pta题目集1~3总结

.前言

1. 因为可能是刚刚接触java的原因,在我们之前学过C的基础之上,我们刚接触java学习的几个星期,就开始动手完成相应每周的PTA题目集,难度不是很大。考察了一些比较基础的知识点。

2.这三次题目集的主要考察了java的基本程序设计,考察了java项目的创建,java项目的输入和输出,不同于c语言的输入scanf和输出print来说,java的输入需要命名一个头文件#import Java.util.Scanner,然后使用Scanner scanner = new Scanner(System.in);基本语句来接收键盘的输入,输出则是通过 System.out.printf来实现在控制台上的运行。

3.前三次的题目集还同时考察了类的创建,以及如何封装数据到类当中去,考察了if else 和switch等选择语句的应用,因为pta答案的精确,还考察了我们对于浮点数的取值,例如四舍五入保留两位小数等等,还学会了对应的输入输出类型的转化,是int型,还是float型,还是double亦或是字符串的类型,可以通过在前面加个()进行类型的强制转换。

4.题量来说,第一次pta作业较简单,一共有九题,难度不大,第二次pta作业就有关于类的基本使用方法和数据的封装,一共有八题,尤其是7-2的关联类,7-7的菜单点菜类以及7-8的日期类的基本使用,难度比较大,需要提前预习一些书本上的知识方法来进行解题,第三次作业一共就4题,有两题倒是和第二次作业的pta类似,但是最为困难的就是第二题7-2课程成绩统计程序,难度比较大,包括课程和课程成绩两类信息,课程性质又分必修,选修,以及考核的方式等等,还有信息的相关约束以及输出的格式要求,对于目前的我来说难度比较大。

.设计与分析

1.第二次作业7-2的相应生成报表

 

 

 

   此次作业是第二次题目集里的7-2成绩计算-2关联类的基本运用。成绩类Score里面有期末qimo和平时pingshi两个成绩,学生类里面有String类型的学号,还有通过计算公式计算规则:平时成绩*0.4+期末成绩*0.6,来得到总成绩,学生类型里有String类型的姓名,int类型的语文数学和物理成绩。还有计算平时分getaverageusual(),计算期末分getaverageusual()和平均分getaverage()的函数。

 

2.第二次作业7-1的相应类图生成报表

 

 

 

  此次作业是第二次题目集里的7-1成绩计算-1-类、数组的基本运用,创建学生类来封装信息,属性有学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int),总分以及平均分的计算都放在了输出环节,利用  int totalGrade = List[i].ChineseGrade + List[i].MathGrade + List[i].PhysicalGrade;来输出总成绩,再通过总成绩除以对应的三门科目,即可得到平均分,平均分是double类型,再通过System.out.printf()来输出。

 

3.第二次作业菜单计价系列题目

 

 

 

 

  此次代码使用Scanner类从控制台获取用户的输入,包括菜名和份额。使用字符串数组Menu保存菜单中的菜名,使用整型数组money保存每道菜的价格。通过循环获取用户输入的菜名和份额,并依次判断菜名是否存在于菜单中。如果菜名存在,则根据份额计算该菜品的价格:小份(1)直接加上菜品价格,中份(2)将菜品价格乘以1.5并四舍五入,大份(3)直接加上菜品价格的两倍。如果菜名不存在,则输出提示信息。最后输出订单的总价。

 4.第三次作业7-2课程成绩统计程序

 

 

 

 

 

代码首先创建了三个Map对象,分别用于保存学生的课程成绩信息(studentGrades)、课程的成绩信息(courseGrades)以及班级的总成绩信息(classGrades)。接下来,代码使用Scanner对象循环读取输入信息。每次读取一行信息,根据空格分割为不同的字段。第一个字段是课程名称,第二个字段是课程性质,第三个字段(可选)是考核方式。然后,在内层循环中,代码再次使用Scanner对象读取成绩信息。每次读取一行信息,根据空格分割为不同的字段。第一个字段是学生ID,第二个字段是学生姓名,第四个字段(可选)是平时成绩,第五个字段是期末成绩。根据题目要求,对于必修课,考核方式必须为考试,否则输出错误信息。然后,根据考核方式计算每个学生的总成绩,并将成绩信息存入对应的Map中。最后,代码分别计算并输出学生的平均成绩、课程的平均成绩以及班级的平均成绩。对于每个输出部分,首先按照指定的顺序(学号、课程名称、班级号)进行排序,然后遍历对应Map,计算平均成绩,并输出到标准输出流中代码使用了Java集合类中的HashMapTreeMapArrayList来保存成绩信息,并利用流式处理计算平均成绩。通过使用这些集合类和流处理,可以方便地进行数据的统计和计算操作。

.踩坑心得

1Student类的构造函数:在构造函数中,初始化字符串对象时,可以直接使用 "" 代替 new String(" "),因为字符串字面值已经是String对象。

2)循环遍历输入信息:在循环中,由于每次循环都会创建一个新的Student对象,所以可以将 students[k] = new Student(); 的代码移到循环内部。同时,循环条件 i<9 可以改为 i < students.length * 3 来提高代码的可读性。

3)输出格式的处理:题目要求输出的结果需要按照指定格式进行输出。在代码中需要注意输出格式的处理,例如学号、课程名称和班级号的格式,平均成绩的小数位数等等。同时,为了保证程序的可读性和可维护性,最好将输出格式的相关代码封装在一些单独的方法中。

4)数组越界问题:在创建列表 List 时,应该注意数组大小为5,但在循环遍历输入学生信息时,应注意索引范围从04,即 for(int i=0;i<5;i++),以避免数组越界错误。

5)平均分计算问题:在计算平均分时,需要注意整除运算符 / 和小数点的使用。由于整数相除结果仍为整数,若要得到精确的小数平均分,需要将总分转换为浮点数或使用强制类型转换。可以使用 double averageGrade = (double)totalGrade / 3; double averageGrade = totalGrade / 3.0; 来确保得到正确的平均分结果。

6)模块化设计和代码复用:可以将功能模块进行拆分,编写函数来实现各个独立的功能,方便代码的复用和维护。

 7)数据结构的选择:本题中需要统计学生、课程和班级的成绩信息,并且需要按照指定顺序排序输出。因此,需要选择合适的数据结构来方便地进行数据的存储、计算和排序。在本次实现中,我选择了Java集合类中的HashMapTreeMapArrayList等来保存成绩信息,并利用集合类和流式处理来计算平均成绩。

 

四.主要困难以及改进建议

 

1.(1)类的设计:代码需要涉及到学生、成绩和学科等多个类之间的交互。在设计类之前需要仔细考虑类之间的继承和关系。设计合理的类:需要根据代码需求、功能和逻辑考虑如何设计合理的类,使得类之间的交互简单清晰,同时易于扩展和维护。

2)数组和变量的使用:代码需要使用数组来存储多个学生对象,需要注意数组的声明和使用方法。同时,也需要合理使用变量来进行中间计算。合理使用数组和变量:需要正确使用Java的数组和变量,以提高代码的效率和可读性。同时,应避免过多使用硬编码或魔术数字,而是使用常量或枚举类型来表示数据和状态。

3)固定学生数量:代码中固定了学生数量为5,无法支持任意输入人数。建议使用变量或动态数据结构(如ArrayList)来动态存储学生信息,以支持任意数量的学生。

2)输入错误处理:目前代码中没有对输入错误或者非法数据进行处理。例如,如果用户输入的成绩不是合法数字,程序会抛出异常。建议在读入成绩前进行输入验证,确保输入数据合法性,并处理异常情况。

3)输出格式控制:目前代码中使用空格分隔学生信息,最后一个学生信息后面也有一个空格。这样的输出格式可能不符合预期。建议调整输出格式,确保每个学生信息之间只有一个空格,并且最后一个学生信息后面没有多余的空格和换行。

(4)变量命名规范:代码中的变量命名没有遵循常见的命名规范,不够清晰易懂。建议使

用具有描述性的变量名,以增加代码的可读性和可维护性。

5)使用常量或枚举类型代替硬编码的菜单和价格信息:将菜单和价格信息作为常量或枚举类型的属性来定义,在代码中引用这些常量或枚举类型,而不是直接使用硬编码的数组。

6)封装菜品类和菜单类:可以定义一个菜品类,包含菜名和价格属性,并提供相应的访问方法。然后可以创建一个菜单类,用于管理菜单列表,包括添加、删除和查找菜品等操作。这样可以更好地组织和管理菜单数据,提高代码的可读性和维护性。

7)优化循环和查找算法:当前的代码使用了简单的线性查找算法来查找菜名在菜单中的索引。如果菜单列表较大,这种线性查找可能会比较低效。可以考虑使用更高效的查找算法(如二分查找)或使用HashMap等数据结构来提高查找性能。

五. 总结

  通过这三次pta题目集的学习,我学会了java程序的基本设计,学会了一些java的类的创建以及使用类来封装数据等,同时了解了在java项目当中的输入和输出的方法,还了解了类中类的使用,即如学生、成绩和学科多个类之间的交互,还了解了哈希Hash算法来查找相应的数据,可以更高效地完成题目的需求,还知道了在日期类的使用当中,一些添加头文件,就可使用的函数可以很好地解决问题,例如计算两个日期的天数,月数差以及年数差,还可以知晓判断给定一个日期,为某某年某月某日,这些在今后的java项目当中可以更好地使用,更为方便。当然在自己写pta的过程当中对于类的使用还需要更加地熟练与操作,对于一些基本框架的构造还需要更为熟练。希望下次能写题目集更为得心应手。

posted @ 2023-10-07 22:05  逍翊  阅读(9)  评论(0)    收藏  举报