Blog3

发布时间 2023-06-28 22:45:07作者: 夵

PTA题目集6,7,8总结Blog

一、前言

大一下学期开始,我们开始学习Java这门编程语言。Java具有大多数编程语言共有的特性,是专门设计用于互联网分布式环境的。它的形式和感觉类似于C++,但相比C++更易于使用,并且完全采用了面向对象的编程方式。

到目前为止,我们已经完成了八次Pta作业。除了第一次题目相对简单,后面的作业难度大幅提升,我只有第一次能够完整地解决所有的Pta题目,之后就没有拿到过满分。总的来说,最近三次Pta作业主要涉及类的设计、Java语言的学习,以及面向对象的思维方式。对于我们这样只接触过少许Java语言的学生来说,确实是一项挑战。最近三次的作业虽然题目类型相似,但难度很大。这三次作业不再是简单的菜单设计,而是转为学生成绩的统计,涉及到许多类的调用、数据的读取和输出的变化,非常复杂。还需要灵活运用许多函数,要了解继承和传参的概念,对我们来说确实十分困难。

二,设计与分析

1. 第六次题目集

代码如下:

Course类:

 

CourseGrade类:

 

 

 Record类:

 

 

Choose_course类:

 

 

Class类:

 

 

Student类:

 

 

StudentGrade类

 

 

Main类

 

 

 类图如下:

 

 

 

圈复杂度如下:

 

题目分析:

这个题目是关于课程成绩统计程序的。它包含了课程类、班级类、学生类和选课类。课程类主要包含课程名称、课程类型和课程模式。学生类主要包含学生ID和姓名,还有输入的成绩信息,包括期中考试和期末考试的成绩。输入的成绩不仅需要传递给学生对象,还需要传递给课程和班级对象,这使得参数传递变得更加复杂。一开始看到这道题目时,我感到非常吃惊,因为题目的文字量特别大,并且还涉及了许多其他的功能,例如删除和不对应的情况,还有不输入成绩的情况,这与普通的成绩输入有很大的区别。在评分方面,评分项被进一步细化,导致很难获得较高的分数。

踩坑心得:

1. 成绩平均分只取整数部分,小数部分丢弃,要分开取整,不能加在一起取整。
请确保在计算平均分时,将小数部分丢弃并单独取整,而不是将多个成绩相加后再取整。

2. 格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format",输出后要使用`continue`而不是简单地使用`break`。
当遇到格式错误或其他信息异常时,请使用`continue`语句跳过当前循环并进入下一次循环,而不是中断整个循环。

3. 超出范围的返回值错误,导致返回空。
如果参数超出了有效范围导致返回值错误,确保返回一个适当的错误值或进行适当的错误处理,而不是返回空值。

4. 方法后没有带上(),导致报错,所以方法类函数后都要加上()。
在调用方法时,请确保在方法名后添加圆括号,即使方法没有参数。这是Java语言的语法要求。

5. 大小写注意,Java语言对输入的语言的精确度和准确度要求很高,很多时候报错是因为方法首字母没有大写。
在使用Java类和方法时,请确保准确地使用大小写,方法名的首字母需要大写,而其他部分需要小写,以便与类定义和Java语言规范保持一致。

6. 排序时使用冒泡排序,导致经常出错,实际上使用普通的循环排序更可靠。
在选择排序算法时,确保选择适当的排序算法以获得正确而高效的结果。冒泡排序算法可能不是最佳选择,可以考虑使用其他排序算法,如插入排序或快速排序。

2. 第七次题目集

代码如下:

Class类:

 

 

Course类:

 

 

ExamGrade类:

 

 

ExperimentalGreade类:

 

 

Grade类:

 

 

InvestigateGrade类:

 

 

 Record类:

 

 

Student类:

 

 

 Subject类:

 

 

 main类:

 

 

 

 

类图如下:

 

 

圈复杂度如下: 

 

 

题目分析:

 

         此题是课程成绩统计程序,包含课程类,班级类,学生类和选课类,课程类主要是包含courseName,courseType和courseMode。学生类主要是包含ID和学生姓名,当然也要包含输入进来的成绩,包含期中和期末的成绩。输入的成绩不但要传入学生的图,还要把成绩传到课程和班级,这样传参又复杂了起来。并且这次加入了实验这个新的ourseType和courseMode,实验的成绩又是另一种算法,所以我采取了边输入边算,然后在传参的方法,输入后马上清空列表开始计算下一个人的成绩,实验实验类确实是特别的存在,有自己的独特算法,导致我要新建一个实验成绩类,而且在主函数里面又增加了很多情况。课程性质分为必修课、选修课和实验课。考核方式分为考试、考察和实验。不同考核方式对总成绩的影响也不同。其中,考试的总成绩由平时成绩和期末成绩的权重决定,考察的总成绩直接等于期末成绩,实验的总成绩为每次实验成绩的平均分。在这个程序中,必修课只能选择考试作为考核方式,选修课可以选择考试或考察,而实验课的成绩只能由实验的成绩计算得出。

 

踩坑心得:

 

1,成绩平均分只取整数部分,小数部分丢弃,要分开取整,不能加在一起取整。上次的pta这个不是很明显,但这次有部分测试点的分数确实蹊跷,正好要四舍五入。

2,格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format",输出后用continue而不能简单的用break。

3,超出范围的返回值错误,导致返回空。

4,方法后没有带上(),导致报错,所以方法类函数后都要加上()。

5,大小写注意,java语言对输入的语言的精确度和精准度要去很高,很多时候报错是因为方法首字母没有大写。

6,排序时用的冒泡排序,导致经常出错,还是普通的循环排序更靠谱。

7,数据类型转换错误,string类和int类转换和输出问题。

8,代码需要传参的地方更多,很容易传参错误导致输出错误。

9,不同的四舍五入顺序可能会造成误差。

 

第八次题目集:

 

代码如下:

 

ChooseCoures类:

 

 

 

Course类:

 

 

Grade类:

 

 

Student类:

 

 

Main类:

 

 

 

 

 

 

类图如下:

 

 

圈复杂度如下: 

 

 

题目分析:

这个题目是关于课程成绩统计程序的。它包含了课程类、班级类、学生类和选课类。课程类主要包含课程名称、课程类型和课程模式。学生类主要包含学生ID和学生姓名,当然也包括输入的成绩,包括期中考试和期末考试的成绩。输入的成绩不仅需要传递给学生对象,还需要传递给课程和班级对象,因此传参变得更加复杂。此外,这次题目中加入了实验这一新的课程类型和课程模式,实验成绩使用另一种算法进行计算。因此,我采取了边输入成绩边计算的方式,然后在传参的同时,清空列表开始计算下一个人的成绩。在第三个版本修改中,总成绩的计算方式也进行了修改,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成。课程成绩类组合了分项成绩类,分项成绩类包含成绩分值和权重两个属性。此次实验还加入了权重的概念,权重的输入是动态的,需要传参和动态存储,因此十分复杂。考试的总成绩由平时成绩和期末考试成绩的权重决定,实验的总成绩直接等于期末考试成绩,实验的总成绩为课程每次实验成绩乘以权重后进行累加。在录入课程信息时,需要输入课程权重值,并确保所有分项成绩的权重之和等于1。

踩坑心得:

 

三,主要困难

1. 对于成绩平均分只取整数部分的要求,确保在每次计算平均分时,将小数部分丢弃并单独进行取整操作,而不是将多个成绩相加后再取整。

2. 当遇到格式错误或其他信息异常(如成绩超出范围)时,应按照格式错误处理,将错误信息输出为"wrong format"。在输出错误信息后,使用`continue`语句跳过当前循环并进入下一次循环,而不是简单地使用`break`语句中断整个循环。

3. 当超出范围时,确保返回一个合适的错误值或进行适当的错误处理,而不是返回空值。

4. 在调用方法时,请确保在方法名后添加圆括号,即使方法没有参数。这是Java语言的语法要求。

5. 在使用Java类和方法时,请确保准确地使用大小写。方法名的首字母需要大写,而其他部分应为小写,以便与类定义和Java语言规范保持一致。

6. 在排序时,冒泡排序可能导致错误。可以尝试使用更可靠的排序算法,如快速排序或归并排序,以确保正确排序。

7. 当涉及到数据类型转换时,确保在正确的地方使用适当的类型转换方法。在字符串和整数之间的转换时,使用 `parseInt` 或 `valueOf` 等方法,并注意正确的转换方式和输出方式。

8. 在传递参数时,确保正确传递参数,特别是考虑到方法签名和参数列表的正确性,并将参数传递给正确的位置,以避免输出错误。

9. 在比较两个字符串时,可以使用 `compareTo` 方法,而不是将字符串转换为整数再进行比较。这样可以避免精度损失和代码复杂化。继续使用 `compareTo` 方法来比较两个学生的编号。

10. 目前的代码只能计算学生的总分和平均分,如果需要计算其他的统计信息,如最高分或最低分,需要相应地修改代码。可以考虑将这些计算逻辑抽象成一个 `ScoreCalculator` 类,并使用策略模式来支持不同的统计方法。这样可以使代码更加灵活、易于扩展。

11. 在判断输入是否正确的方法(`IfRight()`)中,尽量避免过多的判断逻辑,并将验证和异常处理分离。建议在 `Score` 类中添加一个构造函数,该构造函数接收成绩数组并验证其长度和取值是否正确。如果参数不符合要求,则抛出 `IllegalArgumentException` 异常。这样可以使代码更加通用和可读。

 

四,改进建议

 

1. 成绩平均分计算:确保在计算平均分时,按照题目要求将小数部分丢弃并分开取整,而不是将所有成绩相加后再取整。

2. 异常处理:对于格式错误或其他信息异常的情况,不仅需要输出"wrong format"作为错误信息,而且应使用`continue`语句跳过当前循环并进入下一次循环,而不是简单地使用`break`。这样可以确保程序继续执行后续的输入和处理,避免中断整个循环。

3. 超出范围返回值处理:当成绩超出范围时,应返回一个适当的错误值或进行适当的错误处理,以避免返回空值或其他不正确的结果。

4. 方法调用格式:在调用方法时,确保在方法名后添加圆括号,即使方法没有参数。这是Java语言的语法规定。

5. 大小写注意:在使用Java类和方法时,确保准确地使用大小写。方法名的首字母应大写,其他部分应小写,以与类定义和Java语言规范保持一致。

6. 选择合适的排序算法:如果冒泡排序导致错误,可以尝试使用更可靠的排序算法,如快速排序或归并排序,以确保正确排序。

7. 数据类型转换注意:当涉及到数据类型转换时,要注意使用适当的转换方法并确保正确的输出方式,特别是在字符串和整数之间的转换时。

8. 参数传递正确性:在传递参数时,要确保正确传递参数,包括考虑方法签名和参数列表的正确性,并将参数传递给正确的位置,以避免输出错误。

9. 字符串比较:在比较两个字符串时,使用 `compareTo` 方法而不是将字符串转换为整数再进行比较,以避免精度损失和代码复杂化。

10. 统计信息的计算:如果需要计算其他的统计信息(如最高分或最低分),可以考虑将这些计算逻辑抽象成一个独立的类,并使用策略模式来支持不同的统计方法,以提高代码的灵活性和可扩展性。

11. 异常处理的优化:在判断输入是否正确的方法中,尽量避免过多的判断逻辑,并将验证和异常处理进行分离,以提高代码的通用性和可读性。

五,总结

这三次的作业总体来说难度大,题目量虽然也不多,但是有些题目还是需要静下心来思考才能做好。通过这数次的PTA作业,我也基本能够掌握java语言中类的作用。这段时间的作业,也让我发现了自己最大的问题,那就是思维比较固化,写的很多程序的思路大多都是按部就班的那种,所以我的思维能力还是很需要培养的。这几次的作业,也基本帮助我们搭建了一个最基本的java语言的框架,让我学会了java的基本语法和类的分类,掌握了面向对象的语言的基本思路,学会了部分菜单的设计,学会了类的调用和部分函数,学会了传参和继承。虽然我还有很多不足和错误,java的语法不够熟练,对类的概念没有充分的掌握,传参也容易出错。希望老师可以更多的讲一下部分有用的java方法,毕竟自己查资料学习的不够系统,通过老师的讲解可以更加深入,系统的学习。要克服思维固化,需要不断练习和尝试新的方法。试着寻找不同的解决方案或思考问题的方法,并尝试将它们应用到代码中。这样可以帮助你拓展思维,学习新的方法和技巧。