PDA

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.

mostec
10-01-2008, 21:23
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);
}

mostec
12-01-2008, 03:52
è 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)

mostec
12-01-2008, 13:57
#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.

cionci
13-01-2008, 11:11
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;
}

maze
13-01-2008, 11:18
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

Furla
13-01-2008, 21:17
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.

cionci
14-01-2008, 09:31
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...

Furla
14-01-2008, 16:04
lo so mi diverto male :asd: