Luk3 (Ex-Member)
Guru
Messaggi: 615
Iscritto: 16/08/2008
|
Salve, ho fatto un programma che dovrebbe controllare se una parola è palindromo o meno,
ma basta che la lunghezza di questa sia divisibile per 2 che me la da palindroma.
Penso sia un problema con l'uso delle funzioni della libreria string.h, visto che è la prima volta che provo!
Codice sorgente - presumibilmente C++ |
// Il programma controlla se una stringa è palindroma #include <stdio.h> #include <string.h> int main() { char word[30], half1[30], half2[30], revhalf2[30]; int i, j, wordlenght; j = 0; system("clear"); printf("Il programma controlla se una parola è palindroma."); printf("\n\nInserisci una parola: "); scanf("%s", word); wordlenght = strlen(word); if((wordlenght%2)!=0) { printf("\nLa parola non è palindroma!\n\n"); } else { i = wordlenght/2; while(j<=wordlenght/2) { half1[j] = word[j]; j++; } while(i<=wordlenght) { half2[i] = word[i]; i++; } j = strlen(half2); i = 0; while(i<=strlen(half2) && j>=strlen(half2)) { revhalf2[i] = half2[j]; i++; j--; } if(strcmp(half1, revhalf2)) { printf("\nLa parola è palindroma!\n\n"); } } return 0; }
|
|
|
GuglielmoS (Ex-Member)
Pro
Messaggi: 114
Iscritto: 27/11/2009
|
Penso che ti sia andato a complicare un pò troppo la vita. Per verificare se è palindroma, basta che confronti la stringa con un ciclo a due indici e ti fermi se ci sono caratteri non uguali.
Esempio:
Codice sorgente - presumibilmente C/C++ |
...
i = 0;
pal = 1;
j = len-1;
str = stringa_da_verificare;
while(i < (len/2) && pal) {
if (str[i++] != str[j--])
pal = 0;
}
printf("Palindroma: %s\n", (pal) ? "Si" : "No");
...
|
In alternativa puoi usare la ricorsività.
Questo lo scrissi tempo fa:
Codice sorgente - presumibilmente C++ |
/*Funzione ricorsiva per controllare se una stringa è palindroma*/ int is_pal(const char str[], int len, int c){ /*Controllo i caratteri da confrontare sono finiti*/ if(len > len / 2) return 0; else if(str[c] == str[len]) return is_pal(str, len - 1, c + 1); else return 1; }
|
Ciao GuglielmoS. Ultima modifica effettuata da GuglielmoS il 17/11/2010 alle 18:45 |
|
Alex (Ex-Member)
Expert
Messaggi: 441
Iscritto: 15/08/2005
|
Postato originariamente da Luk3:
Salve, ho fatto un programma che dovrebbe controllare se una parola è palindromo o meno,
ma basta che la lunghezza di questa sia divisibile per 2 che me la da palindroma.
Penso sia un problema con l'uso delle funzioni della libreria string.h, visto che è la prima volta che provo!
// Il programma controlla se una stringa è palindroma
#include <stdio.h>
#include <string.h>
int main() {
char word[30], half1[30], half2[30], revhalf2[30];
int i, j, wordlenght;
j = 0;
system("clear");
printf("Il programma controlla se una parola è palindroma.");
printf("\n\nInserisci una parola: ");
scanf("%s", word);
wordlenght = strlen(word);
if((wordlenght%2)!=0)
{
printf("\nLa parola non è palindroma!\n\n");
}
|
prima di tutto una stringa con numeri dispari non necessariamente non è palindroma...
ad esempio la parola "aveva" può essere letta sia da sinistra che da destra quindi è palindroma
else
{
i = wordlenght/2;
while(j<=wordlenght/2)
{
half1[j] = word[j];
j++;
}
while(i<=wordlenght)
{
half2 = word;
i++;
}
j = strlen(half2);
i = 0;
while(i<=strlen(half2) && j>=strlen(half2))
{
revhalf2 = half2[j];
i++;
j--;
}
if(strcmp(half1, revhalf2))
{
printf("\nLa parola è palindroma!\n\n");
}
}
return 0;
} |
personalmente io avrei fatto in una maniera diversa.....
avrei fatto un ciclo for che va da 0 fino alla lunghezza della stringa / 2.
successivamente, tramite l'utilizzo di un altro contatore avrei confrontato la prima lettera con l'ultima, la seconda con la penultima, e così via:
Codice sorgente - presumibilmente C/C++ |
int i,j;
for(i=0,j=lung_stringa;i<=lung_stringa/2;i++,j--)
if(s[i]!=s[j]) //controllo se il due caratteri sono diversi
break;
|
a questo punto, appena uscito dal ciclo, se i è = alla lung_stringa/2 vuol dire che non sono entrato nell'if e che quindi il ciclo non è terminato prematuramente e che quindi la parola è palindroma, mentre se il cilclo termina prematuramente i assumera un valore diverso dalla lung_stringa/2 e quindi la parola non è palindroma...
Codice sorgente - presumibilmente C/C++ |
if(i==lung_stringa/2)
printf("Palindroma");
else
printf("Non palindroma");
|
Ultima modifica effettuata da Alex il 17/11/2010 alle 18:48 |
|
delta (Member)
Rookie
Messaggi: 37
Iscritto: 25/08/2010
|
non capisco il ragionamento, non ti basta fare una cosa del genere?
Codice sorgente - presumibilmente C++ |
//codice precedente int wordlength=strlen(word)/2; bool palindromo=true; for(int i=0; i<wordlength and palindromo; i++) { if (word[i]!=word[wordlenght-1-i]) { palindromo=false; } } if (palindromo) {printf("palindromo!!!\n");} else {printf("non palindromo!\n");}
|
adesso non ho un compilatore sotto mano per provare il tuo codice...
Ultima modifica effettuata da delta il 17/11/2010 alle 18:57 |
|
Alex (Ex-Member)
Expert
Messaggi: 441
Iscritto: 15/08/2005
|
Postato originariamente da delta:
non capisco il ragionamento, non ti basta fare una cosa del genere?
|
in effetti basterebbe, alla fine il mio codice e il tuo sono uguali, solo che io uso una variabile int in più e una bool in meno....però la sostanza è quella...
inoltre il mio se la parola non è palindroma esce subito dal ciclo appena trova una lettera diversa...il tuo controlla tutto... |
|
a_butta (Member)
Expert
Messaggi: 578
Iscritto: 16/03/2010
|
e ricavare la stringa al contrario e confrontarla con quella normale?
Se la stringa inversa è uguale a quella di partenza è palindroma, altrimenti no...
|
|
Luk3 (Ex-Member)
Guru
Messaggi: 615
Iscritto: 16/08/2008
|
Ho semplificato ma ancora non va..dice sempre che non è un palindromo!
Non sono molto sicuro della funzione strcmp().
Ho cercato in internet e dicono che se torna un valore == 0 allora è true..Boh
Codice sorgente - presumibilmente C++ |
// Il programma controlla se una stringa è palindroma #include <stdio.h> #include <string.h> int main() { char word[30], revword[30]; int i, j; j = 0; system("clear"); printf("Il programma controlla se una parola è un palindromo."); printf("\n\nInserisci una parola: "); scanf("%s", word); i = strlen(word); while(i>=0) { revword[j++] = word[i--]; } if(strcmp(word, revword) == 0) { printf("\nLa parola è un palindromo!\n\n"); } else { printf("\nLa parola non è un palindromo!\n\n"); } return 0; }
|
Ultima modifica effettuata da Luk3 il 17/11/2010 alle 21:48 |
|
Luk3 (Ex-Member)
Guru
Messaggi: 615
Iscritto: 16/08/2008
|
Comunque a quanto mi risulta il tipo bool non esiste in C
|
|
GuglielmoS (Ex-Member)
Pro
Messaggi: 114
Iscritto: 27/11/2009
|
Postato originariamente da Luk3:
Ho semplificato ma ancora non va..dice sempre che non è un palindromo!
Non sono molto sicuro della funzione strcmp().
Ho cercato in internet e dicono che se torna un valore == 0 allora è true..Boh
Codice sorgente - presumibilmente C++ |
// Il programma controlla se una stringa è palindroma #include <stdio.h> #include <string.h> int main() { char word[30], revword[30]; int i, j; j = 0; system("clear"); printf("Il programma controlla se una parola è un palindromo."); printf("\n\nInserisci una parola: "); scanf("%s", word); i = strlen(word); while(i>=0) { revword[j++] = word[i--]; } if(strcmp(word, revword) == 0) { printf("\nLa parola è un palindromo!\n\n"); } else { printf("\nLa parola non è un palindromo!\n\n"); } return 0; }
|
|
Non funziona per via del fatto che tu fai partire la i dal valore strlen(word). Quindi il primo carattere della stringa revword sarà un '\0', il che significa che la strcmp comparerà una stringa vuota.
Comunque per quanto riguarda il valore di ritorno della strcmp, hai:
1. 0 quando le stringhe sono uguali (dove hai letto true, veniva inteso che l'uguaglianza era vera, non che veniva restituito true)
2. -1 quando la prima stringa è minore della seconda
3. 1 quando la prima stringa è maggiore della seconda
Spero di averti chiarito un pò le idee.
Ciao GuglielmoS Ultima modifica effettuata da GuglielmoS il 17/11/2010 alle 22:11 |
|