#include<math.h>
#include<iostream.h>
class rational
{
int numerator,denominator;
void optimization();
public:
rational(int x=0,int y=1); //声明带默认值的构造函数
friend rational operator +(rational &num1,rational &num2);
//声明重载运算符"+"
friend rational operator -(rational &num1,rational &num2);
friend rational operator *(rational &num1,rational &num2);
friend rational operator /(rational &num1,rational &num2);
friend bool operator==(rational &num1,rational &num2);
//声明比较运算符"=="重载函数
friend double real(rational& x); //声明将分数转换为浮点数的函数
friend ostream &operator<<(ostream&,rational &); //声明"<<"重载
friend istream &operator>>(istream&,rational &); //声明">>"重载
};
void rational::optimization()
{
int gcd,min,max;
if(numerator==0)
{ //如分子为0,则置分母为1后返回
denominator=1;
return;
}
gcd=(abs(numerator)>abs(denominator)?abs(denominator):abs(numerator));
if(gcd==0) return;
/*//也可如此用循环求最大公约数
for(max=gcd;max>1;max--)
if((numerator%max==0)&&(denominator%max==0))
break;
*/
//以下用辗转相除法求最大公约数,此方法较好
if(abs(numerator)>abs(denominator))
{max=numerator;min=denominator;}
else
{min=numerator;max=denominator;}
do{
gcd=max%min;
max=min;
min=gcd;
}while(gcd!=0);
numerator/=max;
denominator/=max;
if(numerator<0 && denominator<0)
{
numerator=-numerator;
denominator=-denominator;
}
else if(numerator<0 || denominator<0)
{
numerator=-abs(numerator);
denominator=abs(denominator);
}
}
rational::rational(int x,int y)
{
numerator=x;
denominator=y;
optimization();
}
rational operator +(rational &num1,rational &num2)
{
rational temp;
temp.denominator=num1.denominator*num2.denominator;
temp.numerator=num1.numerator*num2.denominator+
num1.denominator*num2.numerator;
temp.optimization();
return temp;
}
rational operator -(rational &num1,rational &num2)
{
rational temp;
temp.denominator=num1.denominator*num2.denominator;
temp.numerator=num1.numerator*num2.denominator-
num1.denominator*num2.numerator;
temp.optimization();
return temp;
}
rational operator *(rational &num1,rational &num2)
{
rational temp;
temp.denominator=num1.denominator*num2.denominator;
temp.numerator=num1.numerator*num2.numerator;
temp.optimization();
return temp;
}
rational operator /(rational &num1,rational &num2)
{
rational temp;
temp.denominator=num1.denominator*num2.numerator;
temp.numerator=num1.numerator*num2.denominator;
temp.optimization();
return temp;
}
bool operator==(rational &num1,rational &num2)
{
if(num1.numerator==num2.numerator &&
num1.denominator==num2.denominator)
return true;
else
return false;
}
double real(rational& x)
{
return (double(x.numerator))/(x.denominator);
}
ostream &operator<<(ostream& out,rational &obj)
{
out<<obj.numerator;
if(obj.numerator!=0 && obj.denominator!=1 &&obj.denominator!=0)
cout<<"/"<<obj.denominator<<"\n";
else if(obj.denominator==0)
cout<<"ERROR!The denominator is equal to 0.\n";
else cout<<"\n";
return out;
}
istream &operator>>(istream& in,rational &obj)
{
cout<<"Input the numerator ,denominator of the rational:\n";
in>>obj.numerator;
in>>obj.denominator;
obj.optimization();
return in;
}
void main()
{
rational r1,r2,r3;
cin>>r1;
cin>>r2;
cout<<"r1="<<r1;
cout<<"r2="<<r2;
r3=r1+r2;
cout<<"r1+r2=";cout<<r3;
r3=r1-r2;
cout<<"r1-r2=";cout<<r3;
r3=r1*r2;
cout<<"r1*r2=";cout<<r3;
r3=r1/r2;
cout<<"r1/r2=";cout<<r3;
if(r1==r2)
cout<<"r2 is equal to r1.\n";
else
cout<<"r2 isn't equal to r1.\n";
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
C++程序设计技能百练源码 (200个子文件)
11_94.cpp 4KB
7_63.cpp 3KB
10_81.cpp 3KB
5_50.cpp 3KB
11_97.cpp 3KB
5_44.cpp 3KB
10_84.cpp 3KB
10_87.cpp 3KB
5_49.cpp 3KB
6_55.cpp 2KB
9_79.cpp 2KB
9_77.cpp 2KB
6_58.cpp 2KB
2_4.cpp 2KB
9_80.cpp 2KB
11_96.cpp 2KB
11_98.cpp 2KB
9_78.cpp 2KB
10_90.cpp 2KB
5_42.cpp 2KB
7_62.cpp 2KB
11_95.cpp 2KB
5_48.cpp 2KB
8_72.cpp 2KB
7_64.cpp 2KB
10_83.cpp 2KB
7_69.cpp 2KB
7_61.cpp 2KB
5_43.cpp 2KB
5_47.cpp 2KB
10_82.cpp 2KB
8_75.cpp 1KB
10_88.cpp 1KB
7_68.cpp 1KB
6_60.cpp 1KB
5_39.cpp 1KB
6_57.cpp 1KB
8_71.cpp 1KB
10_89.cpp 1KB
9_76.cpp 1KB
4_32.cpp 1KB
5_46.cpp 1KB
10_86.cpp 1KB
7_65.cpp 1KB
5_45.cpp 1KB
8_74.cpp 1KB
6_59.cpp 1KB
5_41.cpp 1KB
3_16.cpp 1KB
5_37.cpp 1KB
8_73.cpp 1KB
3_15.cpp 994B
4_28.cpp 955B
6_54.cpp 868B
4_27.cpp 863B
5_38.cpp 858B
5_40.cpp 854B
3_17.cpp 827B
6_56.cpp 805B
4_29.cpp 779B
4_26.cpp 778B
2_9.cpp 777B
11_93.cpp 760B
3_13.cpp 754B
11_100.cpp 747B
4_22.cpp 742B
3_10.cpp 728B
6_52.cpp 707B
4_31.cpp 703B
7_66.cpp 700B
4_25.cpp 695B
6_53.cpp 687B
6_51.cpp 684B
7_70.cpp 678B
5_36.cpp 669B
2_8.cpp 661B
4_23.cpp 639B
2_3.cpp 628B
10_85.cpp 623B
3_18.cpp 621B
4_33.cpp 621B
3_11.cpp 620B
11_92.cpp 617B
4_34.cpp 616B
4_30.cpp 602B
2_7.cpp 596B
4_24.cpp 554B
3_19.cpp 544B
7_67.cpp 524B
2_5.cpp 494B
11_99.cpp 491B
5_35.cpp 488B
1_2.cpp 485B
3_14.cpp 485B
3_12.cpp 482B
4_20.cpp 413B
4_21.cpp 404B
1_1.cpp 389B
11_91.cpp 360B
2_6.cpp 299B
共 200 条
- 1
- 2
资源评论
心中有码
- 粉丝: 6
- 资源: 106
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功