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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con un programa en C (string.h y funciones)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con un programa en C (string.h y funciones)  (Leído 6,919 veces)
Kayburn

Desconectado Desconectado

Mensajes: 20



Ver Perfil
Problema con un programa en C (string.h y funciones)
« 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


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #1 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:


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.
Kayburn

Desconectado Desconectado

Mensajes: 20



Ver Perfil
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #2 en: 11 Marzo 2014, 01:29 am »

claro! ahí está el problema, no sé que poner dentro de ese for XD
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #3 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! ..... !!!!







« Última modificación: 11 Marzo 2014, 01:40 am por leosansan » En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #4 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.
« Última modificación: 11 Marzo 2014, 04:52 am por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #5 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.  
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.
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #6 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!!
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #7 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! ..... !!!!


« Última modificación: 11 Marzo 2014, 11:06 am por leosansan » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #8 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
« Última modificación: 11 Marzo 2014, 06:31 am por engelx » 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.
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Problema con un programa en C (string.h y funciones)
« Respuesta #9 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.
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines