opp训练集7-11Blog作业

发布时间 2023-06-24 03:33:10作者: 懒虫tt

前言:

这一次是pta作业集合7-11的作业总结,其中包含了菜单计价程序的迭代以及选课系统程序的迭代,代码量要求精简,有着内存限制,难度提升。

其中菜单计价程序在菜单计价程序-3的基础上增加了部分内容,菜单计价程序是在原来训练集上的新一波迭代,要求计算出每条点菜信息相应的处理结果。

opp8是选课系统的第一次编程,要求写出一个程序用来给学生选课使用,其中包含了课表信息的输入,以及学生选课信息的处理,以及各种异常之间的改动,输出结果等。

opp9是一个简单的程序用来统计源码中的所有关键字出现的次数,代码量少,简单,通过使用正则表达式以及进行Stirng类中的split方法对输入的源码进行处理。

opp10是一个总共有四道题目,前两道是编写一个程序处理学生成绩的信息,对字符串进行处理,讲学生的信息使用HashMap进行记录和存储,熟练使用hashMap进行对信息的存储。其中第三道题目是对opp9中的选课系统进二次迭代,增加新鲜的功能。第四道题目则是编写一个动物模拟发声系统,用来模拟不同动物的叫声,其中编写了一个抽象类Animal类用来作为不同动物之间的父类,通过其中的speak方法对不同动物的叫声以字符串的形式进行输出。

opp11总共五道题目,包含了前面学生选课系统的迭代和书写自定义接口,并且熟练使用ArrayList这个容器,学会重写父类中的方法。

考察知识点:

1.字符串的处理。

2.HashMap,ArrayList容器的使用,实现对信息的存储,增删改查。

3.抽象类接口的编写以及对抽象类接口实现。

4.面向对象程序设计关系类的编写。

设计与分析

菜单计价程序:

类图:

 设计:总共有一个大类,五个分类。

Menu类:就是菜单类,用来记录所有的菜品信息,所有输入的菜品信息全都是保存在由ArrayList定义的dishs这个属性中,用来存菜品的名字和单价。其中special这个属性室友ArrayList定义的,是用来记录所有的特色菜品名称。kinds中的每一个元素都是String定义的,用来判定是否每一个菜品是何种异常,如果没有,就是正常的,通过dishs中的每一个索引值都是可以从kinds中相应的字符串信息,根据每一条菜品的字符串信息,判定菜品是哪一种异常,以便于输出最后的结果。

Dish类:菜品类。用来记录一个菜品和该菜品的名字和单价,以及分别定义了两个属性的get和set方法。

Record类:点单类。用来记录一条点菜记录。其中定义了几个属性。orderNum是int类型的属性。用来记录该订单的编号。d就是由Dish类定义的该订单信息所需要的菜品。portion是d的份额(包括大,中,小)每一种份额对应该菜品最后的总价比例。num表示d的数量,最后计算总价需要d的单机乘以num这个变量的值。numberOfDelete是int类型的属性,用来表示订单信息被删除的次数,如果超过一次,便是重复删除。tasty是int类型定义的属性,包括了这个菜品的不同口味,每一个整数代表的口味都是各不相同的。

Custom类:顾客类。定义了三个属性:name、telephone、orders。name是由String类定义的一个属性,用来表示顾客的名字。telephone也是由String类型定义的一个属性,用来表示该顾客的电话号码,orders是由Array List<Order>定义的一个容器,用来存储该顾客所有的订单记录。然后分别定义了三个属性的set和get方法。

Order类:订单类。定义了三个属性tableNumber、records、deleteOfOrderNum。tableNumber是由String类型定义的属性,用来表示该订单的桌号,以便于每一桌订单的识别。records是由Arraylist<Record>定义的一个属性,用来表示这一桌订单中所有的点菜记录。deleteOfOrdernum表示该订单类的认为删除次数,如果超过1,便是重复删除。

Main类:主类,用来进行所有的输入和输出操作,每一条字符串信息都是通过Main类来进行输入,并且进行拆分,细化,进行分类,判定是否为点菜信息还是菜单信息,还是结束信息,最后通过循环讲每一条信息的处理结果输出。

雷达图:

分析:各项参数指标都在合理范围之内,其中从上面的雷达图可以看出代码中的平均复杂度较高,其他指标各项正常。

课程成绩统计系统

类图:

 设计:总共定义了八个类。

courses类:这个表示课程成绩系统中对课程进行记录。定义了三个属性:name、type、mothod。name属性是用来记录学生该课程的名称。type用来记录课程的性质(必修、选修),最后的mothod用来表示课程的考核方式(考试,考核)。

Score类:是一个抽象类,代表学生的课程成绩。它分别有两个继承者,分别是TestScore,这个类就是考试成绩类。norScore类是考核成绩类。Score中定义了一个抽象的方法endScore()用来得出最终的结果。因为考试成绩和考核成绩两种成绩中平时成绩和期末考试成绩所占比重不同,所以最后得出来的最终成绩结果也是不同的,两个继承者分别要对Score类中的endScore()方法进行重写。

Student类:学生类。定义了两个属性,分别是name、id。name表示学生的名字,id代表者学生的学号。name可以重复,但是id不能重复,因为每一个学生的学号信息都是唯一的,这样就方便我们在Main类中实现对重复信息的判断并且对重复的信息进行处理,最后对处理结果进行一个终端的输出。

Slection类:选课类。定义了两个属性courses、scores。都是由Arraylist这个容器进行定义的。其中courses是用来对所有没有异常的的课程进行一个存储,scores是对所有的成绩进行一个存储。这个类中包含了四个方法。其中hass(String name)就是通过name形参判定是否courses中存在课程名字叫做name的课程。其中add Score(Course course,String daily,String test,String id,String name,String kind)是用来像该类中的scores添加一个新的Score定义的课程。course代表需要添加的课程。daily是平时成绩,test是期末考试成绩、id是相应的学生的学号、name是课程的名字、kind是最终Score中kind,代表者是否是异常还是正常。

classes类:班级类。在这个类中定义了两个属性,分别是Num和students。Num是由String类型定义的一个属性,代表的是班级的序号,根据序号,可以找到对应的班级。students这个属性就是由ArrayList定义的一个属性,用来装载该班级的所有学生。一个班上所有的学生。这个类中定义了四个方法。其中aru()这个方法是用来对学生进行排序,按照学号顺序进行排序。puClass(Slection slection)这个方法是用来对班级的信息进行输出,最终会输出班级的序号和最终这个班级的总成绩,如果异常,会输出对应异常的信息。puStudent(Slection slection)这个方法是用来对班级中每一个学生的信息进行输出,按照学号大小依次输出,在这个方法中运用了aru()这个方法对该班级的学生进行一个按照学号的一个排序之后,再依次输出对应的学生的信息。

Main类:在该类中定义了一个list属性,这个属性是由ArraytList<classes>定义的,代表了所有从终端输入的学生信息中提取出来的班级。再这个类中对所有的信息进行输入和输出,完成最终 整个程序的运作。

雷达图:

分析:从这个雷达图中可以看出,各项指标都是超出了各自的范围。复杂度严重超标,超过了最大的限度。以及函数深度也是超过了上限。注释量远远小于下限。代码缺陷严重。

课程成绩统计系统 - 3:

类图:

 设计

这个是课程成绩统计系统最终的迭代结果,其余没有增加的内容,在原来的代码上增加了一个experimentScore这个类表示考核方式为实验的成绩。Main类实现数据的输入和结果的输出。代码基本上没有太大变化,Main类中对输入信息多进行了一个实验的判断。

雷达图:

 分析:代码深度超出雷达上限,复杂度等都在合理范围之内,深度增加。代码深度需要降低。

HashMap容器检索:

import java.util.HashMap;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
HashMap<String,String> nameBox = new HashMap<>();
HashMap<String,Integer> scoreBox = new HashMap<>();
while(true){
String information = input.nextLine();
String[] element = information.split(" ");
if(element[0].equals("end")){
break;
}
else{
nameBox.put(element[0],element[1]);
scoreBox.put(element[0],Integer.parseInt(element[2]));
}
}
String search = input.next();
if(nameBox.containsKey(search)){
System.out.println(search + " " + nameBox.get(search) + " " + scoreBox.get(search));
}
else{
System.out.println("The student " + search + " does not exist");
}
}
}

设计和分析:题目是一个计算学生总成绩的一个小程序,通过在终端输入一名学生的课程成绩信息,分别计算出相应的学生的总成绩。这道题目我是通过HashMap实现对信息的存储。代码中可以看出我定义了两个变量,分别是nameBox和scoreBox。两者都是HashMap所定义的两个变量。nameBox用来存储所有学生,通过学号的不提供,学号重复,则不会存储进nameBox这个容器之中,实现了学号的唯一性,姓名的可重复性。scoreBox这个容器则是用来存储每一个学生的总成绩信息。第一个key键时学生的学号,是String类。第二个value键是int定义的,用来表示这个和key键相匹配的学号的学生的总成绩。

踩坑心得:

这几次的pta分数都是较为低的,每次都是踩着及格线过去的。其中也是积累了不少的经验。

在这几次联系中我注意到了之前都是没有注意到的问题,那就是Scanner类中的nextInt和nextLIne的区别,曾经我总是天真的以为他们两个的区别仅仅只是在于nextInt是识别扫描仪中辨别到的整形数字,nextLine则只是识别一整行的字符串。

但是在做pta的身份证识别的拿到题目的时候,我却发现使用for循环循环n次进行身份证的输入的时候,结果发现只输入了n-1个数字。后来在同学的帮助下,我才猛然发现两者有着一个区别,那是我从来都不曾注意到的,那就是nextint在你第一次在终端按下回车键的时候,回车键会被nextint所识别,这就导致了最终本来可以识别到n个数字,结果因为识别了一个回车键,导致了最后一个数字没有被扫描仪所识别到。

后来我使用nextLine来识别一整行,nextLine不会识别最后一个回车键,而是直接识别一整行。这样就可以将所有的行信息分割开。

改进建议:

增强面向对象编程的设计思维,实现解耦。每次些菜单计价这种需要迭代的pta作业的时候,每次在迭代的时候都会感觉前面一次写的很乱,没有头绪,类和类之间的设计没有处理好,导致了最后我每次的迭代都是要重新写,这样就很麻烦,极大的拖延了效率。

还有就是字符串处理这一类掌握的方法还是较少,比如字符排序等等,还有很多便捷的方法我都是没有掌握,导致自己写的就很麻烦,有时间还是要多普及普及自己的知识面。不能局限在书本上。

总结:

个人总结:面向对象这个课程,这门技术,一定是要学好设计这一个理念,设计做的不好,肯定就不能做好面向对象这一门工作,将来肯定是学不好的。

作业、实验、课上及课下组织方式:这个我觉到老师一直做的很好,在在课上,在线上抛出相关文献资料让我们了解并且让我们讨论交流,利用上网、线下讨论,构成学术性氛围,还有就是定期布置作业,开展实验可以充分锻炼自己的编程能力。