Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jamatbar en 9 Noviembre 2011, 22:14 pm



Título: Duda programa con estructuras de control
Publicado por: jamatbar en 9 Noviembre 2011, 22:14 pm
Buenas, tengo el siguiente programa que me pide un valor hexadecimal y lo transforma en decimal, sin importar que sea letras mayusculas o minúsculas, es código es el siguiente:

#include <stdio.h>

int main ()
{

char car1;
char car2;
char valor1;
char valor2;
int valor;
printf("Introduzca un valor hexadecimal:\n");
scanf("\n%c%c", &car1, &car2);

if('0'<=car1 && car1<='9')
valor1=car1-'0';
else if ('A'<=car1 && car1<='F')
valor1=car1-'A'+10;
else if ('a'<=car1 && car1<='f')
valor1=car1-'a'+10;

if('0'<=car2 && car2<='9')
valor2=car2-'0';
else if ('A'<=car2 && car2<='F')
valor2=car2-'A'+ 10;
else if ('a'<=car2 && car2<='f')
valor2=car2-'a'+10;

valor= 16*valor1 + valor2;

printf("EL valor decimal de 0x%c%c es %d\n",car1,car2,valor);
return 0;
}


Pero me han pedido que proteja el programa de tal forma que detecte si alguno de los carácteres es inválido, indicándolo con un mensaje de error y no procesándolos.

Lo he intentado poniendo otro if else, pero no sé como sacarlo, ¿alguna ayuda?

Gracias y un saludo


Título: Re: Duda programa con estructuras de control
Publicado por: satu en 9 Noviembre 2011, 22:54 pm
Hola

¿Es esto lo que pides??

Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.    char car1;
  6.    char car2;
  7.    char valor1;
  8.    char valor2;
  9.    int valor;
  10.  
  11.    printf("Introduzca un valor hexadecimal:\n");
  12.    scanf("\n%c%c", &car1, &car2);
  13.  
  14.    if('0'<=car1 && car1<='9')
  15.        valor1=car1-'0';
  16.    else if ('A'<=car1 && car1<='F')
  17.        valor1=car1-'A'+10;
  18.    else if ('a'<=car1 && car1<='f')
  19.        valor1=car1-'a'+10;
  20.    else
  21.        {
  22.        printf("Valor erroneo");
  23.        while(getchar()!='\n');
  24.        getchar();
  25.        return 0;
  26.        }
  27.  
  28.    if('0'<=car2 && car2<='9')
  29.        valor2=car2-'0';
  30.    else if ('A'<=car2 && car2<='F')
  31.        valor2=car2-'A'+ 10;
  32.    else if ('a'<=car2 && car2<='f')
  33.        valor2=car2-'a'+10;
  34.    else
  35.        {
  36.        printf("Valor erroneo");
  37.        while(getchar()!='\n');
  38.        getchar();
  39.        return 0;
  40.        }
  41.  
  42.    valor= 16*valor1 + valor2;
  43.  
  44.    printf("EL valor decimal de 0x%c%c es %d\n",car1,car2,valor);
  45.  
  46.    while(getchar()!='\n');
  47.    getchar();
  48.    return 0;
  49. }
  50.  

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: jamatbar en 9 Noviembre 2011, 23:12 pm
Gracias por la ayuda, creo que eso es lo que me piden pero, ¿podrías explicarme que hace lo que has añadido?

Saludos!


Título: Re: Duda programa con estructuras de control
Publicado por: satu en 10 Noviembre 2011, 10:48 am
Hola

Código
  1. else
  2.        {
  3.        printf("Valor erroneo");
  4.        while(getchar()!='\n');
  5.        getchar();
  6.        return 0;
  7.        }
  8.  

He añadido esto cada vez que comprobamos un carácter de los introducidos. Tú compruebas si son caracteres válidos con los if, pues si no son válidos entra en el else e imprime un mensaje por pantalla. El while lo que hace es limpiar el buffer de entrada y el getchar de detrás del while espera a que pulses una tecla, y el return para finalizar el programa. Al final de todo pasa lo mismo, limpiamos el buffer de entrada y el programa espera a que se pulse una tecla.

Espero que lo hayas entendido. Hay gente que para pausar el programa utiliza un system("pause"); pero eso solo funciona en windows, el getchar es estandar.

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: jamatbar en 10 Noviembre 2011, 21:21 pm
Gracias por la aclaración.

Ahora me piden que convierta numeros hexadecimales a decimales hasta que introduzca la secuencia qq para salir del programa, ¿como se podría hacer?

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: satu en 10 Noviembre 2011, 21:26 pm
Hola

Inténtalo por lo menos, si no te sale te ayudo

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: jamatbar en 10 Noviembre 2011, 21:27 pm
Hola

Inténtalo por lo menos, si no te sale te ayudo

Saludos

He pensado poner una estructura do while, pero la verdad es que no sé si lo estoy haciendo bien, he hecho esto:

Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.    char car1;
  6.    char car2;
  7.    char valor1;
  8.    char valor2;
  9.    int valor;
  10. do
  11.    {printf("Introduzca un valor hexadecimal:\n");
  12.    scanf("\n%c%c", &car1, &car2);
  13.  
  14.    if('0'<=car1 && car1<='9')
  15.        valor1=car1-'0';
  16.    else if ('A'<=car1 && car1<='F')
  17.        valor1=car1-'A'+10;
  18.    else if ('a'<=car1 && car1<='f')
  19.        valor1=car1-'a'+10;
  20.    else
  21.        {
  22.        printf("Valor erroneo");
  23.        while(getchar()!='\n');
  24.        getchar();
  25.        return 0;
  26.        }
  27.  
  28.    if('0'<=car2 && car2<='9')
  29.        valor2=car2-'0';
  30.    else if ('A'<=car2 && car2<='F')
  31.        valor2=car2-'A'+ 10;
  32.    else if ('a'<=car2 && car2<='f')
  33.        valor2=car2-'a'+10;
  34.    else
  35.        {
  36.        printf("Valor erroneo");
  37.        while(getchar()!='\n');
  38.        getchar();
  39.        return 0;
  40.        }
  41.  
  42.    valor= 16*valor1 + valor2;
  43.  
  44.    printf("EL valor decimal de 0x%c%c es %d\n",car1,car2,valor);
  45.  
  46.    while(getchar()!='\n');
  47.    getchar();
  48.    }
  49. while (car1== 'q' && car2=='q');
  50.    return 0;
  51. }


Título: Re: Duda programa con estructuras de control
Publicado por: satu en 10 Noviembre 2011, 22:07 pm
Hola

La solución podría ser un do-while pero no lo planteas del todo bien, te pongo el código.

He utilizado la variable "flag" para imprimir el resultado sólo cuando el valor es correcto, y si no entiendes algo ya sabes.

Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.    char car1;
  6.    char car2;
  7.    char valor1;
  8.    char valor2;
  9.    int valor, flag;
  10.  
  11.    do
  12.        {
  13.        flag = 0;
  14.        printf("Introduzca un valor hexadecimal:\n");
  15.        scanf("\n%c%c", &car1, &car2);
  16.  
  17.        if(car1 == 'q' && car2 == 'q')
  18.            {
  19.            printf("\nPresione Enter para salir.....");
  20.            while(getchar()!='\n');
  21.            getchar();
  22.            return 0;
  23.            }
  24.        else
  25.            {
  26.            if('0'<=car1 && car1<='9')
  27.                valor1=car1-'0';
  28.            else if ('A'<=car1 && car1<='F')
  29.                valor1=car1-'A'+10;
  30.            else if ('a'<=car1 && car1<='f')
  31.                valor1=car1-'a'+10;
  32.            else
  33.                {
  34.                flag = 1;
  35.                printf("Valor erroneo\n\n");
  36.                }
  37.  
  38.            if('0'<=car2 && car2<='9')
  39.                valor2=car2-'0';
  40.            else if ('A'<=car2 && car2<='F')
  41.                valor2=car2-'A'+ 10;
  42.            else if ('a'<=car2 && car2<='f')
  43.                valor2=car2-'a'+10;
  44.            else
  45.                {
  46.                flag = 1;
  47.                printf("Valor erroneo\n\n");
  48.                }
  49.  
  50.            if(flag == 0)
  51.                {
  52.                valor= 16*valor1 + valor2;
  53.                printf("EL valor decimal de 0x%c%c es %d\n\n",car1,car2,valor);
  54.                }
  55.            }
  56.        }
  57.    while(1);
  58.  
  59.    return 0;
  60. }
  61.  

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: jamatbar en 10 Noviembre 2011, 22:34 pm
Gracias, aunque, ¿me podrías aclarar el uso de flag en el programa?, es que me lo han explicado pero no logro entenderlo bien la verdad

Saludos!


Título: Re: Duda programa con estructuras de control
Publicado por: satu en 10 Noviembre 2011, 22:48 pm
Hola

Pues flag, como su propio nombre indica es una bandera, es decir, una variable que dependiendo de su valor el programa hace una cosa u otra.

En el programa, en cada iteración se pone flag a 0 (es lo primero justo después del do). Cuando se introduce un valor erroneo se muestra un mensaje de error y se pone el flag a 1 para que no se calcule su valor decimal y no se muestre el resultado. Si el valor es correcto, flag sigue valiendo 0 y se calcula su valor decimal y se muestra.

No se si te habrá quedado claro.

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: jamatbar en 10 Noviembre 2011, 23:00 pm
Hola

Pues flag, como su propio nombre indica es una bandera, es decir, una variable que dependiendo de su valor el programa hace una cosa u otra.

En el programa, en cada iteración se pone flag a 0 (es lo primero justo después del do). Cuando se introduce un valor erroneo se muestra un mensaje de error y se pone el flag a 1 para que no se calcule su valor decimal y no se muestre el resultado. Si el valor es correcto, flag sigue valiendo 0 y se calcula su valor decimal y se muestra.

No se si te habrá quedado claro.

Saludos

Vale, más o menos entiendo lo que es la bandera, pero por ejemplo, por que en el último while pones: while (1); ¿porqué (1)?



Título: Re: Duda programa con estructuras de control
Publicado por: satu en 10 Noviembre 2011, 23:23 pm
Hola

He puesto while(1) para que se esté ejecutando siempre.

Si se introduce "qq" el programa finaliza (return 0) sin ejecutar lo que hay detrás, aunque también se podría poner en el while la condición de salida y sería exactamente igual.

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: jamatbar en 11 Noviembre 2011, 10:08 am
Hola

He puesto while(1) para que se esté ejecutando siempre.

Si se introduce "qq" el programa finaliza (return 0) sin ejecutar lo que hay detrás, aunque también se podría poner en el while la condición de salida y sería exactamente igual.

Saludos

Ok, muchísimas gracias ;)

Saludos


Título: Re: Duda programa con estructuras de control
Publicado por: KaL3o en 11 Noviembre 2011, 11:58 am
Hola yo primero idente el codigo (es que me gusta asi :p )

Y le hize un pequeño cambio al code, le quite el primer else. Y solo mostre el mensaje de error al final.
Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.    char car1;
  6.    char car2;
  7.    char valor1;
  8.    char valor2;
  9.    int valor,flag;
  10.  
  11.    do
  12.    {
  13.        flag = 0;
  14.        printf("Introduzca un valor hexadecimal:\n");
  15.        scanf("\n%c%c", &car1, &car2);
  16.        if(car1 == 'q' && car2 == 'q')
  17.        {
  18.            printf("\nPresione Enter para salir.....");
  19.            fflush(stdin);
  20.            getchar();
  21.            return 0;
  22.        }
  23.        if('0'<=car1 && car1<='9')
  24.            valor1=car1-'0';
  25.        else
  26.            if ('A'<=car1 && car1<='F')
  27.                valor1=car1-'A'+10;
  28.            else
  29.                if ('a'<=car1 && car1<='f')
  30.                    valor1=car1-'a'+10;
  31.                else
  32.                    flag = 1;
  33.        if('0'<=car2 && car2<='9')
  34.            valor2=car2-'0';
  35.        else
  36.            if ('A'<=car2 && car2<='F')
  37.                valor2=car2-'A'+ 10;
  38.            else
  39.                if ('a'<=car2 && car2<='f')
  40.                    valor2=car2-'a'+10;
  41.                else
  42.                    flag = 1;
  43.        if(flag == 0)
  44.        {
  45.            valor= 16*valor1 + valor2;
  46.            printf("\nEL valor decimal de 0x%c%c es %d\n\n",car1,car2,valor);
  47.        }
  48.        else
  49.            printf("\nValor erroneo\n\n");
  50.    }
  51.    while(1);
  52.    return 0;
  53. }
  54.  

Una pequeña observacion, es que una buena practica de programación es hacer uso de una logica positiva... eso quiere decir que las "ramificaciones" deben estar cargadas por el lado de los if y no por el lado de los else.

Mientras escribia mire el codigo y decidi editarlo un poco de otra forma y quedo asi
Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5.    char car1;
  6.    char car2;
  7.    char valor1;
  8.    char valor2;
  9.    int valor,flag;
  10.  
  11.    do
  12.    {
  13.        flag = 0;
  14.        printf("Introduzca un valor hexadecimal:\n");
  15.        scanf("\n%c%c", &car1, &car2);
  16.        if(car1 == 'q' && car2 == 'q')
  17.        {
  18.            printf("\nPresione Enter para salir.....");
  19.            fflush(stdin);
  20.            getchar();
  21.            return 0;
  22.        }
  23.        if('0'<=car1 && car1<='9')
  24.            valor1=car1-'0';
  25.        if ('A'<=car1 && car1<='F')
  26.            valor1=car1-'A'+10;
  27.        if ('a'<=car1 && car1<='f')
  28.            valor1=car1-'a'+10;
  29.        if('0'<=car2 && car2<='9')
  30.            valor2=car2-'0';
  31.        if ('A'<=car2 && car2<='F')
  32.            valor2=car2-'A'+ 10;
  33.        if ('a'<=car2 && car2<='f')
  34.            valor2=car2-'a'+10;
  35.        if(('0'<=car1 && car1<='9' || 'A'<=car1 && car1<='F' || 'a'<=car1 && car1<='f') && ('0'<=car2 && car2<='9' || 'A'<=car2 && car2<='F' || 'a'<=car2 && car2<='f'))
  36.            flag=1;
  37.        if(flag == 1)
  38.        {
  39.            valor= 16*valor1 + valor2;
  40.            printf("\nEL valor decimal de 0x%c%c es %d\n\n",car1,car2,valor);
  41.        }
  42.        else
  43.            printf("\nValor erroneo\n\n");
  44.    }
  45.    while(1);
  46.    return 0;
  47. }
  48.  

Alternativas a hacer resolver un problema de diferentes maneras es lo que hay
 ::)

salu2 ;)


Título: Re: Duda programa con estructuras de control
Publicado por: jamatbar en 11 Noviembre 2011, 12:05 pm
Gracias por la sugerencia :D

Saludos!