Advertisement
RiccardoMontagnin

esercizio2_7_5_2015

Jun 20th, 2015
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4.  
  5. /* Funzione di stampa ricorsiva per righe dell'array x */
  6. void stampa(int *x, int dim, ofstream & OUT){
  7.    
  8.     if(dim < 1){
  9.        
  10.         return;
  11.        
  12.     }
  13.    
  14.    
  15.     stampa(x, dim-1, OUT);
  16.  
  17.     OUT << x[dim-1] << " ";
  18.    
  19.     if((dim-1)%4 == 3){
  20.        
  21.         OUT<<endl;
  22.        
  23.     }
  24.    
  25.     OUT<<endl;
  26.    
  27. }
  28.  
  29.  
  30. /* Funzione di compattazione dell'array */
  31.  
  32. //PRE=(x ha dim elementi, 0<dim<=54, 0<=fino<=cur<=dim)
  33. int compatta(int* x, int dim, int z, int fino, int cur){
  34.  
  35.     //Condizioni di uscita
  36.     if(dim<1){      //Se la dimensione è 0 non devo continuare, quindi fino sarà il numero massimo di elementi presenti nell'array compattato
  37.        
  38.         return fino;
  39.        
  40.     }
  41.    
  42.    
  43.     //Elaborazione
  44.     int k;  //Variabile da ritornare
  45.    
  46.     if(x[cur]==z){                      //Se il valore di x[] è uguale a z, non voglio averla nell'array compattato...
  47.        
  48.         k = compatta(x, dim-1, z, fino, cur+1);     //...quindi cerco il prossimo valore di x[] diverso da z, memorizzando su "fino" la cella successiva all'ultima riempita con un valore di x[] diverso da z
  49.        
  50.     }
  51.    
  52.     else{                               //Se invece il valore di x[] è diverso da z, allora lo voglio nell'array compattato, perciò...
  53.        
  54.         x[fino]=x[cur];                             //...lo memorizzo in x[fino] che era la cella successiva a quella all'ultima usata per memorizzare un valore di x[] diverso da x...
  55.         k = compatta(x, dim-1, z, fino+1, cur+1);   //...e cerco il prossimo valore di x[] diverso da z considerando la prossima cella di x[]
  56.  
  57.     }
  58.  
  59.     return k;       //Ritorna la lunghezza massima dell'array compattato
  60.    
  61. }
  62. //POST=(se k è restituito dalla funzione, allora x[fino..(fino+k)-1] contiene gli elementi contenuti in x[cur..dim-1] diversi da z (che sono k))
  63.  
  64.  
  65.  
  66.  
  67. main(){
  68.    
  69.     ifstream IN("input");
  70.     ofstream OUT("output");
  71.     if(IN && OUT){
  72.        
  73.         //Inizializzazione
  74.         int T[3][4][4], dim, z;
  75.        
  76.         IN>>dim;
  77.        
  78.         int* x=**T;
  79.        
  80.         for(int i=0; i<dim;i++){
  81.            
  82.             IN>>x[i];
  83.            
  84.         }
  85.        
  86.         stampa(x, dim, OUT);    //Stampa l'array originario per righe in modo ricorsivo
  87.        
  88.         OUT<<endl;
  89.        
  90.         IN>>z;
  91.    
  92.         int ne = compatta(x, dim, z, 0, 0);     //Compatta l'array eliminando tutti i valori uguali a z
  93.        
  94.         stampa(x, ne, OUT);     //Stampa l'array compattato per righe in modo ricorsivo
  95.        
  96.         OUT<<endl;
  97.        
  98.         OUT<<"fine"<<endl;
  99.        
  100.         IN.close();
  101.         OUT.close();
  102.        
  103.     }
  104.     else{
  105.      
  106.         cout<<"errore con i files";
  107.        
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement