2014-09-24 54 views
2

我正在嘗試爲哈佛大學完成CS50x的習題集1,並且在我的程序中遇到過一種錯誤。它向我拋出一個浮點異常錯誤;我已經研究了這一點,它似乎主要是當你試圖除以零時引起的。現在,當我查看我的代碼時,我似乎無法找到一個變量甚至等於零的地方,更不用說被零除。無法解決浮點異常

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

int changeF(change, 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 && payment >= 0 && change >= 0) 
     { 
      if (change >= q) 
      { 
       float quarters = changeF(change, q); 
       printf("%f quarters", quarters); 
       change = change - (.25*quarters); 
      } 
      if (change >= di) 
      { 
       float dimes = changeF(change, di); 
       printf("%f dimes", dimes); 
       change = change - (.1*dimes); 
      } 
      if (change >= n) 
      { 
       float nickels = changeF(change, n); 
       printf("%f nickels", nickels); 
       change = change - (.05*nickels); 
      } 
      if (change >= p) 
      { 
       float pennies = changeF(change, p); 
       printf("%f pennies", pennies); 
       change = change - (.01*pennies); 
      } 
     } 
    } 
    while (change > 0); 
} 

回答

0
int changeF(change, div) 

的問題是在這個函數。它的返回類型是int因此,當c的值爲0.1,0.2或類似的東西它變成0並返回它。另一個問題是您沒有在定義中指定數據類型(舊樣式K & R預標準函數定義)。這就是爲什麼它採用默認數據類型,默認數據類型爲int

您應該按照以下方式更新代碼。

double changeF(double change, double div) 
1

你需要給類型給函數的參數:

changeF(float change, float div) 

我不知道,如果你真的想這個函數的返回是整數或浮點數!

1

changeF()功能寫的是:

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

即使用舊的(C89,或預標準 - 而不是更近的C99或C11)的函數符號,隱式聲明changeF()取兩個int參數。

當你調用changeF()float值是小於1.0的div說法,它被轉換爲0int值。然後你除以零,產生你的FPE。