Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.23 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. unsigned int convert(char *hodnota)//funkce, ktera pretypuje N (vstup char a vystup unsigned int
  7. {
  8. unsigned int cislo=0,preteceni=0;
  9. unsigned int i=0;
  10. while(hodnota[i]!='\0')
  11.   {
  12.   if (hodnota[i]<='0' && hodnota[i]>'9') //osetreni, ze N je cislo (osetreni i pro to, ze cilo je kladne)
  13.     {
  14.     return 0;
  15.     }
  16.   hodnota[i]=hodnota[i]-'0';    //zaskani presne hodnoty cisla z nejake ascii hodnoty
  17.  
  18.   preteceni=cislo;
  19.   cislo=cislo*10;
  20.   cislo=cislo+hodnota[i]; //pokud uz proslo pripocte k 10tinasobku predchoziho cila prave nastene cislo
  21.   i++;
  22.   if(preteceni>cislo)   //doslo k preteceni - jednicka vypadla ven a jede se od nuly   
  23.     {
  24.     return 0;       //kdyz vrati nulu - doslo k chybe (zde z duvodu preteceni)
  25.     }
  26.   }  
  27. return cislo;
  28. }
  29.  
  30.  
  31. /*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
  32. /*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
  33. /*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
  34. /*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
  35. /*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
  36. /*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
  37.  
  38.  
  39. int komprimace(unsigned int N)
  40. {
  41. printf("Komprimace %d \n",N);
  42.  
  43. char *buffer1 = malloc((N+1) * sizeof(char));//definice bufferu a jejich dynamické alokování
  44.  
  45. if(buffer1==NULL)
  46. {
  47. return 1;
  48. }
  49.  
  50. char *buffer2 = malloc((N+1) * sizeof(char));
  51.  
  52. if (buffer2==NULL)
  53. {
  54. free(buffer1);
  55. return 1;
  56. }
  57. memset(buffer1, 0, (N+1) * sizeof(char));
  58. memset(buffer2, 0, (N+1) * sizeof(char));
  59. printf("memtest probehl vporadku\n");
  60.  
  61. unsigned int i=0,pocet=1,proslo=0; //vlozeni pomocnych promenych (pocet je promena, do ktere se bude vkladat pocet shodujicich se blokù znakù)
  62. char c=0;
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. while((c = getchar()) != EOF)
  71.   {
  72.  if (isblank(c)!= 0)
  73.   {
  74.   unsigned int k=0, l=0;
  75.   printf("Je tam mezera\n");
  76.   while(k < N)
  77.       {
  78.       putchar (buffer1[l%N]);
  79.       k++;
  80.       l++;
  81.       while((k>=N) && k < (2 * (N-1)))
  82.         {
  83.         putchar (buffer2[l%N]);
  84.         k++;
  85.     l++;
  86.         }
  87.       }
  88. memset(buffer1, 0, (N+1) * sizeof(char));
  89. memset(buffer2, 0, (N+1) * sizeof(char));
  90. i=0;
  91.   }
  92.  
  93.  
  94.     if(i < N)               //prvotní nacteni do bufferu ze vstupu
  95.       {
  96.       buffer1[i%N] = c;
  97.       i++;
  98.       }
  99.       else if(i < 2 * N)
  100.         {
  101.         buffer2[i%N] = c;
  102.         i++;
  103.     printf("prvotni nacteni do bufferu probehlo\n");
  104.         }
  105.  
  106.  
  107.  
  108. while(strcmp(buffer1, buffer2) == '0')        //porovnani buffer (jestli se bloky neopakuji
  109.   {
  110.   printf("Buffery se rovnají\n");
  111.   proslo=1;
  112.   pocet++;                                  //pokud se tovnaji naèti do bufferu 2 dalsi blok znakù a znovu skoc na provnavani
  113.   printf("rovnaji se %d \n",N);
  114.   unsigned int ochrana=0;
  115.   while((c=getchar())!= EOF && ochrana!=N)
  116.     {
  117.     ochrana++;
  118.     i++;
  119.     buffer2[i%N]=c;
  120.     }
  121.   }
  122.  
  123. if(proslo==1){
  124.  putchar(pocet);
  125.   for (unsigned int misto=0;misto<N;misto++)
  126.     {
  127.     putchar(buffer1[misto%N]);
  128.     }
  129.   proslo=0;
  130.   }
  131.  
  132. if(buffer2[N-1]!=0)  
  133. {
  134.     unsigned int j=0;
  135.     putchar(buffer1[j%N]);
  136.  
  137.     while(j<(N-1))
  138.       {
  139.       buffer1[j%N]=buffer1[(j+1)%N];
  140.       j++;
  141.       }  
  142.  
  143.     while(j==(N-1))
  144.       {
  145.       buffer1[j%N]=buffer2[(j+1)%N];     // PRESUNUTI PRVNIHO ZNAKU Z BUFFERU2 NA POSLEDNI ZNAK BUFFERU 1
  146.             j++;      
  147.       }
  148.  
  149.     while ((j>(N-1)) && (j<((2*N)-1)))
  150.       {
  151.       buffer2[j%N]=buffer2[(j+1)%N];
  152.       j++;
  153.       }
  154.        
  155.        
  156.  
  157. }
  158. }
  159. return 0;
  160. }
  161.  
  162.  
  163.  
  164.  
  165. int main(int argc, char *argv[])
  166. {
  167. unsigned int N=(convert(argv[1]));
  168. komprimace(N);
  169. return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement