SamuelKostadinov

Es a tempo 2 Filè

Mar 21st, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.06 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. //PRE: gli array i parametri p, w, n, p2, nP sono definiti
  5.  
  6. bool trova(int * p,int w, int n, int * p2,int nP){
  7.  
  8.     if((w + nP) < n){
  9.         for(int i = 0; i < nP; i++){//(0<= i <= 4) && (ritorna false se non c'è match)
  10.             if(*(p + i) != *(p2 + i)){
  11.                 return false;
  12.             }
  13.         }
  14.         return true;
  15.     }
  16.     return false;
  17.  
  18. }
  19.  
  20. //POST: ritorna vero sse trova un match
  21.  
  22. /*
  23.  
  24.     La funzione consiste in un if, con all'interno un for che a sua volta all'interno ha un if.
  25.     Il primo if funziona come guardia, infatti non devo controllare gli elementi gli ultimi elementi se non sono in numero abbastanza alto,
  26.     infatti se per esempio ci fossero 23 elementi non potrei esaminare gli nP elementi successivi al 22° in quanto non sarebbero stati valorizzati
  27.     (anche se potrebbero essere a tutti gli effetti elementi dell'array). Questo controllo è stato fatto sfruttando il passaggio di parametri
  28.     della funzione e passando per valore sia il numero di elementi totali , sia il numero di elementi da esaminare sia l'indice dell'elemento
  29.     corrente, parametri tutti passati per valore. Nel caso in cui ci si trovasse in questa situazione la funzione restituirebbe come valore
  30.     false in quanto non ci può essere un match. Nel caso in cui si entrasse nel ramo then dell'else invece si entrerebbe in
  31.     un ciclo for con una variabile contatore inizializzata a 0 e inferiore a nP (perchè valore guardia del ciclo;
  32.     nP è il numero di valori inseriti nell'array P e viene passato per valore come parametro alla funzione) che confronta il primo elemento
  33.     dell'array X con il primo elemento dell'array P (a cui si può accedere grazie ai puntatoti passati per valore come parametri).
  34.     Nel caso in cui i 2 numeri non fossero uguali la funzione restituirebbe false in quanto non ci sarebbe stato un match,
  35.     mentre se i valori confrontati sono tutti uguali si esce dal ciclo for e la funzione restituisce true.
  36.  
  37. */
  38.  
  39.  
  40. int main()//PRE: I valori che verranno dati in input in X, n_ele, nP, P, lim1, lim2, lim3 sono definiti  e lim1*lim2*lim3 <= 400
  41. {
  42.   int X[400], n_ele, nP, P[20];
  43.   cin>> n_ele;
  44.   for(int i=0; i<n_ele; i++){
  45.     cin >> X[i];
  46.   }
  47.   int lim1,lim2,lim3;
  48.   cin>> lim1>>lim2>>lim3;
  49.   cin >> nP;
  50.   for(int i=0; i<nP; i++){
  51.     cin>>P[i];  
  52.   }
  53.   cout<<"start"<<endl;
  54.  
  55.   int strato = 0;
  56.   int strati = n_ele / lim1;
  57.   int el1 = n_ele % lim1;
  58.   int righe = el1 / lim2;
  59.   int el2 = el1 % lim2;
  60.  
  61.   int * p = X;
  62.   int i;
  63.   bool match = false;
  64.   int w = 0;
  65.  
  66.   for(i = 0; i < lim1; i++){//(0<= i <= lim1) && (esaminati i strati completi) && (match == true sse è stato trovato un match di P)
  67.       for(int j = 0; j < lim2; j++){//(0<= j <= lim2) && (esaminate j righe complete) && (match == true sse è stato trovato un match di P)
  68.           for(int k = 0; k < lim3; k++){//(0<= k <= lim3) && (esaminati k elementi della riga di indice j) && (match == true sse è stato trovato un match di P)
  69.               int * p2 = P;
  70.               if(!match){
  71.                   match = trova(p + w, w, n_ele, p2, nP);
  72.                   strato = i;
  73.                   w++;
  74.               }
  75.              
  76.           }
  77.       }
  78.   }
  79.  
  80.   /*
  81.        
  82.         Il 3 cicli hanno le variabili contatore (i, j, k) che vengono sempre inizializzate a 0 e mai decrementate, pertanto saranno sempre maggiori
  83.         o al massimo uguali a zero. Inoltre non saranno mai maggiori dei valori di guardia dei rispettivi cicli (lim1, lim2, lim3).
  84.         Una volta entrato nel primo ciclo il programma entra subito nel secondo e analogamente entra nel terzo subito dopo essere entrato nel
  85.         secondo che dichiara una variabile puntatore e la inizializza con l'indirizzo del primo elemento dell'array P.
  86.         A questo punto con un controllo su una variabile booleana decido se chiamare la funzione. La variabile booleana match funziona da guardia,
  87.         visto che devo stampare solo il primo match se ne ho già trovato uno non richiamo la funzione. La funzione trova restituisce un valore
  88.         booleano, cioè true se trova un match o false se non lo trova. Salvo poi lo l'indice dello strato che sto esaminando, visto che l'ultima
  89.         che il programma entra nel ramo then dell'if la variabile match avrà valore true e sarà quando la funzione troverà la prima occorrenza del
  90.         target e quindi lo strato salvato sarà anche quello che presenta il primo match. Infine aumento il contatore dell'elemento corrente in modo
  91.         da poterlo passare come parametro della funzione in caso non sia stato trovato un match.
  92.         Per come sono strutturati i cicli for il contatore i aumenterà solo quando sarà stato esaminato l'intero "strato" corrente, il contatore j
  93.         solo quando sarà esaminata l'intera "riga" corrente e k solo quando sarà stato esaminato l'elemento corrente.
  94.        
  95.   */
  96.  
  97.  if(match){
  98.      cout<<"lo strato "<<strato<<" di T contiene un match"<<endl;
  99.  }else{
  100.      cout<<"Nessun match trovato"<<endl;
  101.  }
  102.  
  103.  
  104.  
  105.   cout<<"end"<<endl;
  106.  
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment