Que alguien me explique!! (SOLUCIONADO)

Pues he estado haciendo unos ejercicios del Libro "Como programar en C", de Deitel, de esos que uno puede bajar en cualquier lado, me encuentro con el siguiente problema:

5.10 Una aplicacion de la funcion floor es redondear un valor al entero mas cercano. El enunciado:
y = floor(x + 0.5);

redondeara el numero x al entero mas cercano y asignara el resultado a y. Escriba un programa que lea varios numeros y que utilice el enunciado anterior pera redondear cada uno de estos numeros al entero mas cercano. Para cada numero procesado, imprima tanto el numero original como el numero redondeado.

Ese es el problema, facil como ninguno otro, mi codigo es el siguiente:

#include stdio.h
#include stdlib.h
#include math.h

int main(void)
{
float x, y;
char i;

do{
printf("Introduce un numero-->");
scanf("%f", &x);
y = floor(x + 0.5);
printf("%.2f\t%.2f\n", x, y);
printf("Deseas introducir otro numero?(s o n)--> ");
scanf("%c", &i);
}while (i != 'n');

return 0;

}

Cabe aclarar que a las cabeceras les faltan los <> y que las tabulaciones hacen que se vea todo feo el codigo, pero bueno, la cuestión es que cuando llega al segundo scanf, se lo salta!!, por que?!!, que alguien me explique!!. yo se que podria hacerlo de otra forma, pero por que se salta ese scanf?!!!

Bueno espero que alguien me pueda explicar.

SOLUCIONADO.

Pues buscando en la internee, me encuentro con la siguiente explicacion a este comportamiento del segundo scanf:


If you enter say '44' and 's' as input to your original program you have in fact entered 5 characters into the input stream: '4','4', enter, 's', and enter .

scanf("%d", &d) reads the first two characters and converts them into the integer value 44 but leaves the newline character (enter) in the input stream. The next scanf("%c", &ch) reads the next character (the newline) from the input and prints it out. This is because "%c" does not skip whitespace as "%d" does.

Asi que la solucion, es... poner un espacio antes de %c, jajaja asi de facil.

Ahora en rima: si pides un numero y despues un caracter, un espacio antes de %c tienes que poner. XD

Gracias a todos por sus sugerencias.

4 comentarios:

Eisenheim Jelid dijo...

Pues en primera yo no utilizaría un Do (un for infinito xD claro!... controlado), en lo personal siempre causan problemas los Do. Yo te sugiero (no estoy seguro) utilices al inicio de cada ciclo un limpiar los bufers, no recuerdo con exactitud el comando.

Chao!

x3mw3rty dijo...

fflush(stdin);

Pudiera ser que el caracter al final lleva un nulo ese nulo lo revice la comparacion y hace cosas raras, yo digo que el flush va despues de que lees el s o n checale y avisas.

Luis Antonio Martínez dijo...

por que no haces un watch para ver que carajos anda pasando con los valores que toman las distintas variables

Fableton dijo...

un espacio jajaja que chistoso... necesitas un fflush por que si por alguna razon hubieras dos digitos mas se pondria mas loco... y pues siempre tienes que limpiar el buffer... saludos deasde a-webolandia donde el ocio supera...