6 STRUKTURY
6 STRUKTURY
Napiszmy program zliczający wystąpienia każdego słowa kluczowego języka C. Potrzebujemy więc tablicy tekstów przeznaczonej na ich nazwy oraz tablicy liczb całkowitych przeznaczonej na ich liczniki. Jedną z możliwości jest użycie dwóch równoległych tablic keyword i keycount:
char *keyword[NKEYS]; /* słowa kluczowe */ int keycount[NKEYS]; /* liczniki tych słów */
Ale właśnie to, że tablice są równoległe, sugeruje możliwość innej organizacji - tablicy struktur. Informacje związane z każdym słowem kluczowym tworzą parę:
char *word; /* słowo */ int count; /* licznik */
Mamy więc tablicę par. Deklaracja strukturowa
struct key { char *word: int count;
} keytab[NKEYS];
deklaruje strukturowy typ key, definiuje tablicę keytab o elementach będących strukturami tego typu oraz rezerwuje dla nich pamięć. Każdy element tablicy jest strukturą. Można to również zapisać tak:
struct key { char *word; int count;
struct key keytab[NKEYS];
Tablica struktur keytab zawiera stały zbiór nazw, najprościej jest więc zrobić z niej zmienną zewnętrzną i zainicjować raz na zawsze przy jej definicji. Inicjowanie tablicy struktur przeprowadza się podobnie, jak poprzednio - po definicji podaje się ujętą w klamry listę wartości początkowych:
6.3 TABLICE STRUKTUR
struct key { char *word; int count;
} keytabf 1 = {
"auto", 0,
"break”, 0,
"case”, 0,
"char”, 0,
"const", 0,
"continue”, 0,
"default”, 0,
/*... *1 "unsigned”, 0,
”void", 0,'
"volatile”, 0,
"while”, 0
Wartości początkowe są wymienione parami odpowiadającymi składowym struktury. Precyzyjniej byłoby ująć w klamry wartości początkowe dla każdego „wiersza” tablicy (każdej struktury), na przykład;
{"auto”, 0 },
{"break", 0 },
{ "case”, 0 },
ale gdy wartościami początkowymi są proste stałe lub napisy i gdy podano wszystkie wartości, wówczas wewnętrzne klamry można opuścić. Jak zwykle, jeśli pominięto wymiar tablicy (nawiasy [] są puste) i podano listę wartości początkowych, to liczba elementów tablicy keytab zostanie wyliczona automatycznie.
Program zliczający wystąpienia słów kluczowych rozpoczyna się deklaracją tablicy keytab. Funkcja main czyta dane wejściowe, cyklicznie wywołując funkcję getword, która za każdym razem pobiera z wejścia jedno słowo. Każde słowo jest poszukiwane w tablicy keytab za pomocą funkcji wyszukiwania metodą bisekcji, znanej z rozdz. 3. Usta słów kluczowych musi być w tablicy uporządkowana rosnąco.
#inc!ude <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
181