/* Student : Tica Sonja * Br. ineksa : 38 / 2000 * Zadatak br. 6, druga grupa */ /* Napomene... Tekst se sastoji od slobodnog teksta i naslova. Glavni program obradjuje slobodni tekst i ulazi u naslov samo kad naidje na prefiks. Naslov se sastoji od a. prefiksa , b. teksta naslova i c. sufiksa . Komande tipa <...> dozvoljene su u slobodnom tekstu. Komande tipa <...> nisu dozvoljene u tekstu naslova. Nakon #define EXIT 1 enum states {freetext,h,hH,hHn,nastext,nastext1,Bp,Bz,f1,fH,fHH,fHHn,z,z2,z3} int br=0; int c,b,m=0,br1=0,min=2,max=6,i,brznak=0,n=0,j,k; long int red=1; enum states stanje; char ime[]="ctext2.txt"; char naslov[200]; int eopn=0, anl=0, nas=0, brojnaslova=0, dubok=0; char prvibrnoj,drugibroj; FILE *f; /*............................................*/ main() { f=fopen (ime,"r"); if(f==NULL) { fprintf(stderr,"Nije uspjelo otvaranje fajla%s\n",ime); exit(EXIT ); } /**/ stanje=freetext; while((c=getc(f))!=EOF) { if(c=='\n') ++red; /**/ switch (stanje) { case freetext: if (c=='<') { stanje=h; } else { ;/*ostaje u freetext*/ } break; /**/ case h: if (c=='H') { stanje=hH; nas=vadinaslov(); if (nas==2) exit(EXIT);/*greska u formiranju naslova*/ if (nas==1) exit(EXIT);/*predugacak tekst*/ if (nas==0) { stanje=freetext; anl=analiza(); if (anl>0) exit(EXIT); /**/ m=naslov[2]; if (naslov[4]=='*' && naslov[5]=='*' && naslov[6]=='*') { max=m-'0'; /* printf("max %d",max);*/ } stampnas(); }/*end nas==0 */ } else { stanje=freetext; } break; }/*end switch*/ } /*end while*/ /**/ if (ferror(f)!=0) fprintf(stderr,"\n Greska pri citanju fajla %s\n",ime); fclose(f); /**/ /* printf("\n brojnaslova = %d",brojnaslova);*/ printf("\n kraj programa"); exit(EXIT); }/*end main*/ /*................................................*/ int vadinaslov(void) { int k,bn; naslov[0]='<'; naslov[1]='H'; br1=1; for(k=2;k<200;k++) naslov[k]=' '; /**/ while((c=getc(f))!=EOF) { if(c==14) ++red; if (br1==200) return 1; /**/ switch (stanje) { case hH: if(c=='2'||c=='3'||c=='4'||c=='5'||c=='6') { stanje=hHn; br1++; naslov[br1]=c; } else { printf("\n red %d Dubina prefiksa izvan dozvoljenog ranga [2-6]",red); return 2; } break; /**/ case hHn: if (c=='>') { stanje=nastext; } else { printf("\n red %d Lose formiran prefiks naslova",red); return 2; } br1++; naslov[br1]=c; break; /**/ case nastext: if (c=='<') { stanje=f1; } br1++; naslov[br1]=c; break; case f1: if (c=='/') { stanje=fH; br1++; naslov[br1]=c; } else { printf("\n red %d Lose formiran sufiks",red); return 2; } break; /**/ case fH: if (c=='H') { stanje=fHH; br1++; naslov[br1]=c; } else { printf("\n red %d Lose formiran sufiks",red); return 2; } break; /**/ case fHH: if (c=='2'||c=='3'||c=='4'||c=='5'||c=='6') { drugibroj=c; stanje=fHHn; br1++; naslov[br1]=c; } else { printf("\n red %d Dubina sufiksa izvan dozvoljenog ranga [2-6]",red); return 2; } break; /**/ case fHHn: if (c=='>') { --br; stanje=freetext; brojnaslova++; br1++; naslov[br1]=c; return 0; } else { printf("\n red %d Lose formiran sufiks",red); return 2; } break; }/*end switch*/ } /*end while*/ }/*end vadinaslov*/ /*....................................*/ int analiza() { char prefn,sufn; int dub,l,k; int broj[16]; int nf,eop; char sbroj[21][20]={ {"Jedan "},{"Dva "}, {"Tri "},{"Cetiri "}, {"Pet "},{"Sest "}, {"Sedam "},{"Osam "}, {"Devet "},{"Deset "}, {"Jedanaest "},{"Dvanaest "}, {"Trinaest "},{"Cetrnaest "}, {"Petnaest "},{"Sesnaest "}, {"Sedamnaest "},{"Osamnaest "}, {"Devetnaest "},{"Dvadeset "}, {"Sedamdesetcetiri"} }; /**/ prefn=naslov[2]; sufn =naslov[br1-1]; if(prefn!=sufn) { printf("\n red %d Nije uskladjena dubina u prefiksu i sufiksu",red); return 1; } /*..veza sa prethodnim naslovom..*/ if (m=='2') { if (prefn!='2' && prefn!='3') { printf("\n red %d Dubina nije uskladjena sa prethodnim naslovom",red); return 1; } } /**/ if (m=='3'|| m=='4'||m=='5') { if (prefn!=m-1 && prefn!=m && prefn!=m+1) { printf("\n red %d Dubina nije uskladjena sa prethodnim naslovom",red); return 1; } } /**/ if (m=='6') { if (prefn!='5' && prefn!='6') { printf("\=n red %d Dubina nije uskladjena sa prethodnim naslovom",red); return 1; } } /*..........*/ if (prefn-'0'>max) { printf("\n red %d Dubina veca od max odredjene sa ***",red); return 1; } /*..analiza slovnih brojeva ..........*/ if (naslov[4]=='[') { for(k=0;k<=15;k++) broj[k]=' '; eop=0; k=0; while(eop==0) { if (naslov[k+5]==']') eop=2; else { broj[k]=naslov[k+5]; k++; if (k>16) { eop=1; printf("\n red %d Predugacak slovni broj",red); return 1; } } }/*end while*/ /*..*/ nf=0; for(k=0;k<21;k++) { if(nf==1) break; nf=1; for(l=0;l<16;l++) { if (broj[l]!=sbroj[k][l]) nf=0; } } if (nf==0) { printf("\n red %d Neregistrovan slovni broj",red); return 1; } }/*if slovni broj*/ /**/ return 0; }/*end func */ /*....................................*/ int stampnas(void) { int k,pomak; pomak=0; if(naslov[2]=='2') pomak=1; if(naslov[2]=='3') pomak=4; if(naslov[2]=='4') pomak=7; if(naslov[2]=='5') pomak=10; if(naslov[2]=='6') pomak=13; if (red>=1000 && red<=9999) printf("\n red = %d" ,red); if (red>=1 && red<=9 ) printf("\n red = 000%d",red); if (red>=10 && red<=99 ) printf("\n red = 00%d" ,red); if (red>=100 && red<=999 ) printf("\n red = 0%d" ,red); for(k=0; k