HM137 普通计算器与多态计算器
HM137 普通计算器与多态计算器
来源: 第 137 集 类和对象-多态-案例1-计算器类
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
要用两种架构实现「两个整数操作数」的计算器,体会多态的好处:组织结构清晰、可读性强、利于前期和后期扩展与维护。真实开发提倡**开闭原则**:对扩展开放,对修改关闭。
普通写法。 一个 Calculator 里放 mNum1、mNum2,getResult 传入运算符字符串,用 if / else if 判断 +、-、*。这样也能算,但每加一种运算(除法、乘方……)都必须改原来的 getResult,乘法出了错也得在整段分支里翻。本题普通写法**只提供加减乘**,遇到除法视为「必须改源码才能扩展」。
多态写法。 先写抽象计算器 AbstractCalculator:只放两个操作数,以及虚函数 getResult()(基类里可以先 return 0,这个 0 实际用不到)。再写只做一件事的子类并重写 getResult:
AddCalculator:两数相加SubCalculator:两数相减MulCalculator:两数相乘DivCalculator:整数相除(向 0 截断)
使用时用**父类指针**指向堆上的子类对象,例如 AbstractCalculator* abc = new AddCalculator;,赋值两个操作数后调用 getResult(),用完 delete。加除法时不必改抽象类和加减乘类,往后追加一个子类即可。
读入若干运算。普通分支必须走带 if 的 getResult;多态分支必须走父类指针调用虚函数。不要只用一套 if 冒充两种架构。
输入格式
第一行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一种操作:
ORD op a b:普通计算器。\(op\) 为+-*/,\(a,b\) 为整数且 \(|a|,|b| \le 10^4\)。除法保证 \(b \ne 0\)。POLY op a b:多态计算器,运算符范围同上。OC:询问普通写法要加新运算时,要不要改原来的getResultPC:询问多态写法要加新运算时,要不要改已经写好的抽象类和旧子类
输出格式
每个操作一行,行末换行:
ORD且 \(op\) 为+-*:一个整数,运算结果ORD且 \(op\) 为/:NEED_MODIFYPOLY:一个整数,运算结果OC:YESPC:NO
样例
输入 #1
8
ORD + 10 10
ORD - 10 10
ORD * 10 10
POLY + 100 100
POLY - 100 100
POLY * 100 100
OC
PC
输出 #1
20
0
100
200
0
10000
YES
NO
输入 #2
3
ORD / 8 2
POLY / 8 2
POLY + 1 2
输出 #2
NEED_MODIFY
4
3
说明
- 样例 #1 对应课堂上普通写法 \(10\) 与多态写法 \(100\) 的加减乘。
- 普通写法加除法必须改源码;多态写法追加
DivCalculator即可,符合开闭原则。 - 堆上
new出的计算器必须delete。
信息
- ID
- 1136
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者