blog3

发布时间 2023-06-28 21:54:24作者: WUKAIYANG

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

 

一,前言:

 

        大一下学期开始,我们开始接触java这门语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的形式和感觉,但它要比C++语言更易于使用,而且在编程时彻底采用了一种以对象为导向的方式。

        Pta作业已经写了八次,除了第一次题目难度比较平缓,后面的数次难度激增,我也只有第一次全部写完pta的所有题目,后面就没有拿到过满分。总体来说,最近三次pta的主要知识点还是在设计类和学习java语言,以及用面向对象的思维方式。对只接触过一点java语言的我们还是很有挑战的。最近三次pta作业虽然题类似,但是难度很大,这三次作业不再是菜单的设计,而是改为学生成绩的统计,但还是有很多类的调用,还有很多读取和输出的变化,十分复杂,还需要使用很多函数,要有继承和传参,对我们来说确实十分困难。

 

二,设计与分析:

 

第六次题目集:

 

代码如下:

 

Course类:

 

CourseGrade类:

 

 

 Record类:

 

 

Choose_course类:

 

 

Class类:

 

 

Student类:

 

 

StudentGrade类

 

 

Main类

 

 

 类图如下:

 

 

 

圈复杂度如下:

 

 

题目分析:

 

       此题是课程成绩统计程序,包含课程类,班级类,学生类和选课类,课程类主要是包含courseName,courseType和courseMode。学生类主要是包含ID和学生姓名,当然也要包含输入进来的成绩,包含期中和期末的成绩。输入的成绩不但要传入学生的图,还要把成绩传到课程和班级,这样传参又复杂了起来,一开始看到这个题目的时候,我是被吓了一跳的,因为这道题的文字量特别的大,而且加了许多别的功能,比如说删除和不对应,还有不输入成绩的情况,有这与普通成绩输入又有很大的区别。在得分上,得分点被细化,导致不好拿到高分。

 

踩坑心得:

 

1,成绩平均分只取整数部分,小数部分丢弃,要分开取整,不能加在一起取整。

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

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

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

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

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

 

第七次题目集:

 

代码如下:

 

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类:

 

 

 

 

 

 

类图如下:

 

 

圈复杂度如下: 

 

 

题目分析:

 

         此题是课程成绩统计程序,包含课程类,班级类,学生类和选课类,课程类主要是包含courseName,courseType和courseMode。学生类主要是包含ID和学生姓名,当然也要包含输入进来的成绩,包含期中和期末的成绩。输入的成绩不但要传入学生的图,还要把成绩传到课程和班级,这样传参又复杂了起来。并且这次加入了实验这个新的ourseType和courseMode,实验的成绩又是另一种算法,所以我采取了边输入边算,然后在传参的方法,输入后马上清空列表开始计算下一个人的成绩。在第三个版本中,修改了计算总成绩的方式,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成。课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。这次的实验类还加入了权重,有事动态的输入,有需要传参,和动态的存入,十分的复杂。考试的总成绩由平时成绩和期末成绩的权重决定,考察的总成绩直接等于期末成绩,实验的总成绩为课程每次实验成绩乘以权重后累加。在录入课程信息时,需要输入课程权重值,并确保所有分项成绩的权重之和等于1。

 

踩坑心得:

 

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

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

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

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

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

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

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

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

9,在比较两个字符串时,可以使用 String 的 compareTo 方法,而不是将字符串转换为整数进行比较。因为这样会损失精度,还会增加代码的复杂性。所以,继续使用 compareTo 方法来比较两个学生的编号。

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

11,自我判断:IfRight() 方法判断成绩数组的长度和每个元素的取值是否正确。这个方法不够通用,应该分离出去。可以考虑在 Score 类中添加一个构造函数,该构造函数接受成绩数组并验证它们的长度和取值是否正确。如果参数不符合要求,则抛出 IllegalArgumentException 异常。

 

三,主要困难:

 

1,java语言不熟练,很多语言功能不会使用。

2,Java对代码语言的精准度和准确度要求十分的高,不能随意修改大小写,很多时候也在这犯错误。

3,对类的概念没有充分的掌握,很多时候不了解在类下面应该包含什么功能,用什么方法。面对题目,不知道如何分类,没有头绪。

4,对继承的方法使用不熟练,对传参的方法也不太熟练,会用但是容易出错。

5,这次用了许多继承的关系,终于学会了一点,但还是很多地方不太熟练,导致出错。

6,可以考虑将这些计算逻辑抽象成一个类,并使用策略模式来支持不同的统计方法。这样可以让代码更加灵活,易于扩展。

 

四,改进建议:

 

1,pta部分题目运行时间超时,要优化代码的算法,很多时候不是你的方法不行,而是有优化的地方没有优化,导致程序运行的时间加长导致超时,现在争取把每个小步骤都优化,以后的大作业程序才能不断的节省时间。

2,pta部分题目非零返回,自己的代码有问题才会导致的,要检查自己的程序逻辑。

3,对继承的方法使用不熟练,对传参的方法也不太熟练,会用但是容易出错,要多使用,防止以后出错。

4,对类的设计要更细节和具体,每个类包含的属性和方法,以及不同类之间的关系。

5,计算总分:getFinalScore() 方法根据课程类型和评估方式计算最终得分。这个方法的代码有点复杂,并且难以扩展。可以考虑将它分离出去,例如将课程类型和评估方式定义成枚举,然后使用工厂模式来创建对应的计算方法。

 

五,总结:

 

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