Blog作业03
第三次Blog作业
20201232-张兆奇
一、前言
本次题目集主要是对抽象类和接口的进一步考察,接口的考察进一步深入,在题目集7中就考察了固定接口的用法,其中还对ArrayList和Collections有更深的考察。抽象类主要是在题目集8和题目集9中考察,其中还对数据的初始化进行了一系列的考核。本阶段的题目集题量较小,但难度有所提升,对题目的理解和对细节的注重有更近一步的考察。
二、设计与分析
(1)题目集7(7-1)、(7-2)两道题目的递进式设计分析
题目集7的两道题主要是对卡片排序和分组问题的考察,排序相对简单,分组相对较难,其中两道题都用了“Comparable”接口,其作用在于对给出的数据进行了比较。
题目集7(7-1)是卡片的排序问题,相对简单,主要是将不同形状的卡片首先分成四个组,再计算相对应图形面积进行排序,然后对不同图形的面积进行排序(从小到大)。本题的主要难点在于对各种图形的分组,首先要先创建一个卡片的链表“List”,用于存储所有的卡片,再从链表中分别提出符合指定条件的卡片,将它们分别存在相对应的类中,再将分好的卡片存在新建立地“cardList”链表中,再用“collections”对卡片计算出的面积进行排序,最后算出相对应图形地总面积。主要要求输入四个不同形状对应的代数,再给出相应的数值,以“0”结束。输出的结果需要在面积前给出图形的名称。
题目集7(7-2)是卡片的分组问题,相对较复杂,其形状子类的设计于排序问题相同,也都是继承“Shape”父类,而且此次没有用链表对卡片进行存储,依旧运用“Comparable”接口对面积进行排序。分组主要是将卡片一张一张的进行分组,因此,我设计了四个分的数组对卡片进行存储,再设计一个总的数组对所有数组进行存储,然后对输入的数字进行识别,再将不同形状的卡片分别存入不同的数组。最后进行对输入数字对应的图形面积的计算,然后进行排序(从大到小),最后在其中选出最大的面积。输出和输入的方式与排序问题的相同。
题目集7(7-1)类图如下:

题目集7(7-2)类图如下:

题目集7(7-1)报表如下:

题目集7(7-2)报表如下:

(2)题目集8的ATM机的分析
本题主要是编写一个ATM机的模拟程序,实现对用户的存款、取款和查询余额的功能。关于此,主要有中国银联、银行、银行用户、银行账户、银行卡和ATM这几个类,而且本次题目集是关于借记卡的业务,因此无法透支,且不可以跨行转账。
本题难度有所减低,不需要进行文件存储,只需要对给定的基础的数据进行初始化。首先,要先确定每一个类中需要什么变量。其中,“Bank”类中需要有银行的编号和名称,还需要创建两个链表,用于储存银行账户和ATM的编号,这对后面对卡进行从后向前的查找有所帮助。在“User”类中需要有卡号、用户名字和用户电话,还需要创建一个链表,用于存储用户的账户,作用和“Bank”类相同。在“Account”类中需要用户的账号和存款,其中这个和“User”、“Bank”类有关联,还需要一个链表来存储银行卡,毕竟一个账户可以有多张银行卡。在“Account”类中,有相关的函数可根据卡号获取账号。在“Card”类中,主要是银行卡的卡号和密码,还需和账号进行绑定。在“ATM”类中只需要ATM的编号,其中需要和“Bank”类进行绑定。为了方便对相对应的条件进行判断,我设计了一个类,对输入的相关数字进行检验。因为本次不存在跨行转账,因此“UnionPay”类只需要创建一个链表,将银行和银联进行绑定。
对数据的初始化用了相对简单的方法,对数据进行双向绑定,主要的算法是存取款的算法。输入要求输入卡号、密码、ATM的编号和要进行业务的钱数,以“#”结束。如果只输入了卡好,就是进行余额的查询。如果是存款,就输入相应的负数,取款则正常输入。
题目集8类图如下:

题目集8报表如下:

(3)题目集9的ATM机的分析
本题目集的ATM类设计相较于上次的有所提升,其中银行卡可分为借记卡和信用卡两种,行用卡可以进行透支取款,但有一定的额度和手续费,此次的类设计支持跨行办理业务,但同样需要收取一定的手续费,且每个银行的都不一样。此次的题目相较上次难度在算法和条件判断都有所提升,而且相较上次而言,本次又新添了新的银行和用户,新的用户账户都是贷记账号,卡都是信用卡。但本次的业务减少,只有取款和查询余额的业务。
本次题目在上次题目的基础上,又需要添加新的初始化数据,还需在“Bank”类中添加跨行取款所需的手续费,主要的重点在跨行取款的算法。首先,跨行转账需要考虑贷记账户和借记账户两种,我是先在开头将借记账号和贷记账号分开,其次需要考虑本行取款和跨行取款两种情况,在进行条件判断时,不光要考虑数额的问题,还需要考虑手续费和待机续航胡的额度问题,比如,贷记账户多次贷记取款时,需考虑金额是否超过贷款额度;在借记账户跨行取款时要考虑手续费,当取款金额和手续费相加超过卡内余额时,取款时不成立的;在贷记账户透支取款时,不仅要考虑银行的手续费,还需考虑透支取款的手续费。最后,在进行输出时,银行是ATM机所对应的银行,并不是账户。
题目集9类图如下:

题目集9报表如下:

三、踩坑心得
(1)题目集7(7-1)卡片排序问题
本题相对简单,类的设计及相对容易,主要对“Shape”抽象类的理解,一开始,我主观认为,设计这个抽象类并没有作用,如果不设计可能也没有关系,但在打了一阶段的代码后我发现,基本上每一个类都有“getArea()”和“vaildate()”,如果不设计这个抽象类,很容易会产生软件报错的情况,因此,需要设置“Shape”抽象类,让其他小类继承。在书写接口时,因为疏忽对“Comparable”接口的了解,导致无法正常运行接口。一开始,想法简单,准备用累加的方法对卡片进行查找和存储,后来发现太过复杂,且容易出错,还容易出现漏卡片的现象,还导致只有一部分的卡片可以查询成功。之后选择用链表的方法,将卡片都存在一个链表中,再设置一个储存图形数字的链表,然后对卡片进行相应的查找,再算出面积等数值后,再对其进行排序。
(2)题目集7(7-2)卡片分组问题
本题在第一道题的基础上加深了难度,主要的类的写法于第一道题相同,主要的问题在对于卡片分组的算法。一开始,我尝试使用第一道题的方法对卡片进行分组,发现方法并不完全使用,第二道题在第一代题的基础上增加了分组,这使得再进行查找之前,对卡片的顺序是由要求的,不能像第一道题一样,只需将卡片一起存在一个链表中。因此,我回归了简单的方法,对卡片进行一一识别,然后累加。分组的主要算法实在面积的求解于排序中,主要的问题还是排序,因为分组方法将为简单,导致面积的排序也需要比较复杂的算法。再开始,我试图只用一个排序对所有选择的图形进行排序,但后来我发现实现起来会漏数据,还可能导致数据排序出错。后来,只能进行一个一个的排序,使得输出正确。
(3)ATM机类设计1
本题的初始化比较容易疏漏,而且在一开始会忽视双向绑定的问题,导致初始化的数据没法双向使用。存取款的算法较为简单,出错较少。主要的问题在于对输入数据的条件判断,因为考虑不周,导致判断的范围出错,容易漏判,而且还出现了更新余额失误的问题。而且在最开始确定条件时,只局限在题目所要求的条件,忽略了现实生活中的制约条件,导致代码只能在给定的卡号中运行,无法准确识别正确的卡号。同样的,账号和一切其他的基本数据也存在相同的问题。
(4)ATM机类设计2
本题主要是在第一题的基础上,加了贷记账户和允许跨行取款的条件。在一开始,我先以是否跨行取款作为主要的条件来更该对余额更新的算法,经过几次调试和尝试,我发现代码的制约条件并不完整,导致只能完成给出的输出示例,并不能全面的完成这道题,一开始我是想通过添加制约条件的方法来完成条件的缺失,但我发现这种方法反而让代码复杂且乱,之后我改变了主要的条件,将是否为贷记账户作为了主要的制约条件,而在贷记账户中将取款金额是否大于余额作为了主要的条件,这使得代码清晰且不易漏掉条件。其中在最后,忘记考虑连续贷记取款不应超过50000元的制约条件。
四、改进建议
本阶段的题目集主要考察封装性、类间的关系和抽象类的继承多态。主要考察的还是抽象类的继承和多态。这次的题目集主要是题目的不断推进,由简到难的推进,主要的两大块内容考察比较系统,对对应知识点的考察也较为详细,题目集较为完整,无需改进。
五、总结
本次主要是对一些类的相关功能和性能的考察,这种同一道题目的递进写法的方法,让我学会了深入学习的方法,用类图进行编程对我读图能力有一定的提升,对抽象类的使用和对类之间的关系的使用让我对类的相关功能和关系有了更深入的了解,本阶段的作业让我的自学能力和自主编程能力又有了进一步的提升。

浙公网安备 33010602011771号