Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error extraño: programa se salta un scanf

Estas en el tema de Error extraño: programa se salta un scanf en el foro de C/C++ en Foros del Web. Buenas a todos. Bueno, en mis ratillos de aburrimiento me pongo a programar cosas tontas xD y bueno... Aquí os dejo el código del programa; ...
  #1 (permalink)  
Antiguo 16/06/2012, 16:46
 
Fecha de Ingreso: agosto-2010
Mensajes: 14
Antigüedad: 13 años, 7 meses
Puntos: 0
Error extraño: programa se salta un scanf

Buenas a todos.

Bueno, en mis ratillos de aburrimiento me pongo a programar cosas tontas xD y bueno... Aquí os dejo el código del programa; después pongo el problema:

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

int main () {

    char seguir = 's';
    char confirmar;
    float a, b, c, d;
    char numero;

    while (seguir=='s') {

        printf("Bienvenido a Nexus Logic Calc versión 0.1. De momento solo calcula reglas de tres con números enteros. \n\n");

        printf("La lógica será la siguiente: \n       a ---------- b \n       c ---------- d \nO lo que es lo mismo: A es a B como C es a D\n");

        printf("¿Qué número desconoce?\n\nNúmero (letra minúscula): ");
        scanf("%c", &numero);
        fflush(stdin);

        switch (numero) {

            case    'a':
            /*Principio de caso A*/
            printf("Introduzca b: ");
            scanf("%f", &b);
            fflush(stdin);

            printf("Introduzca c: ");
            scanf("%f", &c);
            fflush(stdin);

            printf("Introduzca d: ");
            scanf("%f", &d);
            fflush(stdin);

            a = b * c / d;

            printf("El resultado de a es: %f \n", a);
            break;
            /*Fin del caso A*/

            case    'b':
            /*Principio de caso B*/
            printf("Introduzca a: ");
            scanf("%f", &a);
            fflush(stdin);

            printf("Introduzca c: ");
            scanf("%f", &c);
            fflush(stdin);

            printf("Introduzca d: ");
            scanf("%f", &d);
            fflush(stdin);

            b = a * d / c;

            printf("El resultado de b es: %f \n", b);
            break;
            /*Fin del caso B*/

            case    'c':
            /*Principio de caso C*/
            printf("Introduzca a: ");
            scanf("%f", &a);
            fflush(stdin);

            printf("Introduzca b: ");
            scanf("%f", &b);
            fflush(stdin);

            printf("Introduzca d: ");
            scanf("%f", &d);
            fflush(stdin);

            c = a * d / b;

            printf("El resultado de c es: %f \n", c);
            break;
            /*Fin del caso C*/

            case    'd':
            /*Principio de caso D*/
            printf("Introduzca a: ");
            scanf("%f", &a);
            fflush(stdin);

            printf("Introduzca b: ");
            scanf("%f", &b);
            fflush(stdin);

            printf("Introduzca c: ");
            scanf("%f", &c);
            fflush(stdin);

            d = b * c / a;

            printf("El resultado de d es: %f \n", d);
            break;
            /*Fin del caso D*/
        }

        fflush(stdin);
        printf("¿Desea calcular otra regla de tres? (s/n): ");
        scanf("%c", &confirmar);

        if (confirmar == 's') {

            seguir = 's';

        }

        if (seguir=='s') {

            printf("\n\n ==================== \n\n");

        }
        else {

            printf("Hasta luego \n");

        }
        
    }

    return 0;

}
El problema es que el scanf que hay después de "printf("¿Desea calcular otra regla de tres? (s/n): ");" que debería de preguntar para cambiar el contenido de la variable char confirmar, no aparece. Es decir, en la ejecución del programa no pide el dato, se salta el scanf, y como "seguir" sigue siendo 's', es un bucle infinito.

A ver si veis algo raro en el programa o algo :S

Muchas gracias por adelantado ^^

Saludos.
  #2 (permalink)  
Antiguo 17/06/2012, 01:32
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Error extraño: programa se salta un scanf

Hola! lo que te sucede es que te falta un fflush despues del scanf:
Código C:
Ver original
  1. printf("¿Desea calcular otra regla de tres? (s/n): ");
  2.         scanf("%c", &confirmar); despues de esto tiene q ir un fflush

Y otra cosa q tenes q cambiar es:
Código C:
Ver original
  1. if (confirmar == 's') {
  2.  
  3.             seguir = 's';
  4.  
  5.         }
por esto:
Código C:
Ver original
  1. if (confirmar == 's' || confirmar == 'n') {
  2.  
  3.             seguir = confirmar;
  4.  
  5.         }
sino nunca vas a salir del bucle while. Igual esto solo funciona cuando se ingresa una 's' o 'n'. Pero q pasa cuando se ingresa otra letra??? el bucle se sigue ejecutando, lo cual no es muy optimo; pensa como podes hacer para q cuando se ingrese algo distinto de s/n vuelva a preguntar "Desea calcular otra regla de tres? (s/n):"...

Hasta aca los arreglos, ahora una critica: fflush no esta definido para stdin, no es bueno usarlo. Usa esto despues de cada scanf:
Código C:
Ver original
  1. while(getchar()!='\n');// limpia el bufer del teclado


Saludos
  #3 (permalink)  
Antiguo 17/06/2012, 04:52
 
Fecha de Ingreso: agosto-2010
Mensajes: 14
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Error extraño: programa se salta un scanf

Gracias por responder César, luego cuando tenga un ratito lo pruebo ^^

Y esa forma de limpiar el bufer del teclado no la había visto nunca La verdad que soy autodidacta y he aprendido a base de leerme una docena de tutoriales, pero en todos usaban fflush(stdin);

Muchas gracias otra vez

Saludos ^^
  #4 (permalink)  
Antiguo 17/06/2012, 05:24
 
Fecha de Ingreso: agosto-2010
Mensajes: 14
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Error extraño: programa se salta un scanf

Vale... Modificando lo que me has dicho, funciona, pero ahora hace una cosa rara (aunque sigue funcionando xD).

Después de la parte de:
Código:
if (confirmar == 's' || confirmar == 'n') {
 
            seguir = confirmar;
 
        }
he añadido un:

Código:
else if (seguir != 's' || seguir != 'n') {
/*Vuelve a preguntar si se desea calcular otra regla de tres */
goto repetirconfirmar;

}
Y la etiqueta del goto está justo antes del printf("¿Desea calcular otra regla de tres (s/n)?"); pero ahora, aunque funciona, después de imprimir en pantalla el resultado de la regla de tres, hay que pulsar enter una vez para que el programa continúe. Por ejemplo:

El resultado de a es: 43.0000
(Aquí se queda sin hacer nada hasta que pulsas enter)
¿Desea calcular otra regla de tres (s/n)?:

¿Alguna idea de por qué pasa esto? Aunque sospecho que goto es el culpable xD Sé que no se deben usar mucho... pero no se me ocurría otra forma de repetir solo esa parte del while. Si se os ocurre algo, decídmelo porfi ^^

Saludos :D
  #5 (permalink)  
Antiguo 17/06/2012, 10:37
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Error extraño: programa se salta un scanf

Tenes q presionar enter seguro porque tenes asi el codigo(sin contar el goto y cambiando los fflush por while):

Código C:
Ver original
  1. while(getchar()!='\n');
  2. printf("¿Desea calcular otra regla de tres? (s/n): ");
  3.             scanf("%c", &confirmar); //despues de esto tiene q ir un fflush
  4. while(getchar()!='\n');

Como te dije antes lo hace getchar() dentro del while es limpiarte el bufer del teclado, osea toma los caracteres hasta encontrar un '\n'. Pero vos en cada case ya usas un while despues de cada scanf, entonces cuando salis del switch-case el bufer ya esta vacio; por lo tanto ¿que es lo que va a limpiar el while(gechar()!='\n') antes de "Desea calcular otra regla de tres? (s/n):"? No va a limpiar nada entonces va a esperar a que vos ingreses un enter para continuar... Resumiendo ese while esta demas :)


El goto no es que no se usa mucho, directamente NO se debe usar... Mira como lo hago sin el goto:
Código C:
Ver original
  1. /* codigo despues del switch-case */
  2.         do {
  3.         printf("¿Desea calcular otra regla de tres? (s/n): ");
  4.         scanf("%c", &confirmar);
  5.         while(getchar()!='\n');
  6.         }while (confirmar != 's' && confirmar != 'n');
  7.  
  8.         seguir = confirmar;
  9.  
  10.         if (seguir=='s') {
  11.  
  12.             printf("\n\n ==================== \n\n");
  13.  
  14.         } /* fin del if */
  15.        
  16.     } /* fin del while(continuar=='s') */
  17.    
  18.     printf("Hasta luego \n");
  19.  
  20.     return 0;
  21.  
  22. }

Cualquier duda, segui preguntando. Saludos

Etiquetas: extraño, int, programa, salta, scanf, string, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:27.