所以我正在为我的OO课写一个mixed numerals课程。我们需要重载每个比较和布尔操作数(以及其他内容),但我在如何考虑'<'时遇到问题和'>'操作数。这是我的'=='和'!='操作数函数用于某些上下文。
编辑:如果有人对加法/减法方法有任何提示,我将不胜感激。
bool operator ==(Mixed& mn1, Mixed& mn2){
mn1.ToFraction();
mn2.ToFraction();
mn1.Simplify();
mn2.Simplify();
if(mn1.numerator == mn2.numerator && mn1.denominator == mn2.denominator)
return true;
else
return false;
}
和
bool operator !=( Mixed& mn1, Mixed& mn2){
mn1.ToFraction();
mn2.ToFraction();
mn1.Simplify();
mn2.Simplify();
if(mn1.numerator == mn2.numerator && mn1.denominator == mn2.denominator)
return false;
else
return true;
}
如果有人能提供一些指导,我会很感激。哦,我们无法将它们转换为小数进行比较。
编辑:这是我的标题。
#include <iostream>
using namespace std;
class Mixed
{
public:
Mixed(int integer, int numerator = 0, int denominator = 1);
Mixed(int integer = 0);
double Evaluate();
void ToFraction();
void Simplify();
friend istream& operator >>(istream& in, Mixed& mn);
friend ostream& operator <<(ostream& out, Mixed& mn);
friend bool operator ==( Mixed& mn1, Mixed& mn2);
friend bool operator !=( Mixed& mn1, Mixed& mn2);
friend bool operator >( Mixed& mn1, Mixed& mn2);
friend bool operator <( Mixed& mn1, Mixed& mn2);
friend bool operator <=( Mixed& mn1, Mixed& mn2);
friend bool operator >=( Mixed& mn1, Mixed& mn2);
friend const Mixed operator +( Mixed& mn1, Mixed& mn2);
friend const Mixed operator -( Mixed& mn1, Mixed& mn2);
friend const Mixed operator *( Mixed& mn1, Mixed& mn2);
friend const Mixed operator /( Mixed& mn1, Mixed& mn2);
private:
int GCD(int a, int b);
int integer, numerator, denominator;
};
答案 0 :(得分:2)
有理数非常直接:有理数是一对(a,b)的整数,通常写成a / b
,直到等于(a,b)≡(a',b ')当且仅当ab'= a'b。
因此,如果您的类包含两个代表性整数p
和q
,则可以将等于运算符实现为:
struct Rational
{
int p; // numerator
unsigned int q; // denominator
bool operator==(Rational const & rhs) const
{
return p * rhs.q == rhs.p * q;
}
// ...
};
对于两个肯定的理由,您通过p * rhs.q < rhs.p * q
存在不等式。所有其他关系可以用这两个来实现,例如, x <= y
与!(y < x)
等相同。
通过将分子和分母除以它们的GCD,可以将理性取消到最低项,正如您已经实施的那样。
“混合”数字,即整数加上理性小于一,可以简单地转换为操作的通常分子 - 分母合理表示,并通过积分除法和余数转换为混合形式。
答案 1 :(得分:1)
要比较有效性,通常需要找到一个公分母,然后比较分子。对于这样的比较,你真的不需要减少到最低项(尽管它很快/很容易,这样做通常是相当无害的。)
如果您决定保持平等比较,可以将它们简化为:
bool operator ==(Mixed mn1, Mixed mn2){
mn1.ToFraction();
mn2.ToFraction();
mn1.Simplify();
mn2.Simplify();
return mn1.numerator == mn2.numerator && mn1.denominator == mn2.denominator;
}