palindromo

Iniciado por ALONSOQ, 13 Julio 2012, 12:47 PM

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

ALONSOQ

Hola,

Despues de conseguir, con ayuda, eliminar los espacios de un texto; me propongo saber si un texto es palindromo ( se lee igiual de izda a decha que al reves), he redactado lo que sigue, pero hay algun errorcillo que espero que me podais ayudar a detectar

#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
int main()

{
      char texto[30];
      char copytexto[30];
     
     
     int i, j;
     
     printf (" escribe la frase:");
      gets( texto );
     

     
     // se copia esta frase en un nuevo arreglo sin espacios
     for( i=0;i<strlen(texto);i++ )
     {
          if( texto[i] == ' ' )/* si hay un espacio*/
          {
              for( j = i+1 ; texto[j] !='\0' ; j++ )
              {
                   texto[j-1] = texto[j];
              }
           
            texto[j-1] = '\0';
          } 
           
     }
       printf( "Sin espacios : %s\n" ,texto );
       
          /*strcpy (copytexto,texto);*/
           
           for (i=0;i<strlen (texto);i++)
           {
               for(j<strlen(texto);j=0;j--)
             
               
                if (texto[i]=texto[j])
               
               
               printf("es palindromo");
               
               else
               
               printf("no lo es");
           }
           
     
      system( "pause" );
}


Muchas gracias

Stakewinner00

Muy util cuando llegue a casa lo miro.

Thanks

avesudra

He editado un poco tu código de manera que lo que hace es que al texto sin espacios , lo copio a copytexto y a copytexto lo invierto , después comparo las dos cadenas y si son iguales , el texto es palíndromo  ;-) ¡Gracias por el aporte!
PD: Para ver la salida que el programa produce no es necesario llamar al sistema , puedes hacer lo mismo con printf + getchar.
#include <string.h>
#include <stdio.h>

void invertir_cadena(char *cadena);
int main()

{
     char texto[30];
     char copytexto[30];


    int i, j;

    printf (" escribe la frase:");
    gets( texto );
    for( i=0;i<strlen(texto);i++ )
    {
         if( texto[i] == ' ' )/* si hay un espacio*/
         {
             for( j = i+1 ; texto[j] !='\0' ; j++ )
             {
                  texto[j-1] = texto[j];
             }

           texto[j-1] = '\0';
         }

    }
    strcpy (copytexto,texto);
    invertir_cadena(copytexto);
   printf( "Sin espacios : %s\n" ,texto );

   if (strcmp(texto,copytexto)==0)
   printf("Es palindromo\n");
   else
   printf("No es palindromo\n");
   printf("Presione una tecla para continuar . . .");
   getchar();
   return 0;
}
void invertir_cadena(char *cadena)
{
   char *p_f_cadena=cadena+strlen(cadena)-1;
   char save=0;

   for(int i = 0; cadena+i<=p_f_cadena; ++i)
   {
       save=*(cadena+i);
       *(cadena+i)=*p_f_cadena;

       *p_f_cadena=save;
       --p_f_cadena;
   }
}
Regístrate en

ALONSOQ

Muchas gracias,

voy a mirarlo tranquilamente para tratar de entender lo que has escrito

saludos

durasno

Hola! no es mas facil tener dos indices, uno al inicio y otro al final del arreglo, para ir comparando letra por letra?? algo asi:

for(i=0,j=strlen(texto)-1; i!=j; i++,j-- )
  if(texto[i]==texto[j])
    "es palindromo"


Saludos
Ahorrate una pregunta, lee el man

do-while

Cita de: durasno en 13 Julio 2012, 17:39 PM
for(i=0,j=strlen(texto)-1; i!=j; i++,j-- )
  if(texto[i]==texto[j])
    "es palindromo"


Solo estas comparando pares de letras, no todo el texto que pueda recivir.

Aqui tienes otra funcion:

#include <math.h>
#include <stdlib.h>
#include <string.h>

int palindromo(char *texto) /* texto no puede tener espacios en blanco */
{
    int longitud = strlen(texto),i;

    for(i = 0 ; i < longitud / 2 ; i++)
        if(pow((rand() % 100) + 2 , texto[i] - texto[longitud - i - 1]) - 1)
            return sin(acos(1));

    return cos(log(1));
}


XD

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

xiruko

estoy de acuerdo con durasno, veo mas sencillo recorrer el texto comparando 2 indices que empiezan al principio y al final, y se recorren hasta llegar a la mitad de la cadena. dejo aqui mi codigo, lo he probado y funciona:

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

#define SIZE 256

int main(int argc, char** argv)
{
char buffer[SIZE];
int i, j, cond=1;

printf("Introduzca la frase: ");
fgets(buffer, SIZE-1, stdin);
buffer[strlen(buffer)-1]='\0';

//eliminar espacios en blanco
for (i=0; i<strlen(buffer)-1; i++) {
if (buffer[i] == ' ') {
for (j=i; j<strlen(buffer)-1; j++) {
buffer[j]=buffer[j+1];
}
buffer[strlen(buffer)-1]='\0';
}
}
printf("La frase sin espacios es: %s\n", buffer);

//comprobar si es palindromo
for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
if (buffer[i] != buffer[strlen(buffer)-i-1]) {
cond=0;
}
}

if (cond == 1) {
printf("Es palindromo.\n");
} else {
printf("No es palindromo.\n");
}

return 0;
}

durasno

Exacto yo me referia a esto:
for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
if (buffer[i] != buffer[strlen(buffer)-i-1]) {
cond=0;
}
}

Igual me parece innecesario eliminar los espacios


Saludos
Ahorrate una pregunta, lee el man

do-while

Cita de: durasno en 14 Julio 2012, 00:22 AM
Igual me parece innecesario eliminar los espacios

Si no eliminases los espacios, oraciones como "dabale arroz a la zorra el abad" no se cosiderarian palindromos, siendo que si se consideran como tal... o tampoco seria un palindromo el famoso "a man a plan a canal panama", que incluso hay programadores que han trabajado con este ultimo para extenderlo todo lo posible.

Todo depende de la "pureza" que quieras darle a un palindromo...

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

bemone

Lo acabo de hacer recien en el comentario y no lo probe, fijate si anda.

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{
string str, str2;
cin >> str;

size_t pos = str.find_first_of(" ");
while(pos != string::npos){
str.erase(pos);
pos = str.find_first_of(" ");
}

str2 = str.substr(0, str.length());
reverse(str.begin(), str.end());

if(str2 == str)
cout << "La frase '"<<str<<"' es palindroma." <<endl;
else
cout << "La frase '"<<str<<"' no es palindroma." <<endl;

system("pause");
       return EXIT_SUCCESS;
}
Odio los tipos de variable de Windows.