Advertisement
Guest User

Untitled

a guest
Dec 27th, 2014
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.36 KB | None | 0 0
  1. // Mateusz Wcislo
  2. #include <iostream>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. /* ******************************** */
  10.  
  11. 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
  12. {
  13.     FILE *fp;    
  14.     fp=fopen(in,"r");
  15.         if (fp==NULL) exit(1);
  16.  
  17. // A wystapila ileRazy[0] razy, B - ileRazy[1], C - ileRazy[2], ...
  18.     int ileRazy[27]={'\0'}; // liczba wystapien
  19.     int c = 0, lit = 0;
  20.     while( ( c = fgetc (fp) ) != EOF )
  21.     {
  22.         if( 'A' <= c && 'Z' >= c )
  23.         {
  24.             lit = c - 'A'; // wystapila litera lit
  25.             ileRazy[lit]++; // liczba wystapien litery lit + 1
  26.             wszystkieZnaki++;
  27.         }
  28.         else if (c==';') {ileRazy[26]++; wszystkieZnaki++;}
  29.     }
  30.     fclose(fp);
  31.  
  32.     int temp[27]={'\0'};
  33.     for (int k=0;k<27;k++) temp[k] = ileRazy[k];
  34.    
  35.     int tabSort[27]={'\0'}; // miejsce na posortowana malejaca tablice ileRazy
  36.     sort(ileRazy,ileRazy+27, greater < int >());
  37.     for (int k=0;k<27;k++) tabSort[k] = ileRazy[k];
  38.  
  39.     // szukamy pierwszej zerowej wspolrzednej posortowanej tablicy wystapien
  40.     int zero = 27;
  41.     for (int k=0;k<27;k++) 
  42.     {
  43.         if (tabSort[k]==0)
  44.         {
  45.             zero = k;
  46.             break; 
  47.         }  
  48.     }
  49.    
  50.     // otwieramy plik ze statystykami i zapisujemy dane
  51.     FILE *st;    
  52.     st=fopen(stat,"w");
  53.  
  54.     // bedziemy pracowac tylko na niezerowych elementach
  55.     int litera;
  56.     for (int k=0;k<zero;k++)
  57.     {
  58.         litera = 0;
  59.         for (int j=0;j<27;j++)
  60.         {
  61.             if (tabSort[k] == temp[j])
  62.             {
  63.                 litera = j; // litera j wystapila tabSort razy
  64.                 break; // a co jezeli dwie litery wystapily taka sama liczbe razy ?
  65.             }
  66.         }      
  67.                
  68.         // teraz bedziemy wrzucac dane do pliku stat, litery alfabetu to 65 + litera
  69.         // Znaleziono tabSort[k] znakow '65'+litera, co stanowi procent% wszystkich
  70.        
  71.         double procent=0;
  72.         procent = ((double)tabSort[k] / (double)wszystkieZnaki) * 100.00f;
  73.  
  74.         // trzeba zrobic rozroznienie na srednik, tzn. if litera == 26     
  75.         if (litera != 26)
  76.         {
  77.             fprintf(st, "Znaleziono %*d znakow %c, co stanowi %6.3f%% wszystkich\n", 8,tabSort[k], 65+litera, procent );               
  78.         }
  79.         else
  80.         {
  81.             fprintf(st, "Znaleziono %*d znakow %c, co stanowi %6.3f%% wszystkich\n", 8,tabSort[k], 59, procent );                  
  82.         }      
  83.     }
  84.    
  85.     fclose(st);
  86.  
  87.  
  88. }
  89.  
  90. /* ******************************** */
  91.  
  92. void opO(char *zakod, char *stat, char *odkod, char symbol)
  93. {
  94.     int ileZnakow=0;
  95.     char *S = "U";
  96.  
  97.     opU(zakod, S, ileZnakow);
  98.  
  99.     // wypisujemy statystyki szyfrogramu
  100.     FILE *stSz;  
  101.     stSz=fopen(S,"r");
  102.  
  103. //cout << "PRZED WHILE " << endl;  
  104.  
  105.     char *napis = new char[100];
  106.     char *napis2 = new char[100];
  107.  
  108.     while( fgets(napis, 100, stSz) != NULL )
  109.     {
  110.         cout << napis;
  111.     }  
  112.     rewind(stSz);
  113.     FILE *st; //statystyki z argumentu *stat   
  114.     st=fopen(stat,"r");
  115.         if (st==NULL) exit(1);
  116.  
  117.     char *s1=new char[12];  char *s2=new char[6];
  118.     char *s3=new char[2]; char *s4=new char[2];
  119.     char *s5=new char[8]; char *s6=new char[13];
  120.     int lint; double ldouble;
  121.     char szyfro[27] = {'\0'}, staty[27]={'\0'}; // zapamieta wystapienia z szyfrogramu, ze statystyk
  122.     int k=0; // wspolrzedne tablicy    
  123.  
  124. //cout << "PRZED WHILE GETS" << endl;
  125.    
  126.     while( fgets(napis, 100, stSz) != NULL )
  127.     {
  128.         if(napis[15]>0) // liczba wystapien >0
  129.         {
  130.             szyfro[k] = napis[27];
  131.     //  cout << "szyfro[k] = " << szyfro[k] << endl;
  132.             fgets(napis2, 100, st);
  133.             staty[k] = napis2[27];
  134.     //  cout << "staty[k] = " << staty[k] << endl;
  135.             k++;
  136.         }
  137.     }  
  138.     fclose(st); fclose(stSz);
  139.  
  140. //cout << "PRZED ILE LICZB" << endl;
  141.    
  142.     // szyfro[0] koduje staty[0], ..., szyfro[n] koduje staty[n]
  143.     // trzeba uporządkować alfabetycznie szyfro
  144.     int ileLiczb=0,i=0;
  145.     while(szyfro[i]!='\0')
  146.         {
  147.             ileLiczb++; // tyle liczb zakodowano
  148.             i++;
  149.         }
  150.  
  151.     // sortujemy tablice szyfro alfabetycznie
  152.     for( int i = 0; i < ileLiczb; i++ )
  153.     {
  154.         for( int j = 0; j < ileLiczb - 1; j++ )
  155.         {
  156.             if( szyfro[j] > szyfro[j+1] )
  157.             {
  158.                 swap( szyfro[ j ], szyfro[ j + 1 ] );
  159.                 swap( staty[j], staty[j+1] );
  160.             }
  161.         }
  162.     }
  163.  
  164. //cout << "PRZED SZUKANIEM SREDNIKA" << endl;
  165.  
  166.     // szukamy srednika
  167.     int idSrednik=0;
  168.     for( int i = 0; i < ileLiczb; i++ )
  169.     {
  170.         if(szyfro[i]==';') idSrednik=i;
  171.     }
  172.     // wypisujemy
  173.     for( int i = 0; i < ileLiczb; i++ )
  174.     {
  175.         if (i!=idSrednik) { printf("Symbol %c koduje %c\n", szyfro[i], staty[i]); }    
  176.     }  
  177.     printf("Symbol %c koduje %c\n", ';', staty[idSrednik]);
  178.    
  179.  
  180. // odkodowac plik zakod i dopisac do pliku odkod
  181.     FILE *zak; zak=fopen(zakod,"r");       
  182.     FILE *odk; odk=fopen(odkod,"a");
  183.     char c;
  184. // odczytujemy linie z zakod i wpisujemy do odkod
  185.     while( ( c = fgetc (zak) ) != EOF )
  186.     {
  187.         int ind=0;
  188.         for( int i = 0; i < ileLiczb; i++ )
  189.         {
  190.             if(c==szyfro[i]) ind=i;
  191.         }
  192.         fprintf(odk, "%c", staty[ind]);
  193.     }  
  194.     fclose(zak); fclose(odk);
  195.  
  196. //cout << "PRZED WYPISYWANIEM 50 ZNAKOW" << endl;
  197.    
  198. //  wypisujemy 50 znakow od drugiego wystapienia znaku 'symbol' w odkod
  199.     FILE *fp;
  200.     fp=fopen(odkod,"r");   
  201.  
  202.     int ost=0,przed=-1,wypisane=0,wszystkie=0;
  203.     while( ( c = fgetc (fp) ) != EOF ) 
  204.     {
  205.         if (c == symbol)
  206.         {
  207.             ost++;
  208.             przed++;   
  209.         }
  210.     }
  211.     rewind(fp);
  212.    
  213.     while( ( c = fgetc (fp) ) != EOF ) 
  214.     {
  215.         if (wszystkie>przed and wypisane<50)
  216.         {
  217.             printf("%c",c);
  218.             wypisane++;
  219.         }
  220.         wszystkie++;
  221.     }
  222.        
  223. //cout << "PRZED ZAMKNIECIEM" << endl;
  224.     delete[] napis; delete[] napis2;       
  225.     fclose(fp);
  226. }
  227.  
  228. /* ******************************** */
  229.  
  230. void opW(char *in, int n, int k) // wyswietla znaki n, n+1,...,n+k-1 z pliku 'in'
  231. {
  232.     FILE *fp;    
  233.     fp=fopen(in,"r");
  234.         if (fp==NULL) exit(1);             
  235.  
  236.     /* wyswietlanie znakow */
  237.     int i=0; char c;
  238.     while ( (c = fgetc (fp) ) != EOF)
  239.     {
  240.         if (i>=n and i<=n+k-1) cout << c;
  241.         i++;
  242.     }    
  243.    
  244.     fclose(fp);
  245. }
  246.  
  247. /* ******************************** */
  248.  
  249. int main()
  250. {
  251.     char op;
  252.    
  253.     do
  254.     {
  255.         cin >> op;
  256.         if (op == 'u')
  257.         {      
  258.             char *in=new char[20]; char *stat=new char[20];
  259.             cin >> in >> stat;
  260.             int wszystkieZnaki=0;
  261.             opU(in, stat,wszystkieZnaki);  
  262.             cout << wszystkieZnaki;
  263.         }
  264.         else if (op == 'o')
  265.         {
  266.             char *zakod=new char[20]; char *stat=new char[20];
  267.             char *odkod=new char[20]; char a;
  268.             cin >> zakod >> stat >> odkod >> a;
  269.             opO(zakod,stat,odkod,a);           
  270.         }
  271.         else if (op == 'w')
  272.         {
  273.             char *in=new char[20]; int n,s;
  274.             cin >> in >> n >> s;
  275.             opW(in,n,s);
  276.         }  
  277.     } while (op != 'k');
  278.  
  279.     return 0;
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement