一.前言
(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自身的特性如封装、多态等等,技多不压身,多门语言的精炼能够更好的提高我们自己的编程能力,并且学会看他人的博客多去接受更深一层的知识,感受来自来自电子计算机的浪漫。