|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2004
Messaggi: 265
|
[C] _ parola palindroma
Salve a tutti, sto cercando di creare un programma con le funzioni in grado di riconoscere le parole palindroma ma sembra non funzionare (dà errore nel compilare...)
#include <stdio.h> #include <string.h> int pali(int a,char stringa); typedef char stringa[10]; int main () { stringa parola; int var1; printf ("Inserisci parola"); scanf ("%s", parola); int j=0; j = pali(int var1, char parola); if (j=1) printf ("è palindroma"); else ("non lo è.."); } int pali (int a, char parola) { int j; int k; int i=0; k = sizeof parola; while (k!=i) {if (parola[i] == parola[k]) j=1; else j=0; i++; k--;} return j;} Idee in merito?? Grazie!!!! Ultima modifica di pietrone86 : 10-01-2008 alle 18:50. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Allora, direi che ci sono parecchi errori:
Penso sia più o meno tutto...
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Oltretutto, sono quasi certo che l'algoritmo sia sbagliato. Credo che se tu sei alle prime armi sia meglio che tu segua un approccio ricorsivo.
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jan 2001
Città: Rimini
Messaggi: 197
|
in effetti per questo genere di lavori la soluzione ricorsiva è perfetta e mille volte più pulita ed elegante della soluzione iterativa
__________________
Linux + xBox360 + iPod. Ognuno al suo posto. |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Dec 2004
Messaggi: 265
|
ok grazie per la'iuto . adesso complia eppure dice che tutte le parole sono palindrome
#include <stdio.h> #include <string.h> typedef char stringa[10]; int pali(int a,stringa parola); int main () { stringa parola; int var1=0; printf ("Inserisci parola"); scanf ("%s", parola); int j; j = pali(var1, parola); if (j=1) printf ("è palindroma"); else ("non lo è.."); } int pali (int a, stringa parola) { int j; int k; int i=0; k = sizeof (parola); while (k!=i) {if (parola[i] == parola[k]) j=1; else j=0; i++; k--;} return j; } eppure non mi sembre sbagliato come algoritmo... |
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Dec 2004
Messaggi: 265
|
Quote:
col ricorsivo invece ho provato cosi: #include <stdio.h> #include <string.h> typedef char stringa[10]; int pali (int a, int m ,stringa parola); int main () { stringa parola; int var1=0; int var2; printf ("Inserisci parola"); scanf ("%s", parola); int j; j = pali(var1,var2, parola); if (j=1) printf ("è palindroma"); else ("non lo è.."); } int pali (int a, int m ,stringa parola) { int j; int k = sizeof (parola); m = k; while (m!=a) {if (parola[a] == parola[m]) j=1; else j=0;} return j; int pali(int a++, int m-- , stringa parola); } |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jan 2001
Città: Rimini
Messaggi: 197
|
è molto confusionaria la tua soluzione inoltre dubito vada...
te ne posto una ricorsiva che ho fatto al volo che a parte scherzi strani dovrebbe essere perfetta. Codice:
int pali(int begin, int end, char* word){ int res = 1; if ((begin != end) && (begin+1 != end)){ res = pali(begin+1,end-1, word); //RICORSIONE FINCHé NON ARRIVA AL CENTRO DELLA PAROLA } if (res == 0) //CONTROLLA CHE LA RICORSIONE PRECENDENTE NON ABBIA DATO ESITO NEGATIVO return 0; if (word[begin] == word[end]) //CONFRONTA LE LETTERE return 1; else return 0; }
__________________
Linux + xBox360 + iPod. Ognuno al suo posto. Ultima modifica di mostec : 12-01-2008 alle 03:54. |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Dec 2004
Messaggi: 265
|
a me la tua funzione non funziona... dopo che digito la parola non mi dice se è palindroma o meno (grazie per l'aiuto)
|
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Jan 2001
Città: Rimini
Messaggi: 197
|
Codice:
#include <stdio.h> int pali(int begin, int end, char* word){ int res = 1; if ((begin != end) && (begin+1 != end)){ res = pali(begin+1,end-1, word); } if (res == 0) return 0; if (word[begin] == word[end]) return 1; else return 0; } int main(int argc, char* argv[]){ printf("%d",pali(0,3,"anna")); //STAMPA 1 printf("%d",pali(0,4,"anena")); //STAMPA 1 printf("%d",pali(0,3,"ania")); //STAMPA 0 printf("%d",pali(0,4,"aneni")); //STAMPA 0 return 0; }
__________________
Linux + xBox360 + iPod. Ognuno al suo posto. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1159
|
Da una veloce lettura l'errore è qui. Esci da quel ciclo solo quando i=k, quindi parola[i] sarà uguale a parola[k] e ti verrà ridato j=1 e quindi tutte le parole saranno palindrome. Puoi risolvere cambiando la condizione del while, ad esempio while (k!=i && j==1)
|
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Dec 2004
Messaggi: 265
|
AArgh anche cosi continua a non funzionare!!!
#include <stdio.h> #include <string.h> typedef char stringa[10]; int pali(int a,stringa parola); int main () { stringa parola; int var1=0; printf ("Inserisci parola"); scanf ("%s", parola); int j; j = pali(var1, parola); if (j=1) printf ("è palindroma"); else ("non lo è.."); } int pali (int a, stringa parola) { int j; int k; int i=0; k = sizeof (parola); while (k!=i && j==1) {if (parola[i] == parola[k]) j=1; else j=0; i++; k--;} return j; } |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1159
|
Quote:
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Io lo farei così:
Codice:
int palindroma_ricorsiva(char *inizio, char *fine) { if(inizio >= fine) return 1; if(*inizio == *fine) return palindroma_ricorsiva(inizio + 1, fine - 1); return 0; } int palindroma(char *parola) { return palindroma_ricorsiva(parola, parola + strlen(parola) -1); } Codice:
int palindroma(char *inizio) { char *fine = inizio + strlen(inizio) - 1; while(inizio < fine) { if(*inizio != *fine) return 0; inizio++; fine--; } return 1; } |
![]() |
![]() |
![]() |
#14 | |
Junior Member
Iscritto dal: Sep 2006
Messaggi: 19
|
Quote:
|
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
io la farei così
Codice:
void palind (char *parola) { int lstr = strlen(parola); int cont=0; int i, j; for (i=0; i<(lstr/2); i++) { j=lstr-i-1; if (parola[i]==parola[j]) { cont++; } } if (cont==(lstr/2)) { printf("Palindroma"); } else { printf("Non Palindroma"); } } Ultima modifica di nico88desmo : 13-01-2008 alle 11:30. |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1159
|
|
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Dec 2004
Messaggi: 265
|
Adesso mi dice che tutte le parole non sono palindrome...
#include <stdio.h> #include <string.h> typedef char stringa[10]; int pali(stringa parola); int main () { stringa parola; int var1=0; printf ("Inserisci parola"); scanf ("%s", parola); int j; j = pali(parola); if (j==1) printf ("è palindroma"); else printf ("non lo è.."); } int pali (stringa parola) { int j=0; int k; int i=0; k = strlen (parola); k--; while (k>i && j==1) {if (parola[i] == parola[k]) j=1; else j=0; i++; k--;} return j; } Ultima modifica di pietrone86 : 13-01-2008 alle 16:59. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1159
|
Ma il codice lo rileggi?Nel ciclo while non entrerai mai...hai sbagliato l'inizializzazione della j
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
Codice:
bool paliter(char* inizio, char* fine) { while(*inizio++==*fine--); return --inizio>fine; } bool palrec(char* inizio, char* fine) { return inizio>=fine?1:(*inizio==*fine)?pali(inizio+1,fine+1):0; } Ultima modifica di Furla : 13-01-2008 alle 21:48. |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:35.