前三次答题判题程序总结

前言:
本次作业主要考察类的设计,从第一次作业只需三到五个类就能解决问题到第三次需要六七个类以上才能解决问题,这要求我们在写程序之前必须设计好各个类之间的关系和职责,这需要我们有良好的设计习惯并且遵守面向对象程序设计的原则。这几次作业难度很大,第一次作业200行可以搞定,第二次作业起码要400行,第三次作业就来到了500行代码。
每次作业纯编码时间可能就需要20小时以上。难度可以说非常大。

设计与分析:
因为本体需要分析输入的各种复杂信息,所以学习正则表达式的使用是必要的。
第一次作业需要读取
1、 题目数量,格式为整数数值,若超过1位最高位不能为0;
2、 题目内容,格式为:"#N:"+题号+" "+"#Q:"+题目内容+" "#A:"+标准答案;
格式约束:题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
3、答题信息,答题信息按行输入,每一行为一组答案,每组答案包含第2部分所有题目的解题答案,答案的顺序号与题目题号相对应。
格式:"#A:"+答案内容
格式约束:答案数量与第2部分题目的数量相同,答案之间以英文空格分隔。
样例:#A:2 #A:78
所以以下三个类是需要的。
题目类(Question):用于保存一道题目的信息以及处理的方法。
private int num;// 题号
private String content, // 题目内容
standardAnswer;// 标准答案
boolean matchingStandardAnswers(String answer):判断是否符合标准答案
试卷类(TestPaper):保存和处理一张试卷的信息以及处理的方法
int questionNum;// 题目数量
Question[] questions;//题目清单
void inputQuestion(int num, Question question):添加一道题目
void printQuestions():输出题目的内容~标准答案
boolean markQuestion(int num, String answer):判断第 num 题的正确性。
答卷类(AnswerPaper):保存和处理一张答卷的信息以及处理的方法
TestPaper paper;//试卷信息
String[] answers;//每一题的答案信息
boolean[] marks;//每一题的判题结果(对/错)
void printQ_A(int num):输出第 num 题的题目和答案(卷面答案,非标准答案)
boolean getJudge(int num):获得第 num 题的判题结果
由于输入信息需要用正则表达式来读取,所以最好还要设计一个用来分析信息的类。
匹配输入类(InputMatching)
questionNumMatching:String =””//正则表达式用于匹配题号
questionMatching:String=””//匹配题目内容
standerAnswerMatching:String=“”//匹配标准答案
questionInput:String = questionNumMatching+“”+ questionMatching+“”standerAnswerMatching
answerMatching: String = “”//匹配答案

第二次作业相比于第一次作业,有一些输入的东西变多了,有部分输入的格式也有所改变,并且输入变为乱序输入,这里要注意一些很恶心细节问题,例如答卷答案与问题的匹配顺序,可以看到答案的顺序与试卷中的题目顺序是一致的。我帮大家理解理解这句话,因为这个题目非常长,通读完整个题目后不免会将一些细节忘记,而就是这些微小的细节,会让你在后续修改bug的过程非常痛苦。回到正题,例如试卷是#T:1 3-5 4-8 5-2,答卷是#S:1 #A:5 #A:22,这意味着#A:5是第3题的答案,#A:22第四题的答案,第5题没有答案。大家一定要创建一个记事本,把一些关键的要求记下来,不然纯靠脑子记真的会搞晕。第二次还涉及到了多张试卷多张答卷的问题,

第三次相比于第二次多增加了格式的检测,这就要求对正则表达式的使用要更加熟练。由于前两次没有自己设计类图,而且仅仅凭着题目的建议和自己的感觉硬写,导致写到后期思路很乱,各个类之间的关系不明了,也没做到单一职责,这导致后期代码量上来以后,每次开始写自己代码前还要浪费很多时间去回想这些代码的作用。痛定思痛,我终于明白设计的重要性,于是在第三次作业开始后,我并没有着急的进行编码,而是先使用powerdesigner进行了类的设计,如图

当时设计的时候还很青涩,如果你有能力的话可以设计更加完善的类图,如下

设计类图的好处是非常多的,其中我最喜欢的一点是我的心里对这个500多行的程序有了一个很清晰的结构。接下来看源码:

踩坑心得:
1、 跳出舒适圈,勇于学习新知识
这几个作业做下来,相信所有同学都能感受到正则表达式强大的功能,但是相信大家一开始接触正则表达式时都不免被它那奇怪的语法和符号给吓唬到了,认为它很难学,于是还是用自己老一套的循环去分析字符串。事实上,只要克服了一开始调到舒适圈外的恐惧,踏实的学习半个小时正则表达式,就已经可以上手去解决问题了,只是那种陌生感让人感觉不太自信,但只要多尝试几次,就能很快掌握这门强大的工具,大大节省做题时间,是一劳永逸的好事,所以大家不要惧怕新知识,要勇于跳出舒适区,积极去学习新知识。
2、 多写注释
相信大家刚接触编程时或者未接触编程前就早早的了解到如果一段长长的代码没有注释是一件多么痛苦的事。但你亲生体会真正意识到注释的重要性又是什么时候呢?我是这三次作业中才真正意识到了注释的重要性。大家可以看到,我前两次作业的源码注释几乎可以说没有,可能就只有一个总体性的注释,例如什么时候输入,什么时候输入,但这些注释是远远不够的。最好的是能将每一个变量的作用,每一个方法的作用,每一个代码块的作用都要给出注释,因为当代码量大起来后,你可以通过注释去了解过去的自己写这些代码的目的,而不用去逐条逐条的看代码,逐条逐条看代码是非常恐怖了,尤其是在debug的时候,由于作业的周期长,代码的量很大,写到后面你真的会看不懂自己以前写的代码,这会浪费你非常多时间去重新理解你之前的代码,大大降低debug的效率
3、 重视设计
好设计不仅可以让程序的拓展性大大提高,对于目前的我来说,好设计更重要的作用是能把我理清求解问题的思路。并且类图中有各个类的属性和方法,这让你写程序时不必再翻上翻下,只需要看看类图就知道有什么能用,或者有什么类有缺陷。并且设计类的时候不必将心神投入在如何实现上,你将有更多的脑力用于思考如何让类的设计更符合面向对面的设计原则。

改进建议:
我目前的编码类还是太少了,可以将正则表达式匹配输入单独列为一个类。
目前编码拓展性不足,几乎没有使用继承与多态,这个在后续可以加入。

总结:
这次作业收获良多,第一次写这么多行代码的程序,锻炼我的程序设计能力,并且让我意识到了注释的重要性。并且本次作业有不少课外的知识,这还锻炼我的自主学习能力。
建议方面主要是做题的时间太短了,虽然每次作业都有一周的时间,但实际上我们大部分的时间都有课,课外的时间本身就少,全部投入在java中会可能还做不完,但我们其他课程也是有作业需要做,并且数学类课程不进行预习的话上课真的不会有多少收获,我想提的建议是要么将数学课的排课排的更松散一点,要么将java排课排的更松散一点,让我们有时间同时学好数学和java,数学需要时间,java也需要时间,以现在的这种上课速度我真的做不到即学好数学又学好java。

posted @ 2024-04-21 17:38  我_喜_欢  阅读(50)  评论(0)    收藏  举报