首页 > 其他分享 >BLOG-1

BLOG-1

时间:2024-10-26 18:42:25浏览次数:1  
标签:存储 题目 读取 试卷 BLOG 对应 输入

一.前言
1.知识点:
(1)因为这三个题目集的最后一题大致内容都是差不多的,只是细节有一点点改变,所以这三个题目是需要迭代的,我们要学会面向对象编程,要使用类的设计思想来做,让代码可以实现复用。
(2)因为题目集的最后一题的题目,试卷,答卷,学生的内容输入都是需要对应的格式,如果格式不对,还需要输出错误信息,所以在读取各种输入的时候我们需要使用正则表达式来规范输入的形式,同时将对应准确的信息读取保存起来。
(3)采用HashMap来存储一些类的元素,因为有一些类它有两个变量是一一对应的,所以我们可以采用HashMap来存储,从而让存储的元素以键值对的形式存在,其中每个键都是唯一的,可以通过键来快速访问对应的值。
(4)采用链表来存储多个题目,试卷,答卷和学生,因为题目,试卷,答卷和学生都不可能是只有一个的,所以我们可以通过定义对应类型的链表将对应信息存储下来,在需要使用的时候可以快速的将其取出。
(5)采用 Scanner 类来处理用户输入,从控制台读取用户输入的题目,试卷,答案和学生等相关信息。

2.题量:
这三次题目集的题量总的来说不是特别大,但是其中类的设计以及如何将各个类运用起来还是需要花一些心思,所以起码还是要花费三个小时以上才能完成一个题目集。

3.难点:
这三次题目集的主要难点都集中在最后一题。因为它并不是一次写完就没了,这三个最后一题的核心内容几乎没有变,只是一些细节发送了改变,所以主要难点就是如何让代码可以迭代使用,不然的话你每写一次最后一题,代码都要大改,那就会白白浪费很多的时间。同时如何正确的使用正则表达式来规范输入格式也是一大难点,因为本身正则表达式就相对比较复杂,要想正确的使用它还是要花一些心思去研究它。
二.设计与分析
1.答题判题程序-1
针对题目内容,我设计了三个类分别是:
(1)Topic类:用于存储题目的题号,内容和标准答案,同时根据标准答案对答案进行批改。
(2)Test类:用于存储题目和题目数量,可以将用户输入的题目全部存储起来并且通过调用Topic类的答案批改函数对所有的题目进行批改。
(3)Answer类:用于存储试卷,能够读取并存储用户输入的试卷和答卷,并在批改完试卷后将对应的信息进行输出。

对应类图如下:

对应时序图如下:

Topic类主要执行的功能除了存储题目的相关内容,就是将用户输入的答案与标准答案进行比较。

Answer类主要执行的功能就是在readTopics函数和readAnswers函数中通过正则表达式从用户输入中读取正确格式的题目和答卷并存储起来,同时在比较完之后通过print函数将结果输出。

2.答题判题程序-2
针对题目内容,我设计了三个类分别是:
(1)Topic类:用于存储题目的题号,内容和标准答案。
(2)TestPaper类:用于存储试卷编号以及对应题目编号的题目分值。
(3)AnswerPaper类:用于存储试卷编号以及对应试卷中题目的提交答案。
(4)Input类:用于从用户输入中筛选格式正确的输入内容并将它们存储到对应的类中。
(5)Answer类:用于进行改分操作,根据答卷的信息依次找对应的试卷进行批改,并将对应结果输出。

对应类图如下:

对应时序图如下:

因为之前的答题判题程序-1的功能要求比较小,所以我就没有考虑太多类的设计,所以导致我的输入读取和输出都放在了答卷类中,这就导致了我的答卷类的功能太过冗杂,一旦需要修改就要大改,所以这次程序中我将输入读取,批改答卷,输出都单独拿了出来分别做成了一个类。
其中Input类中主要执行的功能就是先定义每一个类的链表用于后续信息读取后的存储,从用户的输入中通过正则表达式筛选出格式正确的信息,再通过格式来判断是属于哪个类并将其存储到对应链表中。

Answer类的主要功能就是从Input类中以及获取的各个链表,筛选出对应信息进行判分操作,在判完分后将结果输出出来。

3.答题判题程序-3
针对题目内容,我设计了三个类分别是:
(1)Topic类:用于存储题目的题号,题目状态,内容和标准答案。
(2)TestPaper类:用于存储试卷编号以及对应题目编号的题目分值。
(3)Student类:用于存储学生的学号和姓名。
(4)AnswerPaper类:用于存储试卷编号,学生学号以及对应试卷中题目的提交答案。
(5)Input类:用于从用户输入中筛选格式正确的输入内容并将它们存储到对应的类中。
(6)Answer类:用于进行改分操作,根据答卷的信息依次找对应的试卷进行批改,并将对应结果输出。

对应类图如下:

对应时序图如下:

因为在上一次题目集中我就已经将输入读取和批改答卷输出结果分别做成了一个类,所以在这次题目中只需要根据题目的一些要求对每个类的一些细节进行更改,但是因为上一个题目集中,我的Input类中对于信息的读取都是采用一个函数搞定,导致一个函数中有一段很长的代码,所以我将每一个类的信息读取分别做成了一个函数,这样不仅排版美观同时还方便进行查错,因为只要发现哪个类的信息读取错误直接去找那个函数就行了。

所以在Input类中我增加了parseTopic,parseTestPaper,parseStudents,parseAnswerPaper,parseDelete函数分别对不同的类的信息进行正则匹配。
同时在Answer类中我为了减少for循环的嵌套,增加了findTestPaper,findTopic函数直接查找相应信息而不用循环遍历来查找。
三. 采坑心得
1.在答题判题程序-1中,我一直在输出答题结果的时候老是会少一个结果后面发现答案结果的数组在循环中应该从i-1开始存储。

点击查看代码
for(int i=1;i<=number;i++){
            answer.judge[i-1]=answer.judgeAnswer(i);
        }
2.在答题判题程序-2中,我的代码一直存在编译错误,发现原来是在TestPaper和AnswerPaper类的有参定义中函数名错误了 ![](/i/l/?n=24&i=blog/3545028/202410/3545028-20241026174657798-2127362374.png) 3.在答题判题程序-2中,我输出的题目顺序一直有错误,这个问题我一直没有搞定,所以我就开始不断地设置断点来进行调试才发现,我从HashMap中读取出来的元素是随机的,跟我刚开始插入的顺序完全不一样,于是我只能上网查找资料才发现HashMap不会保留插入顺序,所以我根据查找的资料将HashMap改成了可以保存插入顺序的LinkedHashMap,最终解决了这个问题。
点击查看代码
private LinkedHashMap<Integer,Integer> topicScores=new LinkedHashMap<>();
4.在答题判题程序-3中,我有一些测试点一直过不去,在用了很多样例之后我发现原来是在题目读取中如果#A后面出现#B,本来应该是要将#B也看成答案的一部分,都是我的程序却无法识别,只会输出它的格式错误,所以我开始对我的正则表达式进行更改,可是我尝试了很多的正则表达式的方法它还是无法识别,只会显示格式错误,一直到最后我都还是没有改出来。

对应代码如下:

点击查看代码 - [ ] ``` else if (parts[0].startsWith("#B:")) {//确保#A后面的都是答案 currentAnswer += " #B:" + parts[1]; } ```
**四. 改进建议** 1.在读取信息的正则表达式上还有待提升,这次只是题目中出现#A后面出现#B这种情况,后续可能别的类的读取也会出现这种情况,我现在大部分类的读取采用的都是用不同的符号将输入内容分割成好几部分,再将我需要读取的内容单独分割出来如何存储起来,这种方法一旦遇到输入内容非常复杂的情况就容易出现错误,尽量直接采用正则表达式进行信息的读取。

2.我的代码可复用性也还是需要提高,因为现在的题目要求还比较简单,如果后面的题目越来越复杂,可能复用起来就会比较麻烦,特别是我的改卷类还包含着输出结果的内容,后面尽量还是把输出单独做成一个类,这样复用性才能更高。

3.后续可以再增加一个题库类将每一个试卷中的题目做成一个题库,因为如果不用题库可能导致试卷中本来没有的题目出现从而影响判卷的结果,如果增加题库类就可以给每一个试卷一个对应的题库,从这个题库中来选取题目,进行判分。

4.后面还可以更加深入的了解一下链表和HashMap的使用方法,看看有没有什么更加简便的操作可以减少使用for循环嵌套的数量,让程序更加健壮。

5.目前的输入处理逻辑比较简单,后面可以考虑使用更严格的输入验证来避免解析错误。同时还可以通过创建一个专门的输入验证类来处理这些逻辑,确保输入符合预期格式。
五. 总结
在这个项目中,我深入了解了面向对象编程的核心原则,通过设计和实现三个不同的题目集,加深了对类的设计思想的理解,并意识到代码复用的重要性。由于这三个题目的最后一题核心内容相似但细节有所不同,因此我体会到在编写代码时考虑迭代的重要性。每次面对相似的需求,如何设计一个灵活的系统以便后续能轻松扩展,成了我思考的重点。

在输入处理方面,我意识到确保输入格式的规范性有多么重要。所以我在读取用户输入时,使用正则表达式来验证输入的正确性,从而确保能够准确读取和保存相关信息。这一过程不仅提高了代码的准确性,还让我对正则表达式的使用有了更深的理解。通过使用 HashMap 存储类元素,我能以键值对的形式快速访问数据,增强了程序的效率。同时,采用链表存储多个题目、试卷和答卷,使得在需要时能够迅速提取和管理相关信息。

在设计过程中,我对类的组织和功能进行了深入思考。在第一个答题判题程序中,设计了 Topic、Test 和 Answer 三个类,以存储题目和管理用户输入。这种模块化的设计不仅提高了代码的可读性,也便于将来在相同或类似项目中进行快速重用。随着项目的推进,我在第二个程序中引入了 Input 类和Answer类,专注于从用户输入中筛选格式正确的信息,并将其存储到对应的类中,然后根据得到的信息对答卷进行判分并输出结果。这种调整使得代码结构更加清晰,同时提高了输入管理的效率。

第三个程序中,需求的增加让增加了 Student 类以存储学生信息。这使得系统功能更为全面,同时也让我明白了在系统设计中考虑到多方面需求的重要性。为了提升代码的可维护性,我还对 Input 类中的输入读取函数进行了拆分,避免了冗长的代码,这样不仅提升了代码的可读性,还方便了后续的调试和修改。

在实现过程中,我也经历了一些小挫折。例如,在第一个程序的结果输出时,我因数组索引错误而漏掉了部分结果。这让我意识到细节和逻辑严谨性的重要性。这样的错误虽然小,却在实际输出中产生了较大的影响,提醒我在编写代码时必须对每一行代码进行仔细检查。

此外,我也希望在后续的学习中能深入了解链表和 HashMap 的使用,探索更多简便的操作方式,以减少嵌套循环的数量,提高程序的性能和可读性。同时,我也意识到,代码的可扩展性是未来开发的关键。在设计新功能时,我会更注重将新功能与现有功能模块分离,避免过度耦合。

通过这一系列的学习和实践,我的编程能力得到了提升,尤其是在项目管理和系统设计方面。今后,我将继续优化我的代码结构,提高代码的可维护性和复用性,努力在学习的道路上不断进步。

标签:存储,题目,读取,试卷,BLOG,对应,输入
From: https://www.cnblogs.com/whw-0925/p/18504349

相关文章

  • 题目集 1 - 3 总结性 Blog
    一、前言在过去的一段时间里,我们完成了三次题目集的挑战。这三次题目集涵盖了丰富的知识点,题量和难度也各有不同。(一)知识点概述题目集1主要涉及Java的面向对象编程基础,包括类的定义、对象的创建和方法的调用。在这个题目集中,我们学会了如何使用类来封装数据和行为,以及如何......
  • 题目集1~3的总结性Blog
    前言在完成这三次题目集后,我也有了一些心得和体会。关于题目集1,它有5道题,分别是7-1:设计一个风扇Fan类;7-2:类和对象的使用;7-3:成绩计算-1-类、数组的基本运用;7-4:成绩计算-2-关联类;7-5:答题判题程序-1。在完成题目7-1时,我通过设计一个风扇类,了解了类的基本结构,对类的属性和方法......
  • My_Blog1_第一次
    一、前言第一次大作业7-5答题判题程序-1知识点这是设计的第一个答题判题程序,要求我们模拟一个小型测试。程序输入包括题目数量、题目内容和答题信息,输出题目内容、答题结果和判题信息。其主要的知识点是题目类封装题目编号、内容和标准答案;试卷类管理题目列表和判题;答卷类记......
  • 答题判题程序1~3总结性Blog
    前言:总结三次题目集的知识点、题量、难度等情况答题判题程序11.知识点输入输出处理:解析输入格式,包括题目数量、题目信息和答题信息。按行处理输入内容,确保题目顺序和编号的独立性。字符串解析与匹配:需要识别并提取指定格式中的题号、题目内容、标准答案和用户作答答案。按......
  • 南昌航空大学 22207208-贺凯凯 第一次总结性Blog
    一,前言本项目中我们实现了一个模拟在线答题判分的程序,分为三次迭代,逐步扩展功能和复杂度。通过三次题目集的练习,我们从基本的答题判分系统开始,逐渐加入了多试卷、多学生、多题目管理等元素,最终形成一个多功能、多用户的答题管理系统。每个题目集中涉及的知识点包括输入处理、字符......
  • BLOG-1
    前言回顾这三次作业的心路历程,可以说每一次都带来了新的挑战与收获,随着题目数量和复杂度的增加,对Java编程的理解和面向对象设计的认知逐步加深。作为Java编程初学者,最初对编程架构、模块分层和错误处理的认识相对浅显,但通过这三次作业,从题目处理到答案判定再到错误信息提示,逐步体......
  • BLOG-1
    pta1-3次大作业博客总结一、前言​ 在前三次的PTA大作业中,我们依次完成了答题判题程序1至3。这三个程序彼此紧密相连,层层递进,每一次的完成都是在前一次基础上的持续修改、完善与优化。这三次大作业的顺利进行要求我们对类、Map、List、正则表达式等知识点有深入的理解与熟练的......
  • 答题判题程序题目集 1~3 的总结性 Blog
    前言1.1题目集概述答题判题程序-1:字符串解析:题目内容和答题内容都是按照特定格式给出的字符串,程序需要能正确地拆分和解析这些字符串,然后进行匹配。对象和类的使用:为了更好地管理题目和答题信息,我们可以设计合适的类。每个题目可以作为一个对象,存储它的编号、内容、标准......
  • CVE-2014-4210Weblogic SSRF漏洞复现
    weblogic中存在SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。影响版本:weblogic10.0.2-10.3.6版本一、漏洞复现第一步:进入漏洞环境并启动环境#启动cdvulhub/weblogic/ssrfdocker-composebuilddocker-composeup-d#访问http://......
  • js数据类型-cnblog
    js数据类型数值型数值型是js最基础的数据类型,与其他语言不同的地方是,js并不区分整型数值和浮点型数值,在js中,所有的数值都是有浮点型数值组成的js进制js能够识别3种进制的数据类型1.十进制2.十六进制3.八进制十六进制js的十六进制由0x或0X开头八进制八进制以......