第三次博客作业

一、前言

  在前三次的作业中主要是对于Arraylist泛型的应用方法,接口抽象类的运用等,在写代码的时候要特别注意程序的开闭原则,单一职责定律,这是对于第七次题目集的相关概括,然后对于后面两次题目集,主要是ATM机的运用,对于ATM机,我们要对于其中的输入输出格式要有所注意,这道ATM机的工程量很大,需要花费很多时间,对于我自己来说,花的时间是远远不够的,才导致写的代码不够完善,导致出现了错误。对于最后一次的题目集,是在前一次的题目集上的基础上进行改进的,在新的题目集中主要考察我们的是对于继承,多态,抽象的运用,这些都需要在代码中体现出来,然而对于我自身来说还是没有完全达到,还需要进行改善

二、三次作业的实现

第一次作业:

(1)圈复杂度与类图:

(2)第二小题

  对于这次的第一次作业中,总共有七个类,分别带有不同的功能,在这其中的DealCardList类中,主要是对输入的信息进行处理,同时输出的信息也要经过他的处理,才能进行正确的输出,在这个业务类里面,要对输入的数据进行不同情况的分析,对于不同的数据,放到不同的对象中去进行处理,而其中的Card类则是作为一个接口进行调用,shape类作为父类,被其他的实体类做继承,重写其中的方法,然后方便调用,后面的结果

 

 

 再根据不同的对象的结果进行正确的输出,,于此同时,输出的功能也是在这里面实现的,在这里,要对计算得到的结果进行输出,依据输入的数据,才能决定要有多少个相应输出,让他们在每次进行答案输出的时候都要遍历一遍数组,对于指定的对象,才会有正确的输出,在程序的开始的时候,对于数据指定输入四个对象,最后以0结束,,然后再输入所需要的数据,之后再得到相应的结果,进行正确的输出,相关的代码如下:

r

 

 

 对于不同的类型进行输出,这里的输出结果要求是开始先对于输入的数据的顺序进行输出,之后再对其中所得到的面积进行排序然后进行输出,最后得到最后的结果,对于这次作业的7-1对于输出的格式较为简单,并没有那么复杂,然而在后面的那次作业中输入的数据多了许多,同时在进行输出的时候,也有一定的要求,在这次的第一道题目里面,只需要对输入的数据进行一个分类计算,然后对应不同的进行不同的输出,之后在进行排序后进行输出即可,而在7-2里面,需要将所有的Circle类,Rectangle类,Trapezoid类,Triangle类进行一个分类输出,于此同时,在每个单独的实体类中,还需要进行单独的分类,根据大小进行分类,最后以指定对象的顺序进行输出,因为在这里有三组输出,所以在其中避免不了重复的代码,比如以下就是对于所有面积单独进行排序后的结果:

 

 

 这里是对每个对象的单独的分类,对于指定的对象,会在其中进行所有面积的全部输出,在四种情况下有四种不同的归属分类,因为有不同的输出,所以对于其中的功能需求也有所不同,在这次题目集中主要是对链表的灵活运用,云用链表来进行数据的储存,然后在进行数据调用的时候也是通过链表得以获取储存的数据,这样一来就大大提高了代码的效率,使得其代码更为简洁,这就是大概对于题目集七的分析,主要就是多次运用链表,让我们学会使用链式储存数据,同时也让代码更为单一,实现开闭原则

第二次作业

(1)圈复杂度与类图:

  在这里的第八次题目集中是全新的题目类型,是ATM机的那种,这次的作业主要就是让我们编写一个银行ATM机的模拟程序,能够完成用户的存款,取款以及查询余额功能,在这样一个全新的作业中我们还是需要仔细观察的,在这道题目中,他在这里要求我们的功能看似简单,实为极其复杂,我们需要设计的有实体类,业务类,对于实体类,主要有中国银联,银行,银行用户,银行账户,银行卡,ATM这几个类,都是为实体类,然后对于业务类,主要就是WIthdraw,通过这个业务类来进行数据的处理输出,在这个业务类里面主要有检验卡号是否存在的方法,有检验ATM机是否存在的方法,有检验卡密码是否存在的方法,有检验取款金额是否大于余额的方法,有检验是否跨行的方法,这些都是对于输入的数据的合法性的检验,最后在其中还有相应的显示状态的方法,来进行相应格式的输出,代码如下

 

 

 

 在这里完成了初始数据的检验,同时也完成了输出格式的书写,在这里这个业务类相应的功能就算是完成了,接下来就fa你会输出了,是对于卡号的返回,通过链表ArrayLIst进行遍历输出,通过先对银行的遍历,再对账户的遍历,再对卡号的遍历,最后如果卡号相同则进行返回卡号,相关代码如下

 

 同理可知,获取ATM机的编号也是同样的道理,对银行,账户进行多次遍历,从而返回ATM机的编号,代码类似重复,其实在这次的ATM机中,我们最需要搞懂的就是他们每个实体类之间的关系,只要把他们之间的关系搞清楚,就可以了,这样一来整个轮廓就相当清晰了,在这里,银行与中国银联绑定在一起,,atm编号和银行绑定在一起,同时用户和银行绑定在一起,对应的用户和对应的账户绑定在一起,每个账户都有一个初始余额,同时每个账户都有对应的卡号,这些都是用动态链表绑定在一起的,而且用的都是双向链表,这样的链表可以方便双向查询,可以通过卡号查询到相应的用户账户,同时也可以查询到其中的金额,这些绑定都是在初始化的时候完成的,在初始化的时候就已经将这些数据进行绑定了,这是这道题目中最为核心的一步,通过双向绑定,将数据全部进行储存,初始化,相关代码如下:

 初始化数据完成后就可以进行输入相关的数据了,在代码的开始时,需要对输入的数据进行一定的处理,将输入的数据进行分割处理,方便之后对于单个数据的调用,运用循环将他们多次分割,之后多次调用Withdraw方法,来进行数据的输出,合法性判断等,下面我们看一个例子,我们可以让用户在ATM机上进行取款操作,然后对其进行余额查询

 

 在这里就实现了对于不同的账户不同的人来取款时分开的,每个人的账户都是单独的,相互之间不会有什么特别的联系,既然到这里了,我们就可以对他们的合法性进行测验,看看会不会如时报错,我们可以先测一下跨行取款会不会报错,因为在这一次作业里面跨行取款是不被允许的,这样一来就会报错,接下来看结果:

 

第三次作业

(1)圈复杂度与类图:

  对于第九次题目集,是在第八次题目集的基础上进行改进的,也是对ATM机类结构设计,相较于上一次,这一次的题目集多了一个跨行取款,在上个题目集中我们是知道的,对于跨行取款是会报错的,但对于这次改良版的ATM机类结构设计来说,跨行取款可以,但是需要收取额外的手续费,对于跨不同的银行需要收取的手续费比例不一样,与此同时,在上一题的基础上,还另外加了一个中国农业银行,多加入几个用户卡号,并且加入了一个借记账号,贷记账号,这样一来就定义了哪些账号可以超额取款,哪些不可以,在这里,我们就可以在初始化的时候就给他初始化好,在写构造方法的时候就可以将所在的账户类型与用户的所有卡号进行一个绑定,初始化如下:

在对这些数据初始化晚之后,在相应的类里面,要写入相对应的构造方法,方便传参使用,在这新的一次pta作业中,只要就是对用户取款的方法进行一定的改善,在用户进行取款时,可以对用户所在账户上的余额进行一定程度上的修改,在进行取款操作时,要知道对于借记卡,不可以进行超额取款,,然而对于贷记卡来说,可以进行超额取款,但在这里还是有一定的限制条件的,对于超出的额度,要进行一定的手续费的收取,然而在超出50000后,就会对用户的操作进行限制,最多只能超额取款,对于这种贷记卡来说。同时我们要实现pta的相关要求的话,就是要实现他的开闭原则,可复用性,因此我们可以对那些跨行取款的手续利率,用相应的构造方法来进行调用和输入,对于那种利率,我们可以自行进行设置,这样就实现了代码的开闭原则,提高了代码的可修改性,可复用性,同时对于抽象类,在这次的作业中,由于自己的疏忽,没有看清题目的要求,对于抽象类没有进行添加,可能到时候会因为没有达到题目的要求而被扣分,最重要的就是,对于这道题目来说最重要的还是对于算法的显示,对于抽象类的运用,接下来我们看看主要的算法,代码如下:

 

 在这里我还是有所不足的,在这里,我写入了过多的if,else增加了代码的复杂性,,在这里,我并没有实现单一变量原则,这个方法里面的条件过多,导致了代码的质量并不是很好,在这里的方法很是复杂,对于跨行的取款,对于非跨行的取款,对于超额的取款,在这里都有说明,在这个方法里面我列举了很多种情况,然后对于抽象类来说,对于继承来说,我觉得两种类型的银行卡,需要继承卡类,他们两个作为子类,调用父类的方法,同时在这里我们要实现多态的使用,到这里我们就差不多讲解完了这次的作业,在这里大概讲解了这次作业与上次作业的不同。

三,踩坑心得

   在写第一次作业的时候会碰到对于数据的输出无法正常进行,在写其中的第一题的时候并没有什么很大的问题,但是在写第二题的时候对于其中的排序出现了误解,我们这里是对每种单独的种类进行分解排序,并不是对全部的,面积大小进行排序,于是就有了下面的错误答案,对于这个答案就是错误的,在这个输出的数据里面排序的是全部的面积,然后再进行输出,这样的结果显然不是题目i想要的,于是后面对代码进行进一步的改进,将他们进行单独的分类,然后再在每个单独的种类里面对每个种类里面的单独代码进行分析即可:

 

 

 

   之后最难受的还是属于ATM机类的作业,虽然第一次的ATM机的程序没写出来,但是通过老师给的代码,还是能够理解其中的解法的,对于其中的算法主要是集中在Withdraw类中,要对其进行仔细分析,然后我再最后运行的时候还是遇到问题了,在我进行取钱的时候,因为对于贷记卡来说加上卡里一共的10000块钱,还有本身可以借贷的50000块钱,再加跨行取款,贷款手续费等,在我看来他能取得钱肯定小于60000,如果等于60000肯定报错,但是奇怪的事情就发生了,我在输入贷记账户取60000时,竟然可以成功,之后在问了同学的时候才知道,对于贷记卡来说,贷款的那50000不包括手续费,只是单纯的贷款50000,所以对于他来说,总共可以取钱60000是不会报错,接下来看看输出,以下输出是正确的,其下下面那张输出就是我的错误代码得到的结果

 

 

 

 

四、改进建议

  在第一次作业总的来说,第一次作业需要改进的就是相关的算法,在第一次作业里面对于每个单独对象的算法可以稍微的进行简化,然后对于排序的算法我用的是ArraySort对所有的面积的大小进行了一个小型的排序分类,而在对每种情况下的图形对象又进行了相应的分组,我们除了用Switch case对其进行分组应该还有更好的方法,于此同时,在进行输出的时候,我在里里面用了很多的相同的语句,简称垃圾代码,这样的代码是谁都不愿意看到的,我们可以将其写成另一种方法,然后在要用的时候,就可以对其中的方法进行调用,这样一来简化了很多过程大大降低了代码的圈复杂度,还进一步实现了单一原则,之后对于ATM机的题目来说,我们需要改进的就是多态,继承,抽象的运用,在我写的代码里面这些东西并没有好好得体现出来,所以如果需要改进的话我们可以多加入几个单独的实体类,来对账户类进行一个继承,对其代码中的相似的方法,我们可以写一个抽象类来对他们相同的代码功能进行一个大概的书写,再由相应的类实现相应的接口,实现其中的方法,这样一来就更加的符合题目的要求了,一举两得,于此同时,这次的作业我的复杂度是超标的,所欲对于代码的调整和简化是很有必要的,我们需要对其中的if语句,或者其他的重复代码进行一个修改,才能降低其复杂度,这就是大概的修改建议了

 五、总结

  通过这三次的pta的作业,我们能够熟练的掌握ArrayList泛型的使用方法,对于接口的运用也有了一定的了解,对于动态数组的使用,能够得心应手,当然,我这些说的都是别人,对于我自己来说,学的还是很不够的,在这些知识点方面还是需要多练练,多多去了解的,因为对于这些作业来说,真正的其实是在他人的辅导下才得以写完的,我自己掌握的知识点还是完全不够的,在这里的第一的作业里,最主要的就是代码的开闭原则,单一职责,对于这些我们能够对于每个单独的方法进行书写,我们在自己写完代码时还是需要同时对其进行验证的,比如在第一次作业的第二题就是,在第一小题的基础上进行修改,就是为了来考验我们d对于程序的单一职责,开闭原则是否到位,这些都是对我们的考验,之后在第二次作业的时候,难度就上来了,在这次的题目中,并没有提供类图,这里需要的就是我们对于整体的一个构思,对于程序的一个系统性的想法,只有我们对题目有系统性的想法,才能下手,因此在写这道题目的时候,对于我来说,就是很难的了,以至于后面没有把它做出来,还是有点愧疚的,因为第三次作业做的也是类似的作业,同时又在老师给了源码的情况下,这样一来,就可以对其好好分析了,其实,在完成第三次作业的时候,我对于题目的要求并没有全部完成,虽然说猜测点全过了,但还是有很多的不足,比如在复杂度这一方面,在最后一次的作业中就完成的不是很好,对于圈复杂度,第三次作业是完完全全爆表了,这一点做的很是不够,还是需要进行改进,与此同时,对于抽象类也没有用到,就整体来说,缺少的东西还是挺多的,这个改进的地方还是挺多的

 

posted @ 2021-06-13 00:12  暗黯  阅读(70)  评论(1)    收藏  举报