2012-02-28 33 views
8

Tôi đang ở trong một lớp lập trình mà chúng tôi vừa chuyển từ python sang C. Tôi gặp một chút rắc rối với nó, vì C dường như không thực hiện các phép toán với sự dễ dàng python mà không, hay tôi đang thiếu một cái gì đó khi nói đến toán học trong C.Từ mới đến C, và tất cả các phép tính toán học hơi bị tắt

Đối với bài tập về nhà của tôi, tôi đang viết một chương trình thu thập bao nhiêu dặm để xe của người dùng gallon được, bao nhiêu chi phí khí đốt của họ mỗi gallon, và bao nhiêu dặm họ lái xe mỗi tháng. Chương trình sau đó cho họ biết họ có thể phải trả bao nhiêu tiền cho khí đốt cho tháng hiện tại. mã hiện tại của tôi là như sau:

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

Khi tôi chạy chương trình với các giá trị 24 cho "mpg", 3.00 cho "gas_price", và 1000 dặm, tổng số đến $ 123.00. Điều này là không chính xác, và là khoảng hai đô la ít hơn so với giá thực tế. Khi bạn đi ((1000/24) * 3,00), bạn sẽ nhận được 125 thậm chí. Tôi đã thêm một chuỗi in ra tất cả các giá trị để xem những gì C được sử dụng cho công thức ở dòng 23, và trong khi mpg và gas_price là chính xác, "dặm" hiện lên như có một giá trị của 1074266112. Tôi biết phải có một số lỗi ở đây, vì điều này sẽ ném kết quả ra cách hơn 2 đô la, nhưng tôi không thể không nghĩ rằng nó liên quan.

Tôi xin lỗi về độ dài của câu hỏi, nhưng tôi muốn càng cụ thể càng tốt và tôi hoàn toàn bối rối về lý do tại sao C lại đọc điều này một cách kì lạ.

+0

Đây là cách viết một câu hỏi rõ ràng - công việc tốt. – YXD

Trả lời

14

Bạn đang làm phân chia số nguyên ở đây:

miles/mpg * gas_price 

Cast một trong hai toán hạng để lần đầu tiên double:

(double)miles/mpg * gas_price 

phận Integer sẽ cắt phần phân đoạn. Đó là lý do tại sao số của bạn bị tắt.


Bạn có một lỗi ở đây:

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

printf định dạng của bạn specifiers không phù hợp với toán hạng. Nó phải là:

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

Đó là nó! Cảm ơn bạn rất nhiều! – Batteries

0

Phân chia số nguyên miles/mpg sẽ mất một số độ chính xác. Bạn cũng có một trình định dạng định dạng printf không khớp trong dòng cuối cùng của mình - bạn nên sử dụng %f hoặc một thứ gì đó liên quan đến nó thay vì %d khi in gas_price.

4

biểu này:

miles/mpg * gas_price 

được phân tách như

(miles/mpg) * gas_price 

nơi bộ phận được thực hiện trước khi các nhân. Cả hai toán hạng của bộ chia là số nguyên, vì vậy C cung cấp cho bạn một kết quả nguyên (cắt ngắn). Để lực lượng này là một tính toán dấu chấm động, làm điều này:

1.0 * miles/mpg * gas_price 
1

Thay đổi int mpg, miles;-double mpg, miles;. Vấn đề là miles/mpg đang sử dụng phân chia số nguyên tạo ra kết quả là 41 thay vì 41,66 ....

Các vấn đề liên quan