Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: roser24 en 6 Mayo 2010, 00:08 am



Título: funcion palindroma por referencia(con punteros)
Publicado por: roser24 en 6 Mayo 2010, 00:08 am
Hola chicos,me estoy liando con este ejercicio llego 1 hora en el  no doy con el asusnto..

mi codigo actual es este:
Código
  1. //*8. Crear una función a la que se le pasará una cadena de caracteres de cualquier
  2. longitud y retornará si dicha cadena es palíndroma, es decir, si se resulta ser
  3. exactamente
  4. igual leída de izquierda a derecha que viceversa. Genera el programa principal
  5. para poder ejecutar la función creada.*/
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. void f_palindroma(char *,int);
  10. void f_visualiza(char *);
  11. int main(){
  12.  
  13. char basura;
  14. int lon;
  15. do{
  16. printf("Indica la longitud de la cadena:\n");
  17. scanf("%d",&lon);
  18. scanf("%c",&basura);
  19. }while(lon<1);
  20. char *cad=(char *)(malloc(sizeof(char)*lon));
  21.  
  22. printf("introduce la palabra:\n");
  23. fgets(cad,lon,stdin);
  24.  
  25. f_palindroma(cad,lon);
  26. f_visualiza(cad);
  27. free(cad);
  28. return 0;
  29. }
  30.  
  31. void f_palindroma(char *cadena,int size)
  32. {
  33. int flag=0;
  34. unsigned int i=0,j=0;
  35.  
  36.  
  37. for(i=0;*(cadena+i)!='\0'&&i<size;i++){
  38. for(j=0;*(cadena+j)!='\0'&&j<size;j--){
  39. if(*(cadena+i)= *(cadena+j)){
  40. flag=1;
  41. }
  42. else{
  43. flag=0;
  44. }
  45. }
  46. }
  47. if(flag==1){
  48. printf("Es palindroma");
  49. }
  50. else if(flag==0){
  51. printf("no es palindroma");
  52. }
  53.  
  54. }
  55. void f_visualiza(char *cadena){
  56. printf("\nla cadena es %s ",cadena);
  57. }[code]
  58.  
  59.  
  60. porfis hecharle un vistazillo cuando podais,realmente es estresante que no me ejecute bien.. :-(
  61.  
  62. la funcion palindroma no me la ejecuta bien... y no se porque..
[/code]


Título: Re: funcion palindroma por referencia(con punteros)
Publicado por: biribau en 6 Mayo 2010, 03:01 am
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.
Código
  1. for(p=cadena, q=cadena+size-1;p<=q;p++,q--)
  2.      if(*p != *q )
  3.            return 0;
  4. return 1;
  5.  
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