Duda sobre el ejercicio del palindromo.

Iniciado por -esifu-, 14 Diciembre 2010, 00:07 AM

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

-esifu-

Pues eso, hay algo que me falla en el codigo pero no logro darme cuenta.

Gracias.
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void main(void)
{
     char v[10];      /* Declaración de un vector de 10 caracteres*/
     int tam;             /* Tamaño de la cadena */
     int i;               /* Índice para indexar el vector */
     int res;             /* Resultado. Vale 1 si es palíndromo        */   
     printf("Introduzca una palabra de menos de 11 caracteres:\n");
     
     i=0;
     do
{     
       i++;
       printf("Letra_%d=",i);
       scanf(" %c",&v[i-1]);
     }while(v[i-1]!=';' && i<10);
     i=0; /*No quitar esta sentencia*/
                 
     /*************INICIO CÓDIGO*****************/
     
for (i=0; i<10; i++)

if (i == ';')
{
tam=i;
}
else
{
tam=10;
}
while(i != tam)
{
i++;
tam--;
}
if(v[i-1] == v[tam])
{
res=1;
}
else
{
res=0;
}

     /***************FIN CÓDIGO ******************/
     
     /* ESCRITURA DE RESULTADOS */
     if (res==1) printf("Es palindromo");
     if (res==0) printf("No es palindromo");
     /* BLOQUEO DE PANTALLA*/
     printf("\n");
     system("pause");
}


diskontrol

Buenas,

te voy a dar un consejo, si haces los incrementos (y decrementos) al final de los bucles, te vas a evitar hacer cálculos raros con los índices. No he probado a compilar el código pero así a simple vista diría que no funciona porque no comparas los elementos del vector entre si. Pasas de la memoria reservada para este ya que antes de empezar las comprobaciones no inicializas el índice. Además las lineas de comprobación están fuera del bucle. También deberías salir del bucle a la primera que la variable res adquiera el valor 0, porque luego se puede sobreescribir el resultado y quedaría falseado (y así ya de paso te ahorras las operaciones res=1). Y para finalizar te recomiendo empezar a usar punteros para este tipo de problemas. También es muy probable que me haya saltado cosas :-D.

Saludos!
Siempre ten tus cosas cuando las necesites con @Dropbox. ¡Una cuenta de 2 GB es gratis! http://db.tt/YxRhsCI

Shell Root

Y si la palabra tiene más de 10 caracteres?. Podrías usar algo como,
    int sMAX = 0;
    printf("Enter word: ");
    scanf("%d", sMAX);
   
    char sWords[ strlen(sMAX) ];
    printf("%d", sizeof( sWords ));
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

08l00D

Cita de: Shell Root en 14 Diciembre 2010, 05:11 AM
Y si la palabra tiene más de 10 caracteres?. Podrías usar algo como,
    int sMAX = 0;
    printf("Enter word: ");
    scanf("%d", sMAX);
   
    char sWords[ strlen(sMAX) ];
    printf("%d", sizeof( sWords ));

??
a strlen se le pasa una cadena osea un puntero a char ... no un entero..
para lo que decis habria que utilizar las funciones para pedir memoria dinamicamente...
primero malloc y despues realloc sucesivamente a medida que quieras seguir metiendo caracteres en la cadena...

Garfield07

No, es correcto. A strlen se le pasa una cadena y devuelve un entero. El code es correcto.


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

Littlehorse

Cita de: 08l00D en 14 Diciembre 2010, 07:14 AM
a strlen se le pasa una cadena osea un puntero a char ... no un entero..

Cita de: Sagrini en 14 Diciembre 2010, 18:30 PM
No, es correcto. A strlen se le pasa una cadena y devuelve un entero. El code es correcto.

Sagrini, vuelve a leer el código. Esta mal como bien dice 08l00.


  char sWords[ strlen(sMAX) ];

En esa linea se le pasa un entero a strlen, siendo que el prototipo de strlen es:

size_t strlen ( const char * str );

Ademas, no solo esta mal si no que tampoco es necesario utilizar strlen para esa tarea, puesto que sMAX ya es un entero y podría hacerse así perfectamente:

Código (cpp) [Seleccionar]
char sWords[sMAX];

Por otro lado, si se quiere utilizar un arreglo dinámico, lo recomendable es utilizar memoria dinámica y no pedir un valor al usuario para utilizarlo en un arreglo estático. Es inseguro y poco útil.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Garfield07

perdona, te doy la razon. en verdad no lei todo el codigo, sobre todo no lei la parte del entero.... fff
bueno, pero el codigo correcto seria:

    int size;
    char word [30];

    printf("Enter a word [MAX 30]: ");
    fgets (word, 30, stdin);

   if (strlen (word)>30)
   {
       printf ("Error: the word is too long...\n");
       return 1;
   }

realmente no entiendo el proposito del code...
algo asi? me perdi xD...
diganme el proposito al menos porque no lo pillo...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo