题目集1~3的总结

zero1223 2024-10-26 08:09:00 阅读 66

一:前言:

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块来处理异常。

学习心得:在写题时不能看个大概就直接开始写,应该在反复阅读题目设计好解题思路,画出简易的类图后开始写。

不然在后面调试代码改错时会花费大量时间

建议及意见:希望老师在上课时多讲一些后面大作业可能需要用到的语法和技巧,同时建议能够给出大作业中所有的测试点,有的时候一个测试点需要猜几个小时。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。