2012-02-28 12 views
8

Jestem w klasie programistycznej, w której właśnie przełączyliśmy się z Pythona na C. Mam z tym problem, ponieważ C nie wydaje się wykonuj operacje matematyczne z łatwością, którą wykonuje pyton, albo brakuje mi czegoś, jeśli chodzi o matematykę w C.Nowość w C, a wszystkie obliczenia matematyczne są nieznacznie wyłączone

Dla mojej pracy domowej, piszę program, który zbiera ile kilometrów do samochodu użytkownika galon dostaje, ile kosztuje ich gaz za galon i ile kilometrów jeżdżą każdego miesiąca. Następnie program informuje ich, ile mogą zapłacić za gaz w bieżącym miesiącu. Mój bieżący kod wygląda następująco:

#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; 
} 

Kiedy uruchamiam program z wartościami 24 dla „mpg”, 3,00 dla „gas_price” i 1000 mil, łączna przychodzi do $ 123.00. To nie jest poprawne i wynosi około dwóch dolarów mniej niż rzeczywista cena. Kiedy bierzesz ((1000/24) * 3,00), powinieneś dostać 125 równych. Dodałem ciąg znaków, aby wydrukować wszystkie wartości, aby zobaczyć, co C było używane dla formuły w linii 23, i podczas gdy wartości mpg i gas_price są poprawne, "mile" pokazuje się jako o wartości 1 074 266 136. Wiem, że musi tu być jakiś błąd, ponieważ spowodowałoby to wynik ponad 2 dolary, ale nie mogę pomóc, ale myślę, że jest to powiązane.

Przepraszam za długość pytania, ale chciałem być tak szczegółowy, jak to możliwe, i jestem całkowicie zaskoczony, dlaczego C czyta to tak dziwnie.

+0

Oto jak napisać jasne pytanie - dobra robota. – YXD

Odpowiedz

14

Robisz podział całkowitej tutaj:

miles/mpg * gas_price 

oddania jednego z dwóch argumentów Do double pierwszy:

(double)miles/mpg * gas_price 

Integer podział obetnie część ułamkową. Dlatego twoje numery są wyłączone.


Masz tu kolejny błąd:

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

Twoje printf formacie Specyfikatory nie zgadzają się z argumentami. Powinno być:

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

To było to! Dziękuję bardzo! – Batteries

0

Podział na liczby całkowite z miles/mpg straci pewną precyzję. W ostatniej linii występuje również niedopasowanie specyfikatora formatu printf - należy użyć %f lub czegoś z nim związanego, a nie %d podczas drukowania gas_price.

4

Wyrażenie:

miles/mpg * gas_price 

jest analizowany jako

(miles/mpg) * gas_price 

gdzie podział odbywa przed mnożenie. Oba operandy podziału są liczbami całkowitymi, więc C daje wynik całkowity (skrócony). Do tego zmusić być pływający Obliczanie punktu, to zrobić:

1.0 * miles/mpg * gas_price 
1

Zmień int mpg, miles; do double mpg, miles;. Problem polega na tym, że miles/mpg używa dzielenia liczby całkowitej, co daje wynik 41 zamiast 41,66 ....

Powiązane problemy