Stringa palidroma

di il
8 risposte

Stringa palidroma

Ragazzi ho fatto questo programma che una volta inserita una stringa dovrebbe contarmi quante sono palindrome ossia che si leggono allo stesso modo in un modo o nell'altro. Ad esempio se io inserisco la stringa "ada ada ada" il numero di stringhe palindrome sono 3. Nel programma che ho fatto io invece me ne conta solo 2 perchè il mio algoritmo l'ho basato sulla scissione della stringhe in parole singole contando gli spazi rovesciando la parola e mettendole a confronto. Però lo spazio finale se non glielo metto non funziona alla perfezione. Io saprei anche come aggiustarlo il programma facendo un altro if senza la funzione erase e ripetendo le stesse istruzioni ma non mi sembra molto elegante. IL codice è questo:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main ()
{
      
      string str;
      cout << "Stringa: ";
      getline (cin, str);
      int cont = 0; // conta le occorrenze delle parole palindrome
      
      for (int i = 0; i < str.length(); i++)
      {
          string temp = str; 
          
          if (temp[i] == ' ')
          {
              temp.erase(i);
              string s = temp;
              int z = 0;
              
              for (int i = temp.length()-1; i >= 0; i--)
              {
                  s[z] = temp[i];
                  z++; 
              }
              if ( s == temp )
              cont++;
          }
      }
      cout << "Parole palindrome: " << cont;
      cout << endl << endl;
      system ("pause");
      return 0;           
}

8 Risposte

  • Re: Stringa palidroma

    C'è un altro programma che ho fatto e che funziona perfettamente invece. Questo programma chiede di contare il numero di vocali presenti in un frase e la frequenza di ogni vocale. Sto usando sempre la classe string, ma secondo me c'è un modo ancora più sintetico per fare questo programma. Avevo pensato di usare la funzione find di string ma se faccio str.find ("a" || "e" ecc) non funziona..Non mi proponete però le stl che non le devo fare. Il codice è il seguente:
    
    #include <iostream>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    void conta_vocali (const string& str);
    
    int main ()
    {
          
          string str;
          cout << "Stringa: ";
          getline (cin, str);
          cout << endl;
          conta_vocali(str);
    
          cout << endl << endl;
          system ("pause");
          return 0;           
    }
    
    void conta_vocali (const string& str)
    {
          int cont = 0;
          int fa = 0;
          int fe = 0;
          int fi = 0;
          int fo = 0;
          int fu = 0;
          
          for (int i=0; i<str.length(); i++)
          {
              if (str[i] == 'A' || str[i] == 'a')
              {
                         cont++;
                         fa++;
              }
              if (str[i] == 'E' || str[i] == 'e')
              {
                         cont++;
                         fe++;
              }
              if (str[i] == 'I' || str[i] == 'i')
              {
                         cont++;
                         fi++;
              }
              if (str[i] == 'O' || str[i] == 'o')
              {
                         cont++;
                         fo++;
              }
              if (str[i] == 'U' || str[i] == 'u')
              {
                         cont++;
                         fu++;
              }
          }
          
          cout << "Totale vocale A = " << fa << endl;
          cout << "Totale vocale E = " << fe << endl;
          cout << "Totale vocale I = " << fi << endl;
          cout << "Totale vocale O = " << fo << endl;
          cout << "Totale vocale U = " << fu << endl;
          cout << "Totale vocali presenti: " << cont;
    }
    
  • Re: Stringa palidroma


    Ciao,
    analizzando il tuo codice è abbastanza evidente che il problema è sulla ricerca dello spazio. .
    Giusto per prova aggiungi un spazio alla stringa da immettere e vedi che funziona.
    Invece di: "ada ada ada" scrivi: "ada ada ada "...
    Secondo me ti conviene rivedere la logica del programma oppure in modo brutale aggiungere uno spazio in coda dopo la lettura della stringa; ma sono certo che non perseguirai questa linea di condotta .
  • Re: Stringa palidroma


    Ciao,
    inizierei con:
    - l'utilizzare un bellissimo array monodimensionale (vettore) invece di 5 variabili
    - invece di leggere il carattere dalla stringa così: str, utilizzerei: str.at(i)
    - invece di fare il doppio confronto con le vocali maiuscole e minuscole (che contano sempre per 1) inizierei col convertire subito la stringa letta in minuscolo (ad esempio)
    - invece di usare una catena di if userei uno switch.
    ... che ne dici delle proposte!!!!!
  • Re: Stringa palidroma

    JollyJoker ha scritto:



    Ciao,
    analizzando il tuo codice è abbastanza evidente che il problema è sulla ricerca dello spazio. .
    Giusto per prova aggiungi un spazio alla stringa da immettere e vedi che funziona.
    Invece di: "ada ada ada" scrivi: "ada ada ada "...
    Secondo me ti conviene rivedere la logica del programma oppure in modo brutale aggiungere uno spazio in coda dopo la lettura della stringa; ma sono certo che non perseguirai questa linea di condotta .
    Ovviamente se metto lo spazio il programma funziona perfettamente, ma è una forzatura. Ci deve essere qualche condizione che mi permetta di isolare l'ultima parola e di vedere se è palindroma o meno.
  • Re: Stringa palidroma

    JollyJoker ha scritto:



    Ciao,
    inizierei con:
    - l'utilizzare un bellissimo array monodimensionale (vettore) invece di 5 variabili
    - invece di leggere il carattere dalla stringa così: str, utilizzerei: str.at(i)
    - invece di fare il doppio confronto con le vocali maiuscole e minuscole (che contano sempre per 1) inizierei col convertire subito la stringa letta in minuscolo (ad esempio)
    - invece di usare una catena di if userei uno switch.
    ... che ne dici delle proposte!!!!!

    L'ho aggiustato un poco ma non mi convince. Questo programma si potrebbe fare in due righe, ed io lo trovo ancora troppo prolisso anche se corretto. Skynet fatti vivo...
    
    #include <iostream>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    void conta_vocali (string& str);
    
    int main ()
    {
          
          string str;
          cout << "Stringa: ";
          getline (cin, str);
          cout << endl;
          conta_vocali(str);
    
          cout << endl << endl;
          system ("pause");
          return 0;           
    }
    
    void conta_vocali (string& str)
    {
          int cont = 0;
          int fa = 0;
          int fe = 0;
          int fi = 0;
          int fo = 0;
          int fu = 0;
          
          for (int i=0; i<str.length(); i++)
          {
              str[i] = tolower(str[i]);
              if (str[i] == 'a')
              {
                         cont++;
                         fa++;
              }
              if (str[i] == 'e')
              {
                         cont++;
                         fe++;
              }
              if (str[i] == 'i' )
              {
                         cont++;
                         fi++;
              }
              if (str[i] == 'o')
              {
                         cont++;
                         fo++;
              }
              if (str[i] == 'u')
              {
                         cont++;
                         fu++;
              }
          }
          
          cout << "Totale vocale A = " << fa << endl;
          cout << "Totale vocale E = " << fe << endl;
          cout << "Totale vocale I = " << fi << endl;
          cout << "Totale vocale O = " << fo << endl;
          cout << "Totale vocale U = " << fu << endl;
          cout << "Totale vocali presenti: " << cont;
    }
    
  • Re: Stringa palidroma


    Ciao, ad esempio potresti ricercare il fine stringa invece dello spazio.
    Quando sei giunto alla fine della stringa (ed ovviamente non trovi altri spazi) puoi estrarre la sottostringa che va dall'ultimo spazio sino alla fine della stringa letta.
    ------
    Per il secondo programma prova con le modifiche proposte vedrai che divertente e che chiarezza di codice.
  • Re: Stringa palidroma

    Questa ti va bene?
    
    #include <iostream>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    const string vocali = "aeiou";
    
    bool is_vocale(const char & val)
    {
    	return vocali.find(val) != std::string::npos;
    }
    
    int conta_lettere(string & str, const char & val)
    {
    	return std::count(str.begin(),str.end(),val);
    }
    
    void conta_vocali (string& str);
    
    int main ()
    {
    
    	string str;
    	cout << "Stringa: ";
    	getline (cin, str);
    	cout << endl;
    	conta_vocali(str);
    
    	cout << endl << endl;
    	system ("pause");
    	return 0;           
    }
    
    void conta_vocali (string& str)
    {
    	std::transform(str.begin(),str.end(),str.begin(),tolower);
    
    	cout << "Totale vocale A = " << conta_lettere(str,'a') << endl;
    	cout << "Totale vocale E = " << conta_lettere(str,'e') << endl;
    	cout << "Totale vocale I = " << conta_lettere(str,'i') << endl;
    	cout << "Totale vocale O = " << conta_lettere(str,'o') << endl;
    	cout << "Totale vocale U = " << conta_lettere(str,'u') << endl;
    	cout << "Totale vocali presenti: " << (int)std::count_if(str.begin(),str.end(),is_vocale);
    }
    
    
  • Re: Stringa palidroma

    Stringhe palindrome
    
    #include <iostream>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    bool is_palindrome(const string & str)
    {
    	std::string sReverse(str);
    	std::reverse(sReverse.begin(), sReverse.end());
    	return str == sReverse;  
    }
    
    int main ()
    {
    
    	string str;
    	cout << "Stringa: ";
    	getline (cin, str);
    	int cont = 0; // conta le occorrenze delle parole palindrome
    	size_t last = 0;
    	size_t pos = 0;
    	while((pos = str.find(' ',last)) != std::string::npos)
    	{
    		if(is_palindrome(str.substr(last,pos - last)))
    			cont++;
    		last = pos + 1;
    	}
    
    	if(is_palindrome(str.substr(last)))
    		cont++;
    
    	cout << "Parole palindrome: " << cont;
    	cout << endl << endl;
    	system ("pause");
    	return 0;           
    }
    
Devi accedere o registrarti per scrivere nel forum
8 risposte