马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近看小甲鱼的视频做了一个运算符重载的作业,具体代码在下面,但是运行的结果还是不太理想。
我希望在分母为0的情况下,直接停止程序并显示相应的内容,现在有一点小想法:
1.利用return 来决定是否执行;需要设置返回值,增加函数;
2.使用exit() 来结束程序,但是运行窗口也随之关闭,看不到提示;
希望大佬们有更好的方法。
函数如下://运算符重载 用法:
//函数类型 operator 运算符名称 (行参)
//{
// 对运算符的处理
//}
//例子:实现分数的 + - * /
//存在问题:1.结果的显示不是最简形式 2.当分母为0时,程序无法停止。
#include<iostream>
#include<cmath>
#include<cstdlib>
class FenShu //定义分数的类
{
public:
FenShu(int a,int b); //构造函数
FenShu();
~FenShu();
void xianshi(); //显示和修改(将6/6显示为1,将1/(-6)显示为-1/6)函数
void xiugai();
FenShu operator + (FenShu x); //重载运算符函数
FenShu operator - (FenShu x);
FenShu operator * (FenShu x);
FenShu operator / (FenShu x);
private:
int fenzi; //私有类型:分子,分母
int fenmu;
};
FenShu::FenShu() //无参数构造器
{
fenzi=1;
fenmu=1;
}
FenShu::FenShu(int a,int b) //带参数构造器
{
if( b==0 )
{
std::cout<<"分母不可以为0...\n";
exit();//停止程序
}
fenzi=a;
fenmu=b;
}
FenShu::~FenShu() //析构器
{
}
FenShu FenShu::operator +(FenShu x) //重载 +
{
FenShu A1;
if(fenmu == x.fenmu )
{
A1.fenzi=fenzi+x.fenzi;
A1.fenmu=fenmu;
}
else
{
A1.fenmu=fenmu*x.fenmu ;
A1.fenzi=fenzi*x.fenmu + x.fenzi*fenmu;
}
return A1;
}
FenShu FenShu::operator -(FenShu x) //重载 -
{
FenShu A1;
if(fenmu == x.fenmu )
{
A1.fenzi=fenzi-x.fenzi;
A1.fenmu=fenmu;
}
else
{
A1.fenmu=fenmu*x.fenmu ;
A1.fenzi=fenzi*x.fenmu - x.fenzi*fenmu;
}
return A1;
}
FenShu FenShu::operator *(FenShu x) //重载 *
{
FenShu A1;
{
A1.fenzi =fenzi*x.fenzi ;
A1.fenmu =fenmu*x.fenmu ;
}
return A1;
}
FenShu FenShu::operator /(FenShu x) //重载 /
{
FenShu A1;
{
A1.fenzi =fenzi*x.fenmu ;
A1.fenmu =fenmu*x.fenzi ;
}
return A1;
}
void FenShu::xianshi() //显示函数
{
if(fenzi == fenmu)
{
std::cout<<"1";
}
else
{
std::cout<<fenzi<<"/"<<fenmu;
}
}
void FenShu::xiugai() //判断计算的合法性
{
if(fenmu == 0)
{
std::cout<<"不符合计算要求,分母不能为0\n";
//停止程序
}
else if(fenmu < 0) //当分母为负数时,将分母变正,分子变负
{
fenzi = -fenzi; //分子=-分子
fenmu = abs(fenmu); //绝对值
xianshi();
}
else
{
xianshi();
}
}
void main() //主函数
{
FenShu a(2,0),b(2,3),c;
c=a+b;
a.xiugai();std::cout<<" + ";b.xiugai();std::cout<<" = ";c.xiugai();std::cout<<"\n"; //显示:2/6 + 2/3 = 1
c=a-b;
a.xiugai();std::cout<<" + ";b.xiugai();std::cout<<" = ";c.xiugai();std::cout<<"\n";
c=a*b;
a.xiugai();std::cout<<" + ";b.xiugai();std::cout<<" = ";c.xiugai();std::cout<<"\n";
c=a/b;
a.xiugai();std::cout<<" + ";b.xiugai();std::cout<<" = ";c.xiugai();std::cout<<"\n";
system("PAUSE");
}
本帖最后由 jackz007 于 2019-8-7 08:58 编辑
这样写程序很累,被零除会引发异常,只要在除法运算之前,设定相关异常捕获,如果异常没有发生,走正常流程方向,否则,走异常处理方向,显示相关提示应该就可以了。
|