PDA

View Full Version : [c++] stringa palindroma


Doriän
21-11-2006, 21:34
Salve a tutti!
Allora, sono due giorni che peno su un programma sulla carta semplicissimo, ossia controllare se una parola/frase inserita dall'utente sia palindroma o meno. Be', cercato su internet, controllato discussioni vecchie di anni, non sono riuscito a compilare un codice funzionante :|. Va be' che programmo si e no da un mese :asd:, ma due giorni...
il codice e' il seguente, se provo a compilarlo (dev c++) il programma mi parte ma al primo ciclo for mi crasha :asd:


/*Questo programma acquisisce da tastiera una stringa e determina se è palindroma o meno.*/

#include<stdio.h>
#include<stlib.h>
#include<string.h>

main()
{
int i, j, lenght, flag=0;
char str1[20];

printf("Inserire la parola o frase (max 20 caratteri, spazi inclusi): ");
gets(str1);

lenght = strlen(str1);

for(i=0; i<lenght; i++)
for (j=lenght-1; j>=0; j++)
{
if (str1[i] == str1[j])
flag = 0;
else if (str1[i] != str1[j])
flag = 1;
}

if (flag = 1)
printf("La stringa non e' palindroma!");
else if (flag = 0)
printf("La stringa e' palindroma!");


system("PAUSE");

}



dove sbaglio? almeno, è possibile fare quello che mi serve in questo modo? chiedo perche' l'idea originale era di copiare il contenuto della prima stringa in una seconda stringa, però al contrario, e poi attraverso lo strcmp vedere se le cose corrispondevano...mi sono bloccato, non riuscendo a fargli copiare la stringa al contrario :|. usavo due cicli for annidati, in teoria dovrebbe essere giusto no?
grazie mille :)

andbin
21-11-2006, 21:46
dove sbaglio?Non l'ho provato praticamente il tuo codice ma il problema è sicuramente nel ciclo for interno, dove invece di andare verso 0 decrementando j, lo incrementi con j++. Il valore di j va a finire chissà dove e pure l'accesso alla stringa.

Io comunque farei una cosa molto molto più semplice. Una stringa è palindroma se la stringa invertita coincide con la stringa originale.

Quindi farei così:
- Prendo la lunghezza della stringa es. in 'len'.
- Faccio un ciclo for con 'i' da 0 a < len/2.
- Confronto str[i] con str[len-i-1]
- Al primo confronto che fallisce, so già che la stringa non è palindroma

Doriän
21-11-2006, 22:01
concettualmente quella j doveva decrescere :asd:, ho sbagliato a scrivere :D. Rimane che non funge uguale, "oro" non e' palindromo secondo lui :asd:. La soluzione che proponi te l'avevo trovata suggerita anche da qualche altra parte, ma non l'avevo tenuta in considerazione perchè mi piantavo sull'idea che, se in teoria il mio codice funziona, non vedo perchè non deve in pratica :asd: comunque ora provo a vedere se riesco a compilare quello che hai suggerito te! gracias!

Furla
21-11-2006, 22:23
l'ho fatto nell'ora di esercitazione all'uni, 20 secondi netti.


char flag = 0;
for(int i = 0; i < lenght/2 && !flag; i++)
if (str1[i] != str1[lenght-i-1])
flag = 1;


concettualmente il tuo algoritmo è sbagliato, in pratica con i due for annidati confronta tutti i caratteri con tutti i caratteri. restituisce un flag nullo solo se la stringa è composta da caratteri tutti uguali. il for ti crasha per overflow, come ti è stato fatto notare l'indice di quello interno deve decrementare.

l'idea della copia della stringa sarebbe valida, ma poco efficiente.

Doriän
22-11-2006, 09:42
asd come smontare una persona e vivere felici :asd:. bho, grazie mlle per l'aiuto e per i suggerimenti, ora cerco di scrivere un programma che finalmente funzioni!