Dar una salida en forma de lista en leguaje C

Iniciado por ThronerAXE, 15 Marzo 2013, 00:52 AM

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

ThronerAXE

Muchas gracias por sus consejos y ayudas que me han servido mucho para seguir aprendiendo.

Cita de: rir3760 en 17 Marzo 2013, 17:06 PM
1) Al pedir confirmación si se debe continuar o no:
scanf("%f",&deuda[i]);
printf("\n\nHay otro cliente...S/N? ");
scanf("%c",&resp);

La variable "resp" terminara almacenando el avance de linea generado al introducir el monto de la deuda, para que funcione correctamente debes utilizar " %c":
scanf("%f",&deuda[i]);
printf("\n\nHay otro cliente...S/N? ");
scanf(" %c",&resp);



Tengo una duda con esto, noto que la unica diferencia que hubo en este codigo fue que colocaste un space en el scanf de la variable de resp, pero no termino de entender por que??

rir3760

Por partes:

* La función scanf con casi todos los especificadores como "%d", "%s", etc. lo primero que hace es descartar el espacio blanco, tomando tu programa como ejemplo no hay problema al introducir (cuando se pide la deuda):
    12.34{ENTER}

Pero con los especificadores "%[]" y "%c" ese descarte no sucede, la función retorna el primer carácter que encuentre en el bufer de la entrada estándar.

* Regresando al ejemplo, al pedir la deuda si se introdujo:
    12.34{ENTER}
La función scanf con "%f" descarta los espacios, con los caracteres "12.34" genera el numero y lo almacena en deuda[ i ], el avance de linea o '\n' se queda en el bufer de la entrada estándar y, cuando se llama a scanf con "%c", es almacenado en la variable resp.

* Para evitarlo se utiliza " %c", el espacio en la cadena de formato indica "leer y descartar una secuencia de cero o mas caracteres de espacio blanco". En otras palabras la función primero descarta los caracteres de ese tipo (en tu caso el avance de linea) y solo entonces lee un carácter y lo almacena en la variable resp.

* Por ultimo con scanf los caracteres ' ', '\t', '\n' no se toman literalmente (salvo dentro de "%[]"), en su lugar generan el comportamiento ya mencionado. Para explicarlo mejor puedes utilizar " %c", "\t%c", "\n%c" y el efecto sera el mismo.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ThronerAXE

scanf("%f",&deuda[i]);
printf("\n\nHay otro cliente...S/N? ");
scanf("%c",&resp);


Pensando un poco en la estetica, y tambien en otra forma de hacerlo, ¿existe algun codigo para que al momento de que en la pantalla me pregunte "Hay otro cliente...?S/N" y yo ingrese un caracter, ese caracter no se vea en la pantalla, nose si me explique bien xd un ejemplo grafico sería:

en la pantalla:
Hay otro cliente...?S/N s (estoy ingresando el caracter s y se repite el bucle)
Hay otro cliente...?S/N   (ingreso el caracter s pero no se ve en la pantalla)


Otra duda es, que hay unos codigos que he visto que estan asi:
printf("\n\nHay otro cliente...S/N? ");
fflush(studin);
resp=toupper(getchar();


mi duda es, que en ningun momento veo q guarden el dato ¿ no se deberia usar el scanf para guardarlo en la variable?

rir3760

Cita de: ThronerAXE en 22 Marzo 2013, 02:44 AMPensando un poco en la estetica, y tambien en otra forma de hacerlo, ¿existe algun codigo para que al momento de que en la pantalla me pregunte "Hay otro cliente...?S/N" y yo ingrese un caracter, ese caracter no se vea en la pantalla
Es posible pero debes utilizar una biblioteca especifica de tu compilador (por ejemplo conio o ncurses) o el API de tu SO (por ejemplo la Win32 API).

Cita de: ThronerAXE en 22 Marzo 2013, 02:44 AMOtra duda es, que hay unos codigos que he visto que estan asi:
printf("\n\nHay otro cliente...S/N? ");
fflush(studin);
resp=toupper(getchar();


mi duda es, que en ningun momento veo q guarden el dato ¿ no se deberia usar el scanf para guardarlo en la variable?
Lo hacen: la función getchar obtiene el carácter, este se pasa a mayúsculas con toupper y finalmente se almacena en la variable "resp".

Y disculpa lo repetitivo pero no se recomienda el uso de "fflush(stdin)".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language