Autor
|
Tema: ¿porqué este programa símplemente no funciona? (Leído 4,721 veces)
|
Lotharsan
Desconectado
Mensajes: 6
|
/* Programa que calcula el tiempo de conducción dada la distancia y la velocidad media. Utiliza un bucle cuando se le pregunte al usuario si quiere repetirlo y conteste que sí usando un bucle while. */
#include "stdio.h"
main() { int e, v; char r='s';
while(r=='s') { printf("Introduce la distancia recorrida: "); scanf("%d", &e); printf("Introduce la velocidad media: "); scanf("%d", &v); printf("El tiempo invertido ha sido %d\n", v/e); printf("¿quieres repetirlo? "); r=getchar(); } }
----------------------------------------------------------
Lo ejecuto tanto en Ubuntu como con un compilador en Android (c4droid). El resultado siempre es el mismo, no me leer el último getchar y por tanto el while no se ejecuta. En la mayoría de libros hacen referencia a conio.h, librería no standar de Borland. Yo por supuesto quiero realizar la tarea de leer un caracter desde el teclado de forma standar a todos los compiladores, pero no me funciona. ¿cuál es la forma correcta para leer un caracter desde teclado? También he intentado incluso usar un scanf("%c", &r)..... sin mayor éxito.
|
|
|
En línea
|
|
|
|
DickGumshoe
|
¡Hola! La función scanf deja "basura" en el buffer del teclado, y por eso el getchar() coge la "basura" que tenía. La solución sería poner un getchar() antes de r=getchar(), para que el primero obtenga la basura y ya con el segundo puedas escribir. Así: #include <stdio.h> main() { int e, v; char r='s'; while(r=='s') { printf("Introduce la distancia recorrida: "); printf("Introduce la velocidad media: "); printf("El tiempo invertido ha sido %d\n", v /e ); printf("¿quieres repetirlo? "); } }
Saludos!
|
|
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas!
Otro detalle, para dar el tiempo estas dividiendo dos enteros, asi que estas truncando el valor real. Hazle un cast a float a alguna de las dos variables e imprime el valor como si fuese float, no int.
¡Saludos!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
pues para evitar ese problema del scanf con el buffer de memoria (que almacena basura por el enter que le da uno en la entrada de la instrucción si no estoy mal) simplemente se crea una variable que almacene la división y se imprime, es mejor hacer eso, es más practico y a la larga deja las cosas mucho más entendibles. #include <stdio.h> int main(void) { float e, v; float res; char r='s'; while(r=='s') { printf("Introduce la distancia recorrida: "); printf("Introduce la velocidad media: "); res = v/e; printf("El tiempo invertido ha sido %.2f\n", res ); printf("¿quieres repetirlo? "); } }
Personalmente me gusta más un do-while, pero pues así funciona también.
|
|
|
En línea
|
|
|
|
DickGumshoe
|
pues para evitar ese problema del scanf con el buffer de memoria (que almacena basura por el enter que le da uno en la entrada de la instrucción si no estoy mal) simplemente se crea una variable que almacene la división y se imprime, es mejor hacer eso, es más practico y a la larga deja las cosas mucho más entendibles.
Pero ahí sigues poniendo el getchar()... Que cree una variable o no no influye (es más, si ese dato no lo va a necesitar después sería un desperdicio de memoria crear una variable solo para eso...) Saludos!
|
|
|
En línea
|
|
|
|
Lotharsan
Desconectado
Mensajes: 6
|
Muchas gracias por las respuestas.... me han servido de mucho. Aunque ahora me ha quedado la duda de porqué una función como scanf or getchar no se hicieron ya contemplando esta situación en la que leen datos residuales o símplemente no se les añadió la opción de eliminar datos residuales después de haber leido la información, aunque eso no se pensara en el momento de la creación de estas funciones ¿no han pasado ya años como para haberse corregido o creado una forma mejor de introducir la información sin que se produzcan estos casos?
|
|
|
En línea
|
|
|
|
DickGumshoe
|
No, no lo han corregido... Pero bueno, con un simple getchar() se puede arreglar...
|
|
|
En línea
|
|
|
|
ApOkAlizE
Desconectado
Mensajes: 150
¿sabes lo que vales? ¡consigue lo que te mereces!
|
Pues eso mismo me digo yo... lo podrian haber corregido, pero bueno en esta situación como es tan fácil como poner un getchar() almenos no genera problemas mayores.
|
|
« Última modificación: 17 Julio 2012, 02:53 am por ApOkAlizE »
|
En línea
|
Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Aunque ahora me ha quedado la duda de porqué una función como scanf or getchar no se hicieron ya contemplando esta situación en la que leen datos residuales o símplemente no se les añadió la opción de eliminar datos residuales después de haber leido la información Ese no es el problema. Los dolores de cabeza se deben al uso intercalado de funciones que no ignoran el espacio blanco (getchar/fgets/etc.) con funciones que usualmente si lo hacen como scanf o fscanf. En lugar de llamar a "getchar" para descartar un carácter puedes utilizar scanf para leer los tres datos: do { printf("Introduce la distancia recorrida: "); printf("Introduce la velocidad media: "); printf("El tiempo invertido ha sido %.2f\n", v / e ); printf("quieres repetirlo? "); }while (r == 's' || r == 'S');
Con el espacio en " %c" nos aseguramos de descartar la secuencia de espacio blanco a continuación del numero indicando la velocidad. De nuevo solo es cuestión de manejar bien las funciones. Y si eso no basta se puede desarrollar una propia (y a la medida). Un saludo
|
|
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
No me funciona este programa
Java
|
Meta
|
8
|
5,980
|
22 Abril 2011, 07:42 am
por Meta
|
|
|
Porque no me funciona este codigo
Programación C/C++
|
0xDani
|
3
|
3,648
|
11 Junio 2012, 00:40 am
por 0xDani
|
|
|
Porque no funciona este codigo?
Programación C/C++
|
FKT
|
5
|
2,948
|
9 Agosto 2015, 22:58 pm
por FKT
|
|
|
(Python 3.5) No comprendo porque no funciona mi programa
Scripting
|
BigKaz
|
1
|
1,905
|
7 Diciembre 2016, 16:19 pm
por MCKSys Argentina
|
|
|
porque no me funciona este script.bat ??
Scripting
|
stR_ruBen
|
4
|
3,135
|
23 Enero 2017, 23:36 pm
por stR_ruBen
|
|