Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kayburn en 11 Marzo 2014, 01:00 am



Título: Problema con un programa en C (string.h y funciones)
Publicado por: Kayburn en 11 Marzo 2014, 01:00 am
Hola, estoy aprendiendo a estudiar C, y estoy encallado en un ejercicio, mañana tengo el examen y pff.. espero que me podáis ayudar:

El ejercicio me pide que cree un programa que reconozca palindromos (frases o palabras que se leen tanto de derecha a izquierda, como de izquierda a derecha)

ej: Abusón, acá no suba (evidentemente en el programa no pondremos acentos ni comas)

yo he escrito de momento esto:

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

void invertida (char text[]);

int main ()
{
    char text[100], text2[100];
    int j, i;
    printf("\n Introduce un texto ");
    gets(text);
    strcpy(text2, text);
    invertida(text);
    j=strcmp(text, text2);
    if(j==0)
        printf("\n Es un palindromo ");
    else
        printf("\n No es un palindromo ");
   
printf("\n FIN DEL PROGRAMA \n ");
system("pause");
}

void invertida (char text[])
{
    int i, longitud;
    longitud=strlen(text);
    for(i=longitud-1; i>=0; i--)
    {
       
    }
   
}

Para saber si es un palíndromo, copio el texto con strcpy en otra char, luego invierto el texto original, y por último los comparo con strcmp, y lo igualo a j para poder hacer el if mas tarde. En teoría, si coinciden todos los caracteres, retorna un 0, y por eso pongo if (j==0)

El error creo que está en la función, en el bucle del for, y/o en la llamada a la función "invertida(text);" y me temo que será una tontería... pero bueno.. me tiene loco ya xD

Espero que me podais ayudar! Gracias!

PD: Perdón por si he hecho una estupidez con el programa... llevo poco estudiando C xD


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: engel lex en 11 Marzo 2014, 01:24 am
Código
  1. void invertida (char text[])
  2. {
  3.    int i, longitud;
  4.    longitud=strlen(text);
  5.    for(i=longitud-1; i>=0; i--)
  6.    {
  7.  
  8.    }
  9.  
  10. }

hiciste un for... pero no hiciste nada en el D:


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: Kayburn en 11 Marzo 2014, 01:29 am
claro! ahí está el problema, no sé que poner dentro de ese for XD


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: leosansan en 11 Marzo 2014, 01:39 am
El problema nace con la copia de text, cuando lo que deberías hacer es que text2 sea la copia invertida de text, lo que consigues con la función,. Y ya luego comparar:

Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. void invertida (char text[],char invertida[]);
  7.  
  8. int main ()
  9. {
  10.    char text[100], text2[100]={""};
  11.    int j, i;
  12.    printf("\n Introduce un texto ");
  13.    gets(text);
  14.    invertida(text,text2);
  15.    j=strcmp(text2, text);
  16.    if(j==0)
  17.        printf("\n Es un palindromo ");
  18.    else
  19.        printf("\n No es un palindromo ");
  20.  
  21. printf("\n FIN DEL PROGRAMA \n ");
  22. system("pause");
  23. }
  24.  
  25. void invertida (char text[],char text2[])
  26. {
  27.    int i, longitud;
  28.    longitud=strlen(text);
  29.    for(i=longitud-1; i>=0; i--)
  30.    {
  31.        text2[i]=text[longitud-1-i];/* AQUI LA COPIAS AL REVES*/
  32.    }
  33.    text2[i]='\0';
  34.  
  35. }


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)







Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: Yoel Alejandro en 11 Marzo 2014, 03:43 am
Exactamente como dice leosasan, faltaba la parte donde realmente inviertes la palabra (?!). Y aparte yo recomendaría optimizar la parte donde haces la comparación, sin necesidad de usar la variable intermedia j (entre menos variables uses, el código será más ligero):
Código
  1. if( strcmp(text2, text) != 0 )
  2.    printf("\n Es un palindromo ");
  3. else
  4.    printf("\n No es un palindromo ");
  5. }

o más elegantemente, reemplazado strcmp(text2, text) != 0 por  !strcmp(text2, text) :
Código
  1. if( !strcmp(text2, text) )
  2.    printf("\n Es un palindromo ");
  3. else
  4.    printf("\n No es un palindromo ");
  5. }

=====================================================
(EDICIÓN)

Estaba pensando mejor el asunto, y no es necesario invertir toda la palabra para saber si es un palindromo. Es decir, basta que un carácter no coincida con su "complementario" en la otra mitad de la palabra. O sea si la palabra tiene una longitud N entonces basta que
Código
  1. text[i] != text[N - i - 1]
para saber que no es palíndromo, y en este punto el ciclo debería detenerse. Por la misma razón, es suficiente con escanear la primera mitad de la palabra, o sea desde i=0 y mientras i sea menor a N/2 caracteres (saca la cuenta, funciona con N par e impar).

Con todo esto, el código se puede depurar a:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int palindromo (char text[]);
  5.  
  6. int main ()
  7. {
  8.  
  9.   char text[100];
  10.  
  11.   printf("\n Introduce un texto: ");
  12.   gets(text);
  13.  
  14.   if ( palindromo(text) )
  15.     printf("\n Es un palindromo ");
  16.   else
  17.     printf("\n No es un palindromo ");
  18.  
  19.   printf("\n FIN DEL PROGRAMA \n ");
  20.   getchar( );
  21.  
  22.   return 0;
  23. }
  24.  
  25. int palindromo (char text[])
  26. {
  27.   int i, N;
  28.  
  29.   N = strlen(text);
  30.   for (i = 0; i < (float)N/2; i++)
  31.   {
  32.      if ( text[i] != text[N - i - 1] )
  33.         return 0;
  34.   }
  35.   return 1;
  36. }

Claro, entre más sofisticado se vuelva el código puede que este se ejecute más rápido pero aumenta la complejidad de algunos detalles del mismo (espero no abrumarte). Observa que el tipo de retorno de la función auxiliar palindromo se cambió a int, precisamente para que devuelva un valor numérico indicando si la palabra es palindromo o no.

Si no lo es, observa que la ejecución del for/ se detiene en algún momento cuando la condición dentro del if sea verdadera, y retorna 0. De lo contrario, continúa hasta el final y retorna 1.

Por último un detalle sutil. Cuando la longitud N de la palabra sea impar, el cociente N/2 será decimal, pero los tipos de las variables i, N son enteros, por eso la comparación i < N/2 no será válida. Es necesario convertir N a float para que admita los decimales y por eso ponemos i < (float)N / 2.

Por ejemplo, si N=5 entonces el programa debe ejecutarse con las primeras 3 letras de la palabra, y siendo N/2 = 2.5 ocurrirá justo así, se ejecutará para i=0, i=1, i=2. Por eso, funciona bien cuando N es impar.


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: engel lex en 11 Marzo 2014, 04:26 am
pongo mi granito de arena optimizando un poco más el código

Código
  1. int main (){
  2.    char text[100];
  3.    int j, i;
  4.    printf("\n Introduce un texto ");
  5.    gets(text);
  6.    j=strlen(text);
  7.    for(i=0;i<j;i++){
  8.        if(text[i]!=text[j-i-1]){
  9.            break;
  10.        }
  11.    }
  12.    if(i==j)
  13.        printf("\n Es un palindromo ");
  14.    else
  15.        printf("\n No es un palindromo ");
  16.  
  17. printf("\n FIN DEL PROGRAMA \n ");
  18. system("pause");
  19. }
  20.  


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: Yoel Alejandro en 11 Marzo 2014, 04:54 am
Uy, engelx se me adelantó, justo con la idea de interrupir el ciclo cuando ya se sepa que no es palíndromo. Lo que faltaría es recorrer sólo la primera mitad de la palabra, yeah!!


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: leosansan en 11 Marzo 2014, 05:49 am
Uy, engelx se me adelantó, justo con la idea de interrupir el ciclo cuando ya se sepa que no es palíndromo. Lo que faltaría es recorrer sólo la primera mitad de la palabra, yeah!!

Pues estrujando un poco más:

Código
  1. int main (){
  2.    char text[100];
  3.    int  i;
  4.    printf("\n Introduce un texto:\n ");
  5.    gets(text);
  6.    for(i=0;text[i]==text[strlen(text)-i-1] && i<strlen(text)/2;i++);
  7.    printf (i==strlen(text)/2 ? "\n Es un palindromo ": "\n No es un palindromo ");
  8.    return 0;
  9. }

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: engel lex en 11 Marzo 2014, 06:22 am
Código
  1. int main (){
  2.    char text[100];
  3.    int i=0;
  4.    printf("\n Introduce un texto:\n ");
  5.    gets(text);
  6.    while(text[i]==text[strlen(text)-i-1] && strlen(text)/2>i++);
  7.    printf (i>strlen(text)/2 ? "\n Es un palindromo ": "\n No es un palindromo ");
  8.    return 0;
  9. }

solo por el bien de la competencia otra manera ligeeeeeeeeeramente más corta XD basado en leosansan (sin contar la j, que se te pasó, está es 5 caracteres más corta XD (creo))  aunque realmente no aporto nada XD solo lo hago por while en lugar de for


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: Yoel Alejandro en 11 Marzo 2014, 08:33 am
Totalmente de acuerdo engelx, pero también hay considerar a veces que no sólo el código fuente sea más breve, sino que realmente se ejecute más rápido.

Por ejemplo, usas tres veces el strlen(text) es decir una sobrecarga por llamadas a función. Sería mejor definir una constante y asignarle el valor N = strlen(text), luego usas N. Esto quizá lleve más líneas de código fuente pero se ejecutará más rápido.


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: leosansan en 11 Marzo 2014, 11:13 am
Totalmente de acuerdo engelx, pero también hay considerar a veces que no sólo el código fuente sea más breve, sino que realmente se ejecute más rápido.

Por ejemplo, usas tres veces el strlen(text) es decir una sobrecarga por llamadas a función. Sería mejor definir una constante y asignarle el valor N = strlen(text), luego usas N. Esto quizá lleve más líneas de código fuente pero se ejecutará más rápido.

Aunque aparentemente sea así, por lo que tengo entendido el compilador se encargará de eso de  forma automática

Ya he comprobado que en otras ocasiones el definir una función como inline no produce las mejoras que se esperan de ello ya que al parecer, aunque no la declares como inline, en ocasiones el compilador hace la misma tarea que al declararla inline.


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: eferion en 11 Marzo 2014, 11:25 am
Aunque aparentemente sea saí, por lo que tengo entendido el compilador se encargará de eso de  forma automática

Ya he comprobado que en otras ocasiones el definir una función como inline noproduce las mejoras que se esperan de ello ya que al parecer, aunque no la declares como inline, en ocasiones el compilador hace la misma tarea que al declararla inline.


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Efectivamente, los compiladores de hoy en día hacen maravillas en cuanto a optimizaciones. De hecho muchos compiladores ignoran el uso de inline y lo aplican a discreción según el código que se encuentren (aunque éste esté en el cpp).

En cualquier caso, si un mismo resultado se va a utilizar varias veces en una misma función siempre queda mejor almacenarlo en una variable que volver a insertar la llamada a la función. De esa forma te aseguras que el código sea más óptimo independientemente de que el compilador optimice de una forma o de otra.


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: rir3760 en 11 Marzo 2014, 16:45 pm
Por último un detalle sutil. Cuando la longitud N de la palabra sea impar, el cociente N/2 será decimal, pero los tipos de las variables i, N son enteros, por eso la comparación i < N/2 no será válida. Es necesario convertir N a float para que admita los decimales y por eso ponemos i < (float)N / 2.
La conversión al tipo float no es necesaria ya que la división entre dos números enteros resulta en un valor también entero (los decimales se descartan).

----

Una forma ligeramente distinta a las expuestas es:
Código
  1. #include <string.h>
  2.  
  3. int es_palindromo(char const *cad)
  4. {
  5.   int i;
  6.   int j = strlen(cad) - 1;
  7.  
  8.   for (i = 0; i < j && cad[i] == cad[j]; i++, j--)
  9.      ;
  10.  
  11.   return i >= j;
  12. }

Un saludo


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: leosansan en 11 Marzo 2014, 18:14 pm

Por cierto amigo engelx, en mi caída te arrastré antes y ninguno pusimos los include de cabecera, lo que nos dice que con la emoción no pusimos atención a los warnings que nos lazaba el compilador. Y es que donde esté un "pique" sanote que se quite todo lo demás.
(http://st.forocoches.com/foro/images/smilies/simba1.gif)

Código
  1. #include <stdio.h>
  2. int main (){
  3.    char text[100];
  4.    int i=0,j=0;
  5.    printf("\n Introduce un texto ");
  6.    gets(text);
  7.    while (text[j++]!='\0');
  8.    for(;text[i]==text[j-i-2] && j/2>i++;);
  9.    printf (i>j/2 ? "\n Es un palindromo ": "\n No es un palindromo ");
  10.    return 0;
  11. }

Aunque tengo un while de más, me ahorro la librería string.h y el repetir strlen en tres ocasiones y además, como ya comentaron anteriormente, el código está más optimizado sin calcular tantas veces strlen.

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: do-while en 11 Marzo 2014, 19:03 pm
¡Buenas!

Estaba corrigiendo el código para que tuviese en cuenta los espacios y las eñes, y la parte de los espacios va sobre ruedas, pero por lo menos en Debian no reconoce las eñes, ni introduciendolas como caracteres ni introduciendo sus valores, ni con signo ni sin signo...

¿Alguien puede confirmarmelo?

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4.  
  5. char mayus(char c)
  6. {
  7.    if(c == 'ñ')
  8.        return 'Ñ';
  9.  
  10.    return toupper(c);
  11. }
  12.  
  13. int palindromo(char *s)
  14. {
  15.    int ini = 0 , fin = strlen(s) - 1;
  16.  
  17.    while(ini < fin)
  18.    {
  19.        while(isspace(s[ini]) && s[ini])
  20.            ini++;
  21.  
  22.        while(isspace(s[fin]) && fin > 0)
  23.            fin--;
  24.  
  25.        if(ini < fin && mayus(s[ini]) != mayus(s[fin]))
  26.            return 0;
  27.  
  28.        ini++;
  29.        fin--;
  30.    }
  31.  
  32.    return 1;
  33. }
  34.  
  35. int main ()
  36. {
  37.    char text[100]="dabale\n \t Arroz a      la zorra el abad";
  38.    char texto[100]="   aMa \n ña ÑamA";
  39.    int i=0;
  40.  
  41.    printf("%d %d\n", (unsigned char)'ñ' , (unsigned char) 'Ñ');
  42.  
  43.    printf("%s",text);
  44.    for(;text[i]==text[strlen(text)-i-1] && strlen(text)/2>i++;);
  45.  
  46.    printf (i>strlen(text)/2 ? "\n Es un palindromo ": "\n No es un palindromo ");
  47.    printf(palindromo(text) ? "\n Es un palindromo ": "\n No es un palindromo ");
  48.    printf(palindromo(texto) ? "\n Es un palindromo ": "\n No es un palindromo ");
  49.  
  50.    return 0;
  51. }
  52.  

¡Saludos!
________________________________________________________________________________________________________

PD: Cambiando la condición isspace por !isalnum ignoraréis cualguier cosa que no sea un caracter o un número (incluida la ñ...). Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4.  
  5. int mayus(int c)
  6. {
  7.    if(c == 'ñ')
  8.        return 'Ñ';
  9.  
  10.    return toupper(c);
  11. }
  12.  
  13. int palindromo(char *s)
  14. {
  15.    int ini = 0 , fin = strlen(s) - 1;
  16.  
  17.    while(ini < fin)
  18.    {
  19.        while(!isalnum(s[ini]) && s[ini++]);
  20.  
  21.        while(!isalnum(s[fin]) && fin-- > 0);
  22.  
  23.        if(ini < fin && mayus(s[ini++]) != mayus(s[fin--]))
  24.            return 0;
  25.    }
  26.  
  27.    return 1;
  28. }
  29.  
  30. int main ()
  31. {
  32.    char texto[100]="a man, \n a p\tlan, a canal, panama";
  33.    int i;
  34.  
  35.    printf("%s",texto);
  36.  
  37.    for(;texto[i]==texto[strlen(texto)-i-1] && strlen(texto)/2>i++;);
  38.  
  39.    printf (i>strlen(texto)/2 ? "\n Es un palindromo ": "\n No es un palindromo ");
  40.    printf(palindromo(texto) ? "\n Es un palindromo ": "\n No es un palindromo ");
  41.  
  42.    return 0;
  43. }
  44.  

Lo de la ñ debe ser porque lo considera un caracter multibyte..., ahora investigo un poco mas.

Con la última modificación ha quedado un poco mas compacto pero un poco menos legible XD.

¡Saludos!
________________________________________________________________________________________________________

sizeof('ñ') en Debian, me está diciendo que son 4 bytes...


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: Yoel Alejandro en 11 Marzo 2014, 23:05 pm
rir3760, no era exactamente eso lo que quería decir. Mi intención era precisamente que sí reconociera los decimales, por ejemplo, si la longitud es N=5 se consideraran los valores i = 0, i = 1, i = 2. O sea todos los valores enteros de i no mayores a 5/2 = 2.5, en cuyo caso debemos convertir a float o double, pues de otro modo la sentencia i < N/2 llegaría sólo hasta i=1.

Claro, ahondando en el fondo vemos que i = 2 no es necesario porque no necesitamos comparar el elemento del medio de la cadena. O sea que al final el (float) sí es redundante.

Pero lo que quiero decir es que en un problema donde se requiriera llegar hasta el elemento del medio i = 2, habría que poner el (float), ya que de otro modo la sentencia i < N/2 con N = 5, llegaría hasta i = 1. Y si se nos ocurre poner i <= N/2 también estaría mal porque en el caso que N sea par, ejemplo N = 6, llegaría hasta i = 3 cuando debería ser hasta i = 2. En un caso como ese creo que no queda otro remedio que i < (float)N/2



Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: rir3760 en 12 Marzo 2014, 03:38 am
Pero lo que quiero decir es que en un problema donde se requiriera llegar hasta el elemento del medio i = 2, habría que poner el (float), ya que de otro modo la sentencia i < N/2 con N = 5, llegaría hasta i = 1. Y si se nos ocurre poner i <= N/2 también estaría mal porque en el caso que N sea par, ejemplo N = 6, llegaría hasta i = 3 cuando debería ser hasta i = 2. En un caso como ese creo que no queda otro remedio que i < (float)N/2.
Si la intención es procesar la primera mitad de un array incluyendo el elemento pivote (si existe) me parece mas sencillo utilizar la expresión "i < (N + 1) / 2" para controlar el bucle.

Un saludo


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: leosansan en 12 Marzo 2014, 04:00 am
......................................................................................

Pero lo que quiero decir es que en un problema donde se requiriera llegar hasta el elemento del medio i = 2, habría que poner el (float), ya que de otro modo la sentencia i < N/2 con N = 5, llegaría hasta i = 1. Y si se nos ocurre poner i <= N/2 también estaría mal porque en el caso que N sea par, ejemplo N = 6, llegaría hasta i = 3 cuando debería ser hasta i = 2. En un caso como ese creo que no queda otro remedio que i < (float)N/2



No, no y no. El término central en un array de cindo elementos no es el 2.5 sino el tercero.

Paree que olvidas que los elemento de un array es un caso particular de los términos de una sucesión, que no es más que una aplicación biyectiva entre los números naturales y los elementos de la sucesión .. y entre los números naturales no están los decimales.

El problema se reduce a comparar la sucesión de los elementos de la de parte izquierda con los de la parte derecha y:

* si se trata de un número par se compara exactamente la mitad.

*  si se trata de un número impar se compara la mitad menos uno de cada parte, quedando el central sin nadie con quien compara, por lo que se pasa de él.

De ahí que la expresión N/2 sea la apropiada a emplear.


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: do-while en 12 Marzo 2014, 08:56 am
Ese algoritmo tiene grades fallos lógicos:

O bien la cadena tiene que ser simétrica con respecto al centro o no puede contener espacios.

Dado que hay palíndromos que contienen espacios y que no son simétricos os dirá que textos que realmente son palíndromos no lo son (ej: Anita lava la tina).  Lo de los espacios lo podéis arreglar añadiendo una función que los elimine. De todas todas tenéis que corregir el código.

¡Saludos!


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: Yoel Alejandro en 13 Marzo 2014, 01:39 am
Si la intención es procesar la primera mitad de un array incluyendo el elemento pivote (si existe) me parece mas sencillo utilizar la expresión "i < (N + 1) / 2" para controlar el bucle.

Es otra manera, gracias.

Para do-while, la solución que presenté considera que la palabra no contiene espacios, y fue así para mantenerme fiel al enfoque dado inicialmente al tema por parte de su autor. Luego él mencionó el problema de los espacios, y creo que después presentó en un programa capaz de manejar ese problema.

Leosansan ya va tranquilo, calma. Por supuesto que el elemento central de una sucesión de cinco elementos no es el 2.5, sino el 2 (o sea, de índice 2). Se trataba de una condición que pudiera discernir los valores correctos de i a tomar. Al redondear a enteros, la condición i < 2.5 se reduce a i = 0, 1, 2, como queríamos.

O más precisamente, tal como rir3760 y tú dicen la condición i< N/2 es la apropiada si para el caso impar no se toma el elemento central (el caso nuestro), y la condición i < (float)N / 2, o bien i < (N+1)/2 si el elemento central fuera tomado (que no es nuestro caso).

Pero yo tuve un lapsus y por alguna razón incluí el elemento central o pivote, de donde surgió toda la discusión. Conste que incluir este pivote no afecta el resultado del programa, por cuánto estaría comparando dicho elemento consigo mismo y a lo peor incurre en una pequeña falta de eficiencia.


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: leosansan en 13 Marzo 2014, 05:12 am
Ese algoritmo tiene grades fallos lógicos:

O bien la cadena tiene que ser simétrica con respecto al centro o no puede contener espacios.

Dado que hay palíndromos que contienen espacios y que no son simétricos os dirá que textos que realmente son palíndromos no lo son (ej: Anita lava la tina).  Lo de los espacios lo podéis arreglar añadiendo una función que los elimine. De todas todas tenéis que corregir el código.

¡Saludos!

Creo que no, aunque parezca que sí.

Todo nace en la definición de la RAE de palíndromo:


Citar
palíndromo.
(Del gr. πάλιν, de nuevo, y δρόμος, carrera).
1. m. Palabra o frase que se lee igual de izquierda a derecha, que de derecha a izquierda; p. ej., anilina; dábale arroz a la zorra el abad.


Por un lado está la definición: que se lea igual de derecha a izquierda.

Pero luego la pifian en el ejemplo que ponen ya que:

Citar

dábale arroz a la zorra el abad  <== al derecho

daba el arroz al a zorra elabád <== al revés




Y aplicando en sentido estricto la definición de que se "lea" igual en ambos sentidos lo siento, pero a no ser que empecemos a hablar mal, no se leen igual a la que al a, ni el abad con elabád.

La definición lo pone bien clarito: que se lea igual al derecho que al revés. Y eso no ocurre, a no ser que nos empecemos a sacar reglas como que los espacios no cuentan o se quiten de un lugar y  se pongan en otro, pero eso no es lo que dice la definición.

Sencillamente creo que se equivocaron en el ejemplo, por mencionar aunque sea de pasada, no se lee, como dice la definición, igual una letra acentuada que otra que no lo está.

Y si tenemos eso en cuenta los espacios si cuentan, y mucho ya que en el lenguaje hablado vendrían a representar una pausa mayor o menor. Soy tan estricto al respecto que dos espacios en blanco, cuando en el resto del texto se está usando sólo un espacio, podría considerarse una falta de ortografía "digital". ;)

Pero no deja de ser más que una interpretación que hago yo y con la cual muchos disentirán, a pesar de que la definición es bien clara: que se lea igual.

Es más, no estoy de acuerdo ni con la definición ya que creo que debería haber sido que se escriba igual en ambos sentidos, lo que alejaría la incongruencia entre las letras mayúsculas y minúsculas ya que no es lo mismo:


Citar

En León se come bien

El león come bien


La diferencia entre mayúsculas y minúsculas puede cambiar el sentido de las palabras y frases. En el ejemplo que pongo, uno se refiere a un lugar, León, y el otro a un animal, el león. Pero en fin, no tuvieron eso en cuenta y se limitaron a que se lea igual. Si tuviéramos en cuenta este hecho efectivamente un palíndromo debería de ser estrictamente simétrico, como sucede en los números capicúa.

Pero a lo que iba, creo que tanto engelx como yo nos limitamos a palabras palíndrómicas, no a frases de ahí nuestros escuetos códigos .... y además lo hicimos a posta diferenciando mayúsculas de minúsculas, cosa que no es aplicable como ya he comentado, pero todo ha sido un juego en crear el código más cortito.

Aclaro que esto no tene nada que ver con do-while al que tengo por uno de los "maestros" de este foro. Todo lo contrario, es una observación con respecto a la RAE. Nada más lejos de mi intención que meterme con nadie y mucho menos, reitero, con do-while.

Y para frases y tener en cuenta la equivalencia entre mayúsculas y minúsculas, cosa que me horroriza:


Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. int main (){
  4.    char text[100];
  5.    int i=0,j=0;
  6.    printf("\nIntroduce un texto: \n");
  7.    gets(text);
  8.    while (text[j++]!='\0');
  9.    for(;(toupper(text[i])==toupper(text[j-i-2])) && j/2>i++;);
  10.    printf (i>j/2 ? "\n Es un palindromo ": "\n No es un palindromo ");
  11.    return 0;
  12. }

Eso sí, sigo firme en lo de los espacios, o coinciden o no se lee igual. Las pausas en la lectura las marcan los espacios, siempre bajo mi criterio, ¿ehh..?, o eso o es una falta "digital" de ortografía, como ya comenté.

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: Yoel Alejandro en 13 Marzo 2014, 18:12 pm
Ah bueno leosansan tienes razón, ya eso depende de la interpretación que demos de palíndromo, si bien la definición formal RAE (que es la oficial de nuestro idioma), o bien una definición más relajada.

A veces en determinada ciencia tomamos definiciones más amplias (o más estrictas) que las lingüísticas, y podría ser ese el caso de la informática. Está bien tu aporte y el de todos, porque así contamos con un abanico de soluciones, adaptadas a las distintas interpretaciones del problema.

Un buen proyecto sería construir una función "múltiple", con un argumento option adicional que especifique el tipo de interpretación que será hecho (omitiendo o no los espacios, diferenciando mayúsculas, etc). Así sería más flexible, amplio y práctico  :D.


Título: Re: Problema con un programa en C (string.h y funciones)
Publicado por: leosansan en 13 Marzo 2014, 18:51 pm
.........................................................................................

Un buen proyecto sería construir una función "múltiple", con un argumento option adicional que especifique el tipo de interpretación que será hecho (omitiendo o no los espacios, diferenciando mayúsculas, etc). Así sería más flexible, amplio y práctico  :D.

Muy buena idea amigo yoel_alejandro, Ya hay algo en lo que trabajar. :)

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)