Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. // ova struktura ce nam sluziti za VEZANU LISTU rijeci
  8. struct listaElement {
  9.     char rijec[30];
  10.     unsigned int brojPonavljanja;
  11.     unsigned int redniBroj;
  12.     listaElement* sljedeciElement;
  13. };
  14.  
  15. // ova struktura ce nam sluziti za POLJE rijeci (i zato nema sljedeciElement kao sto ima struktura za vezanu listu!)
  16. struct rijecData {
  17.     char rijec[30];
  18.     unsigned int brojPonavljanja;
  19.     unsigned int redniBroj;
  20. };
  21.  
  22. int main() {
  23.     ifstream inputDatoteka("datoteka.txt");
  24.     listaElement* lista = NULL;
  25.     listaElement* prosliElement;
  26.     unsigned int brojElemenata = 0;
  27.     char rijec[50];
  28.     // s obzirom na to da je inputDatoteka obican input stream, za razdvajanje kod razmaka
  29.     // mozemo koristiti operator >>, isto kao i kod cin-a!
  30.     // tnx Lucas veoma genijalno
  31.     while (inputDatoteka>>rijec) {     
  32.         // pretvoriti svako slovo u malo
  33.         for(int i=0;i<strlen(rijec);i++) {
  34.             if((rijec[i]<65 || rijec[i]>90) && (rijec[i]<97 || rijec[i]>122)) rijec[i]='\0';           
  35.             if(rijec[i] >= 'A' && rijec[i] <= 'Z')
  36.                 rijec[i] += 32;
  37.             }
  38.                
  39.         bool elementPronaden = false;
  40.         listaElement* element = new listaElement; // isto kao listaElement element; samo sto je dinamicki alocirano
  41.         brojElemenata ++;
  42.         element->redniBroj = brojElemenata;
  43.        
  44.         if(lista==NULL) lista=element;
  45.         else {
  46.             listaElement* searchElement = lista;
  47.             while(searchElement != NULL) {
  48.                 /* ako je rijec vec pronadena u listi onda je duplikat, onda cemo obrisati
  49.                 novi element iz liste (jer je duplikat), a postojecoj rijeci cemo povecati broj ponavljanja */
  50.                 if(!strcmp(rijec, searchElement->rijec)) {
  51.                     searchElement->brojPonavljanja += 1;
  52.                     delete element;
  53.                     brojElemenata --;
  54.                     elementPronaden = true;
  55.                 }
  56.                 searchElement = searchElement->sljedeciElement;
  57.             }
  58.            
  59.             if(!elementPronaden) {
  60.                 prosliElement->sljedeciElement = element;
  61.             }
  62.                
  63.         }  
  64.         if(!elementPronaden) {
  65.             strcpy(element->rijec,rijec); // dok imas bilo kakvu strukturu kreiranu sa "new", koristi -> umjesto .
  66.             element->brojPonavljanja=1;
  67.             element->sljedeciElement=NULL;
  68.             prosliElement = element;
  69.         }        
  70.     }
  71.    
  72.     // kreirati strukturu u koje cemo spremiti polje podataka o rijecima i ukupan broj rijeci
  73.  
  74.     struct fileStruktura {
  75.         rijecData *rijeci; // ovo ce biti dinamicko alocirano polje, zasad pokazivac, kasnije cemo alocirati
  76.         unsigned int brojElemenata;
  77.     };
  78.     fileStruktura zapisStruktura;
  79.     zapisStruktura.rijeci = new rijecData[brojElemenata];
  80.     zapisStruktura.brojElemenata = brojElemenata;
  81.    
  82.     for(int i=0;i<brojElemenata;i++) {
  83.         strcpy(zapisStruktura.rijeci[i].rijec, lista->rijec);
  84.         zapisStruktura.rijeci[i].brojPonavljanja = lista->brojPonavljanja;
  85.         zapisStruktura.rijeci[i].redniBroj = lista->redniBroj;
  86.         lista = lista->sljedeciElement;
  87.     }
  88.    
  89.     for (int i = brojElemenata-1; i > 0; i--) {
  90.         for (int j = 0; j < i; j++)
  91.             if (
  92.                 zapisStruktura.rijeci[j].brojPonavljanja < zapisStruktura.rijeci[i].brojPonavljanja ||
  93.                 (zapisStruktura.rijeci[j].brojPonavljanja == zapisStruktura.rijeci[i].brojPonavljanja &&
  94.                 (strcmp(zapisStruktura.rijeci[j].rijec, zapisStruktura.rijeci[i].rijec) == 1))
  95.             ) {
  96.                 rijecData pom = zapisStruktura.rijeci[j];
  97.                 zapisStruktura.rijeci[j] = zapisStruktura.rijeci[i];
  98.                 zapisStruktura.rijeci[i] = pom;
  99.             }
  100.     }
  101.    
  102.     // ako binarna datoteka ne postoji, append ce ju kreirati, ovaj open/close sluzi samo za kreiranje datoteke
  103.     fstream kreiraj("bindat.dat", ios::app);
  104.     kreiraj.close();
  105.    
  106.     // zapisemo cijelu strukturu u binarnu datoteku
  107.     fstream bindat("bindat.dat", ios::binary | ios::out);
  108.     bindat.write((char*)&zapisStruktura, sizeof(zapisStruktura));
  109.     bindat.close();
  110.    
  111.     // ucitamo cijelu strukturu iz datoteke u varijablu "citanjeStruktura"
  112.     fileStruktura citanjeStruktura;
  113.     fstream readdat("bindat.dat", ios::binary | ios::in);
  114.     readdat.read((char*)&citanjeStruktura, sizeof(citanjeStruktura));
  115.     readdat.close();
  116.    
  117.     // sada u varijabli "citanjeStruktura" mozemo pristupiti svim rijecima iz datoteke!!!
  118.     int rednibroj=1;
  119.     for(int i=0;i<citanjeStruktura.brojElemenata;i++) {
  120.         cout << citanjeStruktura.rijeci[i].redniBroj << ". " << citanjeStruktura.rijeci[i].rijec << endl;
  121.     }
  122.     system("PAUSE");
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement