Duda programa con estructuras de control

Iniciado por jamatbar, 9 Noviembre 2011, 22:14 PM

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

jamatbar

Cita de: 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

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)?


satu

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
Breakbeat como forma de vida

jamatbar

Cita de: 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

Ok, muchísimas gracias ;)

Saludos

KaL3o

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.

#include <stdio.h>

int main ()
{
    char car1;
    char car2;
    char valor1;
    char valor2;
    int valor,flag;

    do
    {
        flag = 0;
        printf("Introduzca un valor hexadecimal:\n");
        scanf("\n%c%c", &car1, &car2);
        if(car1 == 'q' && car2 == 'q')
        {
            printf("\nPresione Enter para salir.....");
            fflush(stdin);
            getchar();
            return 0;
        }
        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;
                else
                    flag = 1;
        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;
                else
                    flag = 1;
        if(flag == 0)
        {
            valor= 16*valor1 + valor2;
            printf("\nEL valor decimal de 0x%c%c es %d\n\n",car1,car2,valor);
        }
        else
            printf("\nValor erroneo\n\n");
    }
    while(1);
    return 0;
}


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

#include <stdio.h>

int main ()
{
    char car1;
    char car2;
    char valor1;
    char valor2;
    int valor,flag;

    do
    {
        flag = 0;
        printf("Introduzca un valor hexadecimal:\n");
        scanf("\n%c%c", &car1, &car2);
        if(car1 == 'q' && car2 == 'q')
        {
            printf("\nPresione Enter para salir.....");
            fflush(stdin);
            getchar();
            return 0;
        }
        if('0'<=car1 && car1<='9')
            valor1=car1-'0';
        if ('A'<=car1 && car1<='F')
            valor1=car1-'A'+10;
        if ('a'<=car1 && car1<='f')
            valor1=car1-'a'+10;
        if('0'<=car2 && car2<='9')
            valor2=car2-'0';
        if ('A'<=car2 && car2<='F')
            valor2=car2-'A'+ 10;
        if ('a'<=car2 && car2<='f')
            valor2=car2-'a'+10;
        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'))
            flag=1;
        if(flag == 1)
        {
            valor= 16*valor1 + valor2;
            printf("\nEL valor decimal de 0x%c%c es %d\n\n",car1,car2,valor);
        }
        else
            printf("\nValor erroneo\n\n");
    }
    while(1);
    return 0;
}


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

salu2 ;)
Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.

jamatbar