Advertisement
Guest User

2compitino

a guest
Apr 26th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.83 KB | None | 0 0
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct coppia{int salta,prendi; coppia(int a=0,int b=0){salta=a;prendi=b;}};
  6.  
  7. bool F(char* T, char* P, int dimT, int dimP, coppia *X);
  8. int match (char* T, char*P, int dimT, int dimP);
  9. int not_matc(char*T, char x, int dimT);
  10. void stampa(coppia *X);
  11.  
  12. main()
  13. {
  14.   int dimT, dimP;
  15.   char T[400],P[50];
  16.   coppia X[50];
  17.   for(int i=0; i<50; i++)
  18.     X[i]=coppia(-1,-1);
  19.   cin>> dimT>>dimP;
  20.  
  21.   for(int i=0; i<dimT; i++)
  22.     cin>>T[i];
  23.   for(int i=0; i<dimP; i++)
  24.     cin>>P[i];
  25.   cout<<"start"<<endl;
  26.   if(F(T,P,dimT,dimP,X))
  27.     stampa(X);
  28.    else
  29.     cout<<"nessun match completo"<<endl;
  30.   cout<<"end"<<endl;
  31. }
  32.  
  33.   //PRE_F=(T ha dimT elementi definiti e P ne ha dimP, X ha gli elementi che ci servono)
  34. bool F(char* T, char* P, int dimT, int dimP, coppia *X){
  35.     if(dimP<=0)
  36.         return true;
  37.     if(dimT<=0)
  38.         return false;
  39.     X[0].salta = not_matc(T,P[0],dimT);
  40.     X[0].prendi = match(T + X[0].salta,P,dimT - X[0].salta,dimP);
  41.     /*
  42.     PRE_ric_F(T+X[0].salta+X[0].prendi ha dimT-X[0].salta-X[0].prendi elementi definiti
  43.     e P+X[0].prendi ne ha dimP-X[0].prendi, X+1 ha gli elementi che ci servono
  44.     */
  45.     F(T+X[0].salta+X[0].prendi,P+X[0].prendi,dimT-X[0].salta-X[0].prendi,dimP-X[0].prendi,X+1);
  46.     /*
  47.     POST_ric_F: restituisce true sse esiste un match completi (con eventuali buchi) di P+X[0].prendi in
  48.     T+X[0].salta+X[0].prendi e, se il match c'e', X+1 contiene le coppie che corrispondono al match)
  49.     */
  50. }
  51. /*POST_F=(restituisce true sse esiste un match completo (con eventuali buchi) d P in T e, se il match
  52. c’è, X contiene le coppie che corrispondono al match)
  53. */
  54.  
  55. /*
  56.     CORRETTEZZA:
  57.     assumiamo che valga la pre, allora dimostriamo la pre_ric di F.
  58.     Se T nella PRE aveva dimT elementi definiti allora vale che T+X[0].salta+X[0].prendi ha dimT-X[0].salta-X[0].prendi
  59.     elementi definiti. X[0].salta+X[0].prendi sara' sempre piu' piccolo di T quindi la PRE e' OK.
  60.     Inoltre P+X[0].prendi ha dimP-X[0].prendi elementi definiti. X+1 contiene gli elementi precedenti.
  61.    
  62.     Se vale la pre_ric allora vale la post_ric, allora dimostro la post utilizzando la post_ric:
  63.     1)Se dimP<=0 significa che il match e' stato completamente trovato. Quindi ritorno true.
  64.     2)Se dimT<=0 significa che non e' stato trovato un match all'interno di T, quindi ritorno false.
  65.     3)  Salvo in X->salta il numero di lettere da saltare, fino a quando non trovo una corrispondenza con P[0] in T.
  66.         Salvo in X->prendi il numero di lettere uguali fino a quando non se ne trova una di diversa
  67.         Richiamo quindi la funzione F, passando pero' T+le lettere gia' controllate, quindi T+X->prendi+X->salta.
  68.         E quindi anche dimT sara' uguale a dimT-X->prendi-X->salta. Gli passo inoltre P + il numero di lettere
  69.         di P gia' trovate in T. Quindi P+X[0].prendi. La dimensione sara' quindi dimP-X[0].prendi. Poi ovviamente X+1,
  70.         per salvare i nuovi valori nella posizione array +1.
  71.     1 + 2 + 3 --> POST
  72. */
  73.  
  74. //PRE_n=(T ha dimT elementi)
  75. int not_matc(char*T, char x, int dimT){
  76.     if(dimT<=0)
  77.         return 0;
  78.     if(T[0]==x)
  79.         return 0;
  80.     //PRE_n=(T+1 ha dimT-1 elementi)
  81.     return 1 + not_matc(T+1,x,dimT-1);
  82.     //POST_n=(restituisce il numero di elementi di T+1 da saltare per arrivare a trovare x in T+1, partendo da T[1])
  83.  
  84. }
  85. //POST_n=(restituisce il numero di elementi di T da saltare per arrivare a trovare x in T, partendo da T[0])
  86.  
  87. /*
  88.     CORRETTEZZA:
  89.     assumiamo che valga la pre, allora dimostriamo la pre_ric di F.
  90.     Se T nella PRE aveva dimT elementi allora vale che T+1 ha dimT-1 elementi definiti.
  91.    
  92.     Se vale la pre_ric allora vale la post_ric, allora dimostro la post utilizzando la post_ric:
  93.     1) Se dimT<=0 significa che ho finito di controllare l'array T, quindi ritorno la lunghezza trovata.
  94.     2) Se T[0]==x significa che ho trovato una corrispondenza, quindi ritorno il numero di valori diversi.
  95.     3) Richiamo la funzione ogni volta che i valori non corrispondono, quindi una volta che si andra' ai casi base,
  96.     verra' sommato 1 ogni volta che e' stata chiamata la funzione, quindi la lunghezza del not_match.
  97.  
  98. */
  99.  
  100. //PRE_m=( T ha dimT elementi definiti e P ne ha dimP)
  101. int match (char* T, char*P, int dimT, int dimP){
  102.     if(dimT<=0||dimP<=0)
  103.         return 0;
  104.     if(T[0]!=P[0])
  105.         return 0;
  106.      /*
  107.     PRE_m=( T+1 ha dimT-1 elementi definiti e P+1 ne ha dimP-1)
  108.     */
  109.     return 1 + match(T+1,P+1,dimT-1,dimP-1);
  110.     /*
  111.     POST_m=(deve restituire la lunghezza del massimo prefisso di P+1 che matcha a partire da T[1] in
  112.     posizioni contigue, cioè senza buchi)
  113.     */
  114. }
  115. /*
  116. POST_m=(deve restituire la lunghezza del massimo prefisso di P che matcha a partire da T[0] in
  117. posizioni contigue, cioè senza buchi)
  118. */
  119.  
  120. /*
  121.     CORRETTEZZA:
  122.     assumiamo che valga la pre, allora dimostriamo la pre_ric di F.
  123.     Se T nella PRE aveva dimT elementi allora vale che T+1 ha dimT-1 elementi definiti.
  124.     Se P nella PRE aveva dimP elementi allora vale che P+1 ha dimP-1 elementi definiti.
  125.    
  126.     Se vale la pre_ric allora vale la post_ric, allora dimostro la post utilizzando la post_ric:
  127.     1) Se dimT<=0 significa che ho finito di controllare l'array T, quindi ritorno la lunghezza trovata.
  128.     Oppure se dimP<=0 significa che P e' stato scorso completamente, quindi ritorno 0.
  129.     2) Se T[0]!=P[0] significa che ho trovato una non corrispondenza, quindi ritorno il numero di valori uguali.
  130.     3) Richiamo la funzione ogni volta che i valori corrispondono, quindi una volta che si andra' ai casi base,
  131.     verra' sommato 1 ogni volta che e' stata chiamata la funzione, quindi la lunghezza del match.
  132.  
  133. */
  134.  
  135.  
  136.  
  137. void stampa(coppia *X){
  138.    if((*X).salta!=-1){
  139.        cout << "(" << X[0].salta << ',' << X[0].prendi << ") " ;
  140.    }else{
  141.        cout << endl;
  142.        return;
  143.    }
  144.    stampa(X+1);
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement