HM137 普通计算器与多态计算器

HM137 普通计算器与多态计算器

HM137 普通计算器与多态计算器

来源: 第 137 集 类和对象-多态-案例1-计算器类

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

要用两种架构实现「两个整数操作数」的计算器,体会多态的好处:组织结构清晰、可读性强、利于前期和后期扩展与维护。真实开发提倡**开闭原则**:对扩展开放,对修改关闭。

普通写法。 一个 Calculator 里放 mNum1mNum2getResult 传入运算符字符串,用 if / else if 判断 +-*。这样也能算,但每加一种运算(除法、乘方……)都必须改原来的 getResult,乘法出了错也得在整段分支里翻。本题普通写法**只提供加减乘**,遇到除法视为「必须改源码才能扩展」。

多态写法。 先写抽象计算器 AbstractCalculator:只放两个操作数,以及虚函数 getResult()(基类里可以先 return 0,这个 0 实际用不到)。再写只做一件事的子类并重写 getResult

  • AddCalculator:两数相加
  • SubCalculator:两数相减
  • MulCalculator:两数相乘
  • DivCalculator:整数相除(向 0 截断)

使用时用**父类指针**指向堆上的子类对象,例如 AbstractCalculator* abc = new AddCalculator;,赋值两个操作数后调用 getResult(),用完 delete。加除法时不必改抽象类和加减乘类,往后追加一个子类即可。

读入若干运算。普通分支必须走带 ifgetResult;多态分支必须走父类指针调用虚函数。不要只用一套 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:询问普通写法要加新运算时,要不要改原来的 getResult
  • PC:询问多态写法要加新运算时,要不要改已经写好的抽象类和旧子类

输出格式

每个操作一行,行末换行:

  • ORD 且 \(op\) 为 + - *:一个整数,运算结果
  • ORD 且 \(op\) 为 /NEED_MODIFY
  • POLY:一个整数,运算结果
  • OCYES
  • PCNO

样例

输入 #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
通过率
?
上传者