pta题目集7-9总结

第三次bolg作业
202016班潘海涛
1.前言
这三次的题目集相较于之前的所有,其难度直线上升,有着题量更少,但是题目信息量巨大的特点。这批题目集需要我们熟练掌握类的相关知识,包括继承,多态以及接口的应用。对于类的继承,我们在写代码的时候要充分理清各种类之间的关系,运用的属性以及方法是否偏离主体。
对于题目集7,我们需要解决两个图形卡片排序和分组游戏问题。
其中有很多的图形类需要我们定义。并且各种图形形状类中还有相应的继承关系(由于作业要求任务书上明确说明图形类设计要参考题目集6的类层次结构)。题目还要求输入相应图形编号然后输入相应边的长度,程序能够计算并自动排序图形的面积,本来这种要求只需要在图形类中写一个求面积方法,和返回面积的方法。然后在主函数中将它们存入一个数组。写一个进行排序的方法即可。但是题目还要求要使用Comparable接口实现排序,为了使程序更加简洁,继承和多态的好处就体现了。只需要在图形的父类中重写上CompareTo方法即可。
题目集8和9是两道关于ATM机类结构设计的题,继承关系链非常的长,有着从银联到银行,银行到ATM或用户,用户到账户,账户到卡的继承关系。需要解决在银行存款取款相关的生活问题,同时也需要我们要注意对一些错误情况程序报错的处理。题目集8还不能实现跨行取款,但是到了题目集9,增加了跨行取款和取款的税率情况。以及加入了新的贷记卡类型。
题目要求我们对类层次结构充分掌握与运用。由于程序的信息量大,需要我们对类的继承充分了解,理清代码的思路。
2.设计与分析
题目集7-1的输入格式为:首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
相应的类图如下:

此题其实和上次的题目集6中的题目有很多异曲同工之处,我主要介绍一下此题的特别之处吧——比较器。这里老师刚刚引入比较器的概念,然后题目要求还要有程序设计的开-闭原则,题目中的卡片实现了comparable接口,实际上就是实现对各种图形的面积的排序。而题目又要求是从大到小排序,所以重写的compareTo()方法中应该是return o.area-this.area,这即是降序排列。
题目集7-2的输入格式为:在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0
根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
相应的类图如下:

7-2和7-1相比,复杂了一些,它要求需要将相同的图形进行归类,同类别的进行排序,可以在创建ArrayList集合时创建多个类,和7-1相似的处理这些类即可。就是注意添加元素时候要注意不要加错类了。
题目集 8目标为:编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
查询余额功能输入数据格式: 卡号
此题的要求为:尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进行扩充和完善。
注意:为降低难度,本次作业限定银行卡均为借记卡(不能透支),且不允许跨行办理相关业务(例如在中国建设银行的 ATM 机上对其他银行的账户进行操作)。
相应的类图如下:

写此题时的目标不太很明确,信息量也比较大。写法上首先先仔细读题,明确各种类之间的关系,初步考虑各种类内的方法和属性。之后构建各种类,此题工程量比较大的,似乎是起初将各种卡号姓名等信息首先写入各类中。然后再写进行账号密码的配对,由于卡类是最终的子类,所以需要用到多层for循环,将卡号找到后,用此时的银行,用户的编号进行处理。同时,又要用银行编号对应ATM检查是否跨行取款。取款后,输出相应的用户信息,并且调用相应的set方法更改相应的数据。一一对应题目要求的输入错误等情况,进行相应的处理以及改进。
大致的算法思路为是这样的:按课程任务书要求首先将要输入的部分数据存入一个二维数组,分别遍历每个一维数组,进行一层分支判断按照长度分别为1和4区分查询业务和取款存款业务走向,之后再使用一个分支语句通过判断输入的第四个数据是否大于0分支成取款和存款。然后各首先要进行多层遍历从银行编号到用户编号到账户编号再到卡编号,一旦找到了相应的卡编号,那么就可以采取操作了,首先进行账号的匹配,然后是密码的。通过输入的ATM机序号来对应银行,由此判断是否跨行取款,从而采取报错的措施。同时在同一层的取款分支中还要有判断输入的数据是否大于账户卡中的金额,从而采取必要的报错方案。
对于题目集9,此题在题目集8的要求上沿袭了很多,但是有一些额外的要求
题目目标:编写一个银行 ATM 机的模拟程序,能够完成用户的取款以及查询余额功能。
要求:尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设
计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进
行扩充和完善。
注意:本次作业中银行卡包含借记卡和信用卡两类,且允许跨行办理相关业
务(例如在中国建设银行的 ATM 机上使用中国工商银行的银行卡进行业务操作)。
类图如下:

与题目集8相似点很多,但是有很多新的要求,主要有两点:增加了新的卡类型--贷记卡(持卡用户可以透支取款),同时也要添加新的银行,ATM机,用户和卡号。这些都在同题目集8一样在同样的位置增加即可。同时还有一个跨行取款要收取一定多税,不同银行跨行取款的税是不同的,同时透支取款也有一定的固定税。那么不同于题目集8的写法在于修改题目集8中的ATM机判断的写法。适当加入一些标志物区分记录未跨行跨的和跨行时跨的银行,同时要单独写一个分支语句计算该情况的透支的金额。之后操作写法同题目集8相似。
3.踩坑心得
1.做题时要先缕清思路,将题目要求看清楚,先规划一下做题的思路,不然写到一半,突然发现还有要求没考虑进去,就可能会改动很大,甚至前功尽弃。
2.对题目要求真的要看清,比如8-1我开始写的情况是对输入的银行账号的处理,导致最后改了很久输出没有数据。
3.对于很多组数据的初始化时,要注意细心,不要有遗漏,而且如果遗漏你会在后面寻找错误,你会认为是逻辑出现问题,其实不然,会很浪费时间,比如在写9-1时,我少创建了农业银行,导致输出一直为空,我还以为没有找到用户。
4.逻辑处理得当可以少些很多代码,比如在9-1中的税率计算中,你如果将对于账户余额是否大于0,放在判断银行卡的前面时,会很麻烦。
5.对于多个for循环嵌套时如果只针对最里面的一层关系,处理完后可以直接return,退出这个方法,不要再让它继续了,虽然好像并不怎么影响。
4.改进建议
个代码的模块化思维还是很重要的,我们需要在拿到题目写之前首先将此题拆分成多个模块,想好各个模块的结构,然后写装有各个模块的方法。这样的代码结构层次分明,同时也能够让他人观看时思路清晰,极大提高代码的质量。
同时,要养成编写代码边注释的习惯,这样无论是再检查自己的代码时还是复盘时,都能够让自己的思路清晰。提高编写速度与收获。
5.总结
这几次训练再次练习了类的定义、方法的调用、参数的传递、对象的构造与使用,其中我觉得最大的进步是对结构的分析,准确地判断在何时引用各个职责功能类。
通过3次的题目集练习,我对Java认识进一步提升,对面向对象思维和模块化思想也循循渐进。还有很多编程思维和习惯需要我们去学习,去熟悉。

posted @ 2021-06-17 21:58  萌新1+1  阅读(136)  评论(0)    收藏  举报