2012-10-21 77 views
0

我正在做一個分數賦值,其中我提示用戶輸入兩個分數,然後我加,減,乘和除兩個分數。我知道我仍然需要減少分數,但是我不知道爲什麼分母乘以10.如果我爲frac1輸入1 1/2,爲frac2輸入2 2/5,分母是100而不是10所以很奇怪..任何指導都不勝感激! :)重載運算符C++:爲什麼分母乘以10

// fraction9.cpp : main project file. 
#include "stdafx.h" 
#include<conio.h> 
#include<iostream> 
#include<string> 
using namespace std; 


class Fraction 
{ 
private: 
    int whole; 
    int numerator;  // may be any integer 
    int denominator;  // should always be positive 
public: 
Fraction(); // Set numerator = 0, denominator = 1. 
Fraction(int w, int n, int d=1); // constructor with parameters 
      // acts as conversion constructor 

// operator overload as member 
Fraction operator+ (const Fraction& f) const; 
Fraction operator- (const Fraction& f) const; 
Fraction operator* (const Fraction& f) const; 
Fraction operator/ (const Fraction& f) const;  

// standard input/output routines 
void Input();  // input a fraction from keyboard. 
void Show() const;  // Display a fraction on screen 

// accessors 
int GetWhole() const; 
int GetNumerator() const; 
int GetDenominator() const; 

// mutator 
    bool SetValue(int w, int n, int d=1); // set the fraction's value through parameters 
    //double Evaluate() const; // Return the decimal value of a fraction 


}; 

Fraction Fraction::operator+(const Fraction& f) const 
// operator overload for + written as member function 
{ 
    Fraction r;  // result 
    r.numerator = (denominator * whole + numerator) * f.denominator + (f.denominator *  f.whole + f.numerator) * denominator; 
    r.denominator = (denominator * f.denominator); 
    return r; 
} 

Fraction Fraction::operator-(const Fraction& f) const 
// operator overload for - written as member function 
{ 
    Fraction r;  // result 
    r.numerator = (denominator * whole + numerator) * f.denominator - (f.denominator *  f.whole + f.numerator) * denominator; 
    r.denominator = (denominator * f.denominator); 
    return r; 
} 

// operator overload for * written as member function 
Fraction Fraction::operator*(const Fraction& f) const 
{ 
    Fraction r;  // result 
    r.numerator = ((denominator * whole + numerator) * (f.denominator * f.whole +  f.numerator)); 
    r.denominator = (denominator * f.denominator); 
    return r; 
} 

// operator overload for/written as member function 
Fraction Fraction::operator/(const Fraction& f) const 
{ 
    Fraction r;  // result 
    r.numerator = ((denominator * whole + numerator) * f.denominator); 
    r.denominator = (denominator * (f.denominator * f.whole + f.numerator)); 
    return r; 
} 

Fraction::Fraction() 
// Default constructor. Initializes fraction to 0/1 
{ 
    whole = 0; 
    numerator = 0; 
    denominator = 1; 
} 

Fraction::Fraction(int w, int n, int d) 
// initializes fraction to n/d (defaults to 0/1 if invalid data) 
{ 
    if (SetValue(w, n, d) == false) 
    SetValue(0, 0, 1); 
} 

void Fraction::Input() 
{ 
    cout << "Enter whole number "; 
    cin >> whole; 
    cout << "Enter numerator " ; 
    cin >> numerator; 
    cout << "Enter denominator "; 
    cin >> denominator; 
     if (denominator <= 0) 
    cout << "*** Denominator must be positive. Try again: "; 
    while (denominator <= 0) 
    { 
     cout << "Please re-enter the denominator of the fraction, it cannot be 0" <<  endl; 
     cin >> denominator; 
    }; 
} 

void Fraction::Show() const 
// Display a fraction 
{ 
    cout << whole << " " << numerator << '/' << denominator; 
} 

int Fraction::GetWhole() const 
{ 
    return whole; 
} 

int Fraction::GetNumerator() const 
{ 
    return numerator; 
} 

int Fraction::GetDenominator() const 
{ 
    return denominator; 
} 

bool Fraction::SetValue(int w, int n, int d) 
// sets fraction to n/d and returns true for success (good data) 
// returns false and leaves fraction alone if bad data 
{ 
    if (d <= 0) 
    return false; 

    numerator = n; 
    denominator = d; 
    return true; 
} 

// Driver routine to test the Fraction class 

int main() 
{ 

Fraction f1, f2; 
cout << "Enter first fraction: "; 
f1.Input(); 
cout << "\n You entered "; 
f1.Show(); 
cout << "\n Enter second fraction: "; 
f2.Input(); 
cout << "You entered "; 
f2.Show(); 
cout << "\n The sum of the first and second fraction is "; 
Fraction Aresult; 
Aresult = f1 + f2; 
Fraction Sresult; 
Sresult = f1 - f2; 
Fraction Mresult; 
Mresult = f1 * f2; 
Fraction Dresult; 
Dresult = f1/f2; 
Aresult.Show(); 
Sresult.Show(); 
Mresult.Show(); 
Dresult.Show(); 
cout << '\n'; 
_getch(); 
return 0; 

} 
+0

我正在偷看,現在,除非有人回答第一。 – M4rc

+3

你不在'Show'調用中或之間輸出任何換行符? – aschepler

+1

你的數學(和一般邏輯)檢查出它的價值。第二次輸入負分母時的錯誤信息雖然有點混亂。此外,你可能想要投入一個除以0的支票。 – Cameron

回答

5

那些多餘的零不被追加到分母。它們是你串在一起的混合部分的全部部分。

的結果實際上

0 39/10 
0 -9/10 
0 36/10 
0 15/24 

但你將它們打印在同一行:

0 39/100 -9/100 36/100 15/24 
+1

這就解釋了爲什麼我的測試沒有問題,我(爲了可讀性)在打印之間放入了'cout << endl;'。 – M4rc

+0

omg,哇我真是個白癡。非常感謝! –