ANSI C 0

ANSI C 0



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


Wyszukiwarka

Podobne podstrony:
} int k;} Użycie słowa kluczowego super pozwala na odwołanie się do oryginalnej metody klasy bazowej
ANSI C 0 i 6 STRUKTURY Prawie wszystko, co wiąże się z polami bitowymi, zależy od implementacji. T
ANSI C 0 4 FUNKCJE I STRUKTURA PROGRAMU /* getline: wczytaj wiersz do tablicy s; podaj jego długoś
ANSI C 1 6 STRUKTURY /* getword: weź następne słowo lub znak z wejścia */ int getword(char *word,
ANSI C 0 4 FUNKCJE I STRUKTURA PROGRAMU-------------- zamiast int Iow, high, mid; Iow = 0; high =
ANSI C 8 6 STRUKTURY _____________ wyboru odpowiednich spośród typów short, int lub long dla każde
ANSI C 0 DODATEK A PRZEWODNIK JĘZYKA C_______ int max(a, b, c) int a, b, c;{ /* .» *1} gdzie dekla
29945 zdj0 (6) (float a[],int aSize,float b[],int bSize int k, i = 0, j = 0; for (k = 0; k < aSi
Wykorzystywanie stałych Stałe definiuje się za pomocą słowa kluczowego const. const int NUM = 34; co
Dodatkowe słowa kluczowe: -    short, long - dla typu int oznaczają krótką lub długą
ANSI C 0 2 TYPY, OPERATORY I WYRAŻENIA struktury; będą szczegółowo opisane w rozdz. 6 razem z oper
ANSI C 0 DODATEK A PRZEWODNIK JĘZYKA C ___——- łujących się do samych siebie: struktura lub unia mo
ANSI C 0 xbi i Ul powered byMi siolELEMENTARZ Rozpoczynamy od szybkiego zapoznania się z
ANSI C 0 1 ELEMENTARZ Ćwiczenie 1.8. Napisz program zliczający znaki odstępu, tabulacji i nowego
ANSI C 0 2 TYPY, OPERATORY I WYRAŻENIA Kwalifikatory signed (ze znakiem liczby) i unsigned (bez zn
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
ANSI C 0 5 WSKAŹNIKI I TABLICE -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
ANSI C 6 6 STRUKTURY X Obie współrzędne można zadeklarować jako składowe struktury, na przykład ta

więcej podobnych podstron