2014-09-05 24 views
0

我相信我已經修正了大部分程序。到目前爲止,它是免費的錯誤,但執行的某一部分時我收到奇數值:無法在輸出中獲取正確的小數值

我的輸出是:

0/2 
3/4 
Cannot divide by zero 
Cannot divide by zero 
0 
0 
Cannot divide by zero 
____________________________________ 

我知道,我在我的函數的計算是正確的,但我相信他們沒有收到傳遞給它們的變量的保存值。

這裏是我的類:

#include <iostream> 
#include <string.h> 
#include <fstream> 
using namespace std; 

class fraction { 
private: 
    long num, den; 

public: 
    fraction() {} 
    fraction(int n, int d) { 
     num = n; 
     if (d == 0) { 
      cout << "Careful there, Tim..." << endl; 
      exit(0); 
     } else 
      den = d; 
    } 

    void setNum(long l_num) { num = l_num; } 
    void setDen(long l_den) { den = l_den; } 
    long getNum() { return num; } 
    long getDen() { return den; } 

    long add(fraction& a, fraction& b) { 
     int n = (a.getNum() * b.getDen()) + (b.getNum() * a.getDen()); 
     int d = a.getNum() * b.getDen(); 
     num = n/gcd(n, d); 
     den = d/gcd(n, d); 
     return num; 
     return den; 
    } 

    long sub(fraction& a, fraction& b) { 
     int n = a.getNum() * b.getDen() - b.getNum() * a.getDen(); 
     int d = a.getNum() * b.getDen(); 
     num = n/gcd(n, d); 
     den = d/gcd(n, d); 
    } 

    long mult(fraction& a, fraction& b) { 
     int n = a.getNum() * b.getNum(); 
     int d = a.getDen() * b.getDen(); 
     num = n/gcd(n, d); 
     den = d/gcd(n, d); 
    } 

    long div(fraction& a, fraction& b) { 
     int n = a.getNum() * b.getDen(); 
     int d = a.getDen() * b.getNum(); 
     num = n/gcd(n, d); 
     den = d/gcd(n, d); 
    } 

    long inc(fraction& a) { 
     int n = a.getNum() + 1; 
     int d = a.getDen() + 1; 
    } 

    long gcd(long n, long d) { 
     int remainder; 
     while (d != 0) { 
      remainder = n % d; 
      n = d; 
      d = remainder; 
     } 
     return n; 
    } 
    void print() // Display method 
    { 
     if (den == 1) 
      cout << num << endl; 
     else if (den == 0) 
      cout << "Cannot divide by zero" << endl; 
     else 
      cout << num << "/" << den << endl; 
    } 
}; 

我的教練給了我們嚴格的指示,不要改變他給出int main(),但在這裏它是:

int main() { // define seven instances of the class fraction 
    fraction f1, f2, f3, f4, f5, f6, f7; 
    // set values for the numerator and denominator to f1 and print 
    // them 
    f1.setDen(2L); 
    f1.setNum(0L); 
    f1.print(); 

    // set values for the numerator and denominator to f2 and print them 
    f2.setDen(4L); 
    f2.setNum(3L); 
    f2.print(); 
    f3.add(f1, f2); 
    f3.print(); 
    f4.sub(f1, f2); 
    f4.print(); 
    f5.mult(f1, f2); 
    f5.print(); 
    f6.div(f1, f2); 
    f6.print(); 
    f7.inc(f1); 
    f7.print(); 
} 

我已經提出幫助該程序一次從SO之前,我被非常好的人接近。我再次給我的教授發了兩封電子郵件,然後打電話給他的辦公室。他沒有回答//閱讀我的電子郵件閱讀cc打開,並且未回覆我留下的語音郵件。

+0

你一定'gcd'功能是OK?函數'add'中有無法訪問的代碼'return den;'。給'gcd'函數添加一些測試。 – NetVipeC 2014-09-05 20:10:45

+0

如果'gcd'工作,整數除法是沒有問題的。目前唯一的分區是'分子/ gcd'和'分母/ gcd',如果'gcd'確定就可以分割。 – NetVipeC 2014-09-05 20:12:47

+0

我已經使用add函數作爲一種'測試'來看看我是否可以操縱它來產生一個很好的答案。 我將如何去改變它輸出正確的答案? – 2014-09-05 20:15:33

回答

2

我想我找到了你的問題,你的功能加/減,當你計算d,

int d = a.getNum() * b.getDen(); 

你犯了一個錯誤,爲d,你應該真正做到:

int d = a.getDen() * b.getDen(); 

從你的附加功能,你應該刪除這兩個回報

long add(fraction& a, fraction& b) { 
     int n = (a.getNum() * b.getDen()) + (b.getNum() * a.getDen()); 
     int d = a.getNum() * b.getDen(); 
     num = n/gcd(n, d); 
     den = d/gcd(n, d); 
     //return num; 
     //return den; 
    } 

並在您的INC功能,您忘了SE t時的NUM,書房:

long inc(fraction& a) { 
     num = a.getNum() + 1; 
     den = a.getDen() + 1; 
    } 

檢查了這一點http://ideone.com/C7KgD3看到的結果

+2

該代碼仍會調用未定義的行爲。函數必須改爲返回類型'void',而不是'long'。 – PaulMcKenzie 2014-09-05 20:36:51

+0

謝謝!我不能相信我沒有看到錯誤類型>。<我在發佈後立即刪除了回覆,沒有任何人對他們發表評論,我看到了將這些回覆放在那裏的錯誤。 – 2014-09-05 20:37:51

+0

函數更改爲void。同樣的結果,雖然我很欣賞你糾正我。 – 2014-09-05 20:39:47