菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
431
0

Java第三次blog作业

原创
05/13 14:22
阅读数 11488

1.前言

2.设计与分析

3.采坑心得

4.改进建议

5.总结

[========]


一.前言

  • 题目集7到题目集9,题目虽然一共只有4道,但是每一道题目都过于庞大,但是完成后感觉还是可以。

  • 题目集07,考查了类的继承、多态性使用方法以及接口的应用,体会面向对象设计原则中的“开-闭”原则的实现方法及其作用。该题目集的第一题“7-1 图形卡片排序游戏”相比于第二题“7-2 图形卡片分组游戏”难度较小,功能的实现也比较容易,第二题就比较复杂了。这两道题就运用了大量的继承。

  • 题目集08,考查的东西就是比较全面,几乎都考查到了,要求注意本题目中的各实体类之间的关系,尤其是一对多的组合关系,对实体类的设计要做到单一职责原则,且不能缺少规定的实体类,编程时考虑面向对象中的封装性本题目中的应用以及是否有能够扩展的衍生需求。该题目集只有一道题“ATM机类结构设计(一)”,初次接触这道题时感觉过于庞大,不亚于一道课程设计,但是也仅有404行。

  • 题目集09,就是题目集08的升级版,功能增加了,要求注意本题目中的各实体类之间的关系,尤其是一对多的组合关系,对实体类的设计要做到单一职责原则,且不能缺少规定的实体类,在“合成复用原则”及“单一职责原则”基础上,尽量对上次作业的程序进行重构,使之符合 “开-闭”原则。该题目集也只有一道题“ATM机类结构设计(二)”,这道题的功能更加符合现实情况,更加复杂,也更长,竟然用了833行(为了实现“单一职责原则”)。

  • 以下是部分题目的完整代码和类图链接
    https://blog.csdn.net/lylkp?spm=1000.2115.3001.5343

[========]


二.设计与分析

  1. 题目集07(7-1),考虑一款适合于小学生的卡片(Card)排序游戏,其规则为随机发放一些卡片给学生,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种 卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排序,同时求出所有卡片的面积之和。本程序仅用于为学生所玩的游戏提供正确答案的功能,即根据学生得到的卡片种类与数量,给出 排序前和排序后的卡片顺序,同时给出所有卡片的面积之和,老师也在作业指导书中给出了主类。这道题先创建了抽象shape类,然后是Circle类、Rectangle类、Triangle类和Trapezoid类,均继承抽象shape类,这些子类用来判断输入的数据是否合法和计算该形状的面积,在Chulishuju类里判断形状、判断数据是否合法、对数据进行排序、计算总面积和输出,ArrayList<Card> cardList=new ArrayList<>();用来存边长,对卡片排序时使用了 Comparable 接口, 即 Card 类实现 Comparable 接口中的 CompareTo()方法。同时类结构可以使得系统具有较好的可复用性。但是是第一次要求“单一职责原则”,所以可能并没有很好的用到。最终在细微的修改后所有的测试点都通过了。
    image
    image

  2. 题目集07(7-2),沿袭作业 7-1,对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生, 卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid), 并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。ComparableComparator 接口的应用图形类设计可参考作业 7-1 的类层次结构(需要进一步完善),本次作业要求对卡片排序时使Comparable 接口或 Comparator 接口。由于是升级版,所以只要对原有的类进行修改即可在Chulishuju类里计算总面积的方法按照形状不同来创建,从大到小的排序方法也是按照形状不同来创建。其他地方并没有做出改动,由于有上一道题的基础这道题在做的过程中是相对于更快一些的。
    image
    image

  3. 题目集08(7-1)要求编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能,使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进 行扩充和完善。要注意各实体类之间的关系,尤其是一对多的组合关系。对实体类的设计要做到单一职责原则,也没有缺少规定的实体类。编程时考虑面向对象中的封装性本题目中的应用以及是否有能够扩展的衍生需求。首先在主类里把已给出的数据存到数组里,然后创建Bank类和Account类实现数据的封装,为了实现单一原则检查类也是按照功能创建了两个,Check类和Check1类(存取款的检查类和余额查询的检查类),然后创建Access类,用来实现存取款的计算,创建展示类Show类和Show1类(存取款的展示类和余额查询的展示类),最后完善主类。存入数据和找到对应的数据是比较麻烦的,一不小心就可能报错。
    image
    image

  4. 题目集09(7-1)是在题目集08(7-1)的基础上增加了贷记卡、跨行取款和透支取款的功能,注意本题目中的各实体类之间的关系,尤其是一对多的组合关系。 同时对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。 在“合成复用原则”及“单一职责原则”基础上,尽量对上次作业的程序进行重构,使之符合 “开-闭”原则。为了实现单一原则,又新增加了Check2类、Check3类和Check4类(跨行检查类、账号种类检查类和金额检查类),修改了Access类,新增了Access1类、Access2类和Access3类(借记账号未跨行存取款类、借记账号跨行存取款类、贷记账号未跨行存取款类和贷记账号跨行存取款类),新增Show2类(贷记账号存取款的展示类)。大体可以分为四类,借记账号未跨行存取款、借记账号跨行存取款、贷记账号未跨行存取款和贷记账号跨行存取款。首先判断是余额查询还是存取款,然后判断该卡是借记卡还是贷记卡,最后判断是否跨行,执行相应类即可。为了方便判断是借记卡还是贷记卡,于是创建了两个数组,一个是总数组,所有用户的数据均存在里面,另外一个是贷记卡用户数据的数组,这样就更方便来判断账号种类了。
    image
    image
    image
    image

[========]


三.踩坑心得

  1. 在判断三角形三边是否合法时一定要将三边从小到大排列,再用a+b<=c两边之和大于第三边来判断,如果不进行排列判断就会有误,我就因此有几个测试点没有通过。切记在判断三角形是否合法是要排序!

  2. 不同类之间传数据时顺序一定不能出错,不然有的时候虽然它没有报错,但是输出的结果牛头不对马嘴,检查时也不好检查。

  3. 题目集09(7-1)为了实现单一原则总共写了833行,代码长度33KB,但是代码长度限制为20KB,本来以为没有办法了,但是抱着试试的方法把所有的注释删掉,空白行去掉,括号不占一行,for循环里的内容放在一行,if else也放在一行,最终实现了代码长度缩小到了20KB,仅有231行,这种方法虽然不推荐但是很有效!

  4. 抽象类可以有构造方法,接口中不能有构造方法。抽象类中可以有普通成员变量,接口中没有普通成员变量。抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。抽象类中可以包含静态方法,接口中不能包含静态方法。抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。一个类可以实现多个接口,但只能继承一个抽象类。

[========]


四.改进建议

  1. 对于题目集07(7-1),可以使用增强switch判断,if里的东西还可以简化,可以使代码更加短、简单,在书写上也更加美观。

  2. 对于题目集08(7-1)和题目集09(7-1)可以把用户的数据单独放在一个类里或者一个方法里,不都堆在主方法里,看得累赘,也不美观。

[========]


五.总结

对于本阶段三次题目集,我学会了抽象继承和非抽象继承的方法,用ArraryList存数据,在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接使用Main.input.next...即可避免采坑,也学会了对代码进行调试。Map方法也要更深入的学习研究。我要学习的东西还很多,不足的地方也很多。对于老师上课的方式,我还是比较喜欢的,投影看不清可以选择看网课,对一些眼睛近视或者离投影比较远的同学是友好的,但是投影老出现问题,网速也不是很好,建议学校加强网络的建设。讲课的进度和作业的进度一样了,但有些地方仍需要我们到网上自主学习,不过这样也大大提高了我们的自学能力。实验的话灵活度大,时间长,但是每次提交的方式都是五花八门的,把一项简单的工作搞得复杂了,属于浪费时间的地方。Java这门课程很有难度,但是我会认真学习下去,尽最大努力跟上教学任务的。

发表评论

0/200
431 点赞
0 评论
收藏