/* STUDENT: TAMARA STOJKOVIC BROJ INDEKSA: 271/2000 ZADATAK: 10 (GRUPA II, ZADATAK 6) E-MAIL: TAKILI@PTT.YU */ #include void greska(int red,int s[80],int err[80]) /* ispisuje gresku */ { int i,j; printf("\n\nGreska --- Red:%d\n",red); for (j=0;s[j]!=0;j++) putchar(s[j]); printf("\n"); i=j; for (j=0;j<=i;j++) if (err[j]) putchar('^'); else putchar(' '); putchar('\n'); } int separator(int d) /* da li je karakter separator */ { int p; p=(d=='-'); p=p||((d=='!')||(d=='&')); p=p||((d==',')||(d=='.')); p=p||((d>='0')&&(d<=';')); p=p||((d>='?')&&(d<='Z')); p=p||((d>='a')&&(d<='z')); p=!p; return (p); } void isprazni(int s[80]) /* postavlja elemente niza na 0 */ { int i; for (i=0;i<80;i++) s[i]=0; } void dokraja(int s[80],int err[80],int i) /* uzima karaktere do kraja linije */ { int c; while ((c=getchar())!='\n') { i++; s[i]=c; err[i]=0; } } void main() { int crtica,br,gr,sep,ignore; int c,d; int i,j,red; int err[80],s[80],et[5]; /* crtica - da li se red zavrsava crticom red - red u kojem se nalazi greska gr - indikator da li je pronadjena greska sep - nadjen separator ignore - ignorisemo karakter (etiketu) br - nadjena etiketa
c,d - trenutni karakteri i,j - brojaci err[80] - marker greske u redu (niz) s[80] - svi karakteri u redu (niz) et[5] - za proveru etiketa NAPOMENA: sve greske osim one sa separatorima su automatske: - nakon interpunkcijskog znaka stavlja se razmak - ako je crtica na kraju reda ona se brise i prebacuje se u isti red do kraja reci - svako
se menja enterom - nakon etikete

se dopunjuje do 6 razmaka. etikete (osim
i

) se zbog prirode ne uzimaju u proveru za separator. */ red=i=0;br=gr=crtica=0; sep=0; ignore=0; isprazni(s);isprazni(err);isprazni(et); c=8; /* bilo koji kar. za poredjenje */ while (((d=getchar())!=EOF)&&(!gr)) { switch (c) { case '.':case ',':case '!':case '?':case ':': if ((d!=' ')&&(d!='\n')) { /* greska 4? */ s[i++]=' '; putchar(' '); if (crtica) { crtica=0; putchar('\n'); isprazni(s); c=8;i=0; } } break; case '<': et[1]=d; /* greska 3? */ et[2]=getchar(); if ((et[1]=='p')&&(et[2]=='>')) /* nadjena p etiketa */ { putchar('<'); s[i++]=et[1]; s[i++]=et[2]; putchar(et[1]); putchar(et[2]); j=6; while (j>0) /* provera razmaka */ { d=getchar(); if (d==' ') { putchar(d); s[i++]=d; j--; } else if (d!='\n') while (j>0) { s[i++]=' '; putchar(' '); j--; } } } else if ((et[1]=='b')&&(et[2]=='r')) /* br? */ { et[3]=getchar(); if (et[3]=='>') { /* nadjena
etiketa */ ignore=1; putchar('\n'); d=8; br=1; } else {putchar('<'); s[i++]=et[1]; s[i++]=et[2]; s[i++]=et[3]; putchar(et[1]); putchar(et[2]); putchar(et[3]); d=et[3]; br=1; } } else {putchar('<'); s[i++]=et[1]; s[i++]=et[2]; putchar(et[1]); putchar(et[2]); d=et[2]; br=1; } break; default: if ((d==' ')||(d=='\n')) {ignore=1;sep=0;}/* ignorisemo space i enter */ if (!ignore) {if (!sep) {if (!separator(c)) if (separator(d)) sep=1;} else if (!separator(d)) /* greska 2 */ {s[i]=d; err[i--]=1; i++; dokraja(s,err,i); gr=1; } else sep=0;} ignore=0; break; } if (d=='\n') /* greska 1? */ { red++; if (c=='-') { putchar(8); /* brisemo crticu */ i--; crtica=1; } else {putchar(d);isprazni(s);c=8;i=0;} } else /* nema greske, prelazi se na sledeci karakter */ { if ((!br)&&(d!='<')) putchar(d); br=0; c=d; s[i++]=c; } } if (gr) greska(red,s,err); else printf("\nTekst je prepravljen tamo gde je bilo gresaka."); }