Stringa palindorma

di il
29 risposte

Stringa palindorma

Salve a tutti, da poco ho iniziato a studiare le stringhe e sto provando a fare un piccolo programma che mi dica se una stringa è palindroma. La mia idea è quella di confrontare gli indici delle lettere partendo dall'inizio alla fine, con quelle che partono dalla fine verso l'inizio. Solo che non funziona.
Probabilmente ci saranno degli errori stupidi in quanto dopo un giorno di lavoro mentre scrivevo il codice il mio cervello chiedeva pietà ma non riesco a venirne a capo . questo è quello che ho scritto:

#include<iostream>
#include<cstring>
using namespace std;

bool
palindroma (char a[])
{
  int cont = 0;
  char parola[100];

  for (int i = strlen (a); i >= 0; i--)
    {
      if (a[i] == a[cont])
	{
	  return true;
	  cont++;

	}

    }
  return false;
}

int
main ()
{
  char stringa[100];
  cin.getline (stringa, 99);
  cout << palindroma (stringa);

  return 0;
}



grazie a tutti per l'attenzione e buona serata

29 Risposte

  • Re: Stringa palindorma

    Che senso ha quel return prima di una istruzione che non sarà mai esguita?

    E strlen è corretto?
  • Re: Stringa palindorma

    Ciao Oregon, perchè non verrà mai eseguita? comunque ho provato a mettere il return anche fuori l'if ma non cambia nulla. Per quanto riguarda lo strlen() dovrebbe essere giusto, perchè l'ho usata in altri esercizi prima di fare questo ed effettivamente calcola la lunghezza della stringa.
  • Re: Stringa palindorma

    Questa

    cont++;

    non verrà mai eseguita, sei d'accordo?

    Devi ragionare non fare prove a caso.

    Sì, la strlen calcola la lunghezza ma deve essere usata così per ottenere l'indice dell'ultimo carattere?
    Se una stringa è lunga 6 caratteri e strlen restituisce 6, ti ricordo che gli elementi vanno da [0] a [5] ... capito?

    E poi char parola[100]; non serve a nulla ...

    Ti consiglio di ragionare al contrario ... assumi che sia palindroma e controlla se non lo è con

    if (a[ i] != a[cont])
  • Re: Stringa palindorma

    Aggiungo:
    - perchè non dichiari anche cont, come i, all'interno del for?
    - con la condizione i>=0 vai a controllare le stesse coppie di elementi due volte, oltre che confrontare l'elemento centrale dell'array con sé stesso in caso di dimensione dispari. Se ci rifletti la condizione può essere modificata in i>cont;
    - ti faccio inoltre notare che l'esercizio può essere risolto utilizzando un solo indice... basta ragionare sul fatto che una stringa palindroma coincide con un array simmetrico rispetto al proprio "centro";
    - in ogni caso quella funzione non ha alcuna logica, per esempio true e false dovrebbero essere invertiti...
  • Re: Stringa palindorma

    oregon ha scritto:


    Questa

    cont++;

    non verrà mai eseguita, sei d'accordo?

    Devi ragionare non fare prove a caso.

    Sì, la strlen calcola la lunghezza ma deve essere usata così per ottenere l'indice dell'ultimo carattere?
    Se una stringa è lunga 6 caratteri e strlen restituisce 6, ti ricordo che gli elementi vanno da [0] a [5] ... capito?

    E poi char parola[100]; non serve a nulla ...

    Ti consiglio di ragionare al contrario ... assumi che sia palindroma e controlla se non lo è con

    if (a != a[cont])

    Okay,quindi devo utilizzare strlen()-1?Effettivamente quel cont dentro l'if non ha senso! stavo pensando di metterlo fuori in questo modo ++cont, ma non penso cambierebbe nulla.Prima di provare questo codice ho provato anche ad inizializzare cont con strlen(a), e vedere se a (ovviamente ho iterato i da 0 alla lunghezza) fosse diverso di a[cont] decrementando cont, ma non cambia nulla.Quel char parola l'avevo usato in uno dei miei precedenti esperimenti e mi sono dimenticato di cancellarlo.
  • Re: Stringa palindorma

    Nippolo ha scritto:


    Aggiungo:
    - perchè non dichiari anche cont, come i, all'interno del for?
    - con la condizione i>=0 vai a controllare le stesse coppie di elementi due volte, oltre che confrontare l'elemento centrale dell'array con sé stesso in caso di dimensione dispari. Se ci rifletti la condizione può essere modificata in i>cont;
    - ti faccio inoltre notare che l'esercizio può essere risolto utilizzando un solo indice... basta ragionare sul fatto che una stringa palindroma coincide con un array simmetrico rispetto al proprio "centro";
    - in ogni caso quella funzione non ha alcuna logica, per esempio true e false dovrebbero essere invertiti...
    per quanto riguarda i>cont hai ragione, non ci avevo riflettuto.Sul fatto di risolverlo con un solo indice in questo momento non mi viene in mente nulla, probabilmente a causa della stanchezza. Non capisco perchè true e false devono essere invertiti, secondo il mio (stupido ) ragionamento se sono tutti uguali ritorno true, altrimenti false.
  • Re: Stringa palindorma

    Ti ho già detto di provare a ragionare al contrario. Assumi che sia palindroma e al primo carattere diverso esci con la return dal ciclo e dalla funzione.
  • Re: Stringa palindorma

    oregon ha scritto:


    Ti ho già detto di provare a ragionare al contrario. Assumi che sia palindroma e al primo carattere diverso esci con la return dal ciclo e dalla funzione.
    Intendi così?
    
    for(int i=strlen(a)-1;i>cont;i--){
    ++cont;
    if(a[i]!=a[cont])
       return false; 
    }
    return true;
    
  • Re: Stringa palindorma

    Si ma perché incrementi cint prima della if? Cosi non controlli l'indice 0
  • Re: Stringa palindorma

    oregon ha scritto:


    Si ma perché incrementi cint prima della if? Cosi non controlli l'indice 0
    Per mia ignoranza! ero convinto che utilizzando ++i al posto di i++ si incrementasse la i dopo la prima iterazione, a quanto pare non è così.
  • Re: Stringa palindorma

    Correggi la posizione dell'incremento di cont e prova
  • Re: Stringa palindorma

    oregon ha scritto:


    Correggi la posizione dell'incremento di cont e prova
    Ho fatto ma non cambia nulla
    for(int i=strlen(a)-1;i>cont;i--){
    
    if(a[i]!=a[cont])
       return false; 
        cont++;
    }
    return true;
    }
    teoricamente adesso dovrebbe essere corretta la posizione, giusto?
  • Re: Stringa palindorma

    Praticamente sei tornato alla posizione iniziale!?

    Secondo te è raggiungibile quell'istruzione (mi riferisco a cont++) lì dove l'hai messa?
  • Re: Stringa palindorma

    Nippolo ha scritto:


    Praticamente sei tornato alla posizione iniziale!?

    Secondo te è raggiungibile quell'istruzione (mi riferisco a cont++) lì dove l'hai messa?
    perchè non è raggiungibile? probabilmente sto per dire una bestemmia, perchè non dovrebbe incrementarsi? cioè guarda l'if e non appena l'if è chiuso incremento, perchè non va?
Devi accedere o registrarti per scrivere nel forum
29 risposte