domingo, 24 de octubre de 2010

Detección palíndromos

Materia Lenguajes de Programación

Hola compañeros, esta semana todos presentamos nuestro pseudocódigo imperativo de temas distintos, yo elegí Detección de palíndromos para profundizar más en el tema me dí a la tarea de implementar el código en C y Python

Bueno este es el código en C


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main(){
char* cadena = (char*)malloc(100);
char* cadena1 = (char*)malloc(100);
printf("Escribe la cadena\n");
gets(cadena);
int n, numero, es, i, j;
es = 1;
j = 0;
char x = ' ';
n=strlen(cadena);
for(i=0;i<=n;i++){
if (isupper(cadena[i]))
cadena[i] = tolower(cadena[i]);
if(cadena[i] != x){
cadena1[j] = cadena[i];
j++;
}
}
printf("%s\n", cadena1);
numero = strlen(cadena1);
printf("%d\n", numero);
for(i=0;i<=numero/2;i++){
if(cadena1[i] != cadena1[numero-i-1])
es = 0;

}
if(es)
printf("Si es palindromo\n");
else
printf("No es palindromo\n");

free(cadena);
free(cadena1);

}


Primero que nada agregué las librerías:
stdio.h
Es para las entradas y salidas estándar.

string.h
Está librería es para poder agregar la función strlen() que me dice cuantos caracteres tiene la frase.

stdlib.h
Se agrega para poder usar malloc y free.

ctype.h
Me permite usar las funciones para saber si hay mayúsculas (isupper) y la función para convertir mayúsculas a minúsculas(tolower).

Después uso punteros para reservar memoria para la frase que se va a introducir ya que no se sabe cuantas letras tendrá, se pide la frase al usuario y se obtiene el tamaño de la cadena para saber cuantas veces se repetirá el ciclo for y empezar a checar si hay alguna palabra que contenga mayúsculas para así convertirla a minúscula y también eliminar los espacios en blanco.

Después de que se eliminaron todos los espacios en blancos y toda la frase esta en minúsculas podemos empezar a hacer la comparación de el primer carácter con el ultimo, el segundo con el penúltimo y así hasta haber comparado todos los caracteres y saber si es o no un palíndromo.

Ejecución cuando sí es palíndromo:


Y cuando no:


Y el código en python:


#!/usr/bin/python
cadena = raw_input("Introduce la cadena\n")
print(len(cadena))
cont = 0
cadena2="";
es = 1

for i in cadena:
if i.isupper():
i = i.lower()
if i != " ":
cadena2 = cadena2 + i
cont = cont + 1

for i in range(cont/2):
if cadena2[i] != cadena2[cont-i-1]:
es = 0
break

if (es):
print "es palindromo"
else:
print "no es palindromo"



Ejecución:


Es exactamente lo mismo que en C, solo que un poco más fácil :D, antes de haber desarrollado este código python había hecho otro que me creaba otra cadena pero con el contenido de la primera al revés, y eso me sirve para así comparar la cadena original con la segunda cadena, aunque me pareció muy fácil su desarrollo, esta no es la forma óptima de detección de palíndromos, la mejor es la que publiqué anteriormente, de todas formas aquí les dejo también el código como práctica.


#!/usr/bin/python
frase1 = ""
frase2 = ""
cadena = raw_input("Introduce la cadena")
for i in cadena:
if i.isupper():
i = i.lower()
if i != " ":
frase1 = frase1 + i #creo dos cadenas innecesarias
frase2 = i + frase2
if frase1 == frase2:
print "es palindromo"
else:
print "no es palindromo"

5 comentarios:

  1. Excelente tu entrada la verdad esta muy completa y muy bien explicada y con todo y ejemplos
    Muchas gracias por la información :)

    ResponderEliminar
  2. Bien :) Te pongo dos puntos extra en la clase por esta entrada de información adicional.

    ResponderEliminar
  3. me salvaste de una... te ganaste mi amor... xD

    ResponderEliminar
  4. Muchas gracias por compartirlo, la verdad que me has sacado de un gran apuro. ¡Muchas gracias!

    ResponderEliminar
  5. Y si solo quiero que diga si es palíndromo o si no lo es de una cadena de 40 caracteres

    ResponderEliminar