1 ELEMENTARZ
tymi w nawiasy klamrowe. W naszym programie zliczania słów po else występuje instrukcja if, która steruje wykonaniem dwóch instrukcji zawartych w nawiasach klamrowych.
Ćwiczenie 1.11. Jak mógłbyś sprawdzić poprawność programu zliczającego sło- i wa? Jaki rodzaj danych wejściowych najlepiej nadaje się do demaskowania błędów, jeśli tu występują?
Ćwiczenie 1.12. Napisz program, który każde słowo wejściowe wypisze w osobnym wierszu.
Napiszmy program zliczający liczbę wystąpień każdej cyfry, każdego białego znaki (tj. znaku odstępu, tabulacji i nowego wiersza) oraz wszystkich innych znaków. Jest t< oczywiście problem sztuczny, ale pozwoli nam przedstawić kilka właściwości języl C w jednym programie.
Wyróżniamy aż dwanaście rodzajów danych wejściowych, a więc dla cyfr wygodni* jest zastosować tablicę przechowującą liczniki wystąpień każdej z nich, niż dziesii osobnych zmiennych. Oto jedna z wersji tego programu.
#include <stdio.h>
/* zlicz cyfry, białe znaki, inne */ main()
int c, i, nwhite, nother; int ndigit[10];
nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigitfi] = 0;
while ((c = getchar()) != EOF) if (c >= ’0’ && c <= ’9’)
-H-ndigit[c-’0'];
else if (c == ’ ’ 11 c == ’\n’ || c == ’\f) ++nwhite; else
++nother;
printf(”cyfry =”); for (i = 0; i < 10; ++i) printf(” %d", ndigitfi]);
printfC, białe znaki = %d, inne = %d\n”, nwhite, nother);
Wynikiem tego programu uruchomionego dla własnego tekstu źródłowego jest wiersz
cyfry = 9300000001, białe znaki = 123, inne = 339 Deklaracja
int ndigit[10];
mówi, że ndigit jest tablicą 10 liczb całkowitych. Indeksy tablic w języku C zawsze rozpoczynają się od zera, elementami tablicy są zatem ndigit[0], ndigit[1], ...» ndigit[9]. Odzwierciedlają to pętle for, z których jedna inicjuje, a druga wypisuje elementy tablicy.
Indeks może być dowolnym wyrażeniem o wartości całkowitej, zawierającym zmienne całkowite (jak i) oraz stałe całkowite.
Szczególnie ten program wykorzystuje właściwości wewnętrznej reprezentacji cyfr. Na przykład instrukcja
if (c >= '0’ && c <= ’9’)...
sprawdza, czy znak w c jest cyfrą. Jeśli tak, to wartością numeryczną tej cyfry będzie
c-’0'
Takie wyrażenie jest poprawne jedynie wtedy, kiedy znaki ’0\ T, ... ’9’ są kolejnymi wartościami uporządkowanymi rosnąco. Na szczęście tak właśnie jest we wszystkich powszechnie stosowanych zbiorach znaków.
Obiekty typu char są z definicji po prostu niewielkimi liczbami całkowitymi, toteż w wyrażeniach arytmetycznych zmienne i stałe typu char są traktowane identycznie jak int. Jest to całkiem naturalne i wygodne; przykładowo C-’0’ jest wyrażeniem całkowitym o wartości między 0 a 9, która odpowiada jednemu ze znaków od ’0’ do ’9’ zawartemu w zmiennej c. Wartość ta jest poprawnym indeksem tablicy ndigit.
Decyzję o tym, czy znak jest cyfrą, białym znakiem czy czymkolwiek innym, podejmuje się w następującym fragmencie programu:
45