6 STRUKTURY
int getword(char *t int);
int binsearch(char *, struct key *, int);
/* zlicz słowa kluczowe C */ main()
int n;
char word[MAXWORD]; /* słowo */
while(getword(word, MAXWORD) != EOF) if (isalpha(word[0)))
if ((n = binsearch(word, keytab, NKEYS)) >= 0) keytab[n].count++; for (n = 0; n < NKEYS; n++) if (keytab[n].count > 0)
printf(”%4d %s”, keytab[n].count, keytab[n].word); return 0;
/* binsearch: szukaj słowa w tab[0]...tab[n-1] */ int binsearch(char *word, struct key tab[ ], int n)
int cond;
int Iow, high, mid;
Iow = 0; high = n - 1; while (Iow <= high) { mid = (low+high) / 2;
if ((cond = strcmp(word, tab[mid].word)) < 0) high = mid - 1; else if (cond > 0)
Iow = mid + 1; else
!
return mid;
return -1;
Funkcję getword pokażemy za chwilę; na teraz wystarczy wiedzieć, że każde jejNV)' wołanie znajduje na wejściu słowo, które jest kopiowane do tablicy nazwanej tak,j^| jej pierwszy argument.
Wielkość NKEYS jest liczbą słów kluczowych zawartych w tablicy keytab. Choc!^ możemy policzyć je ręcznie, będzie lepiej i bezpieczniej zrobić to z użyciem mas/?
ny, tym bardziej, że lista może ulec zmianie. Jedną z możliwości byłoby listy wartości początkowych wskaźnikiem zerowym i przebiegnięcie tablicy keytab aż do końca.
Nie potrzeba jednak aż tak wiele, rozmiar tablicy jest bowiem całkowicie określony podczas kompilacji programu. Rozmiarem tablicy jest rozmiar jej jednego elementu pomnożony przez liczbę elementów, a więc liczba elementów wynosi dokładnie
rozmiar keytab / rozmiar struct key
Język C został wyposażony w jednoargumentowy operator zwany sizeof, który może służyć do obliczenia rozmiaru dowolnego obiektu. Wyrażenia
sizeof obiekt
i
i
ś\zeo\{nazwa typu)
dają w wyniku wartość całkowitą równą rozmiarowi wskazanego obiektu lub typu w bajtach. (Dokładniej, sizeof podaje wartość całkowitą bez znaku o typie size_l zdefiniowanym w standardowym nagłówku <stddef.h>.) Obiektem może być zmienna, tablica lub struktura. Nazwą typu może być nazwa jednego z typów podstawowych, jak int lub double, albo nazwa typu pochodnego, jak struktura lub wskaźnik.
W naszym przypadku szukaną liczbą słów kluczowych jest rozmiar tablicy podzielony przez rozmiar jednego elementu. To obliczenie zastosowano w instrukcji #define do określenia wartości NKEYS:
#define NKEYS (sizeof keytab / sizeof(struct key))
To samo obliczenie można napisać inaczej, dzieląc rozmiar tablicy przez rozmiar jej konkretnego elementu:
#define NKEYS (sizeof keytab / sizeof keytab[0J)
Druga postać ma tę przewagę, że nie trzeba jej zmienić po zmianie typu elementów tablicy.
Operatora sizeof nie można stosować w instrukcjach preprocesora #if, ponieważ w fazie prekompilacji nie ma analizy nazw typów. Wyrażenie w #define nie jest jednak obliczane przez preprocesor, zatem tutaj sizeof jest dozwolony.
Wróćmy teraz do funkcji getword. Napisaliśmy ją nieco bardziej ogólnie, niż było to konieczne dla naszego programu, ale nie jest przez to bardziej skomplikowana. Funkcja
getword pobiera następne „słowo” z wejścia, przy czym słowem jest zarówno ciąg liter
•
1 cyfr zaczynający się od litery, jak i pojedynczy nie biały znak. Jej wartością funkcyjną
• _
Jest pierwszy znak słowa lub EOF po napotkaniu końca pliku, lub też sam znak, jeśli nie jest literą.
183