#include "n_slov.h" int main( int argc, Uchar * * argv ) { Uchar *filename = 0; int pocet=0; Uchar * radek; int i; FILE* soubor; sl* seznamSlov; seznamSlov=NULL; filename=argv[1]; pocet= atoi(argv[2]); if (soubor = fopen(filename, "rt")){ while (radek = getLine(soubor)){ seznamSlov = ZjistiSlovaVRadku(radek,seznamSlov); //pracujeme } } printf("nalezena slova\n\n"); for (i=1;i<=pocet;i++) { if (seznamSlov!=NULL) { printf("%d. %s bylo %d \n",i,(*seznamSlov).slovo,(*seznamSlov).pocet); seznamSlov = (*seznamSlov).next; } else { printf("\n vice slov nez %d uz v souboru nebylo",i); break; } } return(0); } sl * ZjistiSlovaVRadku(Uchar * radek,sl * seznamSlov) { int pocet = 0; Uchar * slovo; int znak; int start; znak = 0; start= 0; slovo=""; pocet= pocetSlov(radek); while (pocet>0) { znak = znak + najdiZnakZaSlovem(&radek[start]); while(jeAlfaNum(radek[start]) == 0) start++; seznamSlov = pridejSlovo(&radek[start],seznamSlov); start = znak; pocet--; } return(seznamSlov); } Uchar * getLine(FILE *f) { Uchar *buffer1, *buffer2; unsigned pos = 0; unsigned size = 128; buffer1 = malloc(size); if (feof(f)) return NULL; while (fread(buffer1 + pos, 1, 1, f)) { // znak konce radku if (buffer1[pos] == '\n') { buffer1[pos] = 0; return buffer1; } // nacteme dalsi znak else { ++pos; // realokace bufferu if (pos == size) { size; buffer2 = malloc(size * 2); memcpy(buffer2, buffer1, size); size *= 2; free(buffer1); buffer1 = buffer2; } } } buffer1[pos] = 0; return buffer1; } int jeAlfaNum(Uchar p) { if (((p>=97)&&(p<=122))||((p>=65)&&(p<=90))||((p>=48)&&(p<=57))) return (1); else return (0); } int pocetSlov(Uchar * radek) { int i,delka, jeslovo,pocet; delka = strlen(radek)-1; i=0; jeslovo = 0; pocet=0; while (i<=delka) { if(jeAlfaNum(radek[i])==1) { if (jeslovo==0) jeslovo=1; } else { if (jeslovo==1) { jeslovo=0; pocet=pocet+1; }; } i++; } if (jeslovo==1) pocet++; return(pocet); } int najdiZnakZaSlovem(Uchar * radek) { int i,delka, jeslovo,pocet; delka = strlen(radek)-1; i=0; jeslovo = 0; pocet=0; while (i<=delka) { if(jeAlfaNum(radek[i])==1) { if (jeslovo==0) jeslovo=1; } else { if (jeslovo==1) { radek[i]=0; return(i + 1); }; } i++; } radek[i]=0; return(i + 1); } sl * pridejSlovo(Uchar * slovo,sl * seznam) { sl * misto; misto = najdiVseznamu(slovo,seznam); return(misto); } sl * najdiVseznamu(Uchar * slovo,sl * seznam) { sl* pom; if (seznam ==NULL){ seznam = (sl *) malloc(sizeof(sl)); (*seznam).slovo = (Uchar*) malloc(strlen(slovo) * sizeof(char)); strcpy((*seznam).slovo,slovo); (*seznam).pocet=1; (*seznam).next=NULL; (*seznam).pred=NULL; } else { do{ if (jsouStejne((*seznam).slovo,slovo)){ (*seznam).pocet++; while (((*seznam).pred!=NULL)&&((*seznam).pocet > (*(*seznam).pred).pocet)) seznam = predbehniSeznam(seznam); break; } seznam = posun_next(seznam); } while((*seznam).next!=NULL); if ((*seznam).next ==NULL){ pom = seznam; seznam = (*seznam).next; seznam = (sl *) malloc(sizeof(sl)); (*seznam).slovo = (Uchar*) malloc(strlen(slovo) * sizeof(char)); strcpy((*seznam).slovo,slovo); (*seznam).pocet=1; (*seznam).next=NULL; (*seznam).pred=pom; (*pom).next=seznam; } } do{ seznam = posun_pred(seznam); }while ((*seznam).pred !=NULL); return(seznam); } sl * posun_next(sl * ti ) { if ((*ti).next != NULL) return((*ti).next); else return(ti); } sl * posun_pred(sl * ti ) { if ((*ti).pred != NULL) return((*ti).pred); else return(ti); } int jsouStejne(Uchar * a ,Uchar * b) { int i; if (strlen(a)!=strlen(b)) return(0); else { for (i=0; i < strlen(a);i++) if (a[i]!=b[i]) return(0); } return(1); } sl * predbehniSeznam(sl * seznam) { int pom; char * pom1; pom = (*(*seznam).pred).pocet; pom1= (*(*seznam).pred).slovo; (*(*seznam).pred).pocet=(*seznam).pocet; (*(*seznam).pred).slovo=(*seznam).slovo; (*seznam).pocet= pom; (*seznam).slovo=pom1; return((*seznam).pred); }