Konrad Kosmatka /  Politechnika Warszawska

Programowanie niskopoziomowe - Ćwiczenia 1

2025-02-20

Wprowadzenie

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:

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:

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

  1. Napisz program, który dla danego n wygeneruje tabliczkę mnożenia w zakresie (1 ... n) * (1 ... n). Przykładowe wyjście dla n = 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
    
  2. *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ść?

  3. 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
    
  4. *Zastanów się jak automatycznie dostosować padding do najdłuższej wartości w tabliczce mnożenia także w przypadku heksadecymalnych wartości.

  5. 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 polecenie man 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);