// OperatorT.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
//运算符的重载
//计算有理数rational的 + - * /
class Rational
{
public:
Rational();//构造函数初始化
Rational(int numer, int denom);
Rational operator +(Rational d);//
Rational operator -(Rational d);
Rational operator *(Rational d);
Rational operator /(Rational d);
void print();
private:
friend std::ostream &operator<<(std::ostream &os, Rational f);
//友元函数用friend声明,可以访问类中的私有变量
void normalize();//对分数简化处理
int nu;
int de;
};
Rational::Rational()
{
nu = 0;
de = 0;
}
Rational::Rational(int numer, int denom)
{
nu = numer;
de = denom;
normalize();//简化
}
Rational Rational::operator +(Rational d)
{
Rational r;
r.nu = nu *d.de + de*d.nu;
r.de = de * d.de;
return r;
}
Rational Rational::operator-(Rational d)
{
//Rational r;
//r.nu = nu *d.de - de*d.nu;
//r.de = de * d.de;
//return r;
d.nu = -d.nu;
return operator +(d);
}
Rational Rational::operator*(Rational d)
{
Rational r;
r.nu = nu * d.nu;
r.de = de * d.de;
return r;
}
Rational Rational::operator/(Rational d)
{
//Rational r;
//r.nu = nu * d.de;
//r.de = de * d.nu;
//return r;
int temp;
temp = d.nu;
d.nu = d.de;
d.de = temp;
return operator*(d);
}
void Rational::print()
{
normalize();
if (nu%de == 0)
{
std::cout << nu / de << std::endl; //<< "\n" << "\n"
}
else
{
std::cout << nu << "/" << de << std::endl;
}
}
//对分数的简化处理
//1.分母为正
//2.欧几里得算法对分数进行化简
void Rational::normalize()
{
if (de < 0)//分母小于0,分子分母都取负
{
nu = -nu;
de = -de;
}
int a = abs(nu);
int b = abs(de);
while (b > 0) //好!
{
int t = a%b;
a = b;//被除数变除数,余数变被除数...循环..直到余数为0
b = t;
}
nu /= a;
de /= a;
}
//使用前先声明 // 对 << 进行重载
std::ostream & operator<<(std::ostream & os, Rational f);
int main()
{
Rational r1(-3, 5), r2(-6, -9);
Rational r3, r4, r5, r6;
r3 = r1 + r2;
r4 = r1 - r2;
r5 = r1 * r2;
r6 = r1 / r2;
std::cout << "Src: "<<"\n";
std::cout << "r1= "; r1.print();
std::cout << "r2= "; r2.print();
std::cout << "Result: "<<"\n";
//std::cout << "r3= "; r3.print();
//std::cout << "r4= "; r4.print();
//std::cout << "r5= "; r5.print();
//std::cout << "r6= "; r6.print();//
//对<<重载 应用
std::cout <<"("<< r1 <<")"<< " + " <<"("<< r2 <<")"<< " = " << r1 + r2 << std::endl;
std::cout <<"("<< r1 <<")"<< " - " << "("<< r2 <<")"<< " = " << r1 - r2 << std::endl;
std::cout <<"("<< r1 <<")"<< " * " << "("<< r2 <<")"<< " = " << r1 * r2 << std::endl;
std::cout <<"("<< r1 <<")"<< " / " << "("<< r2 <<")" << " = " << r1 / r2 << std::endl;
system("pause");
return 0;
}
// 对 << 进行重载的实现
std::ostream & operator<<(std::ostream & os, Rational f)
{
Rational f1 = f;
f1.normalize();
os << f1.nu << "/" << f1.de;
return os;
}
C++_Operator Overloading(运算符重载 | 计算有理数的加减乘除)
最新推荐文章于 2024-02-09 14:19:19 发布