实验二 自定义类型的运算
【实验目的】
- 理解运算符函数与运算符重载方法;
- 掌握运算符重载为友元函数;
【实验内容】
题目:
在C++中,分数不是预先定义的,建立一个分数类,使之具有以下功能:能防止分母为0、当分数不是最简形式时进行约分及分母为负数。用重载运算符完成加法、减法、乘法、除法等四则运算。
源程序代码:
#include<iostream>
#include<cstdlib>
using namespace std;
int gcd(int m,int n)//求最大公约数函数
{
if (m < n)
{
int tmp = m;
m = n;
n = tmp;
}
if (n == 0)
return m;
else
return gcd(n,m % n);
}
class fraction //构建分数类
{
int a,b;
public:
fraction(int x=0,int y=1) //构造函数
{
if(y==0) //判断分母是否为0
{
cout<<"分母为零"<<endl;
exit(0);
}
if(y<0) //分母小于0时将负号转移到分子上
{
a=(-1)*x;
b=(-1)*y;
}
a=x;
b=y;
}
fraction(const fraction&f)//拷贝构造
{
a=f.a;
b=f.b;
}
~fraction(){}//析构函数
void setfraction(int x,int y)//在类外重新设置分数值
{
if(y==0)
{
cout<<"分母为零"<<endl;
exit(0);
}
if(y<0)
{
a=(-1)*x;
b=(-1)*y;
}
a=x;
b=y;
}
void show()//输出最简结果
{
int flag=1,m;
if(a<0)
{
a=-a;
flag=-flag;
}
if(b<0)
{
b=-b;
flag=-flag;
}
m=gcd(a,b);
a=a/m;
b=b/m;
a=a*flag;
if(a==0||b==1)
cout<<a<<endl;
else
cout<<a<<"/"<<b<<endl;
}
friend fraction operator + (fraction & f1,fraction & f2 ) //以友元函数重载运算符
{
return fraction(f1.a * f2.b + f1.b * f2.a , f1.b * f2.b);
}
friend fraction operator - (fraction & f1,fraction & f2)
{
return fraction(f1.a*f2.b-f1.b*f2.a,f1.b*f2.b);
}
friend fraction operator * (fraction & f1,fraction & f2)
{
return fraction(f1.a*f2.a,f1.b*f2.b);
}
friend fraction operator / (fraction & f1,fraction & f2)
{
return fraction(f1.a*f2.b,f1.b*f2.a);
}
};
int main()
{
int a,b;
cout<<"请输入第一个分数的分子分母"<<endl;
cin>>a>>b;
int c,d;
cout<<"请输入第二个分数的分子分母"<<endl;
cin>>c>>d;
fraction a1,a2,a3,a4,a5,a6;
a1.setfraction(a,b);
a2.setfraction(c,d);
a3=a1+a2;
cout<<"加法结果"<<endl;
a3.show();
a4=a1-a2;
cout<<"减法结果"<<endl;
a4.show();
a5=a1*a2;
cout<<"乘法法结果"<<endl;
a5.show();
a6=a1/a2;
cout<<"除法法结果"<<endl;
a6.show();
return 0;
}
运行结果截图:
【实验小结】
- 在运算完成后输出所需结果时进行约分,使之输出最简结果;
- 可以将化简部分写一个单独的函数来使用;
- 在重载运算符的时候再运算符前后打上空格使格式好看。