PTA1-3总结

<1>前言:

知识点:

1.类的定义:

代码中定义了三个类,Question、Answer和Paper,分别用来表示问题、答案和试卷。每个类都包含了相应的属性和方法。

2.对象的创建:

在main方法中通过new关键字创建了Question、Answer和Paper类的对象,然后对对象的属性进行赋值和操作。

3.HashMap的使用:

代码中使用了HashMap来存储问题的答案、正确与否等信息,通过键值对的方式进行数据存取。

4.字符串操作:

代码中使用了字符串的split、replaceAll等方法来处理输入的字符串数据,提取出需要的信息。

5.简单循环:

代码中使用了for循环来遍历问题和答案,对每道题目进行判断并输出结果。

6.类方法:

类中使用了构造方法、私有属性和公有方法等面向对象的特性。

7.LinkedHashMap使用:

LinkedHashMap的调用避免了Hashmap自动排序

8.entrySet()使用(循环):

entrySet()的使用

9.逻辑方法:

对于关联类逻辑处理以及方法调用

题量:

三次题量依次增加,总体较大,对于不熟悉题目的学生需要花费数个小时解决甚至数十个小时

难度:

<2>设计与分析:

答题判-1:

这段代码实现了一个简单的答题系统,包括输入题目信息、学生答案以及判断答案是否正确,并输出结果。以下是对代码设计与分析的主要内容:

设计解释:

Question 类:Question 类表示问题,包括标准答案、学生答案、题型和内容等属性。

Answer 类:Answer 类包含学生的答案信息,使用 HashMap 存储学生的答案和是否正确的信息,并包含一个 Paper 对象用于管理试卷。

Paper 类:Paper 类表示试卷,包括试题总数、试题数组、题目答案和题目内容等信息。提供了设置试题总数的方法 settatal(int sum)。

Main 类:Main 类包含主程序入口,实现了问卷调查系统的逻辑。在主方法中,首先读取输入的试题数量,然后逐个读取每道题目的内容、类型和标准答案,并存储在 Answer 对象中。接着读取学生的答案,比较学生答案与标准答案是否一致,并将结果存储在 trues 中。最后输出题目内容、学生答案和正确与否的信息。

1.类设计:

Question 类:表示题目,包括题目内容、标准答案和题目类型。
Paper 类:代表试卷,包括题目数量、题目数组、题目答案和题目内容等信息。
Answer 类:表示学生答案,包括学生的每道题答案、是否正确以及试卷信息等。

2.关键数据结构:

使用了 HashMap 来存储题目内容、标准答案、学生答案以及判断每道题的答案是否正确。
HashMap 提供了快速查找和检索功能,方便对题目信息进行管理和处理。

3.输入处理:

使用 Scanner 对用户输入进行处理,包括题目数量、题目内容、学生答案等。
通过 split 方法对输入的字符串进行分割,提取出题目类型、内容和标准答案等信息。

4.题目与答案匹配:

将题目内容、标准答案存储到 Paper 对象中的 HashMap 中,便于后续查找。
将学生的答案存储到 Answer 对象中的 HashMap 中,并通过对比判断是否正确,结果存储在 trues 中。

5.程序逻辑:

程序逻辑清晰,按顺序进行输入处理、匹配答案、输出结果。
通过对每一步的处理,完成了整个答题系统的功能。

答题判-2:

这段代码实现了一个更为复杂的考试系统,包括题目类、试卷类、答题类等,通过输入题目信息、试卷信息和学生答题信息,最终计算学生的得分并输出结果。以下是对代码的设计与分析:

设计解释

Question 类:Question 类表示试题,包含试题编号、内容和答案等属性。构造函数初始化试题对象,提供了获取试题编号、内容和答案的方法。

TestPaper 类:TestPaper 类表示试卷,包括试卷编号和题目编号与分数的映射关系。构造函数初始化试卷对象,提供了添加题目分数、获取试卷编号和题目分数映射关系的方法。

Answerpaper 类:Answerpaper 类表示答题卷,包含答案和试卷编号等属性。使用 ArrayList 存储答案,提供了添加答案和获取答案列表的方法。

Main 类:Main 类是程序的入口,实现了试卷评分的逻辑。在主方法中,首先使用 Scanner 读取输入内容,根据输入内容分别构建题目、试卷和答题卷对象。然后根据试卷的题目分数映射关系,逐题比对答案并计算得分,最后输出每题的内容、答案及是否正确,并输出总分。

1.类设计:

Question 类:表示题目,包括题目编号、内容和答案。
TestPaper 类:代表试卷,包括试卷编号和题目编号与分数的映射。
Answerpaper 类:表示学生答卷,包括学生答案和试卷编号等信息。

2.数据结构选择:

使用 LinkedHashMap 存储题目、试卷和学生答卷,保持了插入顺序,方便对应关系的建立和查找。
使用 ArrayList 存储学生的得分和学生答案,便于遍历和处理。.

3.输入处理:

通过 Scanner 逐行读取输入内容,并根据不同的标识符 #N:、#T:、#S: 分别处理题目、试卷和学生答卷信息。
根据输入内容构建题目对象、试卷对象和答卷对象,并建立它们之间的对应关系。

4.计算得分:

遍历试卷中的题目,获取学生的答案,与标准答案比较,计算得分。
输出每道题的内容、学生答案、是否正确,并累计总分,最终输出学生的总得分。

5.异常处理:

在检查试卷总分是否为 100 时,如果不为 100,则输出警告信息。
在处理学生答卷时,考虑了试卷不存在和学生答案为空的情况,进行了相应的处理和输出。

6.程序逻辑:

逻辑清晰,按照题目、试卷、学生答卷的顺序进行处理,避免了逻辑混乱和错误。
对每一步操作进行了合理的判断和处理,保证了程序的稳定性和正确性。

答题判-3

这段代码实现了一个更为完善的考试系统,包括题目类、试卷类、答卷类、学生类等,通过输入题目信息、试卷信息、学生信息和学生答题信息,最终计算学生的得分并输出结果。以下是对代码的设计与分析:

设计解释

Question 类:Question 类表示题目,包含题号、内容和标准答案等属性。构造函数初始化题目对象,提供了获取内容和标准答案的方法。

Testpaper 类:Testpaper 类表示试卷,包含试卷编号和题号与分值的映射关系。构造函数初始化试卷对象,提供了添加题目分值、获取试卷编号和题目分值映射关系的方法。

Answerpaper 类:Answerpaper 类表示答卷,使用 ArrayList 存储答案。提供了获取答案列表的方法。

Student 类:Student 类表示学生,包含姓名和学生ID等属性。构造函数初始化学生对象,提供了获取姓名和学生ID的方法。

Main 类:Main 类是程序的入口,实现了试卷评分的逻辑。在主方法中,首先使用 Scanner 读取输入内容,根据输入内容构建题目、试卷、答卷和学生对象。然后根据试卷的题目分值映射关系,逐题比对答案并计算得分,输出每题的内容、答案及是否正确,最后输出学生的总分。

在代码中还包含了一些功能,如检查试卷总分是否为 100 分、删除指定题目、检查学生是否存在等。

1.类设计:

Question 类:表示题目,包括题号、内容和标准答案。
Testpaper 类:代表试卷,包括试卷编号和题号与分值的映射。
Answerpaper 类:表示学生答卷,包括学生的回答。
Student 类:表示学生,包括姓名和学生ID。

2.数据结构选择:

使用 LinkedHashMap 存储题目、试卷、学生答卷等信息,保持了插入顺序,方便对应关系的建立和查找。
使用 ArrayList 存储学生信息、删除的题目、学生得分等,便于遍历和处理。

3.输入处理:

通过 Scanner 逐行读取输入内容,并根据不同的标识符 #N:、#T:、#S:、#X:、#D: 分别处理题目、试卷、学生信息、学生答卷和删除题目信息。
根据输入内容构建题目对象、试卷对象、学生对象和答卷对象,并建立它们之间的对应关系。

4.计算得分:

遍历试卷中的题目,获取学生的答案,与标准答案比较,计算得分。
输出每道题的内容、学生答案、是否正确,并累计总分,最终输出学生的总得分。

5.异常处理:

在检查试卷总分是否为 100 时,如果不为 100,则输出警告信息。
在处理学生答卷时,考虑了试卷不存在、学生不存在、答案为空、题目被删除等情况,进行了相应的处理和输出。

6.程序逻辑:

逻辑清晰,按照题目、试卷、学生信息、学生答卷和删除题目的顺序进行处理,避免了逻辑混乱和错误。
对每一步操作进行了合理的判断和处理,保证了程序的稳定性和正确性。

<3>踩坑心得:

1.Hashmap的自动排序:



不会按照输入顺序输出,而是按照key大小排序后的顺序,所以如果要按照输入输出顺序不可以采用Hashmap

2.Arraylist的不足返回:



输入1 和2 获取3时会报错,而在map里面将得到返回值

3.用substring获取特殊子字符串substring(A,B)包左不包右



4.map如果要删除元素不能使用增强for

5.对于建立了很多表,应该备注,调用可能会混乱

6.map元素类型不可以是基本数据类型,否则会报错


7.map用put Arrylist用add添加元素


<4>改进建议

1.如果两个数据有强关联性检验使用map集合

2.命名清晰:

确保变量、函数和类的命名具有描述性,能够清晰表达其用途和功能,避免使用缩写或不易理解的名称。

3.模块化设计:

将代码按照功能模块进行划分,每个模块负责一个明确的功能,提高代码的可维护性和复用性。

4.遵循设计原则:

遵循 SOLID 原则,尤其是单一职责原则和开闭原则,确保每个类和方法只负责一项功能,并且代码容易扩展而不需要修改原有代码。

5.优化算法:

对于性能敏感的部分,可以考虑优化算法和数据结构的选择,以提高代码的执行效率。

6.错误处理:

添加必要的错误处理机制,包括异常处理、错误提示等,确保代码能够正确处理各种异常情况。

7.代码注释:

在关键逻辑处添加注释,解释代码的意图和实现细节,帮助他人理解代码并快速定位问题。

8.代码风格:

统一代码风格,包括缩进、命名规范、代码结构等,使代码整体风格一致,易于阅读和维护。

9.测试覆盖:

编写充分的单元测试覆盖各个功能模块,确保代码的正确性和稳定性。
通过以上改进建议,可以使代码更加清晰、健壮、高效,并且易于维护和扩展。

<5>总结:

1.学到了:

1.面向对象编程:

代码中使用了面向对象的思想,定义了题目类(Question)、试卷类(TestPaper)和答题类(Answerpaper),分别用于表示题目、试卷和答题情况,利用类和对象来组织和处理数据。

2.集合和映射:

代码中使用了 Java 的集合类(ArrayList、LinkedHashMap)来存储试题、试卷、答题情况等数据,利用集合来方便地管理和操作数据。

3.输入输出处理:

通过 Scanner 类实现了用户输入的读取,根据输入的指令(以 #N:、#T:、#S: 开头)来解析试题、试卷和答题情况,以及输出处理结果。

4.异常处理:

在代码中进行了一些简单的异常处理,比如判断试卷总分是否为 100 分以及对答案是否为空的处理。

5.逻辑控制和流程设计:

代码通过循环和条件判断实现了试卷的评分逻辑,遍历试卷中的题目,与答卷进行比对,并计算出总分。

6.代码复用和模块化:

通过将功能模块化,每个类封装了特定的功能,提高了代码的可读性和可维护性。

7.代码风格和命名规范:

尽管代码基本上可以运行,但其中存在一些命名不规范、缺少注释等问题,可以进一步改进以提高代码质量。

2.进一步深入:

1.异常处理:

代码中虽然进行了一些简单的异常处理,但可以进一步完善,比如对输入数据的格式进行更严格的检查,以避免输入错误导致程序异常。

2.代码优化:

可以考虑优化代码结构和逻辑,消除重复代码,提高代码的可读性和可维护性。

3.注释和文档:

代码中缺乏注释和文档说明,可以添加注释来解释每个类和方法的作用,以及代码的关键逻辑和思路。

4.单元测试:

可以编写单元测试来验证每个功能模块的正确性,确保代码的稳定性和可靠性。

5.性能优化:

如果处理大量数据或复杂逻辑时,可以考虑对代码进行性能优化,提高程序的执行效率。

6.设计模式:

进一步研究和应用设计模式,如工厂模式、观察者模式等,可以提高代码的灵活性和可扩展性。

7.面向对象设计原则:

学习和理解面向对象设计的原则,如封装、继承、多态等,能够帮助更好地设计和组织代码结构。

3.对教学方面改进:

1.对教师:

希望在讲课时多讲解一些例如Hashmap的方法,通过方法学习能让学生写代码更简便

2.对课堂:

希望课堂内容能更贴切一点实际任务,并且能够很好的对新发布任务中未知的知识进行提醒

3.对作业:

希望能够把时间放宽松一点

4.对线下:

希望能够多组织讨论,让能人发挥自己的光辉给别人,互帮互助,增进友谊

5.对实验:

希望深入探究面向对象程序设计的思想

posted @ 2024-04-21 20:02  肖栋平  阅读(11)  评论(0编辑  收藏  举报
1