2014-09-24 58 views
-3

我終於得到了我的更改程序打印出一些數字,而不是拋出浮點異常。但是,現在它略微偏離。該程序不是提供2個季度,1個硬幣,1個鎳和2個便士,而只是選擇一個便士,我無法從代碼的條件或結構檢查中找出原因。我加了一些檢查,在每個if語句,但甚至沒有被打印出來,我現在居然糊塗..printf不工作和其他麻煩

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int changeF(float change, float div) 
{ 
    int c = change/div; 
    return c; 
} 

int main(void) 
{ 
    printf("Enter the bill amount:"); 
    float bill = GetFloat(); 
    printf("Enter the payment amount:"); 
    float payment = GetFloat(); 
    float q = .25; float di = .1; float n = .05; float p = .01; 
    float change = payment - bill; 
    do 
    { 
     if (bill >= 0.0 && payment >= 0.0 && change >= 0.0) 
     { 
      if (change >= q) 
      { 
       int quarters = changeF(change, q); 
       printf("%d quarters\n", quarters); 
       change = change - (.25*quarters); 
      } 
      if (change >= di) 
      { 
       int dimes = changeF(change, di); 
       printf("%d dimes\n", dimes); 
       change = change - (.1*dimes); 
      } 
      if (change >= n) 
      { 
       int nickels = changeF(change, n); 
       printf("%d nickels\n", nickels); 
       change = change - (.05*nickels); 
       printf("%f change", change); 
      } 
      if (change >= p) 
      { 
       int pennies = changeF(change, p); 
       printf("%d pennies\n", pennies); 
       change = change - (.01*pennies); 
       printf("%f", change); 
      } 
     } 
    } 
    while (change > 0.0); 
} 
+0

編譯所有警告和調試信息('gcc -Wall -g')。然後**使用調試器**('gdb') – 2014-09-24 12:41:17

+0

添加一些跟蹤,顯示if(bill> = 0.0)之前的賬單,付款和更改 請注意,所有的浮點數都應該有'f'在他們之後。 0.0被解釋爲0.0d,然後必須下變換爲浮點數,這可能會導致奇怪。在這種情況下,當然不是,但在處理花車時,這是一個好習慣 – 2014-09-24 13:22:46

回答

3

通過在字符串末尾附加一個換行符再試一次:

printf("Enter the bill amount:\n"); 

原因:stdout是行緩衝的,你需要給它一個換行符來刷新輸出。

或明確地將其刷新fflush(stdout);

+0

這似乎與所描述的問題沒有關係。 – 2016-08-27 02:19:35

2

不要以美元計算,而應以美分計算,並使用整數算術計算。你仍然可以讓用戶通過四捨五入輸入金額:

int bill = GetFloat() * 100 + 0.5; 

常量的值將當然也可以是整數,即25,10,5,和1

然後你changeF函數只是一個整數除法。 (你可以放棄一分爲一的硬幣 - 只需使其餘的更改便士。)

你甚至不需要do ... while循環。只需計算一次就足夠了。尋找宿舍,硬幣和鎳幣,剩下的就是便士。完成。無需重新迭代。