题目集 1 - 3 总结性

news/2025/3/16 2:08:59/文章来源:https://www.cnblogs.com/liuwei7312/p/18504281

一、前言
在过去的一段时间里,我们完成了三次题目集的挑战。这三次题目集涵盖了丰富的知识点,题量和难度也各有不同。
(一)知识点概述
题目集 1 主要涉及 Java 的面向对象编程基础,包括类的定义、对象的创建和方法的调用。在这个题目集中,我们学会了如何使用类来封装数据和行为,以及如何通过对象之间的交互来实现特定的功能。
题目集 2 在题目集 1 的基础上,进一步深入了面向对象编程的概念,同时引入了数据结构的使用。我们学会了如何使用列表(List)和映射(Map)等数据结构来存储和管理数据,提高了程序的效率和可维护性。
题目集 3 则更加注重综合能力的考查,涵盖了面向对象编程、数据结构、异常处理等多个方面的知识。我们学会了如何处理复杂的业务逻辑,以及如何进行代码的优化和改进。
(二)题量分析
题目集 1 的题量相对较少,主要集中在实现一个简单的考试系统,包括问题的添加、用户答案的存储和结果的检查等功能。
题目集 2 的题量有所增加,除了实现试卷的创建、问题的添加和答案的检查等功能外,还需要检查试卷总分是否为 100 分,以及输出每个学生的得分情况。
题目集 3 的题量最大,除了包含题目集 2 的所有功能外,还增加了学生学号和姓名的管理、格式错误检查以及被删除题目的处理等功能。
(三)难度分析
题目集 1 的难度相对较低,主要涉及 Java 的面向对象编程基础,对于有一定编程基础的学生来说比较容易上手。
题目集 2 的难度有所增加,需要学生掌握更多的面向对象编程概念和数据结构的使用方法。同时,还需要学生具备一定的问题分析和解决能力,才能正确地实现试卷的创建、问题的添加和答案的检查等功能。
题目集 3 的难度最大,需要学生综合运用所学的知识,包括面向对象编程、数据结构、异常处理等,才能正确地实现程序的所有功能。同时,还需要学生具备较强的问题分析和解决能力,以及良好的编程习惯和代码规范意识。
二、设计与分析
(一)题目集 1 的设计与分析
整体架构:题目集 1 实现了一个简单的考试系统,由Inquiry、ExaminationSystem和ResponseSheet三个主要类组成。Inquiry类代表问题,包含问题编号、内容描述和标准响应值等属性。ExaminationSystem类负责管理问题集,提供添加问题、检查答案和获取问题等方法。ResponseSheet类用于处理用户的答案,包括存储答案、检查答案和打印最终结果等功能。
类图

顺图

代码分析:
以Inquiry类为例,其构造函数public Inquiry(int identificationNumber, String contentDescription, String standardResponseValue) { this.identificationNumber = identificationNumber; this.contentDescription = contentDescription; this.standardResponseValue = standardResponseValue; }清晰地初始化了问题的各个属性。
ExaminationSystem类中的addQuestion方法,public void addQuestion(int number, String questionText, String answer) { questionSet.put(number, new Inquiry(number, questionText, answer)); }将问题添加到问题集中,利用了HashMap的数据结构来高效存储问题。
ResponseSheet类的checkAnswerForGivenNumber方法,public boolean checkAnswerForGivenNumber(int number) { Inquiry question = exam.getQuestionByNumber(number); if (question!= null) { boolean result = question.verifyUserResponse(userResponses.get(number)); resultStatuses.put(number, result); return result; } return false; }实现了检查特定问题答案的功能,通过调用其他类的方法进行协同工作。
(二)题目集 2 的设计与分析
整体架构:题目集 2 进一步扩展了考试系统,增加了试卷的概念。由Question、TestPaper和Answer三个类组成。Question类表示问题,TestPaper类代表试卷,包含试卷编号、问题顺序和问题分数等信息。Answer类用于存储学生的答案。
类图

顺序图

代码分析:
TestPaper类的addQuestion方法,public void addQuestion(int questionNumber, int score) { questionOrder.add(questionNumber); questionsAndScores.put(questionNumber, score); totalScore += score; }不仅将问题添加到试卷中,还动态更新了试卷的总分。
Answer类的addAnswer方法,public void addAnswer(String answer) { answers.add(answer.trim()); }将学生的答案添加到答案列表中,并去除了答案中的前导和尾随空格,提高了数据的准确性。
(三)题目集 3 的设计与分析
类图

顺序图

(一)整体架构
题目集 3 的代码实现了一个较为复杂的考试系统,包括问题的管理、试卷的创建、学生答案的处理以及各种错误情况的检查和处理。主要涉及以下几个类:
Question:表示问题,包含问题编号、内容和答案等属性。
TestPaper:代表试卷,包含试卷编号、问题顺序、问题和分数的映射以及总分等属性。
Answer:用于存储学生的答案,包括试卷编号、学生学号和每个问题的答案映射。
Main:程序的入口点,负责读取输入、处理数据和输出结果。
(二)代码详解
Question类
代码示例:
class Question {
int number;
String content;
String answer;

public Question(int number, String content, String answer) {this.number = number;this.content = content;this.answer = answer.trim();
}

}
分析:这个类非常简洁,定义了三个属性分别表示问题的编号、内容和答案。构造函数用于初始化这些属性,其中对答案进行了去除前导和尾随空格的处理,确保答案的准确性。例如,如果答案是 "answer",经过处理后变为 "answer"。
TestPaper类
代码示例:
class TestPaper {
int number;
List questionOrder;
Map<Integer, Integer> questionsAndScores;
int totalScore;

public TestPaper(int number) {this.number = number;questionOrder = new ArrayList<>();questionsAndScores = new HashMap<>();this.totalScore = 0;
}public void addQuestion(int questionNumber, int score) {questionOrder.add(questionNumber);questionsAndScores.put(questionNumber, score);totalScore += score;
}public int getTotalScore() {return totalScore;
}

}
分析:
属性部分:
number表示试卷编号,用于唯一标识一份试卷。
questionOrder是一个列表,用于保存试卷中问题的顺序,按照添加问题的顺序存储问题编号。
questionsAndScores是一个映射,将问题编号与该问题的分数对应起来,方便快速查找特定问题的分数。
totalScore表示试卷的总分,初始值为 0,在添加问题时动态计算更新。
构造函数:初始化试卷编号和相关的数据结构,为后续的问题添加和分数管理做准备。
addQuestion(int questionNumber, int score)方法:将问题编号添加到questionOrder列表中,同时将问题编号和对应的分数存入questionsAndScores映射中,并更新总分。例如,添加一个问题编号为 1,分数为 10 的问题,会将 1 添加到questionOrder,在questionsAndScores中存入键值对 (1, 10),并将总分增加 10。
getTotalScore()方法:简单地返回试卷的总分,方便在其他地方获取试卷总分进行检查和输出。
Answer类
代码示例:
class Answer {
int testPaperNumber;
String studentId;
Map<Integer, String> answers;

public Answer(int testPaperNumber, String studentId) {this.testPaperNumber = testPaperNumber;this.studentId = studentId;answers = new HashMap<>();
}public void addAnswer(String input) {String[] parts = input.split("-");int questionNumber = Integer.parseInt(parts[0]);String answer = parts[1].trim();answers.put(questionNumber, answer);
}

}
分析:
属性部分:
testPaperNumber表示该答案所属的试卷编号,用于关联答案和特定的试卷。
studentId是学生的学号,用于标识回答该试卷的学生。
answers是一个映射,将问题编号与学生对该问题的答案对应起来,方便快速查找特定问题的学生答案。
构造函数:传入试卷编号和学生学号,初始化答案对象,并创建用于存储答案的映射。
addAnswer(String input)方法:解析输入字符串,通过split("-")方法将字符串按照 "-" 分割成两部分,第一部分是问题编号,转换为整数类型;第二部分是答案内容,去除前导和尾随空格后存入映射中。例如,输入 "1-answer",会将问题编号 1 和答案 "answer" 存入映射中。
三、采坑心得
(一)题目集 1 的采坑心得
问题描述:在实现题目集 1 的过程中,遇到了如何正确地验证用户答案的问题。一开始直接比较用户答案和标准响应值的字符串,发现会出现大小写不敏感的问题。
解决方法:通过查阅资料,使用equalsIgnoreCase()方法进行大小写不敏感的比较,解决了这个问题。
心得与体会:遇到问题要保持冷静,仔细分析原因,通过查阅资料和调试代码来解决问题。同时,要养成良好的编程习惯,提高代码的可读性和可维护性。
(二)题目集 2 的采坑心得
问题描述:在实现题目集 2 的过程中,如何正确地检查试卷总分是否为 100 分成为了一个难题。一开始直接在addQuestion方法中累加每个问题的分数,然后在getTotalScore方法中返回总分,但是发现如果一个问题被添加了多次,总分就会不正确。
解决方法:在addQuestion方法中先判断问题是否已经存在,如果存在则不添加,否则才添加。同时,在getTotalScore方法中重新计算总分,而不是直接返回累加的结果。
心得与体会:要仔细分析问题的需求,设计合理的算法和数据结构来解决问题。进行充分的测试,确保代码的正确性和稳定性。
(三)题目集 3 的采坑心得
问题描述:在实现题目集 3 的过程中,如何正确地处理格式错误是一个挑战。一开始只是简单地输出错误信息,导致程序的可读性和可维护性很差。后来使用异常处理机制,将格式错误作为异常抛出,但还是会出现一些问题,比如如果一个输入行包含多个格式错误,只会抛出第一个错误,而忽略其他错误。
解决方法:在main方法中使用一个循环来逐个检查输入行的格式,如果发现格式错误,则输出错误信息,并继续检查下一行。同时,在异常处理中添加更多的信息,比如错误的行号和错误的内容,以便更好地定位和解决问题。
心得与体会:要充分考虑各种可能的情况,进行全面的测试和调试。学会使用异常处理机制,提高代码的健壮性和可靠性。
四、改进建议
(一)题目集 1 的改进建议
代码优化:在题目集 1 的代码中,可以对一些方法进行优化,比如在verifyUserResponse方法中,可以使用正则表达式来进行更灵活的验证。同时,也可以对ResponseSheet类的printFinalResults方法进行优化,使用更简洁的方式来输出结果。
功能扩展:可以在题目集 1 的基础上进行功能扩展,比如增加问题的分类、难度等级等属性,以及根据不同的分类和难度等级进行问题的筛选和排序等功能。
用户界面:可以为题目集 1 的考试系统添加一个用户界面,使用户可以更加方便地进行操作和查看结果。比如可以使用图形用户界面(GUI)或者命令行界面(CLI)来实现用户界面。
(二)题目集 2 的改进建议
代码优化:在题目集 2 的代码中,可以对一些方法进行优化,比如在TestPaper类的addQuestion方法中,可以使用Set来存储问题编号,避免重复添加问题。同时,也可以对Answer类的addAnswer方法进行优化,使用更高效的方式来存储学生答案。
功能扩展:可以在题目集 2 的基础上进行功能扩展,比如增加试卷的类型、考试时间等属性,以及根据不同的类型和时间进行试卷的生成和管理等功能。
数据存储:可以将题目集 2 的数据存储到文件或者数据库中,以便长期保存和管理。同时,也可以使用文件或者数据库来实现数据的备份和恢复等功能。
(三)题目集 3 的改进建议
代码优化:在题目集 3 的代码中,可以对一些方法进行优化,比如在Main类的main方法中,可以使用更高效的方式来读取输入和处理数据。同时,也可以对Answer类的addAnswer方法进行优化,使用更简洁的方式来存储学生答案。
功能扩展:可以在题目集 3 的基础上进行功能扩展,比如增加学生的成绩统计、排名等功能,以及根据不同的条件进行成绩的查询和分析等功能。
五、总结
通过这三次题目集的挑战,我学到了很多知识和技能。在面向对象编程方面,我学会了如何定义类、创建对象和调用方法,以及如何使用封装、继承和多态等面向对象编程的特性。在数据结构方面,我学会了如何使用ArrayList、HashMap和Set等数据结构来存储和管理数据,提高了程序的效率和可维护性。在问题分析和解决方面,我学会了如何分析问题的需求,设计合理的算法和数据结构来解决问题,以及如何进行充分的测试和调试,确保代码的正确性和稳定性。
同时,我也认识到了自己在编程方面的不足之处。比如,我的编程习惯还不够好,代码的可读性和可维护性还有待提高。我的问题分析和解决能力还不够强,有时候需要花费很长时间才能找到问题的根源。我的代码优化和改进能力还不够高,有时候不能想出更好的算法和数据结构来提高程序的效率和性能。
在今后的学习和实践中,我将更加努力地学习编程知识和技能,提高自己的编程水平。我将养成良好的编程习惯,提高代码的可读性和可维护性。我将加强问题分析和解决能力的训练,提高自己的问题分析和解决能力。我将不断地进行代码的优化和改进,提高程序的效率和性能。
对于教师、课程、作业、实验、课上及课下组织方式等方面,我也有一些建议和意见。比如,教师可以在课堂上多讲解一些实际的编程案例,让我们更好地理解编程的应用场景和方法。课程可以增加一些编程实践的环节,让我们有更多的机会进行编程练习和项目开发。作业可以更加多样化,包括编程作业、报告作业和小组作业等,提高我们的综合能力。实验可以更加注重实践操作和问题解决,让我们更好地掌握编程技能和方法。课上及课下组织方式可以更加灵活,比如采用小组讨论、项目展示等方式,提高我们的学习积极性和参与度。
总之,通过这三次题目集的挑战,我收获了很多,也认识到了自己的不足之处。在今后的学习和实践中,我将不断地努力,提高自己的编程水平和综合能力。

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

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

相关文章

2024-2025-1 20241420 《计算机基础与程序设计》第五周学习总结

2024-2025-1 20241420姚金济 《计算机基础与程序设计》第五周学习总结 作业信息 |作业所属课程|<班级链接>https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP |作业要求|<链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05 |这个作业的目标| ①…

《DNK210使用指南 -CanMV版 V1.0》第三十三章 image元素绘制实验

第三十三章 image元素绘制实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k…

zlibrary网址是哪个及zlibrary电脑客户端/app下载

Z-Library是一家电子图书馆,同时也是全球科学图书和学术文献最大的免费资源之一。以下是对Z-Library的详细介绍及使用步骤: 一、Z-Library介绍 资源规模:Z-Library的数字档案库包含超过1400万本书籍,涵盖了广泛的学科领域,使其成为互联网上最为庞大的图书馆之一。 实体书籍…

[ACTF新生赛2020]rome

DIE查壳32位,无壳 32位ida打开 界面很难看,按\后得到加密程序关注这个while循环,明明是个循环16次,但却v1却只有四个元素 从声明变量这里可以看到v1是int数组,每个元素占四字节梳理一下逻辑,v1是我们需要求的flag,也就是传入的数据,这里通过第一个while循环进行了两次i…

第二章 实验任务

第一题 写入内存修改CS和IP执行(此处没把输入的全部指令都执行,只是做个演示,执行了前面几条)第二题 写入内存:修改CS和IP:执行:最后,AX=0010,即算出 第三题最后一行显示出了日期,但是这并不是电脑真正的生产日期。 这个是在DOSBOX模拟器上运行的,并不是真正的电脑环…

第一集 计算机早期历史

001 计算机渗透进入生活方方面面,我们不是第一次遇到推动全球发展的科技, 工业革命生产能力提高,大幅提升农业、工业、畜牧业的规模,机械化导致更多收成更多商品可以被大批量生产,旅行通讯能更快更好,生活质量得到提升 计算机与工业革命有一样的影响,自动化农业和医疗设…

图解:什么是多租户?

大家好,我是汤师爷~ 什么是多租户? 多租户是SaaS(软件即服务)领域里特有的一个概念。在SaaS服务中,“租户”指的就是使用这个SaaS系统的客户。 那么租户和用户有什么区别呢?举个例子。假设你正在使用一款面向企业(ToB)的SaaS产品,"用户"通常指的是公司里实际…

samtools flagstat参数对比对的bam文件进行统计

001、命令samtools flagstat sample_name.sorted.bam > sample_name.flagstat.txt a、生成的文件是一个包含16行的文本文件: 002、(base) [b20223040323@admin2 workdir]$ cat Asiatic1.flagstat.txt ## 查看统计结果 622520785 + 0 in total (QC-passed reads + Q…

Prometheus源码专题精讲——监控系统 Prometheus 2.x/3.x 源码阅读和分析

监控系统 Prometheus 2.x/3.x 源码阅读和分析 自2014年3月左右Prometheus的首个公开版本0.1.0发布以来 https://github.com/prometheus/prometheus/tree/0.1.0,距离当前已经 11 years ago。 在这期间,Prometheus及其生态系统,如Thanos等,已经在分布式监控领域占据了举足轻…

数据库 表单运用

一、进入数据库操作界面 1、mysql -u root -p 敲回车 ,输入密码 ,进入数据库操作界面 2、show databases 查看所有的数据(如果没有数据库:创建数据库 create database 库名称) 3、use 数据库名 使用数据库 4、show tables 显示库中的所有表 5、建表语句…

Cypress实现拖拽

使用Cypress内置的trigger方法实现拖拽一个元素到另一个同类型元素,实现排序Typescript实现方法: export function dragAndDrop(sourceLocator: string, targetLocator: string) {const dataTranferMock = { setData: () => {}, setDragImage: () => {} }cy.get(source…

js逆向实战之某市场监管公告服务平台返回数据解密

声明:本篇文章仅用于知识交流分享,不用于其他用途 练习网站:https://jzsc.mohurd.gov.cn/data/company 解密过程分析访问网站,随便选择一个区域,点击查询,看触发哪些数据包。只有一个数据包,且其响应数据一看就是经过加密的。 有经验的人就会条件反射是拦截器,全局搜索…