超载运算符C :为什么分母乘以10
Overloaded Operators C++: Why is denominator being multiplied by 10
我正在处理一个分数分配,在该分配中,我提示用户获得两个分数,然后我添加,减去,乘和分配两个分数。我知道我仍然需要减少分数,但是我无法弄清楚为什么分母乘以10。如果我对frac1输入1 1/2,而对于frac2,则分母为2 2/5,则分母为100而不是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 39/10
0 -9/10
0 36/10
0 15/24
,但是您在一行上打印它们:
0 39/100 -9/100 36/100 15/24
相关文章:
- 为什么运算符"new"需要指针才能工作?
- 为什么"运算符<<"不适用于指向派生类型的成员?
- 为什么 == 运算符没有产生与 strcmp 相同的结果?
- 为什么 运算符 = 不为 Json::Value?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- 为什么运算符 new[] 为数组的大小分配内存?
- 为什么“运算符<<(cout,double)”不起作用
- 为什么>>运算符在不同的编译器上显示不同的结果?
- 为什么运算符<<是模棱两可的?
- C++ 为什么运算符>会中断嵌套的运算符()调用?
- 为什么 ::运算符关键字添加到 new 之前用于内存分配
- 为什么<<运算符不适用于来自 ofstream 的派生类?
- 为什么运算符<<需要 const?
- 为什么运算符*不调用构造函数?
- 为什么+运算符重载返回类型是类类型而不是整数
- 为什么运算符 [] 不重载左值和右值?
- 为什么运算符<应该是非成员函数?
- 为什么运算符()有奇怪的行为
- 为什么运算符 new 清除的内存多于请求的内存
- 为什么运算符==没有重载