PTA题目集7~9总结

PTA题目集7~9总结

 

目录

  1. 前言
  2. 设计与分析
  3. 采坑心得
  4. 改进建议
  5. 总结 

一、前言

  这是最后一次的博客作业了,由于作业是迭代的,这次的难度可以说是和之前的题目集五和题目集六的难度大相径庭了。虽然这三次的题目集题目量都不多,除了题目集七有两道题剩下的两个题目集都只有一道题,但是它的难度都比较大。主要还是在锻炼我们对于类与类之间的关系是否清晰,并且能够熟练运用。主要知识点还是类与类的继承与多态,还有一些方法的使用方法。

  1. 题目集七:

题目集七的两道题都是图形卡片游戏,第二题是在第一题的基础上做出的改变,并且加大了难度。两道题都涉及到了类与类之间的继承,通过抽象的Shape类和其他的子类的子类来实现要求。7-1涉及到了一个新知识点,就是CompareTo()方法的使用。这是一个用来比较的方法,可以比较两个相同数据类型的,但是不同类型的数据就不能用这个来比较。7-2涉及的新知识点就是ArrayList工具的使用。ArrayList有点类似于C语言的链表,是一个可以动态修改的数组,和普通数组相比,它没有固定大小的限制,可以添加和删除元素。在很多时候使用起来会非常的方便和简单。

  2.题目集八:

题目集八只有一道题,编写一个银行ATM机的模拟程序虽然老师在课堂上给我们分析了一下这道题,但是因为这次没有给类图,所以最开始没有头绪,很难着手开始写。这道题还是很复杂的,如果对类与类之间的调用不熟练的话会写起来很麻烦。它题目中是需要做到一些信息初始化,并且还有一对多的组合关系。这道题中还用到了很多ArrayList,创建了很多数组。和题目集七比起来,难度突然提升,这导致写题的过程比较坎坷。

  3.题目集九:

题目集九是在题目集八的基础上做出的改变,要在题目集八的基础上增加跨行和信用卡的功能。这就要用到继承关系了,需要通过继承来创建借记账户和贷记账户,从而实现题目所需要的要求。这次的题目因为跨行和透支功能的增加,还需要收取相应的利息,在计算每一种情况所收取利息的情况一不小心还是比较容易搞混的。其中用到的继承关系也算是我们使用到的最常见的一种类与类之间的关系了,继承是从已有类中派生出新的类,新的类能吸收已有类的属性和方法,并且能拓展新的属性和行为。

 

二、设计与分析

                  ① 题目集7(7-1)、(7-2)两道题目的递进式设计分析总结:

                7-1 图形卡片排序游戏:考虑一款适合于小学生的卡片(Card)排序游戏,其规则为随机发放一些卡片给学生,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种 卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排 序,同时求出所有卡片的面积之和。

 

                                               图1-1.题目集七7-1类图

      7-2 图形卡片分组游戏:沿袭作业 7-1,本次作业主要对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生, 卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid), 并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。

                                                               

 

                                                                                                       图1-2.题目集七7-2

  7-1和7-2这两道题大体的要求是差不多,7-2在7-1的基础上增加了一些排序的要求和输出的格式上变化。7-1是计算出每个输入数据的面积输出,排序后再输出,并且输出总面积。而7-2需要在计算出输入数据的面积后,按照规定类型的顺序输出面积,不同类型的面积要分开了排序并且输出。最难的就是将输入的不同数据按不同类型分开来,只要分开来了,后面的就比较简单。所以我由之前的一个数组收录信息改为了四种类型四个数组收录信息

	switch(i) {
			case 1:
				Card card1 = new Card(new Circle(Main.input.nextDouble()));
                card1.getShape().setShapeName("Circle");
                cardList.add(card1);
                circleList.add(card1);
                break;
            case 2:
                Card card2=new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
                card2.getShape().setShapeName("Rectangle");
                cardList.add(card2);
                rectangleList.add(card2);
                break;
            case 3:
                Card card3=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
                card3.getShape().setShapeName("Triangle");
                cardList.add(card3);
                triangleList.add(card3);
                break;
            case 4:
                Card card4=new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
                card4.getShape().setShapeName("Trapezoid");
                cardList.add(card4);
                trapezoidList.add(card4);
                break;

			}

      这样在后面进行排序计算比较方便,对于每个数组分开一个一个进行排序。因为这里运用的是ArrayList数组,而在ArrayList中有有一种可以直接进行排序的方法那就是Collections(),可以直接将输入的数组排好序,就可以得到一个有序数组。只是这个方法只能排序基本类型的变量,但只要将Card类型数组转换一下就可以使用这个方法了。

       对于数组的遍历,在这次的题目集也是熟练运用了foe each方法来对各个不同的数组进行遍历。这比我们之前使用的循环要更简洁,虽然理解起来要没那么好理解,但是使用的地方还是很多的。

public boolean validate() {
		for(Card card : cardList) {
			if(!card.getShape().validate()) {
				return false;
			}
		}
		
			return true;
		
	}

  

  ② 题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

    题目集八:7-1 ATM机类结构设计(一):编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。本次作业限定银行卡均为借记卡(不能透支),且不允许跨行办理相关业务(例如在中国建设银行的 ATM 机上对其他银行的账户进行操作)。

                                                                

 

    题目集九:7-1 ATM机类结构设计(二):编写一个银行 ATM 机的模拟程序,能够完成用户的取款以及查询余额功能。本次作业中银行卡包含借记卡和信用卡两类,且允许跨行办理相关业 务(例如在中国建设银行的 ATM 机上使用中国工商银行的银行卡进行业务操作)

 

 

 

 

  题目集八和题目集九都是制作模拟ATM,只是在要求上有所不同。题目集九由之前的不能跨行取款改为了可以跨行,并且还增加了收取利息的业务。因为老师给我们分析了一下这道题,所以最重要的就是将所有的实体类先全部写出来,然后初始化给出的几个用户的信息,在考虑报错并且退出的情况。这次作业要用到了很多方法,比如equals()、toString()、split()等等,在将输入的数据分割处理时需要用到这些方法来处理。实体类都建好,还需要一个用来处理用户选择的功能的类,需要我们自己新建。在主函数分割完的信息传入这个类中进行运算执行

  题目集九在题目集八的基础上新建了两个不同的账户继承自最开始的账户,因为新加了可以贷款的账户,所以需要将这两个不同的账户分入各自创建的数组,这样更好进行后面的检测。这样之前如果输入取款金额大于账户余额或者透支金额超过规定最大透支金额的错误输出的判断也需要改,根据不同的收取利息的比例进行不同的计算,记得最后更新余额数据。很容易忘了一点就是,如果是借记账户跨行全部取出余额的话,是要进行输入错误处理的,在写代码是很容易遗漏这一点。

  值得一提的是这次在判断卡号和ATM机是否存在是使用到了Iterator迭代器。Iterator不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。它是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。理解起来很复杂,但是在某些地方得用到这个方法。

 

三、采坑心得

  1.在7-1的题目中进行面积数据排序时,最开始自己写了一个排序的方法,导致非常的麻烦并且很不清晰,最后使用了TreeSet集合方法,可以直接提供有序的集合,非常方便。

  2.在7-1中计算面积时一时忽略普通三角形没法直接计算,最后在网络上搜索到了海伦公式才得以完成。

  3.对于题目集八和题目集九,对于密码和一些设定不变的信息,发现可以使用到final关键字,保持数值不再更改。

  4.在ATM机的的信息初始化时,再开始使用了数组的方法,发现写起来行不通,实现起来比较困难。

  5.对于面积输出时要用[]框起来时比较混乱,排序和比较的方法调用起来无法调用,最后重复使用了同一个方法才得以实现运行。

  6.题目集九中利息收取问题在计算时,因为输入的金钱分正负之分,在后续计算余额是+和-没有分清,导致最后余额输出有差错。

 

四、改进建议

     1.单一变量原则还有开-闭了解的很少,很多知识的相关概念了解的模模糊糊,基础不扎实。

  2.去了解关键字final的使用方法,学习它使用起来的基本用法。

  3.数组不止只有ArrayList这一种,还有HashSet、HashMap、Iterator等等集合可以使用,并且每个都有自己特殊不同,需要了解并且使用。

  4.Compareble接口的使用需要加强,并且在之后实现这个接口中的CompareTo()方法。

 

五、总结

     题目集7~题目集9三次题目集都是类与多态的练习,涉及到了很多新的知识,每道题的综合性都比较强。这是最后一次博客的作业,所以难度也是比较大的。但是相应的也能促使我主动去了解并且学习很所之前没有学到的或者没有了解贯彻的知识。比如final关键字,之前看到过但是没有去了解过,这次算是彻底的了解了,虽然运用起来可能还是不太熟练。其实题目集八题目集九的难度和题目集七比起来,要提高了很多,所以其实题目集八我并没有写完,拿到的分也很低。而写题目集九时,老师给了源码,所以写起来比最开始写题目集八要轻松一些。对于一些比较复杂的题目,我总是容易没有思路,上手很难。创新性思维不够,还要多加练习。

                                                                                                                

posted @ 2021-06-20 14:07  肖肖呐肖肖  阅读(149)  评论(0)    收藏  举报