/* autor: Dragana Simic, broj indeksa: 193/00; resenje zadatka br.2 */ #include int greska=0; int isEOF=0; /*kraj fajla*/ struct red { /*jedan red*/ int duzina; /*duzina reda*/ char text[71]; /* sadrzaj reda */ } text; /* funkcija koja vraca pokazivac na text reda sa standardnog ulaza */ char* VadiRed(void){ static int brojreda=0; /* trenutni broj reda sa ulaza */ int a=0; char c; /* karakter sa ulaza */ char niska[71]; /* ako je red duzi od 70 karaktera za prvu rec */ text.duzina=0; text.text[0]=0; for(;;){ c=getc(stdin); /* unos jednog karaktera sa standardnog ulaza */ text.text[text.duzina++]=c; /* unos karaktera u bafer trenutnog reda */ switch(c){ case '\n': text.text[text.duzina]='\0'; /* ako je kraj reda */ /* zavrsavamo i vracamo pokazivac */ greska=0; brojreda++; return text.text; case '>': if(text.text[text.duzina-2]=='R') /* da li je
ili
*/ /* ako jeste, onda je kraj reda */ /* pa vratimo pokazivac */ if(text.text[text.duzina-3]=='B') if(text.text[text.duzina-4]=='<') {greska=0; text.text[text.duzina]='\0';brojreda++;return text.text;} else if(text.text[text.duzina-4]=='/') if(text.text[text.duzina-5]=='<') {greska=0;text.text[text.duzina]='\0';brojreda++;return text.text;} break; case EOF: text.text[text.duzina]='\0'; /* ako je kraj fajla zavrsavamo red */ /* i "javljamo" da smo stigli do kraja reda */ isEOF=1; return text.text; }; if(text.duzina>=71){ text.text[text.duzina]='\0'; /* ako je duzina reda veca od 70 karaktera */ /* zavrsavamo red ali ne povecavamo broj redova za 1 */ a=0; while((niska[a]=text.text[a])!=' ')a++;/* u nisku ubacimo prvu rec */ niska[a]=0; if(!greska){fprintf(stderr,"Predugacak red %d: %s\n",brojreda+1,niska);greska=1;} /* ispisujemo poruku o gresci, red u kome je doslo do greske, i prvu rec u redu, i obezbedjujemo se samo jednom ispisujemo poruku o gresci */ return text.text; } }; /*end for*/ }/*end vadi red*/ /* vraca broj pojavljivanja karaktera u redu */ void Kodovi(char *red,int n[]){ int a=0; while(red[a]!='\0'){n[red[a]]++;a++;}; /* za svako pojavljivanje karaktera iz reda povecavamo njemu pridruzen brojac za 1 */ } void main(void){ int mat[256][3]; int n[256]; /* pomocni red */ int i; for(i=0; i<256; n[i++]=0); for(;isEOF!=1;)Kodovi(VadiRed(),n); /* do kraja fajla uzimamo redove i povecavamo brojace karaktera za sta nam sluzi pomocni red n */ for(i=0;i<256;i++)mat[i][0]=n[i]; /* prepisemo brojace u trazenu matricu */ /* unosimo kakav je "status" karaktera - dozvoljen, nedozvoljen ili sumnjiv */ for(i='*';i<=':';i++){mat[i][1]=1;mat[i][2]=0;};/* dozvoljeni karakteri od * do :, i od ? do Z, i od ^ do z bez ogranicenja */ for(i='?';i<='Z';i++){mat[i][1]=1;mat[i][2]=0;}; for(i='^';i<='z';i++){mat[i][1]=1;mat[i][2]=0;}; for(i=128;i<256;i++){mat[i][1]=0;mat[i][2]=0;};/* nedozvoljeni karakteri */ for(i=0;i<31;i++){mat[i][1]=0;mat[i][2]=0;};/* nedozvoljeni karakteri - nestampajuci */ mat[10][1]=1;mat[10][2]=0; /*return*/ mat[13][1]=1;mat[13][2]=0; /*tab*/ mat[32][1]=1;mat[32][2]=0; /* space */ mat[33][1]=1;mat[33][2]=0; /* ! */ if(mat[34][0]%2){mat[34][1]=-1;mat[34][2]=1;} else {mat[34][1]=1;mat[34][2]=0;}/* " - sumnjiv ako nije paran broj pojavljivanja*/ mat[35][1]=1;mat[35][2]=0; /* %$# dozvoljeni karakteri bez ogranicenja */ mat[36][1]=1;mat[36][2]=0; mat[37][1]=1;mat[37][2]=0; /* da li su sumnjivi sledeci karakteri: '&' i ';' , '(' i ')' , '<' i '>' , '[' i ']' , '{' i '}' tj. proverava se da li su im brojevi pojavljivanja jednaki, ako nisu, kao sumnja se navodi razlika izmedju brojeva pojavljivanja karaktera */ if(mat['&'][0]