View Full Version : [C] _ parola palindroma
pietrone86
10-01-2008, 18:45
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!!!!
magix2003
10-01-2008, 19:22
Allora, direi che ci sono parecchi errori:
Per chiamare la funzione pali non devi mettere il tipo: j = pali(var1, parola);
La variabile var1 non è inizializzata
la funzione pali accetta un int e una char ma gli passi un int e una stringa
Penso sia più o meno tutto...
magix2003
10-01-2008, 19:25
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.
in effetti per questo genere di lavori la soluzione ricorsiva è perfetta e mille volte più pulita ed elegante della soluzione iterativa
pietrone86
11-01-2008, 18:15
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...
pietrone86
11-01-2008, 18:34
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...
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);
}
è 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.
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;
}
pietrone86
12-01-2008, 11:40
a me la tua funzione non funziona... dopo che digito la parola non mi dice se è palindroma o meno (grazie per l'aiuto)
#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;
}
perchè non ti funzionerebbe?
carter100
12-01-2008, 14:27
ok grazie per la'iuto . adesso complia eppure dice che tutte le parole sono palindrome
while (k!=i)
{if (parola[i] == parola[k]) j=1;
else j=0;
i++;
k--;}
return j;
}
eppure non mi sembre sbagliato come algoritmo...
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)
pietrone86
12-01-2008, 16:03
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;
}
carter100
12-01-2008, 18:27
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 è.."); //MANCA UNA PRINTF
}
int pali (int a, stringa parola)
{ int j;
int k;
int i=0;
k = sizeof (parola); //SIZEOF???USA STRLEN
while (k!=i && j==1) //metti k>i
{if (parola[i] == parola[k]) j=1;
else j=0;
i++;
k--;}
return j;
}
Ovvio che non funziona. Controlla i miei commenti, inoltre dopo la strlen k va decrementato di 1 altrimenti punta al carattere di fine stringa /0. Poi la variabile j nella funzione non è inizializzata. Infine la funzione prende un parametro che non fa nulla.
Io lo farei così:
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);
}
In versione iterativa:
int palindroma(char *inizio)
{
char *fine = inizio + strlen(inizio) - 1;
while(inizio < fine)
{
if(*inizio != *fine)
return 0;
inizio++;
fine--;
}
return 1;
}
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)
Son l'unico che pensa manchi pure un uguale? Oo
nico88desmo
13-01-2008, 11:20
io la farei così
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");
}
}
carter100
13-01-2008, 12:34
Son l'unico che pensa manchi pure un uguale? Oo
Si, ho saltato di dire che mancava anche == :D
pietrone86
13-01-2008, 16:57
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;
}
carter100
13-01-2008, 18:22
Ma il codice lo rileggi?Nel ciclo while non entrerai mai...hai sbagliato l'inizializzazione della j
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;
}
banryu79
14-01-2008, 08:32
Adesso mi dice che tutte le parole non sono palindrome...
Consiglio spassionato... pigliati il codice di cionci, provalo e poi studiatelo un attimo per capirlo: ci sono entrambe le versioni e il codice è pulito, semplice ed elegante.
il codice è pulito, semplice ed elegante.
Addirittura :D :sofico:
In effetti la mia intenzione era fargli vedere una versione alternativa senza stare ad ammattire con indici ed indicini.
_Claudio
14-01-2008, 10:42
Il codice postato è troppo incasinato, hai fatto la ricorsione da quanto ho capito, quindi...
Io la farei così (pseudocodice):
bool palindroma(char* str) {
if(length(str)<=1) return true;
else if(str[0] == str[length(str)-1])
return palindroma(substr(str, 1, length(str)-1));
else return false;
}
In sostanza il concetto è questo:
0 1 2 3
A N N A lenght=4
str[0]=A, str[length(str)-1]=str[3]=A
splitta
0 1
N N lenght=2
str[0]=N, str[length(str)-1]=str[1]=N
splitta
stringa vuota lenght=0 ==> return true, risale l'albero della ricorsione e torna true...
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;
}
Oddio che concisione...
lo so mi diverto male :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.