一、问题需求:
利用多态的特性,
1、代码结构清晰;
2、可读性强;
3、便于开发前期或后期的修改和维护,可扩展性高。
初步实现一个简易的计算器,含加减乘除以及求余的功能,仅初步实现,异常处理相关情况可后续慢慢自行添加扩展。
二、额外调用及内容构成
1. 头文件#include<iomanip> 中的fixed setprecision(保留小数位) 对除法结果保留两位小数;
2. 系统函数 system("pause") --> 用于程序暂停缓冲,点击回车即可进行下一步;
3. 系统函数system("cls"); --> 对界面进行清屏操作,使界面简洁;
4. 构成:
1)switch语句 --> 多功能调用
2)while循环 --> 多次进行,提高用户可读性、友好性
3)抽象类、具体功能类以及各个功能模块函数的声明、定义以及调用,具体如下:
class AbstractCalculator; //计算器抽象类
class AddCalculator; //加法类
class SubtrCalculator; //减法类
class MultiCalculator; //乘法类
class DivCalculator; //除法类
class RemaCalculator; //取余类
void showMenu(); //菜单
void add_Test(int num1, int num2); //加法
void subtr_Test(int num1, int num2); //减法
void multi_Test(int num1, int num2); //乘法
void div_Test(int num3, int num4); //除法
void rema_Test(int num1, int num2); //求余
二、代码实现
/* 简易计算器 */
#include<iostream>
#include<iomanip>
using namespace std;
class AbstractCalculator; //计算器抽象类
class AddCalculator; //加法类
class SubtrCalculator; //减法类
class MultiCalculator; //乘法类
class DivCalculator; //除法类
class RemaCalculator; //取余类
void showMenu(); //菜单
void add_Test(int num1, int num2); //加法
void subtr_Test(int num1, int num2); //减法
void multi_Test(int num1, int num2); //乘法
void div_Test(int num3, int num4); //除法
void rema_Test(int num1, int num2); //求余
int main()
{
int num1 = 0, num2 = 0, choice;
double num3 = 0, num4 = 0;
while (true)
{
showMenu(); //展示主页
cout << "请输入你想进行的运算序号:";
cin >> choice;
system("cls");
if (choice != 0)
cout << "请输入您想计算的两个数:";
switch (choice)
{
case 1:
cin >> num1 >> num2;
add_Test(num1, num2); //加法
break;
case 2:
cin >> num1 >> num2;
subtr_Test(num1, num2); //减法
break;
case 3:
cin >> num1 >> num2;
multi_Test(num1, num2); //乘法
break;
case 4:
cin >> num3 >> num4;
div_Test(num3, num4); //除法
break;
case 5:
cin >> num1 >> num2;
rema_Test(num1, num2); //求余
break;
case 0:
cout << "感谢使用!再见!" << endl;
return 0;
break;
default:
cout << "Invild Error !" << endl;
break;
}
system("pause");
system("cls");
}
return 0;
}
//主页函数
void showMenu()
{
cout << "**************************************" << endl;
cout << "*****欢迎进入简单计算器服务系统!*****" << endl;
cout << "***** 加法计算请按 1 *****" << endl;
cout << "***** 减法计算请按 2 *****" << endl;
cout << "***** 乘法计算请按 3 *****" << endl;
cout << "***** 除法计算请按 4 *****" << endl;
cout << "***** 求余计算请按 5 *****" << endl;
cout << "***** 退出服务请按 0 *****" << endl;
cout << "**************************************" << endl;
}
//构建计算器抽象类
class AbstractCalculator
{
public:
virtual int GetResult() //创建虚函数
{
return 0;
}
virtual double GetResult2() //创建虚函数
{
return 0;
}
int m_Num1;
int m_Num2;
double m_Num3;
double m_Num4;
};
//创建加法计算器
class AddCalculator :public AbstractCalculator
{
public:
int GetResult()
{
return m_Num1 + m_Num2;
}
};
//创建减法计算器
class SubtrCalculator :public AbstractCalculator
{
public:
int GetResult()
{
return m_Num1 - m_Num2;
}
};
//创建乘法计算器
class MultiCalculator :public AbstractCalculator
{
public:
int GetResult()
{
return m_Num1 * m_Num2;
}
};
//创建除法计算器
class DivCalculator :public AbstractCalculator
{
public:
double GetResult2()
{
return m_Num3 / m_Num4;
}
};
//创建求余计算器
class RemaCalculator :public AbstractCalculator
{
public:
int GetResult()
{
return m_Num1 % m_Num2;
}
};
//实现多态的条件
//父类的指针或引用 指向子类对象
// 加法测试
void add_Test(int num1, int num2)
{
AbstractCalculator* calculator01 = new AddCalculator;
calculator01->m_Num1 = num1;
calculator01->m_Num2 = num2;
cout << calculator01->m_Num1 << " + " << calculator01->m_Num2 << " = " << calculator01->GetResult() << endl;
delete calculator01;
}
// 减法测试
void subtr_Test(int num1, int num2)
{
AbstractCalculator* calculator02 = new SubtrCalculator;
calculator02->m_Num1 = num1;
calculator02->m_Num2 = num2;
cout << calculator02->m_Num1 << " - " << calculator02->m_Num2 << " = " << calculator02->GetResult() << endl;
delete calculator02;
}
// 乘法测试
void multi_Test(int num1, int num2)
{
AbstractCalculator* calculator03 = new MultiCalculator;
calculator03->m_Num1 = num1;
calculator03->m_Num2 = num2;
cout << calculator03->m_Num1 << " x " << calculator03->m_Num2 << " = " << calculator03->GetResult() << endl;
delete calculator03;
}
// 除法测试
void div_Test(int num3, int num4)
{
AbstractCalculator* calculator04 = new DivCalculator;
calculator04->m_Num3 = num3;
calculator04->m_Num4 = num4;
cout << calculator04->m_Num3 << " / " << calculator04->m_Num4 << " = " << fixed << setprecision(2) << calculator04->GetResult2() << endl;
delete calculator04;
}
//求余测试
void rema_Test(int num1, int num2)
{
AbstractCalculator* calculator05 = new RemaCalculator;
calculator05->m_Num1 = num1;
calculator05->m_Num2 = num2;
cout << calculator05->m_Num1 << " % " << calculator05->m_Num2 << " = " << calculator05->GetResult() << endl;
delete calculator05;
}
注:代码并不完善,有一些异常处理还未进行,若有需要,可多多研究理解并加以完善,谢谢