elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Palindromo C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Palindromo C++  (Leído 6,484 veces)
Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Palindromo C++
« en: 22 Agosto 2014, 22:43 pm »

Hola a todos. Quería comentarles una duda que tengo intentando resolver un ejercicio en C++. El enunciado se incluye en el código. El problema es que creo que esta todo bien y correcto, pero el resultado es que la función siempre devuelve true, o al menos eso parece. Aquí esta el código.

Código:
/*
5.Hacer un programa que contenga una función con el prototipo bool Palindromo(char palabra[40]);.
La función debe devolver true si la palabra es un palíndromo, y false si no lo es.
Una palabra es un palíndromo si cuando se lee desde el final al principio es igual que leyendo desde el principio,
por ejemplo: "Otto", o con varias palabras "Anita lava la tina", "Dábale arroz a la zorra el abad".
En estos casos debemos ignorar los acentos y los espacios, pero no es necesario que tu función haga eso,
bastará con probar cadenas como "anitalavalatina", o "dabalearrozalazorraelabad".
La función no debe hacer distinciones entre mayúsculas y minúsculas.
*/

#include <iostream>

using namespace std;

bool Palindromo(char palabra[40]);
int LongCad(char[]);

int main() {
char posiblePalindromo[40];
cout << "Introduce tu palindromo: ";
cin >> posiblePalindromo;

if (Palindromo(posiblePalindromo)) cout << "\nSi es un palindromo." << endl;
else cout << "\nNo es un palindromo." << endl;

cin.sync();
cin.get();
return 0;
}

bool Palindromo(char palabra[40]) {
char copia[40];
strcpy_s(copia, palabra);

int q = 0, p = LongCad(palabra), aux;
while (palabra[q] < p) {
aux = palabra[q];
palabra[q] = palabra[p];
palabra[p] = aux;
q++;
p--;
}

if (strcmp(palabra, copia) == 0) return true;
else return false;
}

int LongCad(char a[]) {
int i = 0;
while (a[i]) i++;
return 0;
}
[code=cpp][code=actionscript]
[/code][/code]

**EDITO: En el código no he puesto la librería necesaria "cstring" aun asi el código compilaba =S. Luego la puse y el mismo resultado.


« Última modificación: 22 Agosto 2014, 23:08 pm por Bob1098 » En línea

kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Palindromo C++
« Respuesta #1 en: 22 Agosto 2014, 23:24 pm »

La función debería quedar mas o menos así:

Código
  1. bool Palindromo(char palabra[40])
  2. {
  3.    char copia[40];
  4.    int q = 0, p;
  5.  
  6.    p = LongCad(palabra) - 1;
  7.  
  8.    while (palabra[q] != '\0')
  9.    {
  10.        copia[q] = palabra[p];
  11.        q++, p--;
  12.    }
  13.    copia[q] = '\0';
  14.  
  15.    if (strcmp(palabra, copia) == 0)
  16.        return true;
  17.    else
  18.        return false;
  19. }

Y en la función LongCad debes retornar i no cero
 


En línea

DarkMatrix

Desconectado Desconectado

Mensajes: 150


Nuestro Limite es la Imaginacion


Ver Perfil WWW
Re: Palindromo C++
« Respuesta #2 en: 22 Agosto 2014, 23:26 pm »

Creo que tienes 2 errores en el codigo, el primero y mas notable es que la funcion LongCad siempre retorna cero y deberia retornar "i", el segundo es en esta linea "while (palabra[q] < p)", deberia ser "while (q < p)"

Código
  1. /*
  2. 5.Hacer un programa que contenga una función con el prototipo bool Palindromo(char palabra[40]);.
  3. La función debe devolver true si la palabra es un palíndromo, y false si no lo es.
  4. Una palabra es un palíndromo si cuando se lee desde el final al principio es igual que leyendo desde el principio,
  5. por ejemplo: "Otto", o con varias palabras "Anita lava la tina", "Dábale arroz a la zorra el abad".
  6. En estos casos debemos ignorar los acentos y los espacios, pero no es necesario que tu función haga eso,
  7. bastará con probar cadenas como "anitalavalatina", o "dabalearrozalazorraelabad".
  8. La función no debe hacer distinciones entre mayúsculas y minúsculas.
  9. */
  10.  
  11. #include <iostream>
  12. #include <string>
  13.  
  14. using namespace std;
  15.  
  16. bool Palindromo(char palabra[40]);
  17. int LongCad(char[]);
  18.  
  19. int main() {
  20. char posiblePalindromo[40];
  21.  
  22. cout << "Introduce tu palindromo: ";
  23. cin >> posiblePalindromo;
  24.  
  25. if (Palindromo(posiblePalindromo)) cout << "\nSi es un palindromo." << endl << endl;
  26. else cout << "\nNo es un palindromo." << endl << endl;
  27.  
  28. cin.sync();
  29. cin.get();
  30. return 0;
  31. }
  32.  
  33. bool Palindromo(char palabra[40]) {
  34. char copia[40];
  35. strcpy(copia, palabra);
  36. int q = 0, p = LongCad(palabra)-1, aux;
  37. while (q < p) {
  38. aux = palabra[q];
  39. palabra[q] = palabra[p];
  40. palabra[p] = aux;
  41. q++;
  42. p--;
  43. }
  44.  
  45. if (strcmp(palabra, copia) == 0) return true;
  46. else return false;
  47. }
  48.  
  49. int LongCad(char a[]) {
  50. int i = 0;
  51. while (a[i]) i++;
  52. return i;
  53. }
En línea

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Palindromo C++
« Respuesta #3 en: 22 Agosto 2014, 23:40 pm »

el segundo es en esta linea "while (palabra[q] < p)", deberia ser "while (q < p)"

El código es muy inconsistente al copiar directamente la palabra a la cadena copia no lograras comprobar si es o no palíndromo y con la condición del while dispuesta de es manera solo copiara la mitad de la palabra a la cadena destino

Saludos kutcher
En línea

DarkMatrix

Desconectado Desconectado

Mensajes: 150


Nuestro Limite es la Imaginacion


Ver Perfil WWW
Re: Palindromo C++
« Respuesta #4 en: 23 Agosto 2014, 00:07 am »

palabra = "AnitaLavaLaTina"
copia = "AnitaLavaLaTina"

luego del bucle:

palabra = "aniTaLavaLatinA"

palindroma = (strcmp(palabra,copia) == 0)

Como el programa no tiene que distinguir entre mayusculas y minusculas, no importa como lo puse, fue para que se viera al invertir la palabra, la otra mitad no hace falta comprobarla ya que lo que hace el bucle es tomar la primera letra y cambiarla con la ultima, luego la segunda con la penultima, etc..., al llegar a la mitad ya se habran intercambiado todas las letras necesarias para saber si la palabra es palindroma, ya que si es asi la otra mitad sera igual a la ya intercambiada y la comparacion dara true, de lo contrario dara false.
En línea

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix
Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Re: Palindromo C++
« Respuesta #5 en: 23 Agosto 2014, 00:20 am »

Vale, gracias a todos por las respuestas, la próxima vez me pondré a programar después de tomarme un buen café xd.

Aquí esta el código terminado, he corregido los fallos y añadido el "sistema" para las mayúsculas y minúsculas:

Código
  1. /*
  2. 5.Hacer un programa que contenga una función con el prototipo bool Palindromo(char palabra[40]);.
  3. La función debe devolver true si la palabra es un palíndromo, y false si no lo es.
  4. Una palabra es un palíndromo si cuando se lee desde el final al principio es igual que leyendo desde el principio,
  5. por ejemplo: "Otto", o con varias palabras "Anita lava la tina", "Dábale arroz a la zorra el abad".
  6. En estos casos debemos ignorar los acentos y los espacios, pero no es necesario que tu función haga eso,
  7. bastará con probar cadenas como "anitalavalatina", o "dabalearrozalazorraelabad".
  8. La función no debe hacer distinciones entre mayúsculas y minúsculas.
  9. */
  10.  
  11. #include <iostream>
  12. #include <cstring>
  13. #include <cctype>
  14.  
  15. using namespace std;
  16.  
  17. bool Palindromo(char palabra[40]);
  18. int LongCad(char[]); //Calcula la longitud de una cadena
  19.  
  20. int main() {
  21. char posiblePalindromo[40];
  22. cout << "Introduce tu palindromo: ";
  23. cin >> posiblePalindromo;
  24.  
  25. if (Palindromo(posiblePalindromo)) cout << "\nSi es un palindromo." << endl;
  26. else cout << "\nNo es un palindromo." << endl;
  27.  
  28. cin.sync();
  29. cin.get();
  30. return 0;
  31. }
  32.  
  33. bool Palindromo(char palabra[40]) {
  34. char copia[40];
  35.  
  36.  
  37. for (int i = 0; i <= LongCad(palabra) - 1; i++) if (isupper(palabra[i])) palabra[i] = tolower(palabra[i]); //Convierte todos los caracteres a minuscula
  38.  
  39. strcpy_s(copia, palabra); //Se copia la cadena para una posterior comparación
  40.  
  41. int q = 0, p = LongCad(palabra) - 1, aux;
  42. while (q < p) { //Invierte los elementos de la cadena "palabra"
  43. aux = palabra[q];
  44. palabra[q] = palabra[p];
  45. palabra[p] = aux;
  46. q++;
  47. p--;
  48. }
  49.  
  50. if (strcmp(palabra, copia) == 0) return true;
  51. else return false;
  52. }
  53.  
  54. int LongCad(char a[]) {
  55. int i = 0;
  56. while (a[i]) i++;
  57. return i;
  58. }
  59.  
  60.  
« Última modificación: 23 Agosto 2014, 00:35 am por Bob1098 » En línea

kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Palindromo C++
« Respuesta #6 en: 23 Agosto 2014, 00:28 am »

Como el programa no tiene que distinguir entre mayusculas y minusculas, no importa como lo puse, fue para que se viera al invertir la palabra, la otra mitad no hace falta comprobarla ya que lo que hace el bucle es tomar la primera letra y cambiarla con la ultima, luego la segunda con la penultima, etc..., al llegar a la mitad ya se habran intercambiado todas las letras necesarias para saber si la palabra es palindroma, ya que si es asi la otra mitad sera igual a la ya intercambiada y la comparacion dara true, de lo contrario dara false.

Es verdad no me tome el tiempo de leerlo con detalle jaja

Saludos kutcher
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Palindromo C++
« Respuesta #7 en: 23 Agosto 2014, 20:10 pm »

Lo que no me acaba de convencer es la necesidad de usar una copia de "palabra". Podrías comparar directamente los caracteres equidistantes de palabra, algo como:

Código
  1. bool Palindromo(char palabra[40]) {
  2.  nt q = 0, p = (LongCad(palabra) - 1);
  3.  while (q < p) {
  4.    if ( tolower (palabra[q]) != tolower (palabra[p]) )
  5.      return false;
  6.    q++, p--;
  7.  }
  8.  return true;
  9. }

"Creo" que así funcionará.

¡¡¡¡ Saluditos! ..... !!!!



EDITADO con la observación de Blaster.
« Última modificación: 23 Agosto 2014, 21:05 pm por leosansan » En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Palindromo C++
« Respuesta #8 en: 23 Agosto 2014, 20:49 pm »

Seria mas apropiado realizar el decremento e incremento fuera del while justo después de la primera comparación:

Código
  1. while (q < p)
  2. {
  3.   if (palabra[q] != palabra[p])
  4.       return false;
  5.   q++, p--;
  6. }

Tu código al procesar una cadena como esta arenere retornara true

Saludos
« Última modificación: 23 Agosto 2014, 20:54 pm por Blaster » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Palindromo C++
« Respuesta #9 en: 23 Agosto 2014, 21:03 pm »

Seria mas apropiado realizar el decremento e incremento fuera del while justo después de la primera comparación:
...........................
Saludos

Por algo puse "Creo", no sé por qué pero algo me decía que no estaba bien.  ;)

Gracias por la observación. Ya edité el mensaje anterior donde recojo lo que mencionas.

¡¡¡¡ Saluditos! ..... !!!!


En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Palindromo con Pilas
Programación C/C++
Muffin 1 11,702 Último mensaje 28 Enero 2011, 02:32 am
por ricardo_b
palindromo « 1 2 »
Programación C/C++
ALONSOQ 16 8,592 Último mensaje 7 Agosto 2012, 17:52 pm
por X3R4CK3R
Palindromo en un archivo
Programación C/C++
Eva93 8 2,818 Último mensaje 30 Agosto 2013, 13:20 pm
por Eva93
Palindromo
Java
vhh70 7 2,856 Último mensaje 9 Junio 2016, 20:54 pm
por DIANA KARINA HM
palindromo con pilas en java
Java
Mantzur 1 3,154 Último mensaje 10 Octubre 2016, 16:35 pm
por MinusFour
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines