/* Zadatak 2 - resenje Srdjan Vesic; 85/2000 */ #include char* VadiRed (void); void Kodovi (char* red, int n[]); void PredugacakRed (int broj_reda, char* red); char visak [80]; //prenos iz reda koji je bio preko 70 kar. int duzina_viska; //duzina reci koja se prenosi int kraj_datoteke; // da li je dosao kraj datoteke char red[80]; // ucitan red koji vraca funkcija VadiRed int broj_karaktera[256]; // broj pojavljivanja pojedinih karaktera int mat[256][3]; int redni_broj; main() { int i; int ch; int mat1; int mat2; int rezultat1; int rezultat2; char glif; duzina_viska = 0; kraj_datoteke = 0; for (mat1 = 0; mat1 < 256 ; mat1++) { //anuliranje matrice for (mat2 = 0; mat2 < 3; mat2++) { mat[mat1][mat2] = 0; } } while (!kraj_datoteke) { VadiRed(); Kodovi(red, broj_karaktera); for (mat1 = 0; mat1 < 256; mat1++) { mat[mat1][0] += broj_karaktera[mat1]; } } for(mat1 = 0; mat1 < 256; mat1++) { mat[mat1][1] = 0; if( ((mat1 >= 'A') && (mat1 <= 'Z')) || ( (mat1 >= 'a') && (mat1 <= 'z') ) || (mat1 == '.') || (mat1 == ',') || (mat1 == ':') || (mat1 == ';') || (mat1 == '?') || (mat1 == '!') || (mat1 == '`') || (mat1 == '(') || (mat1 == ')') || (mat1 == '[') || (mat1 == ']') || (mat1 == '{') || (mat1 == '}') || (mat1 == '<') || (mat1 == '>') || (mat1 == '+') || (mat1 == '-') || (mat1 == '=') || (mat1 == ' ') || (mat1 == '*') || (mat1 == '#') || (mat1 == '%') || (mat1 == '~') || (mat1 == '^') || (mat1 == '@') || (mat1 == '$') || (mat1 == '/') || (mat1 >= '0' && mat1 <= '9' ) ) { mat[mat1][1] = 1; //normalna slova, cifre... } //druga kolona matrice if (mat['&'][0] > mat[';'][0] ) { mat['&'][1] = -1; mat[';'][1] = -1; mat['&'][2] = 1; mat[';'][2] = 2; } //dozvojlen ali "sumnjiv" if (mat['('][0] != mat[')'][0]) { mat['('][1] = -1; mat[')'][1] = -1; mat['('][2] = 3; mat[')'][2] = 3; } if (mat['['][0] != mat[']'][0]) { mat['['][1] = -1; mat[']'][1] = -1; mat['['][2] = 3; mat[']'][2] = 3; } if (mat['{'][0] != mat['}'][0]) { mat['{'][1] = -1; mat['}'][1] = -1; mat['{'][2] = 3; mat['}'][2] = 3; } if (mat['<'][0] != mat['>'][0]) { mat['<'][1] = -1; mat['>'][1] = -1; mat['<'][2] = 3; mat['>'][2] = 3; } } redni_broj = 1; printf("\n r.br. glif dek.vred. freq status Razlog sumnje\n"); for (mat1 = 0; mat1 < 256; mat1++) { if (mat[mat1][0] > 0) { if( (mat1 < 32) || (mat1 > 127) ) { glif = ' '; //ne stampam glif za 'tab' ili slicno } else { glif = mat1; } printf ("\n%6d %6c %11d %6d %6d ", redni_broj, glif, mat1, mat[mat1][0], mat[mat1][1] ); switch (mat[mat1][2]) { case 1: printf("Veci broj pojavljivanja od broja pojavljivanja znaka ';'"); break; case 2: printf("Manji broj pojavljivanja od broja pojavljivanja znaka '&'"); break; case 3: printf("Razlicit broj pojavljivanja od uparene zagrade"); break; } redni_broj++; } } } char * VadiRed (void ) { int red_i; // indeks stringa red int oup; // indikator ostanka u petlji char c; //tekuci karakter static int broj_reda = 1; //inicijalizacija promenljivih oup = 1; red_i = 0; if (duzina_viska > 0) { for (; red_i < duzina_viska; red_i++) { red[red_i] = visak[red_i]; } red[red_i] = '\0'; duzina_viska = 0; // da sledeci put ne uzima stari visak } // obrada reda do '\n' ili do 70. karaktera (sta pre dodje) while (oup) { if (red_i <= 70){ c = getchar(); if (c == EOF) { kraj_datoteke = 1; oup = 0; // kraj datoteke, pa se postavlja indikator za izlazak iz petlje } else if (c == '\n') { // kraj reda pre 70. kolone red [red_i] = '\0'; oup = 0; //postavljamo indikator za izlazak iz petlje broj_reda ++; } else { // "normalni" red [red_i] = c; red_i ++; } } else { PredugacakRed(broj_reda, red); oup = 0; } } return red; } void PredugacakRed (int broj_reda, char* red) { int brojac; //brojac od napred int ii; // brojac od nazad int visak_i; // indeks za visak char sizlaz[120]; static int pdr = 0; //redni broj poslednjeg predugackog reda if (pdr != broj_reda) { pdr = broj_reda; sprintf (sizlaz, "Predugacak red %d:", broj_reda); fputs(sizlaz, stderr); //preskacemo pocetne "spejsove" for (brojac = 0; (red [brojac] == ' ') && (brojac < 70 ); brojac++){} if (brojac < 70) { //brojac je indeks prvog ne-blanko karaktera for (; (brojac < 70) && (red[brojac] !=' ') ;brojac++) { putc( red [brojac], stderr); } fputs("\r\n", stderr); } } //trazimo poslednji spejs: for (ii = 0; (ii <= 70) && (red [70 - ii] != ' ') ; ii ++ ){} if (ii > 70) { //ovaj red nema praznine a duzi je od 70 karaktera } else { duzina_viska = ii; //pamtimo visak i duzinu viska for (visak_i = 0; visak_i < duzina_viska; visak_i ++) { visak [visak_i] = red [70 - duzina_viska + 1 + visak_i]; } red[70-duzina_viska]='\0'; // da bi se ogranicio string koji se vraca kroz funkciju VadiRed } } void Kodovi (char * red, int n[]) { int red_i; // index za niz red int ch; // index za niz n // anuliranje niza n for (ch=0; ch < 256; ch++) { n[ch] = 0; } // ucitavamo i obradjujemo red // red = VadiRed(); for (red_i=0; (ch=red[red_i])!='\0'; red_i++) { n[ch]++; } return; }