Advertisement
Mazamin

Traccia 3 2015

Jan 16th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1. /*
  2.  PROVA PRATICA DI FONDAMENTI DI INFORMATICA
  3.  
  4.  Si scriva un programma C il quale, lette da un file un insieme di sequenze di caratteri in formato
  5.  compresso o non compresso, nel primo caso espande le sequenze, mentre nel secondo le comprime.
  6.  
  7.  Ad esempio, la sequenza non compressa aaabaaaaccccc verra' compressa in 3a1b4a5c, mentre la sequenza
  8.  compressa 7v5c2b verra' espansa in vvvvvvvcccccbb.
  9.  
  10.  Si assuma che
  11.  a) ogni riga del file contenga una ed una sola sequenza da comprimere o decomprimere;
  12.  b) la scelta di comprimere o decomprimere sia demandata all'utente che conosce a priori l'operazione
  13.     corretta da effettuare.
  14.  
  15.  Il candidato implementi le funzioni mancanti, secondo le modalità descritte nel commento
  16.  alle funzioni e rispettando i vincoli di progetto.
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <math.h>
  24.  
  25. /* Costanti */
  26. #define MAXSEQ 100
  27. #define NCAR 100
  28.  
  29. /* Prototipi */
  30. FILE *ApriFile(char *);
  31. int Leggi_Sequenze(FILE *, char [][NCAR]);
  32. void Comprimi(char [][NCAR], char [][NCAR], int);
  33. void Decomprimi(char [][NCAR], char [][NCAR], int);
  34. void Stampa_Risultato(FILE *, char [][NCAR], int);
  35. void Stampa(char [][NCAR], int);
  36.  
  37. /* Funzione Main */
  38. int main ()
  39. {
  40.     FILE *fpin, *fpout;
  41.     char scelta, sequenze[MAXSEQ][NCAR], zip_unzip[MAXSEQ][NCAR];
  42.     int n;
  43.    
  44.     do{
  45.         printf("Scegli cosa fare:\n");
  46.         printf("c - Comprimere:\n");
  47.         printf("d - Decomprimere:\n");
  48.         scanf("%c", &scelta);
  49.         getchar();
  50.     } while (scelta != 'c' && scelta != 'd');
  51.    
  52.     if( scelta == 'c' ) {
  53.         fpin = ApriFile("r");
  54.    
  55.         if((n = Leggi_Sequenze(fpin, sequenze)) == 0 ) {
  56.             printf("Nessuna operazione da effettuare.\n");
  57.             return EXIT_SUCCESS;
  58.         }
  59.         Stampa(sequenze, n);
  60.        
  61.         Comprimi(sequenze, zip_unzip, n);
  62.         Stampa(zip_unzip, n);
  63.    
  64.         fclose(fpin);
  65.     }
  66.     else {
  67.         fpin = ApriFile("r");
  68.        
  69.         if((n = Leggi_Sequenze(fpin, sequenze)) == 0 ) {
  70.             printf("Nessuna operazione da effettuare.\n");
  71.             return EXIT_SUCCESS;
  72.         }
  73.         Stampa(sequenze, n);
  74.        
  75.         Decomprimi(sequenze, zip_unzip, n);
  76.         Stampa(zip_unzip, n);
  77.        
  78.         fclose(fpin);
  79.     }
  80.    
  81.     fpout = ApriFile("w");
  82.    
  83.     Stampa_Risultato(fpout, zip_unzip, n);
  84.    
  85.     fclose(fpout);
  86.    
  87.     return EXIT_SUCCESS;
  88. }
  89.  
  90. /*
  91.  La funzione ApriFile apre il file il cu nome e' specificato
  92.  dall'utente nella modilità specificata dal parametro formale mode
  93.  e ritorna il puntatore al file
  94.  */
  95. FILE *ApriFile(char* mode)
  96. {
  97.     char nome_file[NCAR];
  98.     FILE *fptr;
  99.    
  100.     printf("Inserire nome file: ");
  101.     scanf("%s", nome_file);
  102.     if((fptr = fopen(nome_file, mode)) == NULL) {
  103.         printf("Errore apertura file %s.\n", nome_file);
  104.         exit(EXIT_FAILURE);
  105.     }
  106.    
  107.     return fptr;
  108. }
  109.  
  110. /*
  111.  La funzione Leggi_Sequenze prende in ingresso il puntatore al file
  112.  di dati in input e la matrice di caratteri destinata a contenere le sequenze
  113.  da immagazzinare. Legge le sequenze e restituisce il numero di sequenze lette.
  114. */
  115. int Leggi_Sequenze(FILE *fpin, char str[][NCAR])
  116. {
  117.     int i=0;
  118.     while(feof(fpin)==0)
  119.         fscanf(fpin, "%s", str[i++]);
  120.     return i;
  121. }
  122.  
  123. /*
  124.  La funzione Comprimi prende in ingresso la matrice di char contenente le sequeze da comprimere,
  125.  la matrice di sequenze compresse e il loro numero. Comprime le sequenze, secondo le modalita'
  126.  descritte, immagazzinandole nella corrispondente matrice di char
  127.  */
  128. void Comprimi(char str[][NCAR], char zip[][NCAR], int n)
  129. {
  130.     int i, j, times;
  131.     char temp[NCAR];
  132.     for(i=0;i<n;i++)
  133.         for(j=0;j<strlen(str[i]);j++){
  134.             times=1;
  135.             while(str[i][j]==str[i][j+1]){
  136.                 times++;
  137.                 j++;
  138.             }
  139.             sprintf(temp, "%d%c", times, str[i][j]);
  140.             strcat(zip[i], temp);
  141.         }
  142. }
  143.  
  144. /*
  145.  La funzione Decomprimi prende in ingresso la matrice di char contenente le sequeze da decomprimere,
  146.  la matrice di sequenze decompresse e il loro numero. Decomprime le sequenze, secondo le modalita'
  147.  descritte, immagazzinandole nella corrispondente matrice di char
  148.  */
  149. void Decomprimi(char str[][NCAR], char unzip[][NCAR], int n)
  150. {
  151.     int i, j, k;
  152.     char temp[NCAR];
  153.     for(i=0;i<n;i++)
  154.         for(j=0;j<strlen(str[i]);j+=2){
  155.             for(k=0;k<str[i][j]-'0';k++)
  156.                 temp[k]=str[i][j+1];
  157.             temp[k]='\0';
  158.             strcat(unzip[i], temp);
  159.         }
  160. }
  161.  
  162. /*
  163.  La funzione Stampa_Operazioni prende in ingresso la matrice di char contenente le sequenze
  164.  e il loro numero. Stampa a video le sequenze.
  165.  */
  166. void Stampa(char str[][NCAR], int n)
  167. {
  168.     int i;
  169.    
  170.     for(i = 0; i < n; i++)
  171.         printf("%s\n", str[i]);
  172. }
  173.  
  174. /*
  175.  La funzione Stampa_Risultato prende in ingresso il puntatore al file di output,
  176.  la matrice di char contenete le sequenze e il loro numero.
  177.  Stampa le sequenze nel file di output.
  178.  */
  179. void Stampa_Risultato(FILE *fp, char str[][NCAR], int n)
  180. {
  181.     int i;
  182.    
  183.     for(i = 0; i < n; i++)
  184.         fprintf(fp, "%s\n", str[i]);
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement