题目集7-9总结性Blog

一、前言

通过对PTA的第七、八、九题目集的学习与总结,我感觉本三次题目集的题量不大,在完成范围之内。难度的话也一般,有难度,但是在解决范围之内,大多数较难的知识点可以通过自学(图书馆看书、看网课)的方式学习。然后本三次题目集涉及到的知识点有类的继承、多态的运用、ArrayList泛型的应用方法、Comparable接口的应用、单一职责原则的应用、“开-闭”原则的应用、正则表达式对字符的匹配与切割存放、换行输入等。可见本三次题目集的知识点非常多,也较为紧密,需要多以应用才能掌握。

二、设计与分析

   本三次题目集共有五道题目,分别为图形卡片排序游戏、图形卡片分组游戏、ATM机类结构设计(一)、ATM机类结构设计(二)。

我们先来具体分析题目集7的第一题,本题要求输入圆形,矩形,三角形,梯形的数量及其边的长度,从而通过运算并且通过一定格式来输出每个图形对应的面积。同时题目还给了图形的边长限制,即不符合题意或者不符合数学逻辑的话会输出Wrong Format”。我对于本题的具体思路是首先每个图形分别为一个类,有自己的属性。然后每个类里都有计算自己面积的方法,最后在对每个图形的面积总和排序,然后计算总面积。图形类的代码较简单,就不拿出来看了。下面为对图形卡片进行处理类DealCardList的构造方法:

 

 

 

该构造方法的作用是将输入的数字与图形类型相匹配并同时允许用户输入相应图形类型的边长,同时将该图形类型加入到ArrayList链表中。

 

 

 

此方法为对所有的图形面积进行排序并输出,可以在后面show()方法中直接使用。

下面为show()方法的输出格式:

 

 

 

此外,图形类型卡片处理类中还有对图形类型边长的检验方法和对图形类型的面积取总和的方法。这些方法都较为简单。

本题的重点在于如何对输入的数字来匹配相应的图形类型从而将该图形加入的ArrayList链表中,我通过switch/case解决了数字匹配图形类型的问题,之后在每个case里创建了一个图面对象来对每个相应图片进行边长出入,在加入到ArrayList链表中。下面为本题一个运行实例:

 

 

 

然后下图为本题的报表内容:

 

 

 

 

 

 下面为对第七次题目集的第二题的分析。由于第七次题目集第二题与第一题非常相似,只需修改一些代码即可。因为本题为图形卡片的分组,所以我创建了多个ArrayList链表,将不同的图形类型对象存放在不同的ArrayList链表中,这样便成功的进行了分组的第一步。

同理,每个这样的存放操作还是在case里进行的,修改后的代码如下

 

 

 

 

 

  然后后面的处理方法完全与题目集七的第一题一样(对图形类型的边长检验、对图型类型的面积总和排序、求图形类型的面积总和)。

唯一的差别就是多了个求图形类型中面积总和的最大值在输出。

下面为本题运行实例:

 

 

      下面为第八次题目集的第一题分析。本题要求编写一个银行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语句来进行相关判断。

 除此之外,本题要有一个查询的功能,即如果只输入一个银行用户的卡号而不如果其余部分(卡号密码、ATM机号、存取款数额)的话,本题会实现一个对银行用户的余额查询功能。对于实现这一功能,我通过判断split切割后的字符串数组长度来完成,即如果字符串数组里只有卡号这一个元素的话,这一字符串数组的长度就为1。如果字符串长度为1的话,就让他查询该银行用户的余额。下面为本题的一个运行实例:

 

 

 

 

 

 

 接下来为本题的生成报表内容:

 

 

 

 

 

下面

      下面来分析一下题目集9的第一题。这一题为题目集8的改进版,即完善了很多题目集8里无法实现的功能。在题目集8中银行用户只有借记卡,而在本题中添加了贷记卡。此外,本题中银行用户可以在任意银行取款,但如果跨行取款的话,需要支付一些取款金额的手续费。本题银行相关数据与用户相关数据如下:

 

 

 

以上信息可知,不同银行对于跨行取款的手续费要求不同。下面为本题的输出规则:

 

 

由上可知,如果借记卡银行用户的余额小于0的话,会输出报错语句,

而如果贷记卡银行用户的余额小于0,则会继续输出该银行用户的余额,但是如果贷记卡银行用户的余额小于-50000.00的话,也会输出报错语句。如下为判断其中一个银行用户的代码实例:

 

 

 

下面为本题的一个运行实例:

 

 

 

 

 

三、采坑心得

   通过写这三次题目集,我细心了很多,因为其中的细节真的太多了。我每次几乎都在输出格式上采坑,要么多一个空格,要么少一个空格,要么字母大小写看错,导致我检查前面代码那么久,后面采发现时输出语句的问题。还有就是一些不规则符号也会输出错。此外,还有时候就是题目要求没看清楚就开始做,导致后面做不出来,回头看题目才发现题目理解错了。还有就是小数点,有时题目要求保留2位小数,而我却没看到。在题目集8和题目集9中,我因为对if/else的知识点有些遗忘,导致打出来的代码总是无法实现题目功能,而反复检查也检查不出问题,浪费了大量的时间,后来查了查资料才发现

我基本知识点都理解错了。下面就是因为我对if/else的理解错误,导致输出结果总是不符题意:

以上结果对银行用户余额的计算出现问题,就是因为if/else语句没有使用好才导致的。

四、改进建议

  对于本三次题目集的代码而言,我的代码虽然没报错,却有很多的警告,我有时创建了很多变量却没用到,并且代码的格式也不是很好看,在以后的作业中,我会做到可持续改进,尽量让自己的代码更简单,更好看。

五、总结

  通过对本三次题目集的错误总结,我学到了类的继承与多态、ArrayList链表,能够更好的掌握这些知识点,同时也对一些原则有了一些了解。在以后打代码的过程中,我会完成一个功能就运行一次,看看有没有问题,而不是打完全部代码在运行,我发现这样如果报错的话,会很难找到错源,这样就会浪费大量时间找错。

对教师的建议:虽然代码很枯燥,但是还是想多听老师讲讲代码,希望老师可以稍微讲一下文字方面的知识,而多用代码来实践学到的知识,告诉我们每行代码的作用以及代码的很多语法,我们其实知道算法,只是不知道怎么用代码来表示,也就是不懂语法。

对课程的建议:我希望课程能够把知识点讲的详细一点,因为有些只是太抽象了,很难一时半会理解,所以希望老师讲的详细一点。

对作业的建议:希望作业量能够适度一些,在我们的完成范围之内,题目难度也适中一些。

 

posted @ 2021-06-08 16:41  永恒之夜lalala  阅读(43)  评论(0编辑  收藏  举报