一.前言:
在这三次题目集中,最后一小题为判题程序,其余题为基础的知识点题,输入一段题目内容,试卷内容,答卷内容,评判对错情况和计算最终总分,在这三次作业的迭代下,我一次比一次做的不好,第一次是满分,第
二次95,第三次只有79,即使效果不好,我还是把我的做题思路写下来供大家参考。
二.三次作业设计与分析:
第一次
知识点:类的应用,类与类之间的关系,题量:5,难度:中等
要求实现一个判题程序,输入题号,题目,和答卷,根据题目后面接着的标准答案和给出的答卷的提交答案进行比较,最终输出答题情况和对错。总体比较简单,通过主函数输入信息,进行存储题目信息在试卷类,
这
我有一点未作完善,我的试卷类只能存储一个题目,答卷类是比较试卷类中的那一道题目和标准答案的正确情况,输出最后的格式。这一次的题目虽然简单,但是对后面的迭代有着比较重大的意义,每次一都是在这
一次的基础下进行修改。****
类图:
耦合度:
第一次作业比较简单,考虑的情况也比较少。
第二次
知识点:类的应用,类与类之间的关系,ArrayList的使用,题量:4,难度:稍难
要求实现一个更加完善的判题程序,这一次相比于上一次的难点在于,要求输入内容有题目信息和标准答案,试卷题目和对应的分数,答题信息,在上一次的基础上迭代,题目稍微难,这一次我稍作修改,根据在主
函数输入的信息中识别内容,进行相应位置的存储,一张试卷存放着该试卷的全部题目,一张答卷存放着对应试卷号和该试卷题目的提交答案,进行一一比较了,输出格式也稍微有所改动,首先输出该试卷总分是否
为100分,其次依次输出试卷的答题情况和总分,如果答案信息中试卷的编号找不到,则输出”the test paper number does not exist”,如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is
null"。最后我通过修改,任然有一个测试点未通过
类图:
耦合度:
这次作业类的关系相比于上一次更为复杂
第三次
知识点:类的应用,类与类之间的关系,ArrayList的使用,题量:3,难度:困难
在第二次的基础上加以迭代,实现一个更加完美的判题程序,要求输入内容有题目信息和标准答案,试卷题目和对应的分数,答题信息,以及学生信息,题目稍难,这一次我基于第二次的方法,依旧使用ArrayLst,
在主函数中输入信息并识别,另加了一个小功能,就是可实现对题库中的题目进行删除功能,接着要判断输入信息是否合法,并输出相应提示,接着进行相应位置的存储,一张试卷存放着该试卷的全部题目,一张答
卷存放着对应试卷号和该试卷题目的提交答案,进行一一比较,输出格式与第二次相差不大,首先输出那部分格式错误,再而输出该试卷总分是否为100分,不同就是在输出得分前加上该答卷的学生学号和姓名,删
除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目
内容与答案改为一条失效提示,例如:”the question 2 invalid~0”,试卷错误地引用了一道不存在题号的试题,在输出学生答案时,提示”non-existent question~”加答案,输入信息只要不符合格式要求,
均输出”wrong format:”+信息内容,如果答卷信息中试卷的编号找不到,则输出”the test paper number does not exist”,答卷中的答案不用输出,但最终还有奖金五个测试点未通过
类图:
耦合度:
这一次比较难,类的个数也比较多,关系也复杂
三.踩坑心得:
一.第一次大作业我是输入一个识别一个,当时这个方法是可行的,到了第二次我的脑子任然是想着这个方法,但是后面写着写着看到了题目说了一句话:输入顺序不确定,我便放弃了这样的解决方式,后面我的解决方法是将内容一次性以一行一行的字符串输入存入到一个字符串数组中,再后来我将输入的内容存入到了元素为String的ArrayList里面,下面是我的展示:
第一次:
第二次:
第三次:
二.就是第三次作业的判断输入的内容是否合法,我的做法是先切分后使用用正则表达式,这里不做过多讲解,举出一例当作样例即可:
这是一个判断输入的题目是否合法的代码:
测试结果如下,
输入:
#N:1 #Q:1+1= #:2(本应该为#N:1 #Q:1+1= #A:2)
#T:1 1-5
#X:20201103 Tom
#S:1 20201103 #A:1-5
end
输出:
三.类似于输入试卷信息的格式,有很多部分是格式相同的,例如:#T:1 1-5 2-8,除了#T:之外,都是"题号-分数"的格式,这个判断格式是否正确的放我我也做了思考,我不知道我的是否为最优解,所以我也打算拿
出那展示,后面看看同学的是否有更优解,加以学习。
这是一段判断输入试卷是否合法的代码:
//输入试卷
for(int k=0;k<content.size();k++){
for(i=0;i<content.size();i++) {
if (content.get(i).startsWith("#T:")){
String[] parts = content.get(i).split("\s+");
j++;
int Paper_num = Integer.parseInt(parts[0].substring(3));
if(Paper_num == j){
Paper paper = new Paper(Paper_num);
int flag1=1;
for (int l = 1; l < parts.length; l++) {
String regex = "^\\d+-\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(parts[l]);
if(!matcher.matches()){
System.out.println("wrong format:" + content.get(i));
flag1=0;
break;
}
}
if (flag1==1) {
for (int l = 1; l < parts.length; l++) {
String[] questionPart = parts[l].split("-");
int questionNumber = Integer.parseInt(questionPart[0]);
int flag=0;
for(int x = 0;x<questions.size();x++){
if(questions.get(x).getNum() ==questionNumber){
flag=1;
paper.addQuestions(questions.get(x));
break;
}
}
if(flag==0){
paper.addQuestions(new Question(0,questionNumber,null,null));
}
int score = Integer.parseInt(questionPart[1]);
paper.addQuestionScore(score);
}
papers.add(paper);
}
}
}
}
}
测试结果如下:
输入:
#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 3~8(正确格式为:#T:1 1-5 3-8)
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
end
输出:
四.改进建议
我的建议是我在我的类的内容进行改进,题目类有题目类的方法,试卷类哟试卷类的方法,答卷类有答卷类的方法,试卷类还是存放这相应的题目,答卷类存放对应试卷的题目编号和学生写的答案,其内部有判题方法对答案进行判断是否正确,更加完善单一职责,在原来的题目基础上进行深一步的迭代。
五。总结:
在三次大作下来,我也学到了很多知识,明白了我们软件工程不容易,既来之则安之,我也要更加努力学习,通过一次次的作业不断提升自我。在本次阶段的大作业,我一次一次对代码进行改善,当然也是一次一次的学习,找出最优的解决方法,
建议和意见:
一.题目:对不友好的一点我觉得就是测试点问题,我们都知道未来遇到很多问题可能并不会给出我们问题所在,也不会明确告诉我们测试点,提交答案的提示很多测试点都是一样的提示,很多同学在测了很久很久才写
出来,甚至可能都还没写出,但这并不是我们不会,也不是因为题目很难,也不是因为我们实现不了哪些功能,而是测试点都是出题方的主观因素,导致我们并没有想法往那个方向思考,我们也不是顶尖985,就是普
通一本,我也相信学院在接下来的培养我们,我们也能更加进一步提升自身能力和水平。
二.课程,实验等方面:
对学校的教学方式很满意,学生通过课前看发布的视频,先一步了解,提升了我们的自学能力(很重要),实验课也能帮助我们解决心中的问题,教师也很好,有的同学因为学习能力偏差,在大作业稍微有点吃力,老
师能很认真的和他们交谈,我觉得很好,在课上和课下,老师很认真的讲课,出一些课堂练习给我们当场练习,然后讲解,也会对大作业进行讲解,课后也会认真在QQ给我们解答问题。
自我加以改进:
1.对自己出现的bug加以分析其原因,在写代码之前分析好类关系图。
2.学习新知识,简化代码,完善单一职责
3.对前三次的未通过的测试点加以分析,在下一次攻克难题