/* --------------------------------------------------- */ /* --- Pocitanie slov --- */ /* --------------------------------------------------- */ /* --------------------------------------------------- zapocet z C pre 3MI december 1996 --------------------------------------------------- Uloha c.1: ---------- - upravte program tak, aby ako oddelovacie znaky jednotlivych slov akceptoval aj znaky: '(', ')', '{', '}', ',', '.', '/' Uloha c.2: ---------- - upravte program tak, aby bol jeho vystup (vypisany zoznam) usporiadany podla percentualnej pocetnosti prislusneho slova ( #(vyskytov slova) / #(vsetkych slov) --------------------------------------------------- */ #include #include #include /* --- maximalna dlzka slova --- */ #define MAX_LEN 1024 /* --- uchovanie slov a ich pocetnosti --- */ typedef struct Words_Structure { char * word; int count; struct Words_Structure * next; } WORDS; typedef WORDS * WORDS_PTR; /* --- prototypy funckii --- */ /* --- nacita slovo z 'input' a ulozi ho do 'buffer' ak prida na koniec suboru vrati NULL --- */ char * get_word(FILE * input, char * buffer); /* --- prida slovo 'new_word' do na zaciatok 'ptr' --- */ void add_word(WORDS_PTR * ptr, char * new_word); /* --- ak existuje polozka zoznamu 'ptr' obsahujuca slovo 'word' tak vrati smernik na nu, inak NULL --- */ WORDS_PTR find_word(WORDS_PTR ptr, char * word); /* --- vypise polozky zoznamu 'ptr' --- */ void print_words(WORDS_PTR ptr); /* --- zmaze polozky zoznamu 'ptr' a jeho hodnotu nastavi na NULL --- */ void delete_words(WORDS_PTR * ptr); /* --- main --- */ int main(int argc, char * argv[]) { /* --- Deklaracia premmenych --- */ char buffer[MAX_LEN + 1]; WORDS_PTR words; FILE * input; if (argc <= 1) { /* --- ak nemame dost zadanych argumentov budeme citat zo standardneho vstupu --- */ input = stdin; } else { /* --- otvor subor zadany z prikazoveho riadku na citanie --- */ argc--; argv++; input = fopen(argv[0], "r"); if (!input) { printf("Nemozem nasjst, alebo otvorit zadany subor !\n"); return -1; } } /* --- na zaciatku je zoznam prazdny --- */ words = NULL; /* --- pokial nie je koniec vstupu pridavaj slova do zoznamu --- */ while (get_word(input, buffer)) add_word(&words, buffer); /* --- vypis vysledok --- */ printf("Pocetnost slov: \n"); print_words(words); /* --- zmaz polozky zoznamu --- */ delete_words(&words); /* --- ak bol vstup citany zo suboru treba ho zavriet --- */ if (input != stdin) fclose(input); /* --- treba vratit vysledok cinnosti programu --- */ return 0; } /* --- nacitanie slova zo vstupu --- */ char * get_word(FILE * input, char * buffer) { int c, len = 0; buffer[0] = 0; /* --- preskoc prazdne znaky --- */ while((c = fgetc(input)) != EOF) if (c != ' ' && c != '\t' && c != '\n') break; /* --- ak je koniec suboru vrat NULL --- */ if (feof(input)) return NULL; /* --- chyba ? --- */ if (ferror(input)) { printf("Chyba pri citani suboru !\n"); exit(-1); } /* --- pokial nie je oddelovaci znak citaj do bufra --- */ do { if (c == ' ' || c == '\t' || c == '\n') break; buffer[len ++] = (char)c; buffer[len] = 0; } while((c = fgetc(input)) != EOF && len < MAX_LEN); /* --- vrat smernik buffer --- */ return buffer; } /* --- pridanie slova do zoznamu --- */ void add_word(WORDS_PTR * ptr, char * new_word) { WORDS_PTR w = NULL; /* --- ak uz toto slovo je v zozname --- */ if ((w = find_word(*ptr, new_word)) != NULL) { /* --- inkrementuj pocet jeho vyskytov --- */ w->count ++; } else { /* --- inak vyrob novy zaznam s tymto slovom --- */ w = (WORDS_PTR)malloc(sizeof(WORDS)); memset(w, 0, sizeof(WORDS)); w->word = (char *)malloc(strlen(new_word) +1); strcpy(w->word, new_word); w->count = 1; w->next = *ptr; *ptr = w; } } /* --- prehladanie zoznamu --- */ WORDS_PTR find_word(WORDS_PTR ptr, char * word) { while (ptr) { /* --- rovnake slovo ? --- */ if (!strcmp(word, ptr->word)) /* --- ak ano vrat smernik na polozku --- */ return ptr; ptr = ptr->next; } /* --- polozka s tymto slovom neexistuje vrat NULL --- */ return NULL; } /* --- vypis polozky zoznamu --- */ void print_words(WORDS_PTR ptr) { while (ptr) { printf("%s (%i)\n", ptr->word, ptr->count); ptr = ptr->next; } } /* --- zmaz zoznam --- */ void delete_words(WORDS_PTR * ptr) { WORDS_PTR tmp, fre = * ptr; while (fre) { tmp = fre->next; free(fre->word); free(fre); fre = tmp; } *ptr = NULL; }