2012-02-28 6 views
8

Estoy en una clase de programación donde acabamos de cambiar de python a C. Estoy teniendo un problema, ya que C no parece realizar operaciones matemáticas con la facilidad con que python lo hace, o me falta algo cuando se trata de matemáticas en C.Nuevo en C, y todos los cálculos matemáticos están ligeramente fuera de

Para mi tarea, estoy escribiendo un programa que recolecta cuántas millas por cada galón de un automóvil del usuario, cuánto cuesta el gas por galón y cuántas millas recorren cada mes. Luego, el programa les dice cuánto pueden esperar pagar por el gas del mes actual. Mi código actual es la siguiente:

#include <stdio.h> 

int main() { 

int mpg, miles; 
double gas_price; 

printf("How many miles per gallon does your car get?\n"); 
scanf("%d", &mpg); 

printf("What is the price of gasoline per gallon?\n"); 
scanf("%lf", &gas_price); 

printf("How many miles do you drive in a month?\n"); 
scanf("%d", &miles); 

printf("The cost of gas this month is $%.2lf\n", miles/mpg * gas_price); 

printf("%d %d %d", mpg, gas_price, miles); 

return 0; 
} 

Cuando ejecuto el programa con los valores de 24 para "mpg", 3,00 para "gas_price", y 1000 millas, el total asciende a $ 123.00. Esto no es correcto, y se trata de dos dólares menos que el precio real. Cuando toma ((1000/24) * 3.00), debe obtener 125 pares. Agregué una cadena para imprimir todos los valores para ver qué C estaba usando para la fórmula en la línea 23, y mientras mpg y gas_price son correctos, "millas" aparece con un valor de 1,074,266,112. Sé que debe haber algún error aquí, ya que arrojaría el resultado de más de 2 dólares, pero no puedo evitar pensar que está relacionado.

Me disculpo por la longitud de la pregunta, pero quería ser lo más específico posible, y estoy completamente perplejo de por qué C está leyendo esto de manera tan extraña.

+0

Así es como escribir una pregunta clara: buen trabajo. – YXD

Respuesta

14

Estás haciendo división entera aquí:

miles/mpg * gas_price 

moldeada uno de los dos operandos a un primer double:

(double)miles/mpg * gas_price 

La división entera trunca la parte fraccionaria. Es por eso que tus números están apagados.


tiene otro error aquí:

printf("%d %d %d", mpg, gas_price, miles); 

Sus printf especificadores de formato no coinciden con los operandos. Debería ser:

printf("%d %f %d", mpg, gas_price, miles); 
+0

¡Eso fue todo! Muchas gracias! – Batteries

0

La división entera de miles/mpg perderá algo de precisión. También tiene una discrepancia de especificador de formato de impresión en la última línea; debe usar %f o algo relacionado con ella en lugar de %d al imprimir gas_price.

4

Esta expresión:

miles/mpg * gas_price 

se analiza como

(miles/mpg) * gas_price 

donde la división se realiza antes de la multiplicación. Ambos operandos de la división son enteros, por lo que C le da un resultado entero (truncado). Para obligar a que se trata de un cálculo de coma flotante, hacer esto:

1.0 * miles/mpg * gas_price 
1

Cambio int mpg, miles; a double mpg, miles;. El problema es que miles/mpg usa una división de enteros que produce un resultado de 41 en vez de 41.66 ....

Cuestiones relacionadas