Programowanie niskopoziomowe - Ćwiczenia 1
2025-02-20Wprowadzenie
Kompilator: gcc
Użycie: gcc -o program kod.c
Powyższe polecenie skompiluje plik kod.c
do pliku wykonywalnego program
.
Wywołanie programu: ./program
Wypisywanie tekstu na ekran
Do wypisywania tekstu w języku C służy funkcja printf
, która znajduje się w bibliotece stdio.h
.
Na początku kodu należy dołączyć nagłówek:
#include <stdio.h>
Szczegółowy opis użycia można uzyskać wpisując w terminalu polecenie man 3 printf
. Przykładowe użycie:
printf("Ala ma kota\n");
Każdą linię musimy zakończyć znakiem \n
(tzw. escape sequence), który zostanie zamieniony na znak ASCII o numerze 10 (heksadecymalnie 0x0A).
Inne sekwencje:
\t
- tabulator,\\
- backslash,\"
- cudzysłów.
Aby wypisać wartość zmiennej przez printf
, użyjemy tzw. specyfikator formatu, który zaczyna się od znaku %
, a zmienną dodamy jako kolejne argumenty wywołania funkcji.
int x = -10;
float y = 3.141;
char z = 'A';
printf("x = %d, y = %f, z = %c\n", x, y, z);
printf("Wypisanie znaku procenta: %%\n");
Najczęściej używane specyfikatory to:
%d
lub%i
- liczby całkowite ze znakiem (np. int),%u
- liczby całkowite bez znaku (np. unsigned int),%f
- liczby zmiennoprzecinkowe (float, double),%c
- znaki (char),%s
- stringi (char*),%x
- liczby w formacie heksadecymalnym (małe litery),%X
- liczby w formacie heksadecymalnym (duże litery),%p
- wskaźniki (o tym później).
Dodając liczbę między %
oraz literę specyfikatora, można dodać tzw. padding, np. %5d
. Wtedy liczba zostanie uzupełniona spacjami, tak aby zajmowała dokładnie 5 znaków na ekranie. Będzie to nam potrzebne do poprawnego wypisywania tekstu na ekran w poniższym zadaniu…
Zadanie
-
Napisz program, który dla danego
n
wygeneruje tabliczkę mnożenia w zakresie(1 ... n) * (1 ... n)
. Przykładowe wyjście dlan = 20
:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152 160 9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144 153 162 171 180 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 11 22 33 44 55 66 77 88 99 110 121 132 143 154 165 176 187 198 209 220 12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192 204 216 228 240 13 26 39 52 65 78 91 104 117 130 143 156 169 182 195 208 221 234 247 260 14 28 42 56 70 84 98 112 126 140 154 168 182 196 210 224 238 252 266 280 15 30 45 60 75 90 105 120 135 150 165 180 195 210 225 240 255 270 285 300 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 256 272 288 304 320 17 34 51 68 85 102 119 136 153 170 187 204 221 238 255 272 289 306 323 340 18 36 54 72 90 108 126 144 162 180 198 216 234 252 270 288 306 324 342 360 19 38 57 76 95 114 133 152 171 190 209 228 247 266 285 304 323 342 361 380 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400
-
*Zastanów się jak automatycznie dostosować padding do najdłuższej wartości w tabliczce mnożenia.
Podpowiedź: Długość paddingu może być sterowana przez wartość zmiennej (należy podać
*
zamiast liczby i przekazać wartość jako argument):int wartosc = 123; int padding = 4; printf("%*d", padding, wartosc);
Pytanie brzmi jak wyliczyć tą wartość?
-
Wypisz tabliczkę mnożenia w postaci heksadecymalnej, jeżeli użytkownik wywołał program z dodatkowymi argumentami (przynajmniej jednym).
Podpowiedź: przypomnij sobie jak wygląda funkcja
main
(tzw. entry point) i jakie są jej argumenty - jest ona identyczna w języku C oraz C++.Wywołanie programu:
./zadanie1 test
powinno wygenerować poniższy wynik:1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 2 4 6 8 A C E 10 12 14 16 18 1A 1C 1E 20 22 24 26 28 3 6 9 C F 12 15 18 1B 1E 21 24 27 2A 2D 30 33 36 39 3C 4 8 C 10 14 18 1C 20 24 28 2C 30 34 38 3C 40 44 48 4C 50 5 A F 14 19 1E 23 28 2D 32 37 3C 41 46 4B 50 55 5A 5F 64 6 C 12 18 1E 24 2A 30 36 3C 42 48 4E 54 5A 60 66 6C 72 78 7 E 15 1C 23 2A 31 38 3F 46 4D 54 5B 62 69 70 77 7E 85 8C 8 10 18 20 28 30 38 40 48 50 58 60 68 70 78 80 88 90 98 A0 9 12 1B 24 2D 36 3F 48 51 5A 63 6C 75 7E 87 90 99 A2 AB B4 A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 AA B4 BE C8 B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5 B0 BB C6 D1 DC C 18 24 30 3C 48 54 60 6C 78 84 90 9C A8 B4 C0 CC D8 E4 F0 D 1A 27 34 41 4E 5B 68 75 82 8F 9C A9 B6 C3 D0 DD EA F7 104 E 1C 2A 38 46 54 62 70 7E 8C 9A A8 B6 C4 D2 E0 EE FC 10A 118 F 1E 2D 3C 4B 5A 69 78 87 96 A5 B4 C3 D2 E1 F0 FF 10E 11D 12C 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0 100 110 120 130 140 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 110 121 132 143 154 12 24 36 48 5A 6C 7E 90 A2 B4 C6 D8 EA FC 10E 120 132 144 156 168 13 26 39 4C 5F 72 85 98 AB BE D1 E4 F7 10A 11D 130 143 156 169 17C 14 28 3C 50 64 78 8C A0 B4 C8 DC F0 104 118 12C 140 154 168 17C 190
-
*Zastanów się jak automatycznie dostosować padding do najdłuższej wartości w tabliczce mnożenia także w przypadku heksadecymalnych wartości.
-
Zamiast wpisywać na sztywno wartość
n
(tzw. hard-coding) w kodzie źródłowym programu zapytaj użytkownika o tą wartość na samym początku.Do pobierania danych od użytkownika w języku C służy funkcja
scanf
. Szczegółowy opis użycia można uzyskać wpisując w terminalu polecenieman 3 scanf
. Użycie tej funkcji jest trochę kłopotliwe, ponieważ nie omówiliśmy jeszcze wskaźników, dlatego trzeba uwierzyć na słowo (i sprawdzić), że poniższy kod faktycznie działa :)printf("Podaj wartość n: "); int n; scanf("%d", &n);