#include <iostream>
using namespace std;
class fenshu
{
private:
double a;
double b;
public:
void zhuanhuan()
{
puanduan();
while((int)a!=a) //(int)a是转换为整型,(double*)a是转换为整型指针型。
a=a*10;
while((int)b!=b)
b=b*10;
}
void puanduan()
{
if(b==0)
{
cout<<"该分数不合法"<<endl;
exit (-2);
}
}
void huajian()
{
zhuanhuan();
double temp,m,n; //temp是一个临时的变量。
if((int)a%(int)b==0)
a=a/b;
else
{
m=a;n=b;
while((int)a%(int)b!=0) //利用辗转相除法求出最大公约数。
{
temp=(int)a%(int)b;
a=b;
b=temp;
}
a=m/b;
b=n/b;
}
}
double gongbeishu(double p,double q)
{
double m,temp,n,t; //n代表最小公倍数,t来存储最大公约数
m=p*q;
if((int)p%(int)q==0)
n=p;
else
{
while(((int)p%(int)q)!=0)
{
temp=(int)p%(int)q;
p=q;
q=temp;
}
t=q;
n=m/t; //n是最小公倍数。
}
return n;
}
void set(double i,double j)
{
a=i;
b=j;
}
void display()
{
cout<<a<<"/"<<b<<endl;
}
fenshu(double i=0,double j=1):a(i),b(j){} //构造函数的初始化
fenshu operator+(fenshu &m)
{
fenshu t;
double temp;
temp=t.gongbeishu(b,m.b);
t.b=temp;
t.a=(temp/b)*a+(temp/m.b)*m.a;
t.huajian();
return t;
}
fenshu operator-(fenshu &m)
{
fenshu t;
double temp;
temp=t.gongbeishu(b,m.b);
t.b=temp;
t.a=(temp/b)*a-(temp/m.b)*m.a;
t.huajian();
return t;
}
fenshu operator*(fenshu &m)
{
fenshu t;
t.a=a*m.a;
t.b=b*m.b;
t.huajian();
return t;
}
fenshu operator/(fenshu &m)
{
fenshu t;
t.a=a*m.b;
t.b=b*m.a;
t.huajian();
return t;
}
};
void main()
{
fenshu x(2,4),y(4,16),z;
double a,b,m,n;
x.huajian();
y.huajian();
z=x+y;
z.display();
cout<<"请输入一个分数的值a和b:"<<endl;
cin>>a;
cin>>b;
cout<<"再输入一个分数值m和n:"<<endl;
cin>>m;
cin>>n;
x.set(a,b);
x.huajian();
y.set(m,n);
y.huajian();
cout<<"两个分数的和:"<<endl;
z=x+y;
z.display();
cout<<"两个分数的差"<<endl;
z=x-y;
z.display();
cout<<"两个分数的乘积"<<endl;
z=x*y;
z.display();
cout<<"两个分数的商"<<endl;
z=x/y;
z.display();
}