#include #include #include /* Sortiranje rjecnika. */ /* Modificirana varijanta unosa rijeci. */ /* Funkcija my_gets za citanje stringa. */ #include "my_gets.c" /* Simbolicke konstante: MAXBROJ = max. broj rijeci, MAXDULJ = max. duljina pojedine rijeci. */ #define MAXBROJ 100 #define MAXDULJ 80 /* Globalno polje znakova za rjecnik. */ char w[MAXBROJ * MAXDULJ]; /* Globalno polje pokazivaca na pojedine rijeci - stringove. */ char *p[MAXBROJ]; /* Stvarni broj rijeci u rjecniku. */ int broj_rijeci; /* Ucitava rijeci i vraca broj rijeci. Kraj ucitavanja je prazna rijec. */ int unos(char *p[]) { char *q = w; int broj = 0, dulj; while (1) { /* Provjera broja rijeci, da ne prepunimo polja p, w. */ /* Napomena: broj je indeks sljedece rijeci koja se ucitava. Sto se tice polja p, test (broj >= MAXBROJ) mogao bi ici i NAKON naredbe p[broj++] = q; jer je MAXBROJ barem 1, a broj je inicijaliziran na 0. Medjutim, zbog polja w, treba biti OPREZNIJI. Zato jer se pocetak sljedece rijeci u polju w (pokazivac q) postavlja na dnu petlje -- striktno govoreci, NE smijemo ucitati sljedecu rijeci prije tog testa, jer bismo mogli "prepuniti" polje w (citanjem ekstra rijeci), prije testa stane li ona u oba polja. Zamislite da sve ucitane rijeci imaju maksimalnu duljinu MAXDULJ (nije jako vjerojatno, ali matematicki je moguce). Onda je polje w popunjeno (do kraja) s tocno MAXBROJ rijeci. Svaki sljedeci pokusaj citanja sigurno "gazi po memoriji". Zato test (broj >= MAXBROJ) mora biti PRIJE citanja! */ if (broj >= MAXBROJ) break; if (my_gets(q, MAXDULJ) == NULL) return -1; if ((dulj = strlen(q)) == 0) break; p[broj++] = q; q += dulj + 1; } return broj; } /* Sortiranje rjecnika izborom ekstrema. Dovodimo najmanji element na pocetak. Rjecnik je zadan poljem pokazivaca na rijeci (element polja je pokazivac na znak-string). Koristimo samo zamjene pokazivaca. */ void sort(char *p[], int n) { int i, j, ind_min; char *temp; for (i = 0; i < n - 1; ++i) { ind_min = i; for (j = i + 1; j < n; ++j) if (strcmp(p[j], p[ind_min]) < 0) ind_min = j; if (i != ind_min) { temp = p[i]; p[i] = p[ind_min]; p[ind_min] = temp; } } return; } /* Ispisuje sve rijeci u rjecniku. */ void ispis(char *p[]) { int i; for (i = 0; i < broj_rijeci; ++i) puts(p[i]); return; } /* Glavni program. */ int main(void) { if ((broj_rijeci = unos(p)) >= 0) { printf("Broj rijeci = %d\n", broj_rijeci); sort(p, broj_rijeci); ispis(p); } else printf("Greska: EOF u citanju rijeci.\n"); return 0; }