首页 > 其他分享 >答题判题系统的三次优化

答题判题系统的三次优化

时间:2024-04-21 19:22:05浏览次数:24  
标签:题目 答题 正则表达式 字符串 判题 三次 题号

一.前言
(1)答题判题程序-1:
【1】知识点:charAt()的运用,正则表达式,数据形式转换
【2】题量:较少
【3】难度:较易
(2)答题判题程序-2:
【1】知识点:charAt()的运用,正则表达式,ArrayList的运用
【2】题量:中等
【3】难度:中等
(3)答题判题程序-3:
【1】知识点:charAt()的运用,正则表达式,数据结构的初步运用
【2】题量:较多
【3】难度:困难
二.设计与分析
答题判题程序-1:
(1)类的设计思路图:

(2)设计具体思路:
1.首先,创建一个整形数组,用于接收从键盘输入的问题数量的数据。
2.接收步骤1所记录的问题数的数量的字符串。
3.创建一个Question类对象,并使用正则表达式对每条进行截取得到题号num,题目question,标准答案standardanswer以此对Question类对象进行实例化。
4.接受一个装载着回答的信息的字符,以'#'出现的次数对回答数进行统计,接受一个装载着回答的信息的字符串,运用正则表达式对字符串进行截取得到回答answer,创建回答个数个的Answer类对象,并用所截取的字符串对这些对象进行实例化。
5.按照题号的大小,对Qusetion类进行排序(从小到大)
6.在对Question类对象的循环遍历中用Answer[]类对象进行匹配,先输出该题目,再输出回答。若有能匹配的,输出"true ",否则输出“false ”.

答题判题程序-2:
(1)类的设计思路图

(2)设计具体思路:
1.创建一个足够大的字符串数组,用于接收所有的字符串直至字符串为"end"为止;
2.根据该字符串数组中的每个字符串中的第二个字符即charAt(1)在对整个字符串数组information[]进行遍历的循环中来判断该字符串属于哪个类型的信息(答题操作),并据此进行后续操作(判题操作)。
【1】charAt(1)='N',该字符串为题目信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
否则System.out.printf("wrong format%s\n",该字符串);
[2]将该字符串使用正则表达式进行截取,获得题号,题目,标准答案。
[3]创建一个题目类my_question,并用上述获得的信息实例化一个题目对象。

【2】charAt(1)='T',该字符串为试卷信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
否则System.out.printf("wrong format%s\n",该字符串);
[2]将该字符串使用正则表达式进行截取,获得题号,题分。
[3]将此处得到的题号与实例化的题目类的对象my_answer[]的题号进行匹配,若一致则题分为该题目对象的题分。

【3】charAt(1)='S',该字符串为答卷信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
否则System.out.printf("wrong format%s\n",该字符串);
[2]将该字符串使用正则表达式进行截取,获得试卷号回答。
[3]先根据'-'出现的次数统计答题的数量,创建一个答题类数组my_answer[],使用题目号与回答对答题类进行初始化。
再创建一个答卷类数组my_sheet[],从my_sheet[0]开始用试卷号与答题类数组对答卷类进行初始化,每当有一个information[]的charAt(1)=='S',my_sheet[]的数组序号加1,题目数重置为0,以便多个答卷的操作。
【4】进行判题操作
[1]创建一个整形数据grade为0;
[1]首先根据题目对象的题号根据题号大小对整个题目类数组进行排序(从小到大)。
[2]在对试卷类的题目类进行循环遍历操作是用所有答卷类的答题类进行匹配,如果匹配,则输出该题目并输出"true\n",grade+该题的题分,否则输出该题目并输出"false\n",grade加0。
[3]输出每一题的题分,最后输出该张卷子的总分。
答题判题程序-3:
(1)类的设计思路图:

Question与Test类为结合关系,Answer类与Sheet类也为结合关系,主要是对Test类和Sheet类进行操作
(2)程序设计具体思路:
1.首先创建一个字符串数组information[],将所有的字符串都输入进这个字符串数组中,直至字符串为"end",则停止,以此对所有字符串进行储存并进行统计。

2.根据该字符串数组中的每个字符串中的第二个字符即charAt(1)在对整个字符串数组information[]进行遍历的循环中来判断该字符串属于哪个类型的信息(答题操作),并据此进行后续操作(判题操作)。
【1】charAt(1)='N',该字符串为题目信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
否则System.out.printf("wrong format%s\n",该字符串);
[2]将该字符串使用正则表达式进行截取,获得题号,题目,标准答案。
[3]创建一个题目类my_question,并用上述获得的信息实例化一个题目对象。

【2】charAt(1)='T',该字符串为试卷信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
否则System.out.printf("wrong format%s\n",该字符串);
[2]将该字符串使用正则表达式进行截取,获得题号,题分。
[3]将此处得到的题号与实例化的题目类的对象my_answer[]的题号进行匹配,若一致则题分为该题目对象的题分。

【3】charAt(1)='X',该字符串为学生信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
否则System.out.printf("wrong format%s\n",该字符串);
[2]将该字符串使用正则表达式进行截取,获得学生姓名,学生学号。
[3]根据字符串中'-'出现的次数来对学生数进行统计,并创建容量为此的学生对象数组student[],并使用所获得的姓名与学号对学生对象进行初始化。

【4】charAt(1)='S',该字符串为答卷信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
否则System.out.printf("wrong format%s\n",该字符串);
[2]将该字符串使用正则表达式进行截取,获得试卷号,答题人,题目号,回答。
[3]先根据'-'出现的次数统计答题的数量,创建一个答题类数组my_answer[],使用题目号与回答对答题类进行初始化。
再创建一个答卷类my_sheet,用试卷号与答题类数组对答卷类进行初始化。

【5】charAt(1)='D',该字符串为删除信息
[1]使用正则表达式判断字符串是否符合格式,若符合进行操作[2],
[2]将该字符串使用正则表达式进行截取,获得删除的题目号delete_num;
否则System.out.printf("wrong format%s\n",该字符串);

【6】求整个题目类数组的题分的总和total_grade,如果total<100,则输出“alert: full score of test paper试卷号 is not 100 points”

【7】进行判题操作
[1]首先根据题目对象的题号根据题号大小对整个题目类数组进行排序(从小到大),对答题类进行同样的操作。
[2]在对学生类的遍历循环中,判断答题人与学生类对象的name是否符合,如果符合进行操作[2],否则无输出。
[3]首先判卷是否有输入删除题号,若没有,直接进行[2]操作,反之,匹配题号与删除题号,若一致则输出"the question 2 invalid~0",并将该题的题分改为0。
[4]用答卷类对试卷类进行匹配,如果回答与标准答案相同,则输出该题目+"~true",并将学生得分grade加上该题的题分,否则+"false"。如果答题类出现了试卷类中未有的题号则输出"non-existent question~0",切得分为0;
[5]输出答题人的姓名,并输出学生类中name与答题人一致的对象的id,输出答题人每道题的得分,最后输出总分。

三.踩坑心得
(1)踩坑:答题判题程序-1中最开始不清楚需要匹配正确的字符串的格式,用极其简单且复杂的方法判断。
解决方法:使用正则表达式规定正确的格式,对每条字符串进行匹配操作。
数据:

源码:

测试结果:

(2)踩坑:答题判题程序-1中直接将字符串类型数据与整形数据进行比较,结果一直报错。
解决方法:使用Integer.parseInt(String)来进行字符串转化为int型的操作。
数据:

源码:

测试结果:

(3)踩坑:答题判题程序-2中不明白多个类的运用与多个类之间关系的处理,最开始知使用一个类。
解决方法:并使用好类之间的三个主要关系——关联、聚合、组合。如:Question类是Test类的一部分即聚合关系。
数据:。。。
源码:参考类设计图
测试结果:。。。
(4)踩坑:不理解程序的封装。
解决方法:get和set的使用。
数据:。。。
源码:

测试结果:。。。
(5)踩坑:答题判题程序-1中不知如何对各种字符串的分类,数组大小的确认以免浪费空间。
解决方法:使用charAt(),利用每条字符串的特征,以计算各种类型数据所需数组的大小,并且分别进行操作。
数据:

源码:

测试结果:

(6)踩坑:最开始在答题判题程序-2中大量使用了内部类,使得程序难以进行维护。
解决方法:使用外部类。
数据:。。。
源码:。。。
测试结果:。。。
(7)踩坑:答题判题程序-3中题目乱序输入,输出结果与预料不一样。
解决方法:利用题号对题目类数组进行排序(从小到大),利用答题号对答题类进行同样的操作。
数据:

源码:


测试结果:

(8)踩坑:答题判题程序-3中回答的题号在题目类数组中不存在和删除题目同时存在的情况下的结果混乱。
解决方法:添加一个题号2即num_2,进行两次匹配,用题号与题号2结合使用,来解决多种情况的问题。
数据:

 源码:

测试结果:

四.改进建议
目前还无法解决的问题:
(1)错误格式的信息,无效的题目引用
(2)单信息输入
(3)空白卷没有答案的试卷按正常试卷输出结果
(4)答案为空字符。按正常输入处理。
(5)消息、答案数据乱序输入+缺失的答案
(6)题目、答案数据乱序输入
改进建议:
(1)改用ArrayList或者Hashmap改进数据结构,仅仅用数组或者linkedlist在面对很多问题时难以解决甚至不能解决;
(2)在循环中嵌套多个循环,以防止乱序输入程序非零返回的问题
七.总结
(1)首先,这三题为近三周的主要任务,也是开始学习Java以来第一个比较耗时的编程任务,它们不仅仅考验了我们学生之前在C语言学习的成果。还在其中大量运用了我们在C语言中未学习到的知识如封装、正则表达式等等。

(2)其次,在这段时间里,我明显认识到了自己的不足不仅体现在学习能力上还体现在学习态度上,很多东西都是老师和同学指导以后才理解的,自主学习能力较少,急需改正。

(3)然后,在这几周中,我基本了解了Java编程的进本要求和形式。同时对于类的认识逐渐清晰正则表达式这一知识点有了更加深入的了解。

(4)此外,近几周我认识到了时间的重要性。在课程方面,建议学校可以试着调整课程的安排,让学生们在学习过程中可以尽可能的线下交流、共同讨论、一起克服难题。在作业方面,希望老师可以明确作业的要求,测试点的要求希望可以更加清晰,有的测试点自己错不知因,正不知原。在实验方面,希望每次实验能和作业一样是层层深入而不是给个大框架却在初期实现少量功能。

(5)最后,各种高级计算机语言有着许多的共同之处,一种计算机高级语言的掌握程度可以很大的影响到新的语言的学习。但是每种语言都具有自己语言的独特性,要想通过掌握一门语言而走遍天下实在有点儿戏。
在未来的Java学习中,要多去了解Java自身的特性如封装、多态等等,技多不压身,多门语言的精炼能够更好的提高我们自己的编程能力,并且学会看他人的博客多去接受更深一层的知识,感受来自来自电子计算机的浪漫。

标签:题目,答题,正则表达式,字符串,判题,三次,题号
From: https://www.cnblogs.com/qianliji3498741082/p/18147671

相关文章

  • OOP答题判题系统1-3次总结
    一.前言1.知识点:(1)面向对象编程(OOP):这三道题目要求设计并实现题目类、试卷类和答卷类等,这涉及到类的定义、属性的封装以及方法的实现,是OOP的核心概念。(2)方式设计:设计并实现用于判题、保存题目、保存答案等功能的方法,这涉及到方法的命名、参数设计以及逻辑实现。(3)数据结构与集合......
  • 前三次答题判题程序总结
    前言:本次作业主要考察类的设计,从第一次作业只需三到五个类就能解决问题到第三次需要六七个类以上才能解决问题,这要求我们在写程序之前必须设计好各个类之间的关系和职责,这需要我们有良好的设计习惯并且遵守面向对象程序设计的原则。这几次作业难度很大,第一次作业200行可以搞定,第......
  • PTA前三次题目集总结
    以下内容是我对PTA三次习题作业最后一题的思路,源码以及总结学到的java知识大多都来自写题目集这些题目对我对java的认知与学习起到了不小的帮助答题判题程序-1题目内容设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的......
  • OOP面向对象编程三次题目总结
    一.前言:在这三次题目集中,最后一小题为判题程序,其余题为基础的知识点题,输入一段题目内容,试卷内容,答卷内容,评判对错情况和计算最终总分,在这三次作业的迭代下,我一次比一次做的不好,第一次是满分,第二次95,第三次只有79,即使效果不好,我还是把我的做题思路写下来供大家参考。二.三次作业......
  • PTA前三次题目集总结
    PTA前三次题目集总结1.前言:2.设计与分析3.踩坑心得4.改进建议5.总结1.前言:  1.前三次题目集的重心从对类的使用和设计,类的关系,到类的封装。第一次题目集题目较多,主要是为了让作为初学者的我们能掌握Java的基本操作。第二次题目集题量适中,但增加了使用链表,自定义类要实现......
  • 第一次Blog总结-前三次答题判定程序
    目录前言设计与分析采坑心得改进建议总结关于java&面向对象因为这学期刚开始学习java,因此对于java的某些知识点或技巧掌握地不是太熟练,但是经过长达三周的折磨下,总算对java有了初步的总体认知。前言知识点覆盖:数组灵活运用,List和Map接口灵活运用,各种类的设计已经......
  • 答题判题程序1~3总结
    一.前言第一次作业知识点、题量、难度总结1.第一次作业的主要内容为:输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。其中输入的信息主要为:题目数量,题目内容,答题信息,以"end"结束输入。要求输出答题信息和判题信息。2.主要涉及到的知识点:(1)面向对象编程:......
  • 三次答题判题程序练习让你入门Java。
    (1)前言本阶段三次题目集涵盖了从基础编程概念到较复杂算法设计等多个知识点。题量适中,难度呈梯度上升,从简单的数据结构与算法实现到复杂的问题求解,逐步挑战学生的编程能力。第一次题目集主要考察基本语法、数据类型和简单的控制结构;第二次题目集则增加了数组、链表等数据结构的应......
  • PTA三次题目集总结性Blog
    (1)前言1.第一次题目集知识点主要涉及类的设计和实现、构造方法的使用、成员变量和访问器/修改器的定义、方法的重写(toString方法)、对象的创建和调用方法、控制台输入和输出的使用、浮点数的格式化输出等,题量比较适中,难度也比较适中,要求实现的功能较为基础,但需要一定的类设计和方......
  • NTT 的三次变八次优化
    就是将NTT的域扩到复数。我不知道高斯整数的其他取模方式,所以巨慢/xk。而且没用。我们知道高斯整数的神秘取模方式,使得其结果的范数小于除数的一半。然而我们发现这个取模在整数下的结果仍然在整数取模的同余系中!好很有精神!我们选取\(g=3,mod=998244353\),我们只需要验证\(......