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.对实验:
希望深入探究面向对象程序设计的思想