Frase palindroma

di il
18 risposte

Frase palindroma

Salve a tutti, l'esercizio mi chiede di leggere da input una parola di max 30 caratteri e determinare se è palindroma

Ho scritto il listato e ve lo posto

#include <string>
#include <iostream>

using namespace std;

int main()
{
cout << "*** programmma che inserita una parola di max 30 caratteri, " << endl;
cout << " determina se la stessa e\' palindroma" << endl << endl;
string parola;
int conta=0;
cout << " inserisci la parola " << endl << endl;
getline(cin,parola);
for (int i=0; i<parola.size();i++)
{
for (int j=parola.size(); j>0; j--)
{
while (parola.at(i)==parola.at(j))
{
i++;
conta++;
}
}
}
if (conta >= (parola.size())/2)
cout << " la parola e\' palindroma " << endl << endl;
else
cout << " la parola non e\' palindroma " << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Tuttavia non funziona perchè il compilatore non vede di buon occhio il fatto che punto l'elemento nella posizione parola.size(), infatti se punto il precedente la cosa gli sta bene, tuttavia non capisco il motivo di questa sua impossibilità.

Sicuramente ci sarà qualche metodo già dedicato ma vi prego di aiutarmi x riuscire in quello che ho costruito io sennò e come nn avessi imparato nulla...

Grazie come sempre

18 Risposte

  • Re: Frase palindroma

    Parola.size() non è posizione valida. size()-1 si.
    esempio stringa = "prova"
    size() = 5

    prova[5] non esite.
  • Re: Frase palindroma

    Sì infatti ho messo size-1 però mi sa che sto usando un modo di affrontare l'algoritmo sbagliato....

    Pensavo di puntare con gli indici la prima e l'ultima lettera della parola, quindi se uguali incrementare un contatore e passare rispettivamente a seconda e penultima lettera.

    quando avevo scandito tutta la parola se conta è aumentato di un numero di volte superiore alla metà della lunghezza della parola, la stessa dovrebbe essere palindroma....

    Skynet a prima vista in cosa fallisce il listato??
  • Re: Frase palindroma

    L'algoritmo fallisce perche fai dei for annidati. viene eseguito il ciclo interno poi quello esterno.Una cosa così sarebbe + giusta
    
    for(i = 0, j = parola.size()-1; i !=j ; i++, j--)
    {
       if(parola[i] != parola[j])
              break;
    }
    
    if(i != j)
    //non palindroma
    else
    //si
    
  • Re: Frase palindroma

    Come logica sembra buona, ma il compilatore lo rigetta, perchè non accetta la dichiarazione di 2 puntatori consecutivi. Hai provato a farlo girare?
  • Re: Frase palindroma

    Io si, tu?
    
    int main()
    {    
    	int i = 0;
    	int j = 0;
    
    	std::string parola = "prova";
    
    	for(i = 0, j = parola.size()-1; i !=j ; i++, j--)
    	{
    		if(parola[i] != parola[j])
    			break;
    	}
    
    
    	return 0;
    }
    
  • Re: Frase palindroma

    Ho usato il tuo codice aggiungendo le istruzioni per interagire da video

    #include <iostream>
    #include <string>

    using namespace std;


    int main()
    {
    int i = 0;
    int j = 0;

    string parola;
    cout << " scrivi ";
    getline (cin,parola);

    for(i = 0, j = parola.size()-1; i !=j ; i++, j--)
    {
    if(parola != parola[j])
    break;
    }
    if(i != j)
    cout << " la parola e\' palindroma " << endl;
    else
    cout << " la parola non e\' palindroma " << endl ;

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    funziona per il compilatore ma non fa quanto richiesto o meglio per lui è sempre palindroma, forse c'è qualcosa che nn va ancora...
  • Re: Frase palindroma

    Infatti bisogna cambiare l'if da i != j a i >= j e dentro il for da i != j a i < j
    
    int main()
    {
    	int i = 0;
    	int j = 0;
    
    	string parola;
    	cout << " scrivi ";
    	getline (cin,parola);
    
    	for(i = 0, j = parola.size()-1; i < j ; i++, j--)
    	{
    		if(parola[i] != parola[j])
    			break;
    	}
    	if(i >= j)
    		cout << " la parola e\' palindroma " << endl;
    	else
    		cout << " la parola non e\' palindroma " << endl ;
    
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    
  • Re: Frase palindroma

    Chapeau skynet

    ascolta giusto x passare di palo in frasca, mi sembra smanettando con il compilatore che il ciclo switch ... case non possa essere usato per confrontare una stringa con un vettore di stringhe, è così??

    se usato su una stringa e su un char funziona così come funziona con gli interi, ora volevo capire se lo uso male io o se è davvero così....
  • Re: Frase palindroma

    Ciao il costrutto <switch-case> non serve per fare i cicli, ma per le decisioni multiple... a sostituzione di sequenze di <if> per rendere più leggibile il codice.
    Per quanto riguarda i confronti, non puoi usarlo per comparare stringhe e array ma per tipi di dati uguali... stringhe con stringhe, ecc.
  • Re: Frase palindroma

    In pratica volevo usarlo per confrontare una stringa che contiene il nome di un mese con un vector <string> che contiene i vari mesi pensi sia possibile come accostamento?
  • Re: Frase palindroma

    Ciao, non stiamo parlando più della problematica della frase palindroma giusto?
    Come ti dicevo puoi usarlo solo per tipi di dati uguali, cmq se ho capito bene quello che vuoi fare potresti fare un semplice ciclo <for> che scandisce gli elementi del vettore mesi.
    All'interno del ciclo puoi inserire una semplice condizione <if> tra la stringa da controllare e l'elemento del vettore di indice corrente (mi riferisco all'indice del ciclo <for>)
  • Re: Frase palindroma

    Sì mi sa che farò così e dovrebbe funzionare tranquillamente...

    Grazie

    Per la cronaca sono pure io un fan di Toki poi ma staccati venivano Shu e Rei...
  • Re: Frase palindroma

    
    std::vector<std::string> vettoreMesi;
    std::string mese;
    
    std::vector<std::string>::iterator it = std::find(vettoreMesi.begin(),vettoreMesi.end(),mese);
    
    if(it != vettoreMesi.end())
    //trovato
    else
    //non trovato
    
    std::find lo trovi nel header <algorithm>
  • Re: Frase palindroma

    Ma ora che ci penso il fatto è questo...

    Dato un mese e un anno devo far calcolare i giorni

    Facendo come dici tu faccio corrispondere il mio mese a quello del vettore, mi resta il problema di associargli i giorni....

    Vabbè febbraio poi è una fesseria, ma per questo motivo mi veniva utile la scelta multipla, non se se mi sono spiegato...
Devi accedere o registrarti per scrivere nel forum
18 risposte