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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Identificar frases palíndromas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Identificar frases palíndromas  (Leído 3,496 veces)
AxelP

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Identificar frases palíndromas
« en: 15 Noviembre 2014, 06:10 am »

Hola a todos, tengo que hacer un programa que identifique las frases palíndromas. Tengo este código, pero falla en el if al comprobar la cadena con la cadena invertida:

Código:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
char frase1[100];
char frase2[100];
printf("Aqui puedes identificar frases palindromas\n\nEscribe tu frase: ");
gets(frase1);
int letra1 = 0;
int letra2 = 0;
for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
{
     if (frase1[letra1] != ' ')
{
              frase2[letra2++] = frase1[letra1];
}
}
strlwr(frase2);
printf("%s", frase2);
if (frase2 == strrev(frase2))
{
printf("\nTu frase es palindroma!");
}
else
{
printf("\nTu frase no es palindroma!");
}
}


« Última modificación: 15 Noviembre 2014, 06:13 am por AxelP » En línea

Ocelot1994

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #1 en: 15 Noviembre 2014, 14:52 pm »

Prueba a cambiar esto :
-Con esto comprobamos letra por letra en la frase2.
Código
  1. int inicio=0;
  2. int fin=letra2-1;
  3.  
  4. while((inicio<fin) && (frase2[letra1]==frase2[letra2])){
  5.    inicio++;
  6.    fin--;
  7.  
  8. }
si el while sale porque fin e inicio son iguales es que es palindromo y tirara por el if, si no se cumple la igualdad de las letras tirara por el else y no será palindromo

Código
  1. if (frase2[inicio] == frase2[fin])
  2. {
  3. printf("\nTu frase es palindroma!");
  4. }else ......


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #2 en: 15 Noviembre 2014, 15:05 pm »

no puedes comprobarlo directamente porque los array de char son mas largos que las palabras que evaluas...

yo haría algo como

Código
  1. inicio = 0;
  2. fin = strlen(frase)
  3. while(inicio<=fin){
  4.  si(frase[inicio++] != frase[fin--]) { //no estoy seguro si se resta 1
  5.    //no es palindromo... hacer lo que se vaya a hacer
  6.    break;
  7.  }
  8. }
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #3 en: 15 Noviembre 2014, 20:33 pm »

Hola a todos, tengo que hacer un programa que identifique las frases palíndromas. Tengo este código, pero falla en el if al comprobar la cadena con la cadena invertida:

En esencia la idea está bien pero mal implementada:

* Al usar "strrev(frase2)" de forma automática la frase 2 queda invertida y lógicamente es siempre igual a si misma.

* Lo anterior lleva al uso de una tercera cadena para guardar frase1 igual a frase2:

Código
  1. for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
  2.  if (frase1[letra1] != ' ')
  3.    frase2[letra2++] = frase1[letra1] , frase3[letra2 - 1] = frase1[letra1];

 y a continuación no hay más que comparar frase3 con frase2 invertida.

* Pero ahí viene el otro error grave que tienes que es comparar en el if dos cadenas con "==" cuando eso en C no es válido. Para ello has de usar "strcmp":

Código
  1. if (strcmp (frase3 , strrev(frase2))  == 0)
  2.  printf("\nTu frase es palindroma!");
  3. else
  4.  printf("\nTu frase no es palindroma!");

Con esas correcciones tu código es totalmente funcional.

Aunque las otras ideas que te han dado son más "chachis".

P.D:Te falta el "return" de main.

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


« Última modificación: 15 Noviembre 2014, 20:37 pm por leosansan » En línea

AxelP

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #4 en: 15 Noviembre 2014, 23:33 pm »

Les agradezco mucho a todos, ahora ya pude comprender mejor como lo hace  ;-)
Solo tengo una duda en la respuesta de leosansan, el código funciona, pero ¿Por qué le restas 1 en la parte de frase3[letra2 - 1]? Eso es lo único que no entiendo, y repito muchas gracias a todos.
 

* Lo anterior lleva al uso de una tercera cadena para guardar frase1 igual a frase2:

Código
  1. for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
  2.  if (frase1[letra1] != ' ')
  3.    frase2[letra2++] = frase1[letra1] , [u]frase3[letra2 - 1][/u] = frase1[letra1];

 
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #5 en: 16 Noviembre 2014, 02:31 am »

Solo tengo una duda en la respuesta de leosansan, el código funciona, pero ¿Por qué le restas 1 en la parte de frase3[letra2 - 1]? Eso es lo único que no entiendo
Es debido al uso del operador secuencial ",". Su comportamiento dada la expresión:
Código
  1. frase2[letra2++] = frase1[letra1] , frase3[letra2 - 1] = frase1[letra1];

Es el siguiente:
1) Se evalúa la expresión a la izquierda, esta es "frase2[letra2++] = frase1[letra1]" y su resultado se descarta.
2) Todos los efectos laterales del paso 1 se aplican: el valor de la variable "letra2" se incrementa en una unidad.
3) Se evalúa la expresión a la derecha, esta es "frase3[letra2 - 1] = frase1[letra1]". El punto importante aquí es que el valor de "letra2" ya se incremento en una unidad y ahora es el indice del siguiente carácter, por ello se le resta una unidad.

Ya que la idea es copiar la cadena en dos arrays otra opción mas sencilla y con el mismo efecto es:
Código
  1. frase3[letra2] = frase2[letra2] = frase1[letra1];
  2. letra2++;

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
AxelP

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #6 en: 16 Noviembre 2014, 06:35 am »

Muchas gracias  :D ;-)
Ahora entiendo por qué es, y que tu ejemplo es lo mismo, creo que ya comprendo perfectamente el código, muchas gracias rir3760 y también a todos los demás, ya pude entender y hacer mi tarea  :D
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #7 en: 16 Noviembre 2014, 14:05 pm »

......................................
Ya que la idea es copiar la cadena en dos arrays otra opción mas sencilla y con el mismo efecto es:
Código
  1. frase3[letra2] = frase2[letra2] = frase1[letra1];
  2. letra2++;
.........................

Incluso más sencillo:

Código
  1. frase3[letra2] = frase2[letra2++] = frase1[letra1];

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



En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Identificar frases palíndromas
« Respuesta #8 en: 16 Noviembre 2014, 16:13 pm »

Incluso más sencillo:

Código
  1. frase3[letra2] = frase2[letra2++] = frase1[letra1];

No porque el operador de asignación no garantiza un punto de secuencia y por ende en la expresión:
Código
  1. frase3[letra2 /* B */] = frase2[letra2++ /* A */] = frase1[letra1];
Se corre el riesgo de que la expresión A se evalue y su efecto lateral se aplique antes que la evaluación de la expresión B.

Un caso similar que se utiliza para explicar el punto y que por supuesto no se recomienda es:
Código
  1. a[i] = i++;
Debido a que el resultado de la expresión depende del orden de evaluación de los operandos y el momento exacto de la aplicación de los efectos laterales (algo que no define el lenguaje).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Frases del Hacker « 1 2 3 4 »
Foro Libre
LordKevin 31 36,568 Último mensaje 10 Mayo 2010, 14:30 pm
por Carloswaldo
Frases Informaticas... « 1 2 3 4 »
Foro Libre
Furious Dami 32 13,408 Último mensaje 15 Marzo 2011, 16:01 pm
por [u]nsigned
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines