第三阶段Blog作业
题目集7:7-1图形卡片排序游戏以及7-2图形卡片分组游戏掌握类的继承、多态性使用方法以及接口的应用,
题目集8:7-1 ATM机类结构设计(一)
题目集9:7-1ATM机类结构设计(二)
花了几个礼拜做这些题目,让我掌握类的继承、多态性使用方法以及接口的应用。因为题目比较复杂,所有花的时间有点多,但是基本上都能完成。
设计与分析
①题目集7(7-1)、
题目集7-1:
掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 2020-OO第07次作业-1指导书V1.0.pdf
输入格式:
- 首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
- 然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
- 如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
- 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
- 排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
- 排序后的各图形类型及面积,格式同排序前的输出;
- 所有图形的面积总和,格式为Sum of area:总面积值。
类图:

(7-2)两道题目的递进式设计分析总结
题目集7(7-1)是图片卡牌排序游戏,输入卡片图形类型,再依次输入各图形的相关参数,Card类通过关键字implements声明自己使用Comparable接口,从而使用compareTo()方法进行排序。7-2在7-1的基础上首先根据卡片类型将所有卡片分组,再排序,输出面积最大值。以下是我遇到的问题:
踩坑心得:
如何对数据进行降序处理是这道题的一个关键点,list集合有对元素的排序方法,但是默认的是升序,只有重新排序方法才能使元素升序。
改进建议:
可以用数组存储数据,利用数组排序。
题目集7-2
掌握类的继承、多态性使用方法以及接口的应用。 具体需求参考作业指导书。
输入格式:
- 在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0
- 根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
- 如果图形数量非法(<=0)或图形属性值非法(数值<0以及三角形三边不能组成三角形),则输出Wrong Format。
- 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
- 排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
- 输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
- 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
- 各组中面积之和的最大值输出,格式为The max area:

踩坑心得:
对数据的处理要求更多更细,要先找出不同类型,在让同一类型中元素面积大小进行比较。
改进建议:
多想一些简化代码的方法和算法,我的代码差点因为长度限制而过不去。
题目集8
设计ATM仿真系统,具体要求参见作业说明。 OO作业8-1题目说明.pdf
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
- 存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
- 查询余额功能输入数据格式: 卡号
输出格式:
①输入错误处理
- 如果输入卡号不存在,则输出Sorry,this card does not exist.。
- 如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
- 如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
- 如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
- 如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.。
②取款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
③存款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
④查询余额业务输出
¥[金额]
金额保留两位小数。
类图:

踩坑心得:
这次次题目集中,一个用户在同一个银行可以有多个银行账号,且可以有多个隶属卡号,余额互通,典型的一对多实体类。Bank类中有addAccount(Account account)、addATM(ATM atm),Account类中可以添加卡号addCard(Card card),以及setBank(Bank bank),通过add方法传值来实现实体类的一对多。
改进建议:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空。另外,老师的代码里使用了一个正则表达式匹配就解决了字符串匹配问题,但我却用了许多类似下图的if条件判断:
题目集9
设计ATM仿真系统,具体要求参见作业说明。 OO作业9-1题目说明.pdf
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
- 取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔)
- 查询余额功能输入数据格式: 卡号
输出格式:
①输入错误处理
- 如果输入卡号不存在,则输出Sorry,this card does not exist.。
- 如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
- 如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
- 如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
②取款业务输出
输出共两行,格式分别为:
业务:取款 [用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
③查询余额业务输出
业务:查询余额 ¥[金额]
金额保留两位小数。
类图:

改进建议:
与上一题相比,增加了用户和账户银行卡,但是这些对于已经设计出合理的类来说不是什么问题,主要是考虑计算余额问题,需要考虑的情况很多,先考虑是否为贷记账号,在考虑是否跨行,在考虑是否透支,透支是否超过最大限度,透支和跨行还要有手续费,和利率相关。这里要做到心里有数。对相应题目的编码改进给出自己的见解,做到可持续改进改进主要是针对第(3)条当中提出的几个问题,参考老师给出的正确源码来进行改进。在我的源码里,我把ATM机都设计在Bank类当中了,还有,用户的银行卡,账户号以及存取款和检验数据合法性我也是将它们都设计在customer类当中了,导致customer类很复杂,这是最大的错误。应该分别将它们都设计成实体类。另外,没有使用到动态数组ArrayList,导致后期不易于维护,后面发现了这个缺点的时候已经晚了,需要全部重新写过。
总结:
对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。多做题感受一下这种思想的好处。当代码越多这种思想越好,代码需要改时不需要该很多,不需要重写。一般只需要该类中的代码就可以。
浙公网安备 33010602011771号