Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ALONSOQ en 13 Julio 2012, 12:47 pm



Título: palindromo
Publicado por: ALONSOQ en 13 Julio 2012, 12:47 pm
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

Código
  1. #include <string.h>
  2. #include <ctype.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int main()
  6.  
  7. {
  8.      char texto[30];
  9.      char copytexto[30];
  10.  
  11.  
  12.     int i, j;
  13.  
  14.     printf (" escribe la frase:");
  15.      gets( texto );
  16.  
  17.  
  18.  
  19.     // se copia esta frase en un nuevo arreglo sin espacios
  20.     for( i=0;i<strlen(texto);i++ )
  21.     {
  22.          if( texto[i] == ' ' )/* si hay un espacio*/
  23.          {
  24.              for( j = i+1 ; texto[j] !='\0' ; j++ )
  25.              {
  26.                   texto[j-1] = texto[j];
  27.              }
  28.  
  29.            texto[j-1] = '\0';
  30.          }  
  31.  
  32.     }
  33.       printf( "Sin espacios : %s\n" ,texto );
  34.  
  35.          /*strcpy (copytexto,texto);*/
  36.  
  37.           for (i=0;i<strlen (texto);i++)
  38.           {
  39.               for(j<strlen(texto);j=0;j--)
  40.  
  41.  
  42.                if (texto[i]=texto[j])
  43.  
  44.  
  45.               printf("es palindromo");
  46.  
  47.               else
  48.  
  49.               printf("no lo es");
  50.           }
  51.  
  52.  
  53.      system( "pause" );
  54. }

Muchas gracias


Título: Re: palindromo
Publicado por: Stakewinner00 en 13 Julio 2012, 12:59 pm
Muy util cuando llegue a casa lo miro.

Thanks


Título: Re: palindromo
Publicado por: avesudra en 13 Julio 2012, 13:10 pm
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.
Código
  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. void invertir_cadena(char *cadena);
  5. int main()
  6.  
  7. {
  8.      char texto[30];
  9.      char copytexto[30];
  10.  
  11.  
  12.     int i, j;
  13.  
  14.     printf (" escribe la frase:");
  15.     gets( texto );
  16.     for( i=0;i<strlen(texto);i++ )
  17.     {
  18.          if( texto[i] == ' ' )/* si hay un espacio*/
  19.          {
  20.              for( j = i+1 ; texto[j] !='\0' ; j++ )
  21.              {
  22.                   texto[j-1] = texto[j];
  23.              }
  24.  
  25.            texto[j-1] = '\0';
  26.          }
  27.  
  28.     }
  29.     strcpy (copytexto,texto);
  30.     invertir_cadena(copytexto);
  31.    printf( "Sin espacios : %s\n" ,texto );
  32.  
  33.    if (strcmp(texto,copytexto)==0)
  34.    printf("Es palindromo\n");
  35.    else
  36.    printf("No es palindromo\n");
  37.    printf("Presione una tecla para continuar . . .");
  38.    getchar();
  39.    return 0;
  40. }
  41. void invertir_cadena(char *cadena)
  42. {
  43.    char *p_f_cadena=cadena+strlen(cadena)-1;
  44.    char save=0;
  45.  
  46.    for(int i = 0; cadena+i<=p_f_cadena; ++i)
  47.    {
  48.        save=*(cadena+i);
  49.        *(cadena+i)=*p_f_cadena;
  50.  
  51.        *p_f_cadena=save;
  52.        --p_f_cadena;
  53.    }
  54. }
  55.  


Título: Re: palindromo
Publicado por: ALONSOQ en 13 Julio 2012, 15:51 pm
Muchas gracias,

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

saludos


Título: Re: palindromo
Publicado por: durasno en 13 Julio 2012, 17:39 pm
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:

Código
  1. for(i=0,j=strlen(texto)-1; i!=j; i++,j-- )
  2.  if(texto[i]==texto[j])
  3.    "es palindromo"

Saludos


Título: Re: palindromo
Publicado por: do-while en 13 Julio 2012, 18:42 pm
Código
  1. for(i=0,j=strlen(texto)-1; i!=j; i++,j-- )
  2.  if(texto[i]==texto[j])
  3.    "es palindromo"

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

Aqui tienes otra funcion:
Código
  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int palindromo(char *texto) /* texto no puede tener espacios en blanco */
  6. {
  7.    int longitud = strlen(texto),i;
  8.  
  9.    for(i = 0 ; i < longitud / 2 ; i++)
  10.        if(pow((rand() % 100) + 2 , texto[i] - texto[longitud - i - 1]) - 1)
  11.            return sin(acos(1));
  12.  
  13.    return cos(log(1));
  14. }
  15.  

XD

¡Saludos!


Título: Re: palindromo
Publicado por: xiruko en 13 Julio 2012, 19:41 pm
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:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define SIZE 256
  5.  
  6. int main(int argc, char** argv)
  7. {
  8. char buffer[SIZE];
  9. int i, j, cond=1;
  10.  
  11. printf("Introduzca la frase: ");
  12. fgets(buffer, SIZE-1, stdin);
  13. buffer[strlen(buffer)-1]='\0';
  14.  
  15. //eliminar espacios en blanco
  16. for (i=0; i<strlen(buffer)-1; i++) {
  17. if (buffer[i] == ' ') {
  18. for (j=i; j<strlen(buffer)-1; j++) {
  19. buffer[j]=buffer[j+1];
  20. }
  21. buffer[strlen(buffer)-1]='\0';
  22. }
  23. }
  24. printf("La frase sin espacios es: %s\n", buffer);
  25.  
  26. //comprobar si es palindromo
  27. for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
  28. if (buffer[i] != buffer[strlen(buffer)-i-1]) {
  29. cond=0;
  30. }
  31. }
  32.  
  33. if (cond == 1) {
  34. printf("Es palindromo.\n");
  35. } else {
  36. printf("No es palindromo.\n");
  37. }
  38.  
  39. return 0;
  40. }


Título: Re: palindromo
Publicado por: durasno en 14 Julio 2012, 00:22 am
Exacto yo me referia a esto:
Código
  1. for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
  2. if (buffer[i] != buffer[strlen(buffer)-i-1]) {
  3. cond=0;
  4. }
  5. }
Igual me parece innecesario eliminar los espacios


Saludos


Título: Re: palindromo
Publicado por: do-while en 14 Julio 2012, 03:53 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!


Título: Re: palindromo
Publicado por: bemone en 14 Julio 2012, 05:30 am
Lo acabo de hacer recien en el comentario y no lo probe, fijate si anda.

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. string str, str2;
  10. cin >> str;
  11.  
  12. size_t pos = str.find_first_of(" ");
  13. while(pos != string::npos){
  14. str.erase(pos);
  15. pos = str.find_first_of(" ");
  16. }
  17.  
  18. str2 = str.substr(0, str.length());
  19. reverse(str.begin(), str.end());
  20.  
  21. if(str2 == str)
  22. cout << "La frase '"<<str<<"' es palindroma." <<endl;
  23. else
  24. cout << "La frase '"<<str<<"' no es palindroma." <<endl;
  25.  
  26. system("pause");
  27.        return EXIT_SUCCESS;
  28. }


Título: Re: palindromo
Publicado por: durasno en 14 Julio 2012, 05:36 am
Citar
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.
:) ya entendi... Saludos


Título: Re: palindromo
Publicado por: dato000 en 14 Julio 2012, 17:32 pm
Lo acabo de hacer recien en el comentario y no lo probe, fijate si anda.

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. string str, str2;
  10. cin >> str;
  11.  
  12. size_t pos = str.find_first_of(" ");
  13. while(pos != string::npos){
  14. str.erase(pos);
  15. pos = str.find_first_of(" ");
  16. }
  17.  
  18. str2 = str.substr(0, str.length());
  19. reverse(str.begin(), str.end());
  20.  
  21. if(str2 == str)
  22. cout << "La frase '"<<str<<"' es palindroma." <<endl;
  23. else
  24. cout << "La frase '"<<str<<"' no es palindroma." <<endl;
  25.  
  26. system("pause");
  27.        return EXIT_SUCCESS;
  28. }

ummm funciona con palabras más no con frases.


Título: Re: palindromo
Publicado por: ALONSOQ en 7 Agosto 2012, 10:11 am
Hola he retomado este tema y he encontrado este código, que de una manera facil y entendible para los que somos principaiantes, dice si una palabra es o no palindromo. Pero me surge la siguiente duda de principante, en el bucle for termina con ';' ( en los codigos que yo he hecho hasta ahora no se termina con ';') y si se elimina, aunque el programa compila y ejecuta, no funciona correctamente ¿ por que?

muchas gracias
Código
  1. int longitud;
  2. int inicio=0, fin;    
  3.  
  4.  
  5. void palindromo (char palin[]);
  6. char palin[30];
  7. main()
  8. {
  9. palindromo(palin);
  10. }
  11.  
  12. void palindromo (char palin[])
  13. {
  14.  
  15.     printf("dime una palabra:");
  16.     gets (palin);
  17.    longitud = strlen(palin);
  18.  
  19.  
  20.     for(fin=longitud-1; palin[fin]==palin[inicio] && fin>=0; inicio++,fin--);
  21.  
  22.         if (inicio==longitud)
  23.         {
  24.            printf( "Es palindromo");
  25.         }  
  26.         else
  27.         {
  28.            printf( "no es palindromo");  
  29.         }  
  30.  
  31.  
  32. }


Título: Re: palindromo
Publicado por: fary en 7 Agosto 2012, 13:34 pm
Mucho más simple

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7. char Palabra[100];
  8. int i,len;
  9.  
  10. memset(Palabra,0,100);
  11.  
  12. printf("Introduce la palabra: ");
  13. scanf("%s",&Palabra);
  14.  
  15. len = strlen(Palabra);
  16.  
  17. for (i=0;i!=len;i++)
  18. {
  19. if (Palabra[i] != Palabra[len-i-1]) break;
  20. }
  21.  
  22. if (i==len) printf("Palindroma\n");
  23. else printf("No es palindroma\n");
  24.  
  25. system("PAUSE");
  26. return 0;
  27. }


Título: Re: palindromo
Publicado por: ALONSOQ en 7 Agosto 2012, 17:34 pm
Muchas gracias por tu respuesta

por cierto que significa memset(Palabra,0,100);?

gracias


Título: Re: palindromo
Publicado por: fary en 7 Agosto 2012, 17:49 pm
Muchas gracias por tu respuesta

por cierto que significa memset(Palabra,0,100);?

gracias

Llena el buffer Palabra con bytes nulos.

http://www.cplusplus.com/reference/clibrary/cstring/memset/



Título: Re: palindromo
Publicado por: X3R4CK3R en 7 Agosto 2012, 17:52 pm
por cierto que significa memset(Palabra,0,100);?

http://bit.ly/HniJLP

google no muerde :-X ni tampoco cplusplus.com

Saludos