/* 11. zadatak - Srdjan vesic */ #include #define MAXCHAR 274 #define MAXWORD 100 /* maksimalna dozvoljena duzina jedne reci */ #define MAXSENT 100 /* maksimalan dozvoljen broj reci u recenici */ #define MAXDEF 15 /* maksimalan broj karaktera u definiciji (ne racunajuci zagrade) */ #define HISTCHAR 220 /* karakter koji predstavlja jedinicnu meru grafika */ #define HISTMAX 70 /* duzina u kojoj se stampa karakter sa najvise pojavljivanja*/ typedef enum {false, true} boolean; int bpk[MAXCHAR]; /* broj pojavljivanja svakog karaktera */ int brsobk[MAXWORD + 1]; /* broj reci sa odredjenim brojem karaktera */ int brsobr[MAXSENT + 1]; /* broj recenica sa odredjenim brojem reci */ int duzinareci; /* duzina trenutne reci */ int brojreda; /* broj tekuceg reda */ int brojrecenica; /* ukupno */ int brutr; /* broj reci u tekucoj recenici */ int maxduzinareci; /* maksimalna dostignuta duzina reci, ukoliko je veca od MAXWORD; inace je nula */ int maxduzinadefinicije; /* maksimalna dostignuta duzina definicije, ukoliko je veca od MAXDEF; inace je nula */ int maxbrojreciurecenici; /* isto */ boolean uyuslovu; /* da li smo u yu slovu ili crtici ili "..." ? */ boolean ureci; /* da li smo trenutno u reci? */ boolean uetiketi; /* da li smo trenutno u etiketi? */ boolean udefiniciji; /* da li smo trenutno u definiciji? */ boolean obradislovo; /* da li ce se ulaziti u brojanje reci i broja karaktera */ boolean nismourecenici; void Anuliranje (void); /* anulira nizove bpk, brsobk, brobr... */ void BrojPojavljivanja (int); /* broj pojavljivanja odredjenog karaktera */ void DuzinaReci (int); void ObradaRecenice (void); int Yuslovo (int); boolean Etiketa (int); boolean Definicija (int); boolean JednakiStringovi (char* s1, char* s2); void StCopy (char* a, char* b); /* kopira prvi na drugi string */ void Histogramch (void); /* stampa histogram za karaktere */ void Histogramword (void); /* stampa histogram za reci */ void HistogramSent (void); /* stampa histogram za recenice */ main () { int i; /* brojac */ int c; /* trenutno ucitani znak iz ulazne datoteke */ c = 0; /* da bi prvi put usao u petlju */ Anuliranje(); while (c != EOF) { c = getchar(); obradislovo = true; if (!(c = (YuSlovo (c)))) {obradislovo = false;} /* jer smo u yu slovu ili */ if (Etiketa (c)) {obradislovo = false;} /* u etiketi ili u */ if (Definicija (c)) {obradislovo = false;} /* definiciji */ if (obradislovo) { BrojPojavljivanja (c); DuzinaReci (c); } } if(maxduzinareci > MAXWORD) { fprintf(stderr, "\nPostoji rec duzine %d. Postavi MAXWORD na tu vrednost!", maxduzinareci); } if(maxduzinadefinicije > MAXDEF) { fprintf(stderr, "\nPostoji definicija duzine %d. Postavi MAXDEF na tu vrednost!", maxduzinadefinicije); } if(maxbrojreciurecenici > MAXSENT) { fprintf(stderr, "\nPostoji recenica sa %d reci. Postavi MAXSENT na tu vrednost!", maxbrojreciurecenici); } Histogramch(); Histogramword(); HistogramSent(); } void Anuliranje () { int a; maxduzinareci = 0; maxduzinadefinicije = 0; maxbrojreciurecenici = 0; brojreda = 1; brojrecenica = 0; brutr = 0; ureci = false; uyuslovu = false; uetiketi = false; nismourecenici = true; for (a = 0; a < MAXCHAR; a++) { bpk[a] = 0; /* anuliranje bpk - a */ } for(a = 0; a < MAXWORD + 1; a++) { brsobk[a] = 0; } for(a = 0; a < MAXSENT + 1; a++) { brsobr[a] = 0; } } void BrojPojavljivanja (int c) { if (!uyuslovu) { if (c != '\n'){ bpk[c]++; } else { brojreda++; } } } void DuzinaReci (int c) { if (ureci) { if((c == ' ') || (c == '\n') || (c == '\t') || (c == EOF)) { ureci = false; if (duzinareci <= MAXWORD) { brsobk[duzinareci]++; } else { if (duzinareci > maxduzinareci) { maxduzinareci = duzinareci; } } } else { duzinareci++; } } else { if ((c != ' ') && (c != '\n') && (c != '\t')) { ureci = true; brutr++; duzinareci = 1; } else { } } } int YuSlovo (int c) { /* ako je u sred obrade yu slova - vraca false inace - vraca znak koji je prepoznao */ static char yuslovo[10]; static int brojac; if (uyuslovu) { if (c == ';') { uyuslovu = false; yuslovo[brojac] = '\0'; if (JednakiStringovi(yuslovo, "Cx")) { return 256;} else if (JednakiStringovi(yuslovo, "cx")) { return 257;} else if (JednakiStringovi(yuslovo, "Cy")) { return 258;} else if (JednakiStringovi(yuslovo, "cy")) { return 259;} else if (JednakiStringovi(yuslovo, "Dx")) { return 260;} else if (JednakiStringovi(yuslovo, "dx")) { return 261;} else if (JednakiStringovi(yuslovo, "Dy")) { return 262;} else if (JednakiStringovi(yuslovo, "dy")) { return 263;} else if (JednakiStringovi(yuslovo, "Zx")) { return 264;} else if (JednakiStringovi(yuslovo, "zx")) { return 265;} else if (JednakiStringovi(yuslovo, "Sx")) { return 266;} else if (JednakiStringovi(yuslovo, "sx")) { return 267;} else if (JednakiStringovi(yuslovo, "Lx")) { return 278;} else if (JednakiStringovi(yuslovo, "lx")) { return 279;} else if (JednakiStringovi(yuslovo, "Nx")) { return 270;} else if (JednakiStringovi(yuslovo, "nx")) { return 271;} else if (JednakiStringovi(yuslovo, "hellip")) { return 272;} else if (JednakiStringovi(yuslovo, "mdash")) { return 273;} /* dosli smo do kraja nekog &xxx; znaka, pa ga brojimo */ else { fprintf(stderr, "\nRed %d: nekorektan unos: \"&%s;\"!", brojreda, yuslovo); return false; } } else { yuslovo[brojac++] = c; return false; } } else { if (c == '&'){ uyuslovu = true; yuslovo[brojac = 0] = '\0'; /* "anuliranje" stringa yuslovo */ return false; } else{ return c; } } } boolean JednakiStringovi (char* s1, char* s2) { int brojac; for(brojac = 0; s1[brojac] != '\0' && s2[brojac] != '\0'; brojac++) { if(s1[brojac] != s2[brojac]){ return false; } } return (s1[brojac] == '\0' && s2[brojac] == '\0'); } boolean Etiketa (int c) { /* vraca true ako i samo ako smo "u etiketi" */ if (uetiketi) { if (c == '>') { uetiketi = false; } return true; } else { if (c == '<'){ uetiketi = true; return true; } else { return false; } } } boolean Definicija (int c) { /* vraca true akko smo u definiciji */ static int rednibroj = 0; /* redni broj slova u definiciji */ static char definicija[MAXDEF + 1]; /* tekuca definicija (bez zagrada) */ if (udefiniciji) { if (c == ']') { udefiniciji = false; definicija[rednibroj] = '\0'; if(JednakiStringovi (definicija, "S")) { /* ulaz u recenicu */ ObradaRecenice (); } } else { definicija[rednibroj++] = c; if (rednibroj > MAXDEF && rednibroj > maxduzinadefinicije) { maxduzinadefinicije = rednibroj; } /* obrada poslednje recenice */ if (c == EOF) { ObradaRecenice (); } } return true; } else { if (c == '['){ udefiniciji = true; rednibroj = 0; return true; } else { /* obrada poslednje recenice */ if (c == EOF) { ObradaRecenice (); } return false; } } } void ObradaRecenice () { if (!nismourecenici) { brojrecenica++; if (brutr <= MAXSENT) { brsobr[brutr]++; } else { if(brutr > maxbrojreciurecenici){ maxbrojreciurecenici = brutr; } } brutr = 0; } nismourecenici = false; } void Histogramch (void) { int i; int maxbpk; float k; int j; /* brojac */ float procenat; unsigned char a[5]; /* tekuci znak */ int ukupanbrojkaraktera; maxbpk = 0; /* broj pojavljivanja karaktera koji se javio najvise puta */ ukupanbrojkaraktera = 0; printf("\nbroj pojavljivanja odredjenog karaktera:\n"); for (i = 0; i < MAXCHAR; i++) { if (bpk[i] > maxbpk) { maxbpk = bpk[i]; } ukupanbrojkaraktera += bpk[i]; } k = ((HISTMAX + 0.0) / (maxbpk + 0.0)); for (i = 0; i < 274 ; i++) { if (bpk[i] > 0) { if(i == 256) StCopy ("Cx", a); else if(i == 257) StCopy ("cx", a); else if(i == 258) StCopy ("Cy", a); else if(i == 259) StCopy ("cy", a); else if(i == 260) StCopy ("Dx", a); else if(i == 261) StCopy ("dx", a); else if(i == 262) StCopy ("Dy", a); else if(i == 263) StCopy ("dy", a); else if(i == 264) StCopy ("Zx", a); else if(i == 265) StCopy ("zx", a); else if(i == 266) StCopy ("Sx", a); else if(i == 267) StCopy ("sx", a); else if(i == 268) StCopy ("Lx", a); else if(i == 269) StCopy ("lx", a); else if(i == 270) StCopy ("Nx", a); else if(i == 271) StCopy ("nx", a); else if(i == 272) StCopy ("...", a); else if(i == 273) StCopy ("-", a); else { a[0] = i; a[1] = '\0'; } printf("%4d ", i); /* ascii */ procenat = ((bpk[i] + 0.0)/(ukupanbrojkaraktera + 0.0) * 100); printf("%-4s", a); /* glif */ for (j = 0; j < (k * bpk[i]); j++) { /* histogram */ printf("%c", HISTCHAR); } printf(" %d ", bpk[i]); /* broj pojavljivanja */ printf("(%.3f %%)", procenat); /* procenat */ printf("\n"); } } } void StCopy (char* a, char* b) { int i; for(i = 0; a[i] != '\0' ; i++) { b[i] = a[i]; } b[i] = '\0'; } void Histogramword (void) { int i; int maxbrsobk; /* duzina najduze reci */ float k; int brojreci; int j; /* brojac */ float procenat; maxbrsobk = 0; brojreci = 0; printf("\nbroj reci sa odredjenim brojem karaktera:\n"); for (i = 0; i < MAXWORD + 1; i++) { if (brsobk[i] > maxbrsobk) { maxbrsobk = brsobk[i]; } brojreci += brsobk[i]; } printf("\n"); k = ((HISTMAX + 0.0) / (maxbrsobk + 0.0)); for (i = 1; i < MAXWORD + 1; i++) { if (brsobk[i] > 0) { printf("%3d ", i); procenat = ((brsobk[i] + 0.0)/(brojreci + 0.0) * 100); for (j = 0; j < (k * brsobk[i]); j++) { /* histogram */ printf("%c", HISTCHAR); } printf(" %d ", brsobk[i]); /* broj pojavljivanja */ printf("(%.3f %%)", procenat); /* procenat */ printf("\n"); } } } void HistogramSent (void) { int i; int maxbrsobr; /* duzina najduze reci */ float k; int j; /* brojac */ float procenat; maxbrsobr = 0; printf("\nbroj recenica sa odredjenim brojem reci:\n"); for (i = 0; i < MAXSENT + 1; i++) { if (brsobr[i] > maxbrsobr) { maxbrsobr = brsobr[i]; } } printf("\n"); k = ((HISTMAX + 0.0) / (maxbrsobr + 0.0)); for (i = 1; i < MAXSENT + 1; i++) { if (brsobr[i] > 0) { printf("%3d ", i); procenat = ((brsobr[i] + 0.0)/(brojrecenica + 0.0) * 100); for (j = 0; j < (k * brsobr[i]); j++) { /* histogram */ printf("%c", HISTCHAR); } printf(" %d ", brsobr[i]); /* broj pojavljivanja */ printf("(%.3f %%)", procenat); /* procenat */ printf("\n"); } } }