题目集1~3的总结
一:前言:
1.知识点:主要包括类和对象的使用、数据封装、方法的定义和使用、数组操作、字符串处理、正则表达式,以及基本的输入输出操作,每次题集的最后一题对于字符串的处理的要求都比较细致,有很多需要考虑的细节,这部分在后面详细介绍。
2.题量:每次题目集的题目量都比较适中,不多不少
3.难度:除了最后一题外难度都比较适中,最后一题的难度较大,每次都要7.8小时及以上
二:设计与分析:
第一次作业:
答题判题程序-1:本题要求实现一个简单的答题判题程序,包括题目的输入、试卷的输入,答案的提交、以及答案的校验和输出。
解题思路:设计了四个类:
Question 类
属性:number(题目编号)、content(题目内容)、standardAnswer(标准答案)
方法:构造函数、getter方法、checkAnswer方法用于检查答案是否正确
功能:表示一个题目,包含编号、内容和标准答案,并能检查给定的答案是否正确
Exam 类
属性:count(题目数量)、questions(题目数组)
方法:构造函数、judgeAnswer方法用于判断特定题目的答案是否正确、saveQuestion方法用于保存题目
功能:表示一次考试,包含多个题目,并能对答案进行校验
AnswerPaper 类
属性:exam(考试对象)、answerList(答案列表)、judgeList(答案校验结果列表)
方法:构造函数、check方法用于检查特定题目的答案是否正确、output方法用于输出题目、答案和校验结果
功能:表示一份答题卡,包含答案和校验结果,并能输出这些信息
Main 类
方法:main方法,程序的入口点
功能:读取题目和答案,创建考试和答题卡对象,然后输出答案和校验结果
代码流程分析
读取题目数量:通过Scanner读取题目数量n。
读取题目信息:循环读取n个题目的信息,包括编号、内容和标准答案,并创建Question对象保存到Exam对象中。
读取答案:读取答案信息,并通过split方法分割成数组。
创建答题卡对象:使用考试对象和答案数组创建AnswerPaper对象。
输出答案和校验结果:调用AnswerPaper对象的output方法输出题目、答案和校验结果。
类图
第二次作业:
答题判题程序-2:实现了一个考试系统,涵盖了题目管理、考试管理、成绩管理和学生答案管理等功能
解题思路:设计了十个个类:
Question 类
属性:
int number: 题目编号
String content: 题目内容
String StandarAnswer: 标准答案
方法:
构造方法和 checkAnswer 方法用于检查学生的答案是否正确。
功能:表示单个题目。
QuestionList 类
属性:
Question[] questionsList: 存储题目的数组
方法:
saveQuestion: 保存题目到数组中。
功能:管理题目列表。
Exam 类
属性:
int id: 考试编号
Question[] questions: 存储考试题目的数组
方法:
addQuestion: 向考试中添加题目。
judgeAnswer: 判断学生的答案是否正确。
功能:表示一次考试。
Examlist 类
属性:
Exam[] examList: 存储考试的数组
方法:
saveExam: 保存考试到数组中。
功能:管理考试列表。
sco 类
属性:
int scoredata: 分值
int id: 题目编号
功能:表示每道题目的分值。
Score 类
属性:
int totalScore: 总分
sco[] scores: 存储分值的数组
方法:
save: 保存分值并更新总分。
功能:管理考试的分数。
ScoreList 类
属性:
Score[] scoreList: 存储分数的数组
方法:
saveScore: 保存分数到数组中。
功能:管理分数列表。
AnswerList 类
属性:
String[] StudentAnswers: 存储学生答案的数组
方法:
saveAnswers: 保存学生答案。
功能:管理学生的答案。
AnswerPaper 类
属性:
AnswerList[] AnswerPapers: 存储答卷的数组
方法:
saveAnswerPaper: 保存答卷。
功能:管理所有答卷。
Main 类
功能:程序入口,负责调用数据输入、分数判断和答卷比较的功能。
数据流分析
输入数据:
使用 Scanner 读取输入数据,支持题目、考试和学生答案的输入。
数据格式通过特定的前缀(如 #N:、#T:、#S:)进行区分。
数据处理:
通过 extractContent 方法提取题目内容、答案等信息。
将提取的数据封装到相应的类中(如 Question、Exam、Score 等)。
分数判断:
judgeScore 方法检查每份试卷的总分是否为100,并输出相应信息。
答卷比较:
comparePaper 方法遍历学生的答案,比较每道题目的答案是否正确,并输出分数。
类图
第三次作业:
答题判题程序-3:实现了一个考试系统,涵盖了题目管理、考试管理、成绩管理和学生答案管理等功能
解题思路:设计了八个类
类设计分析
Question 类
属性:
int number: 题目编号
int score: 题目分数
int getscore: 学生获得分数
String content: 题目内容
String StandarAnswer: 标准答案
int flag: 题目有效性标志
方法:
构造方法和 checkAnswer 方法用于检查学生的答案是否正确。
QuestionList 类
属性:
Question[] List: 存储题目的数组
方法:
saveQuestion: 保存题目到数组中
Exam 类
属性:
int id: 考试编号
Question[] questions: 存储考试题目的数组
int totalScore: 总分
方法:
addQuestion: 向考试中添加题目。
judgeAnswer: 判断学生的答案是否正确。
ExamList 类
属性:
Exam[] exams: 存储考试的数组
方法:
saveExam: 保存考试到数组中。
Student 类
属性:
String sid: 学生编号
String sname: 学生姓名
StudentData 类
属性:
Student[] sList: 存储学生的数组
方法:
saveStudent: 保存学生到数组中。
AnswerPaper 类
属性:
int Aid: 答卷编号
String Sid: 学生编号
String[] answers: 存储学生答案的数组
int[] ids: 存储题目编号的数组
方法:
saveAnswer: 保存学生答案。
setid: 设置答卷编号和学生编号。
DeleteQues 类
属性:
int[] deles: 存储要删除的题目编号的数组
方法:
savedel: 保存要删除的题目编号。
类图
数据流分析
输入数据:
使用 Scanner 读取输入数据,支持题目、考试、学生和答卷的输入。
数据格式通过特定的前缀(如 #N:、#T:、#S:、#X:、#D:)进行区分。
数据处理:
通过 extractContent 方法提取题目内容、答案等信息。
将提取的数据封装到相应的类中(如 Question、Exam、Student 等)。
删除题目:
DeleteQuestion 方法根据删除列表 DeleteQues 删除题目。
分数判断:
JudgeScore 方法检查每份试卷的总分是否为100,并输出相应信息。
答卷比较:
CompareAnswer 方法遍历学生的答案,比较每道题目的答案是否正确,并输出分数。
三:采坑心得:
第一次作业:
1.在处理字符串,提取题目的编号,内容,标准答案时出错
代码如下:
使用indexOf记录#N:,#Q:,#A:,然后用substring提取#N:到#Q:,#Q:到#A:,#A:之后的内容时出错,未考虑#N:本身的长度,导致提取的内容出错
测试时报错如下:
解析:这个异常 java.lang.NumberFormatException 发生在尝试将字符串转换为整数时,如果字符串不是有效的整数格式,就会抛出这个异常。代码中,异常是在 Main 类的 main 方法的第88行抛出的,这是因为 Integer.parseInt 方法接收了一个不能解析为整数的字符串。根据异常信息 For input string: "#N:1",我们可以看到问题出现在尝试将字符串 "#N:1" 转换为整数时。这个字符串显然是不符合整数格式的,因为它包含了非数字字符。
要解决这个问题,需要确保传递给 Integer.parseInt 方法的字符串只包含数字。
代码修改后:
这次代码在使用indexOf时,加上了#N:本身的长度,这样用substring提取的数据就是准确的
2.未考虑题号顺序与输入顺序不同
导致答案校验的结果错误
输入:
2
//#N:2 #Q:1+1= #A:2
//#N:1 #Q:5+5= #A:10
//#A:10 #A:2
//end
预计输出:
5+5=~10
1+1=~2
true true
实际输出:
1+1=~10
5+5=~2
false false
修改代码,在保存题目和校验答案输出时,按照题号来对应答题卡中的答案,然后给出相应的的输出
第二次作业:
1.未考虑到答卷可以为空,(#S:2)
这样提取到的a是错误的无法转化为int类型
报错如下:
这个异常 java.lang.NumberFormatException 发生时,通常意味着尝试将一个空字符串或非数字字符串转换为整数。在您提供的代码中,异常是在 Main 类的 InputData 方法的第218行抛出的,这通常是因为 Integer.parseInt 方法接收到了一个空字符串或者不包含有效数字的字符串。
修改代码:
增加一个判断,答卷是否为空,若为空答卷的编号则为#S:后面的字符,若不为空为为#S: - #A:之间的字符,然后再转换为int类型
同时增加对答案的判断,若不为空则保存
第三次作业:
1.未考虑到输入的字符串的格式错误,将错误的内容存储
导致答案错误
增加正则表达式来判断输入的字符串格式是否正确
2.在增加了正则表达式之后,未考虑到,空白卷 没有答案的试卷,答案为空字符等问题,导致在提起信息并存储的时候出错,然后在后面校验答案时出现数组越界的错误
修改正则表达式,并在处理数据时增加对空白卷等情况的判断
3.在处理无效的试卷引用时,一开始考虑的是遍历答卷,来判断试卷是否有对应的答卷导致错误,
后面修改为遍历试卷,看是否有与答卷匹配的试卷。并且增加对答卷是否存在的判断
用flat来记录是否有匹配的试卷,并用brr记录所匹配到的试卷的编号
四:改进建议:
第一次作业:
异常处理:代码中没有对输入进行异常处理,例如输入的不是整数或者输入的格式不正确。应该添加异常处理来确保程序的健壮性。
输入验证:在读取题目和答案时,应该验证输入的合法性,例如题目编号是否重复,答案是否为空等。
代码重构:AnswerPaper类的output方法中,输出题目和答案的循环可以合并,减少代码的重复。
数据结构优化:Exam类中的questions数组使用编号作为索引可能不是最优选择,因为编号可能不是连续的。可以考虑使用HashMap来存储题目。
代码清晰性:Main类中的main方法过长,可以考虑将其拆分为几个小方法,每个方法负责一个特定的功能,以提高代码的可读性和可维护性。
第二次作业:
异常处理:增加输入验证和异常处理,确保输入数据的格式正确,避免程序崩溃。
数据结构优化:使用 ArrayList 替代数组,以便动态管理题目、考试和答案的数量,避免频繁的数组复制。
代码重构:将重复的代码提取为方法,增加代码的可读性和可维护性。
第三次作业:
改进建议和前两次一致
五:总结:
本阶段的三次题目集涵盖了Java编程的多个方面,包括面向对象编程、数据结构、异常处理、正则表达式、输入输出处理等。
通过这三次的题目,我学会了数组的动态增长,对字符串的处理,split,trim,substring,indexof等方法,学会了面向对象的思想,
接下来应该深入学习Java集合框架,包括List、Set、Map等接口及其实现类,了解它们的用途和性能特点,还需要学习异常处理:
学习如何自定义异常,并在代码中合理使用try-catch-finally块来处理异常。
学习心得:在写题时不能看个大概就直接开始写,应该在反复阅读题目设计好解题思路,画出简易的类图后开始写。
不然在后面调试代码改错时会花费大量时间
建议及意见:希望老师在上课时多讲一些后面大作业可能需要用到的语法和技巧,同时建议能够给出大作业中所有的测试点,有的时候一个测试点需要猜几个小时。