Advertisement
Guest User

ZSR12 Z4

a guest
Feb 17th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void unesi(char niz[],int velicina)
  5. {
  6.     char znak = getchar();
  7.     if(znak == '\n' ) znak = getchar();
  8.     int i;
  9.     for(i=0; i<velicina-1; i++) {
  10.         niz[i]=znak;
  11.  
  12.         znak=getchar();
  13.         if(znak=='\n') {
  14.             i++;
  15.             break;
  16.         }
  17.     }
  18.     niz[i]='\0';
  19. }
  20. int kompresuj(char *dat1,char *dat2)
  21. {
  22.     FILE *unos= fopen(dat1,"r");
  23.     char znak,tmpRijec[50];
  24.     char *p=tmpRijec;
  25.     char rijeci[1000][10]= {'\0'};
  26.     int brojPonavljanja[1000]= {0};
  27.     int brojRijeci=0,i,j,tmp;
  28.     int pronadena;
  29.     int dodatak=1;
  30.     if(!unos) {
  31.         printf("Datoteka %s nije pronadena!",dat1);
  32.         return 0;
  33.     } //da li je datoteka za unos otvorena
  34.     while((znak=fgetc(unos))!=EOF || dodatak) {
  35.         if(znak==EOF) {
  36.             dodatak=0;
  37.         }
  38.         if((znak>='A' && znak<='Z')||(znak>='a' && znak<='z')) {
  39.             *p=znak;
  40.             p++;
  41.         } else {
  42.             *p='\0';
  43.             if(strlen(tmpRijec)<10) {
  44.                 pronadena=0;
  45.                 for(i=0; i<brojRijeci; i++) {
  46.                     if(strcmp(tmpRijec,rijeci[i])==0) {
  47.                         brojPonavljanja[i]++;
  48.                         pronadena=1;
  49.                         break;
  50.                     }
  51.                 }
  52.                 if(pronadena==0 && *tmpRijec!='\0') {
  53.                     strcpy(rijeci[brojRijeci],tmpRijec);
  54.                     brojPonavljanja[brojRijeci]++;
  55.                     brojRijeci++;
  56.                 }
  57.             }
  58.             p=tmpRijec;
  59.         }
  60.  
  61.     } //unos rijeci
  62.  
  63.     for(i=0; i<brojRijeci; i++) {
  64.         for(j=i+1; j<brojRijeci; j++) {
  65.             if(brojPonavljanja[i]<brojPonavljanja[j]) {
  66.                 tmp=brojPonavljanja[i];
  67.                 strcpy(tmpRijec,rijeci[i]);
  68.                 brojPonavljanja[i]=brojPonavljanja[j];
  69.                 strcpy(rijeci[i],rijeci[j]);
  70.                 brojPonavljanja[j]=tmp;
  71.                 strcpy(rijeci[j],tmpRijec);
  72.             } else if(brojPonavljanja[i]==brojPonavljanja[j] && strcmp(rijeci[i],rijeci[j])>0) {
  73.                 tmp=brojPonavljanja[i];
  74.                 strcpy(tmpRijec,rijeci[i]);
  75.                 brojPonavljanja[i]=brojPonavljanja[j];
  76.                 strcpy(rijeci[i],rijeci[j]);
  77.                 brojPonavljanja[j]=tmp;
  78.                 strcpy(rijeci[j],tmpRijec);
  79.             }
  80.         }
  81.     } //sortiranje nizova
  82.     if(brojRijeci>10) brojRijeci=10;
  83.     fseek(unos,0,SEEK_SET);
  84.     FILE *upis=fopen(dat2,"w");
  85.     if(!upis) {
  86.         printf("Doslo je do greske prilokom otvaranja datoteke %s",dat2);
  87.         fclose(unos);
  88.         return 0;
  89.     }
  90.     for(i=0; i<brojRijeci; i++) {
  91.         if(brojPonavljanja[i]!=0) {
  92.             fputs(rijeci[i],upis);
  93.             fputc('\n',upis);
  94.         } else break;
  95.     } //unos tabele
  96.     if(i!=10) fputc('\n',upis);
  97.     p=tmpRijec;
  98.     dodatak=1;
  99.     while((znak=fgetc(unos))!=EOF || dodatak) {
  100.         if(znak==EOF) {
  101.             dodatak=0;
  102.         }
  103.         if((znak>='A' && znak<='Z')||(znak>='a' && znak<='z')) {
  104.             *p=znak;
  105.             p++;
  106.         } else {
  107.             *p='\0';
  108.             if(strlen(tmpRijec)<10) {
  109.                 for(i=0; i<brojRijeci; i++) {
  110.                     if(strcmp(tmpRijec,rijeci[i])==0) {
  111.                         fprintf(upis,"[%d]%c",i+20,znak);
  112.                         break;
  113.                     }
  114.                 }
  115.                 if(i==brojRijeci) fprintf(upis,"%s%c",tmpRijec,znak);
  116.             } else if(*tmpRijec!='\0') {
  117.                 fprintf(upis,"%s ",tmpRijec);
  118.             } else fputc(znak,upis);
  119.             p=tmpRijec;
  120.         }
  121.     }
  122.  
  123.     printf("Datoteka kompresovana.\n");
  124.     fclose(unos);
  125.     fclose(upis);
  126.     return 1;
  127. }
  128. int dekompresuj(char *dat1,char *dat2)
  129. {
  130.     FILE* unos=fopen(dat1,"r");
  131.     if(!unos) {
  132.         printf("Greska: %s",dat1);
  133.         return 0;
  134.     }
  135.     FILE* upis=fopen(dat2,"w");
  136.     if(!upis) {
  137.         printf("Greska: %s",dat2);
  138.         fclose(unos);
  139.         return 0;
  140.     }
  141.     char rijeci[10][10];
  142.     char tmpRijec[10];
  143.     int brojRijeci=0;
  144.     int tmpBroj;
  145.     char znak;
  146.     int i=0;
  147.     while(fgets(rijeci[brojRijeci],10,unos)!=NULL) {
  148.         //fseek(unos,-1,SEEK_CUR);
  149.         //fscanf(unos,"%s\n",tmpRijec);
  150.         //strcpy(rijeci[brojRijeci],tmpRijec);
  151.         if((rijeci[brojRijeci][0]<'A' || rijeci[brojRijeci][0]>'Z') && (rijeci[brojRijeci][0]<'a' || rijeci[brojRijeci][0]>'z')) break;
  152.         brojRijeci++;
  153.  
  154.     }
  155.     for(i=0; i<brojRijeci; i++) {
  156.         rijeci[i][strlen(rijeci[i])-1]='\0';
  157.     }
  158.     while((znak=fgetc(unos))!=EOF) {
  159.         if(znak=='[') {
  160.             fscanf(unos,"%2s]",tmpRijec);
  161.             tmpRijec[2]='\0';
  162.             tmpBroj=atoi(tmpRijec);
  163.             fputs(rijeci[tmpBroj-20],upis);
  164.         } else fputc(znak,upis);
  165.     }
  166.     fclose(upis);
  167.     fclose(unos);
  168.     printf("Datoteka dekompresovana.\n");
  169.     return 1;
  170. }
  171. int main()
  172. {
  173.     int i;
  174.     char datoteka1[100],datoteka2[100];
  175.     do {
  176.         printf("Odaberite: 1 - kompresuj, 2 - dekompresuj, 0 - izlaz: ");
  177.         scanf("%d",&i);
  178.         switch(i) {
  179.         case 1:
  180.             printf("Unesite ime ulazne datoteke: ");
  181.             unesi(datoteka1,100);
  182.             printf("Unesite ime izlazne datoteke: ");
  183.             unesi(datoteka2,100);
  184.             kompresuj(datoteka1,datoteka2);
  185.             break;
  186.         case 2:
  187.             printf("Unesite ime ulazne datoteke: ");
  188.             unesi(datoteka1,100);
  189.             printf("Unesite ime izlazne datoteke: ");
  190.             unesi(datoteka2,100);
  191.             dekompresuj(datoteka1,datoteka2);
  192.             break;
  193.         case 0:
  194.             break;
  195.         }
  196.     } while(i!=0);
  197.         return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement