题目集7~9的总结性Blog

(1)前言

7-1主要考察了类的继承,多态性的使用方法及接口的应用。难度:中等。

7-2主要考察掌握类的继承、多态性使用方法以及接口的应用。难度:中等。

8-1主要考察对java综合能力的考察。难度:中偏上。

9-1主要考察对java综合能力的考察。难度:偏难。

第九次题目集在第八次题目集的基础上进行了深入。这次题目集也只有一道题目,需要设计ATM仿真系统,但是比第八次题目集增添了新的内容。和第八次题目集不同,这次题目集不止有借记卡,也加入了信用卡,用户可以使用信用卡贷款,并且能够进行跨行存取款,同时需要收取一定的跨行费用。这次题目集的难度更大,算法更加复杂,同时还新增加了几个用户的信息。

(2)设计与分析

第七次作业

第七次作业主要要求实现图形卡片的排序,分组,考察类的继承、多态性使用方法以及接口的应用。由于第二题的代码建立在第一题基础上,故只用第二题代码作为论据。

本题我按照题目要求共定义了7个类(Main除外),分别为卡片(Card)、圆形(Circle)、矩形(Rectangle)、三角形(Triangle)、梯形(Trapezoid)、数据处理(DealCardList)及一个抽象类Shape。

本次作业要求对卡片排序时使用 Comparable 接口, 即 Card 类需要实现 Comparable 接口中的 CompareTo()方法。经查询资料发现,之所以要实现该接口,是为了便于排序,实现该接口的类可以使用合    框架中的一些sort方法,否则强行sort由于编译器不知如何比较,将会编译失败。如果只实现CompareTo()方法,而不实现接口,强行sort依然会报错,我将此理解为Comparable 接口是对编译器的一种声明,没 有这个声明,编译器亦无法知道你设计了比较的功能,从而编译失败。

本题设计了一个抽象类shape,圆形(Circle)、矩形(Rectangle)、三角形(Triangle)、梯形(Trapezoid)这些图形类都继承该类,这样做的好处是可以利用多态将实际类型不同的图形对象变成一张张      卡片,再置于一个Arraylist列表中,进行排序等操作。值得注意的是,对于存入卡片中的子类对象,实际上相当于声明为父类,由此带来的一个缺点便是无法调用子类中独有的方法。

类图

 

 第八次作业

本题要求编写一个银行ATM机的模拟程序,能够完成用户的存款,取款以及查询余额的功能。

本题涉及的类有Bank类、User类、Account类、Card类以及ATM类。

 

 

每个用户对应一张或多张卡号,且每张卡号的密码都是88888888,如果查询银行时输入的卡号不存在,则输出“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”。

明确题意后,首先本题需要换行输入信息,直到输入“#”时停止。代码如下:

 

 输入完成后,在使用split函数对输入字符串进行切割存放,然后在一一比对。首先我们先判断卡号,根据卡号来锁定银行用户,其次我们判断密码是否正确,如果正确,我们在进行下一步判断,否则直接跳出运行的程序。接下来我们在判断银行用户是否在相应的ATM机上进行相关操作,如果不在卡号所对应的ATM机上进行相关操作,则也输出报错语句然后跳出程序。最后,在判断银行用户到底时该存款还是该取款,如果输入金额为大于0则表示银行用户将进行取款,否则如果输入金额小于0则表示银行用户将进行存款。下面将给一个银行用户的判断例子:

 

 本题难点在于将输入的字符串切割后存入数组中,然后用数组中的元素表示每个需要比较的数据,这就需要灵活巧妙的运用for循环语句和if/else语句来进行相关判断。

类图如下

 

 

第九次作业

  • 这个题目是对上一题的扩展,增加了新的业务功能。

    增加了借记卡。银行账户分为借记账户和贷记账户两种,其中,借记账户不能够透支 取款,而贷记账户可以透支取款,这里需要支付手续费。

    需要单独创建一个中国农业银行,因为在这题中,借记卡都是这个银行里才有的,贷记卡透支取钱需要付5%的手续费,

    此外,如果还要跨行取钱的话,就还需要额外付手续费,这个手续费每个银行标准都不一样,

    创建中国农业银行的时候,也要连带着把中国农业银行的基本数据初始化,比如ATM机,这个银行里面也有ATM机,

    新加入了三个用户,:张三丰、令狐冲、乔峰,这些人都是持有中国农业银行的贷记卡的,业务假定 :系统的测试用例均采用如上数据,

    手续费默认均从银行卡所对应的账户中自动扣除。跨行业务手续费收取比例由 ATM 机隶属银行决定,

    例如,用户手持中国 工商银行的银行卡在中国建设银行的 ATM 上进行取款操作,则手续费收取比例为 中国建设银行的相应比例,

    按初始化数据中的规定为取款金额的 2%。跨行查询余额不收取手续费。透支取款手续费由中国银联统一规定为 5%,最大透支金额均为 50000 元。

    其他的就只需要在上次题目的基础上改进,结果输出不一样,大致就是这样的了。

类图如下

 

 

3踩坑心得

对于题目集7来说的话,采坑的话,自我觉得没有什么大地方需要注意,就是要确定自己对于输入数据是否合法的地方,要注意图形的是否可以成的地方;对于题目集8和9的话,第一,要注意这个条件 如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.这个我自己在写的时候不知道该怎么样去在什么时候判断,最后发现可以在输入不存在的ATM机的时候,或者在ATM机对应不到的银行的时候输出;还有就我自己的这份代码来说,对于重复判断只是查询信息的时候,需要在if的判断中加一个continue,因为在测试点的时候,有会测试重复查询的例子;再就是题目集9,也就是加大难度的ATM机,有了两种卡号,对于我的代码来说就会有两种不同的情况要去判断,也就是增加了复杂度,这也间接让自己成功体会了一次因为代码情况太多,复杂的后果。因为缺少了一个对应判断出情况的方法去计算结果,然后就自己一直在测试,最后终于是找到了错误的原因——所以一定要减少写代码的时候的复杂度,不要用太多的if-else

 

4改进建议

 经过这几次题目集,我对于面向对象程序设计这一课程的了解也逐渐深入。在题目集九的完成时,老师已经给出了题目集八的源码让我们根据题目集八的源码对代码进行改进来完成题目集九。我在对老师给出的源码研究时,意识到自己之前的代码的简单性,虽然完成了相关的功能,却没有任何的复用性,很难在我的代码的基础上进行改进完成题目集九。并且我的代码大部分都还停留在面向过程程序设计的思路中,对老师源码的研究时,我逐渐理解了面向对象程序设计的内容,对其有了更深的理解,也逐渐开始掌握其中的内容。

5总结

经过这三次题目集的锻炼进一步加深了我对类的继承、多态性使用方法以及接口的理解,明白对实体类的设计要做到单一职责原则,合成复用原则,才能编写出合格的代码。同时对集合框架有了进一步的认识,但由于其类容较多,想要灵活使用,还要在日后不断学习,反复使用。

 

 

posted @ 2021-06-17 20:40  yys's  阅读(79)  评论(0)    收藏  举报