Sottostringhe tra due array

di il
1 risposte

Sottostringhe tra due array

Vorrei scrivere una funzione c++ che dati due array di stringhe s1 e s2, restituisce true se le stringhe di s1 sono sottostringhe di s2 nella medesima posizione dell'array.
per farvi un esempio
ecco il mio programma
gli array di stringhe li ho inizializzati io
restituisce true e in questo caso va bene ma lo fa anche se vado a cambiare le stringhe dei due array

//true se le stringhe di s1 sono sottostringhe delle stringhe di s2 nella medesima posizione
#include<iostream>
#include<string>
using namespace std;
const int N=4;
bool sottostringa(string, string);
bool funzione(string [N],string [N]);
int main()
{
    string s1[N]={"giorno","maschio","ladro","aglio"};
    string s2[N]={"buongiorno","maschione","ladrona","sbaraglio"};

    if(!funzione)
    cout<<"NON ";

    cout<<" E' VERIFICATA LA CONDIZIONE DELL'ESERCIZIO"<<endl;

return 0;
}

bool sottostringa(string x,string y)
{
    int lx=x.length();
    int ly=y.length();
    bool test=false;
    for(int i=0;i<=(ly-lx) && !test;i++)
    {
        if(y.substr(i,lx)==x){
        test=true;
        }
    }
return test;
}

bool funzione(string s1[N],string s2[N])
{
    bool condizione=false;
    for(int i=0;i<N && !condizione;i++)
    {
        for(int j=0;j<N && !condizione;j++)
        {
            if(sottostringa(s1[i],s2[j]) && i==j)
            condizione=true;
        }
    }
return condizione;
}

1 Risposte

  • Re: Sottostringhe tra due array

    C' erano diverse cose sbagliate:
    if(!funzione)
     cout<<"NON ";
    ti sei dimenticato di inserire gli array di stringhe come parametri della funzione.

    Nella funzione funzione non c'è bisogno di utilizzare due cicli for, ma ne basta uno se il ciclo lo fai in questo modo:
    for(int j=0; j<N ;j++)
      {
         if(sottostringa(s1[j], s2[j])) 
         ......
        }
    inoltre è sbagliato il modo in cui utilizzi l' istruzione if:
    if(sottostringa(s1[i],s2[j]) && i==j)
     condizione=true;
    devi sfruttare una variabile contatore che tiene conto del numero di volte che la funzione sottostringa ritorna true, facendo in questo modo:
    int contatore=0;
     for(int j=0; j<N ;j++)
       {
         if(sottostringa(s1[j], s2[j])) 
         contatore++;
        }
    
      if(contatore==N)
      condizione=true;
    Mentre nella funzione sottostringa non c'è bisogno di utilizzare questo ciclo for:
    for(int i=0;i<=(ly-lx) && !test;i++)
        {
            if(y.substr(i,lx)==x){
            test=true;
            }
        }  
    ma basta usare una istruzione if in questo modo:
    bool test=false;
    if(y.substr(0,lx)==x || y.substr(ly-lx,lx)==x)
     test=true;
    Pertanto il programma corretto è il seguente:
    #include<iostream>
    #include<string>
    using namespace std;
    const int N=4;
    bool sottostringa(string, string);
    bool funzione(string [N],string [N]);
    int main()
    {
      string s1[N]={"giorno","maschio","ladro","aglio"};
      string s2[N]={"buongiorno","maschione","ladrona","sbaraglio"};
    
      if(!funzione(s1, s2))
       cout<<"NON ";
    
      cout<<" E' VERIFICATA LA CONDIZIONE DELL'ESERCIZIO"<<endl;
      return 0;
    }
    
    bool sottostringa(string x,string y)
    {
      int lx=x.length();
      int ly=y.length();
      bool test=false;
      if(y.substr(0,lx)==x || y.substr(ly-lx,lx)==x)
      test=true;
      return test;
    }
    
    bool funzione(string s1[N], string s2[N])
    {
      bool condizione=false;
      int contatore=0;
      for(int j=0; j<N ;j++)
       {
         if(sottostringa(s1[j], s2[j])) 
         contatore++;
        }
    
      if(contatore==N)
      condizione=true;
      return condizione;
    }
    
    Matteo
Devi accedere o registrarti per scrivere nel forum
1 risposte