题目集1~3的总结

news/2025/3/19 2:08:03/文章来源:https://www.cnblogs.com/zero1223/p/18502370

一:前言:

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块来处理异常。
学习心得:在写题时不能看个大概就直接开始写,应该在反复阅读题目设计好解题思路,画出简易的类图后开始写。
不然在后面调试代码改错时会花费大量时间
建议及意见:希望老师在上课时多讲一些后面大作业可能需要用到的语法和技巧,同时建议能够给出大作业中所有的测试点,有的时候一个测试点需要猜几个小时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/821813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性代数--矩阵 特征值特征向量

本章基调: A是n阶方阵 数λ,存在非零列向量α,Aα=λα则λ是特征值,α是对应于λ的特征向量 λ可以为0,特征向量不能为0 λα−Aα=0(λE−A)α=0 特征矩阵:λE−A特征多项式:|λE−A|特征方程:|λE−A|=0 结论:对应λ的特征向量不是唯一的 但是一个特征向量α只能对…

Go 入门指南:12.3. 文件拷贝

Go 入门指南:12.3. 文件拷贝 原创 吃个大西瓜 Coding Big Tree2024年10月25日 08:01 云南如何拷贝一个文件到另一个文件?最简单的方式就是使用 io 包: 示例 12.10 filecopy.go: // filecopy.gopackage mainimport ( "fmt" "io" "os")func ma…

算法题——执行操作可获得的最大总奖励

3181.执行操作可获得的最大总奖励 题干 给你一个整数数组 rewardValues,长度为 n,代表奖励的值。 最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 : 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。如果 rewardValues[i] 大于 你当前的总奖励…

闲聊项目经理和技术经理的区别

项目经理不一定能干好技术经理的活,技术经理可以朝项目经理发展关于项目经理 项目经理给人的感觉,有种一个人事无巨细的带一票人打江山的感觉。 项目合同要负责、项目具体需求要负责、项目人员分配要负责、项目实施要指挥……等等 管理心态,是关键;不懂技术,可以;不懂全局…

为什么HashMap是线程不安全的

HashMap是线程不安全的数据结构,主要原因是它的操作不是原子性的,导致在多线程环境下可能出现竞态条件。竞态条件是指多个线程以不正确的顺序访问共享资源,导致结果的不确定性和不一致性。同时对HashMap进行修改时,可能导致数据损坏和不一致。为了解决这个问题,可以使用线…

高效实现聚水潭奇门售后单集成到MySQL的关键技术

聚水潭奇门数据集成到MySQL:售后单数据的高效对接方案 在企业数据管理中,如何实现不同系统之间的数据无缝对接一直是一个关键问题。本文将分享一个具体的技术案例,即如何通过轻易云数据集成平台,将聚水潭奇门的售后单数据高效集成到MySQL数据库中,形成BI狄菲俪诗-售后表。…

地理空间智能与人工智能:开启未来地图的智慧之门

在信息爆炸的21世纪,地理空间智能与人工智能的深度融合正以前所未有的方式重塑我们对世界的认知与管理。当AI遇上GIS(地理信息系统),两者碰撞出的火花不仅照亮了地理信息处理的未来,更是在城市管理、环境保护、灾害响应、商业分析等多个领域开辟了全新的可能性。今天,让我…

高效集成:聚水潭采购入库数据导入MySQL案例

聚水潭数据集成到MySQL的技术案例分享 在企业数据管理中,如何高效、准确地将业务系统的数据集成到分析平台是一个关键问题。本篇文章将聚焦于一个具体的系统对接集成案例:将聚水潭的采购入库单数据集成到MySQL数据库中,以便在BI勤威平台上进行进一步的数据分析和处理。 案例…

springboot监听器的使用(ApplicationListener、SmartApplicationListener、@EventListener)

Springboot监听器的使用(ApplicationListener、SmartApplicationListener、@EventListener) https://blog.csdn.net/m0_54355172/article/details/128592476 目录前言 1. ApplicationListener1. 简单的全局监听 2. 定时任务 3. 监听自定义事件2. SmartApplicationListener1…

wordpress接入腾讯云COS,50G月免费流量

对象存储COS是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景,适用于网站需要实时访…

千兆网卡与万兆网卡区别是什么

千兆网卡与万兆网卡区别:一、传输速度区别;二、物理接口区别;三、传输距离区别;四、价格区别;五、功耗区别;六、适用场景区别。传输速度区别在于,千兆网卡的传输速度为1 Gbps,而万兆网卡的传输速度为10 Gbps。一、传输速度区别 千兆网卡,也称为千兆以太网卡,其传输速…

Java的list.forEach方法和foreach效率有区别吗

Java的list.forEach方法与传统的foreach循环在许多场景中都被广泛应用,它们的区别主要有:1、工作原理;2、性能比较;3、实际应用中的考量;4、使用场景的建议。foreach循环也是基于Iterator的,它提供了一种更加简洁的语法来迭代集合中的元素。1、工作原理 list.forEach方法…