funcion palindroma por referencia(con punteros)

Iniciado por roser24, 6 Mayo 2010, 00:08 AM

0 Miembros y 1 Visitante están viendo este tema.

roser24

Hola chicos,me estoy liando con este ejercicio llego 1 hora en el  no doy con el asusnto..

mi codigo actual es este:
//*8. Crear una función a la que se le pasará una cadena de caracteres de cualquier
longitud y retornará si dicha cadena es palíndroma, es decir, si se resulta ser
exactamente
igual leída de izquierda a derecha que viceversa. Genera el programa principal
para poder ejecutar la función creada.*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void f_palindroma(char *,int);
void f_visualiza(char *);
int main(){

char basura;
int lon;
do{
printf("Indica la longitud de la cadena:\n");
scanf("%d",&lon);
scanf("%c",&basura);
}while(lon<1);
char *cad=(char *)(malloc(sizeof(char)*lon));

printf("introduce la palabra:\n");
fgets(cad,lon,stdin);

f_palindroma(cad,lon);
f_visualiza(cad);
free(cad);
return 0;
}

void f_palindroma(char *cadena,int size)
{
int flag=0;
unsigned int i=0,j=0;


for(i=0;*(cadena+i)!='\0'&&i<size;i++){
for(j=0;*(cadena+j)!='\0'&&j<size;j--){
if(*(cadena+i)= *(cadena+j)){
flag=1;
}
else{
flag=0;
}
}
}
if(flag==1){
printf("Es palindroma");
}
else if(flag==0){
printf("no es palindroma");
}

}
void f_visualiza(char *cadena){
printf("\nla cadena es %s ",cadena);
}[code]


porfis hecharle un vistazillo cuando podais,realmente es estresante que no me ejecute bien.. :-(

la funcion palindroma no me la ejecuta bien... y no se porque..
[/code]

biribau

Tienes algunas cosas mal en f_palindroma(el resto no lo he analizado mucho):
= no compara, asigna
2 bucles anidados? mirar si una palabra es palíndroma se hace en una pasada, o 2, pero no en n^2
comprobar si algo es palíndromo depende de que muchas comprobaciones se cumplan, no? tu sólo te quedas con la última(asignas a flag true o false, en vez de componer un resultado basado en todas las comparaciones)
y si ya tienes size para que chequeas fin de cadena('\0')? no hace falta
Otro consejo, ya lo comenté antes a otro, pero *(puntero+entero) == puntero[entero]
Solución:
Teniendo la longitud de la cadena es muy fácil, sólo tienes que comparar la mitad de la palabra, o sea, divides la palabra en 2 trozos y comparas el uno con el otro sólo que uno ascendente y el otro descendente.

for(p=cadena, q=cadena+size-1;p<=q;p++,q--)
      if(*p != *q )
            return 0;
return 1;

Básicamente es un flag = flag && *p == *q, lo que pasa que hago cortocircuito para acabar primero(en una conjunción con que uno sea falso anula toda la fórmula). Si te fijas un puntero va de principio a fin y el otro al revés
Creo que eso debería de funcionarte, o sino está muy cerca