Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Mateusz Wcislo
- #include <iostream>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- /* ******************************** */
- void opU(char *in, char *stat, int&wszystkieZnaki) // Posortować znaki kodowane w pliku in względem częstości występowania i zapis do pliku stat
- {
- FILE *fp;
- fp=fopen(in,"r");
- if (fp==NULL) exit(1);
- // A wystapila ileRazy[0] razy, B - ileRazy[1], C - ileRazy[2], ...
- int ileRazy[27]={'\0'}; // liczba wystapien
- int c = 0, lit = 0;
- while( ( c = fgetc (fp) ) != EOF )
- {
- if( 'A' <= c && 'Z' >= c )
- {
- lit = c - 'A'; // wystapila litera lit
- ileRazy[lit]++; // liczba wystapien litery lit + 1
- wszystkieZnaki++;
- }
- else if (c==';') {ileRazy[26]++; wszystkieZnaki++;}
- }
- fclose(fp);
- int temp[27]={'\0'};
- for (int k=0;k<27;k++) temp[k] = ileRazy[k];
- int tabSort[27]={'\0'}; // miejsce na posortowana malejaca tablice ileRazy
- sort(ileRazy,ileRazy+27, greater < int >());
- for (int k=0;k<27;k++) tabSort[k] = ileRazy[k];
- // szukamy pierwszej zerowej wspolrzednej posortowanej tablicy wystapien
- int zero = 27;
- for (int k=0;k<27;k++)
- {
- if (tabSort[k]==0)
- {
- zero = k;
- break;
- }
- }
- // otwieramy plik ze statystykami i zapisujemy dane
- FILE *st;
- st=fopen(stat,"w");
- // bedziemy pracowac tylko na niezerowych elementach
- int litera;
- for (int k=0;k<zero;k++)
- {
- litera = 0;
- for (int j=0;j<27;j++)
- {
- if (tabSort[k] == temp[j])
- {
- litera = j; // litera j wystapila tabSort razy
- break; // a co jezeli dwie litery wystapily taka sama liczbe razy ?
- }
- }
- // teraz bedziemy wrzucac dane do pliku stat, litery alfabetu to 65 + litera
- // Znaleziono tabSort[k] znakow '65'+litera, co stanowi procent% wszystkich
- double procent=0;
- procent = ((double)tabSort[k] / (double)wszystkieZnaki) * 100.00f;
- // trzeba zrobic rozroznienie na srednik, tzn. if litera == 26
- if (litera != 26)
- {
- fprintf(st, "Znaleziono %*d znakow %c, co stanowi %6.3f%% wszystkich\n", 8,tabSort[k], 65+litera, procent );
- }
- else
- {
- fprintf(st, "Znaleziono %*d znakow %c, co stanowi %6.3f%% wszystkich\n", 8,tabSort[k], 59, procent );
- }
- }
- fclose(st);
- }
- /* ******************************** */
- void opO(char *zakod, char *stat, char *odkod, char symbol)
- {
- int ileZnakow=0;
- char *S = "U";
- opU(zakod, S, ileZnakow);
- // wypisujemy statystyki szyfrogramu
- FILE *stSz;
- stSz=fopen(S,"r");
- //cout << "PRZED WHILE " << endl;
- char *napis = new char[100];
- char *napis2 = new char[100];
- while( fgets(napis, 100, stSz) != NULL )
- {
- cout << napis;
- }
- rewind(stSz);
- FILE *st; //statystyki z argumentu *stat
- st=fopen(stat,"r");
- if (st==NULL) exit(1);
- char *s1=new char[12]; char *s2=new char[6];
- char *s3=new char[2]; char *s4=new char[2];
- char *s5=new char[8]; char *s6=new char[13];
- int lint; double ldouble;
- char szyfro[27] = {'\0'}, staty[27]={'\0'}; // zapamieta wystapienia z szyfrogramu, ze statystyk
- int k=0; // wspolrzedne tablicy
- //cout << "PRZED WHILE GETS" << endl;
- while( fgets(napis, 100, stSz) != NULL )
- {
- if(napis[15]>0) // liczba wystapien >0
- {
- szyfro[k] = napis[27];
- // cout << "szyfro[k] = " << szyfro[k] << endl;
- fgets(napis2, 100, st);
- staty[k] = napis2[27];
- // cout << "staty[k] = " << staty[k] << endl;
- k++;
- }
- }
- fclose(st); fclose(stSz);
- //cout << "PRZED ILE LICZB" << endl;
- // szyfro[0] koduje staty[0], ..., szyfro[n] koduje staty[n]
- // trzeba uporządkować alfabetycznie szyfro
- int ileLiczb=0,i=0;
- while(szyfro[i]!='\0')
- {
- ileLiczb++; // tyle liczb zakodowano
- i++;
- }
- // sortujemy tablice szyfro alfabetycznie
- for( int i = 0; i < ileLiczb; i++ )
- {
- for( int j = 0; j < ileLiczb - 1; j++ )
- {
- if( szyfro[j] > szyfro[j+1] )
- {
- swap( szyfro[ j ], szyfro[ j + 1 ] );
- swap( staty[j], staty[j+1] );
- }
- }
- }
- //cout << "PRZED SZUKANIEM SREDNIKA" << endl;
- // szukamy srednika
- int idSrednik=0;
- for( int i = 0; i < ileLiczb; i++ )
- {
- if(szyfro[i]==';') idSrednik=i;
- }
- // wypisujemy
- for( int i = 0; i < ileLiczb; i++ )
- {
- if (i!=idSrednik) { printf("Symbol %c koduje %c\n", szyfro[i], staty[i]); }
- }
- printf("Symbol %c koduje %c\n", ';', staty[idSrednik]);
- // odkodowac plik zakod i dopisac do pliku odkod
- FILE *zak; zak=fopen(zakod,"r");
- FILE *odk; odk=fopen(odkod,"a");
- char c;
- // odczytujemy linie z zakod i wpisujemy do odkod
- while( ( c = fgetc (zak) ) != EOF )
- {
- int ind=0;
- for( int i = 0; i < ileLiczb; i++ )
- {
- if(c==szyfro[i]) ind=i;
- }
- fprintf(odk, "%c", staty[ind]);
- }
- fclose(zak); fclose(odk);
- //cout << "PRZED WYPISYWANIEM 50 ZNAKOW" << endl;
- // wypisujemy 50 znakow od drugiego wystapienia znaku 'symbol' w odkod
- FILE *fp;
- fp=fopen(odkod,"r");
- int ost=0,przed=-1,wypisane=0,wszystkie=0;
- while( ( c = fgetc (fp) ) != EOF )
- {
- if (c == symbol)
- {
- ost++;
- przed++;
- }
- }
- rewind(fp);
- while( ( c = fgetc (fp) ) != EOF )
- {
- if (wszystkie>przed and wypisane<50)
- {
- printf("%c",c);
- wypisane++;
- }
- wszystkie++;
- }
- //cout << "PRZED ZAMKNIECIEM" << endl;
- delete[] napis; delete[] napis2;
- fclose(fp);
- }
- /* ******************************** */
- void opW(char *in, int n, int k) // wyswietla znaki n, n+1,...,n+k-1 z pliku 'in'
- {
- FILE *fp;
- fp=fopen(in,"r");
- if (fp==NULL) exit(1);
- /* wyswietlanie znakow */
- int i=0; char c;
- while ( (c = fgetc (fp) ) != EOF)
- {
- if (i>=n and i<=n+k-1) cout << c;
- i++;
- }
- fclose(fp);
- }
- /* ******************************** */
- int main()
- {
- char op;
- do
- {
- cin >> op;
- if (op == 'u')
- {
- char *in=new char[20]; char *stat=new char[20];
- cin >> in >> stat;
- int wszystkieZnaki=0;
- opU(in, stat,wszystkieZnaki);
- cout << wszystkieZnaki;
- }
- else if (op == 'o')
- {
- char *zakod=new char[20]; char *stat=new char[20];
- char *odkod=new char[20]; char a;
- cin >> zakod >> stat >> odkod >> a;
- opO(zakod,stat,odkod,a);
- }
- else if (op == 'w')
- {
- char *in=new char[20]; int n,s;
- cin >> in >> n >> s;
- opW(in,n,s);
- }
- } while (op != 'k');
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement