一、前言
这三次题目集主要考察的是我们对Java的面向对象的封装,还有关于方法的调用和返回,集合和正则表达式的使用,java已经封装好的类的使用,多个类之间的关系与使用,使用类来封装对象而不是用一个main解决所有问题,体现了面向对象的设计思想。这三次题目集的题量适中,每次的题目集前几个题目都是为了让你了解一些Java的知识,为最后一题做铺垫。这三次题目集的难度都是逐渐往上加的,每一次题目集的最后一题都是在上一次的基础上增加功能,是为了我们熟悉类的使用,这样就不会让我们突然感觉难度很大,并且可以考察我们c语言的基础。
二、第一次答题判题程序
1.需求分析
输入题目信息和答题信息,输出判题结果true或者false。
2.代码分析
这次答题判题程序我设计了四个类,题目类Topic(用于封装单个题目的信息),试卷类Paper(用于封装整套题目的信息),答卷类Answer(用于封装答题信息),主类Main(Java程序执行的入口)。
题目类Topic
这个类里面主要是用来储存题目的题号,题目还有标准答案。
set()和get()方法,用来更改储存的内容和获取储存的内容。
类的空参和有参构造,用来初始化储存的内容。
judgment()方法,调用了Topic类的判题方法,用来判断答案是否和标准答案一致。
试卷类Paper
这个类主要是储存整个试卷题目的信息,里面有一个存储题目的哈希表,用来储存题目。
getquestions()方法,获取相应题目信息。
judgment()方法,可以判断特定答题目的答案与标准答案是否一致。
savequestion()方法,用来向试卷里的题目的哈希表中存放题目。
答卷类Answer
这个类主要是用来存储答题信息和判题结果,有答案的列表属性用来储存每一题答案和判题结果的列表属性用来储存每一题答题结果。
空参和有参构造,可以初始化试卷类的对象。
save()方法,用来存储答案信息和判断题结果。
printfout()方法,用来输出题目的答题信息,还有答题结果。
主类Main
这个类是程序的服务入口,程序的输入输出都是在这个main方法中执行,通过键盘输入,获取键盘的消息,解析这个消息,判断它是题目还是答案,然后将它存储到相应的类中,最后再调用答卷类中的输出方法,输出相应的内容。
3.关键代码讲解
通过split()将题目信息分隔成题号,题目还有标准答案,然后再储存到题目类中,然后在放进试卷类的哈希表中。
通过循环从哈希表中输出题目消息,然后再通过循环输出判题结果。
4.类图
5.采坑心得
(1)遇到的问题一
String[] str1 = str.split(" ");
int number = Integer.parseInt(str1[0].split(":")[1]);
String question = str1[1].split(":")[1];
String standardAnswer = str1[2].split(":")[1];
一开始写的时候我没有考虑到那个题目可以有多余的空格,所以一开始我是以空格来分隔题目信息,但是最后就会出现非零返回,无法存储进信息 。
解决方法:不要用空格来分隔题目信息,使用井号来分割题目信息,并且使用trim()方法来去除首尾的空格。
(2)遇到的问题二
String[] str1 = str.split("#");
int number = Integer.parseInt(str1[0].split("N:")[1]);
String question = str1[1].split("Q:")[1];
String standardAnswer = str1[2].split("A:")[1];
一开始由于我对于split这个方法使用不熟练,所以当我用井号分割时,我以为它存储是从有数据开始,也就是从右边开始,所以之后我存储的数据位置都为出错,最后提交时就会非零返回。
解决方法:按照split这个方法分割开的数组正确存储。
(3)遇到的问题三
一开始没有注意到答案的顺序就是按123这个顺序,以为它是按题目的输入顺序匹配的,所以最后输出的时候,匹配就会使得答案不正确。
解决方法:让答案匹配换成正确的123匹配,而不是按题目的输入匹配。
6.改进建议
以后输入题目是要考虑到是否会有多余空格,然后判断能不能使用空格来分隔。
可以输出时直接去调用题目的判题方法,这样就不用专门使用一个列表来储存判定结果。
在存储的时候,也要考虑到时候获取的时候是否好获取,就如你要按123顺序获取,你就使用哈希表,如果你要按输入顺序获取,你就使用列表。
三、第二次答题判题程序
1.需求分析
这一次的答题判题程序在上一次的基础上增加了题目的分数,输出的时候不仅要输出题目的答题情况还要把答题人的分值输出。
答卷数量和试卷数量可以多份。
程序输入信息分三种,三种信息可能会打乱顺序混合输入。
2.代码分析
这次答题判题程序我设计了七个类,题目类Topic(用于封装单个题目的信息),试卷类Paper(用于封装整套题目的信息),答卷类Answerer(用于封装答题信息),题目分值类Score(用于封装单个题目的分值),试卷号类Points(用于封装整套题目的分值),答卷人类Answer,主类Main(Java程序执行的入口)。
题目类Topic
这个类里面主要是用来储存题目的题号,题目还有标准答案。
set()和get()方法,用来更改储存的内容和获取储存的内容。
类的空参和有参构造,用来初始化储存的内容。
judgment()方法,调用了Topic类的判题方法,用来判断答案是否和标准答案一致。
试卷类Paper
这个类主要是储存整个试卷题目的信息,里面有一个存储题目的哈希表,用来储存题目,有一个存储试卷号的哈希表,用来储存试卷分数。
getquestions()方法,用来获取相应题目信息。
savequestion()方法,用来向试卷里的题目的哈希表中存放题目。
比上次多了
save()方法,用来向试卷里的题目分数的哈希表中存放试卷号的分数。
getPoint()方法,用来获取相应试卷的分数。
答卷类Answer
这个类主要是用来存储答题人信息,有答答卷的列表属性用来储存每一张答卷。
空参和有参构造,可以初始化试卷类的对象。
save()方法,用来存储答案信息。
printfout()方法,用来输出题目的答题信息,还有答题结果。
比上次少了我删除了判题结果的列表,到时候输出的时候直接将答案放到题目中的判题方法使用。
题目分值类Score
这个类主要是用来储存单个题目的分值和题号。
有参构造,可以初始化试卷类的对象。
get()方法,获取题目的分值和题号。
试卷号类Points
这个类主要是用来存储你分值的试卷号是哪个,里面有一个存储每一题分值的列表。
gettotal()方法,用来计算一整张试卷的分值,用于判断试卷是否有100分。
saves()方法,用于使用列表存储每一题的分值。
get()方法,可以获取特定题目的分值。
答案类Answer
这个类主要是用来存储答题信息,有答案的列表属性用来储存每一题答案。
save()方法,用来存储答题信息。
getAnswer()方法,用来获取答题信息。
getNumber方法,获取答案对应的试卷号。
主类Main
这个类是程序的服务入口,程序的输入输出都是在这个main方法中执行,通过键盘输入,获取键盘的消息,解析这个消息,判断它是题目,答案还是试卷分值,然后将它存储到相应的类中,最后再调用答卷类中的输出方法,输出相应的内容。
3.关键代码讲解
首先通过开头是否是井号N或T或S来判断你是题目还是分值还是答案,然后再存储到相应的类中。
if(point.gettotal()!=100){
System.out.println("alert: full score of test paper"+number1+" is not 100 points");
}
通过试卷分值的类的gettotal()方法判断试卷够不够100分。
输出的时候最外层是答卷的循环,如果没有找到试卷,就输出相应信息,如果找到了就执行试卷分值的循环。最后输出答卷信息,还有相应分值。
4.类图
5.采坑心得
(1)遇到的问题一
answerer.setNumber(number2);
for (int i = 2; i < str3.length; i++) {
str3[i] = str3[i].split(":")[1].trim();
answerer.save(str3[i]);
}
这是由于我在答案输入的时候,答卷的那个信息类名没有重新初始化,这就会导致他只会保存最初的那一张答卷。
解决方法:Answerer answerer = new Answerer(number2);重新初始化
(2)遇到的问题二
if (str.startsWith("#N:")) {
String[] str1 = str.split(" ");
因为没有关于题目可以有多余空格的测试样例,我就也没有考虑,以为这一次题目不用考虑有多余空格,所以也是以空格分隔题目。
解决方法:使用井号来分割题目信息。
if (str.startsWith("#N:")) {
String[] str1 = str.split("#");
(3)遇到的问题三
if(answerer.getAnswer(i)==null){
System.out.println("answer is null");
}
这是由于答卷缺失部分答案,我尝试获取大于答卷列表长度的对应的答案,这就会报错,会非零返回。
解决方法:判断是否小于题目列表长度,小于的话就答案存在,否则答案不存在。
if(i<answerer.getAnswer().size())
(4)遇到的问题四
一开始这个输出不是100分的提示我是放到输出那里,最后就会和题目不符,因为题目是要在一开始就输出分不是100分。
解决方法:把那个输出不是100分的提示放在了输入那里。
6.改进建议
以后在输出时获取列表中的数据需要看清楚列表的长度,如果获取的大于的列表的长度,那么就会提示非零返回。
由于存储的属性都是存储地址,所以你存放另一张答卷信息时,必须重新初始化。
四、第三次答题判题程序
1.需求分析
这一次的答题程序在上一次的基础上增加了学生信息,还可以删除题目。
输入信息只要不符合格式要求,均输出”wrong format:”+信息内容。
题目不存在,题目删除和答案不存在中,答案不存在的优先级最高。
每次的答卷数只有一份。
2.代码分析
这次答题判题程序我设计了八个类,在上一次代码的基础上增加了一个学生类Student(用于封装学生信息)。
题目类Topic
这个类里面主要是用来储存题目的题号,题目还有标准答案。
set()和get()方法,用来更改储存的内容和获取储存的内容。
类的空参和有参构造,用来初始化储存的内容。
judgment()方法,调用了Topic类的判题方法,用来判断答案是否和标准答案一致。
试卷类Paper
这个类主要是储存整个试卷题目的信息,里面有一个存储题目的哈希表,用来储存题目,有一个存储试卷号的哈希表,用来储存试卷分数。
getquestions()方法,用来获取相应题目信息。
savequestion()方法,用来向试卷里的题目的哈希表中存放题目。
save()方法,用来向试卷里的题目分数的哈希表中存放试卷号的分数。
getPoint()方法,用来获取相应试卷的分数。
答卷类Answer
这个类主要是用来存储答题人信息,有答卷的列表属性用来储存每一张答卷,。
空参和有参构造,可以初始化试卷类的对象。
save()方法,用来存储答案信息。
printfout()方法,用来输出题目的答题信息,还有答题结果。
比上次多了
一个学生信息的列表用于储存学生信息。
savestudent()方法,用来存储学生信息。
题目分值类Score
这个类主要是用来储存单个题目的分值和题号。
有参构造,可以初始化试卷类的对象。
get()方法,获取题目的分值和题号。
试卷号类Points
这个类主要是用来存储你分值的试卷号是哪个,里面有一个存储每一题分值的列表。
gettotal()方法,用来计算一整张试卷的分值,用于判断试卷是否有100分。
saves()方法,用于使用列表存储每一题的分值。
get()方法,可以获取特定题目的分值。
答案类Answer
这个类主要是用来存储答题信息,有答案的列表属性用来储存每一题答案。
save()方法,用来存储答题信息。
getAnswer()方法,用来获取答题信息。
getNumber方法,获取答案对应的试卷号。
学生类Student
这个类是用来存储学生学号和姓名。
无参和有参构造,可以初始化试卷类的对象。
getId()方法,获取学生学号。
getName()方法,获取学生姓名。
主类Main
这个类是程序的服务入口,程序的输入输出都是在这个main方法中执行,通过键盘输入,获取键盘的消息,解析这个消息,首先判断这个符不符合格式。不符合就有提示,内容符合的话再判断它是题目,答案,学生,删除还是试卷分值信息,然后将它存储到相应的类中,最后再调用答卷类中的输出方法,输出相应的内容。
3.关键代码讲解
删除题目,我就让题目类中存储的题目号为-1,这样输出的时候判断题目号是否为-1,就知道是不是删除了的题号。
if(str.matches("((#N:\\s*[1-9][0-9]*\\s*#Q:\\s*.*\\s*#A:\\s*.*)" +
"|(#T:\\d(\\s+[1-9][0-9]*-[0-9]*)+)" +
"|(#S:\\d\\s+\\d{8}(\\s+#A:[1-9][0-9]*-\\s*.*)*)" +
"|(#X:(\\d{8}\\s+.+-*)+)" +
"|(#D:N-[1-9][0-9]*))"))
使用正则表达式来判断输入信息格式符不符合要求。
首先判断答案存不存在,不存在的话,输出答案不存在,存在的话再判断题目存不存在,不存在的话,输出题目不存在,存在的话再判断是否是删除的题目,是删除的题目输出相应信息,不是的话就输出答题信息。
如果答案不存在或者题目不存在或者是删除的题目,那么相应的题目的分数为0分,其他情况就看答案正不正确。
4.类图
5.采坑心得
(1)遇到的问题一
由于一开始我是先判断是否是井号N,然后再判断正则表达式验证。这样就会少了,如果一开始就缺少型号的情况,所以就会出错。
解决方法:在获取输入信息之后,直接进行正则表达式验证,符合正则表达式在进行进一步的判断。
(2)遇到的问题二
一开始我是先判断题目存不存在,然后再判断题目是否删除,最后再判断答案存不存在,这与题目要求答案不存在优先级最高不符。
解决方法:先判断答案存不存在,然后再判断题目存不存在,最后再判断题目是否删除。
(3)遇到的问题三
str.matches("#S:\\d\\s+\\d{8}(\\s+#A:[1-9]-\\s*.+)+")
我的一开始没有考虑到答案是空字符或没有答案,所以正则表达式写的有问题,所以当它没有答案时,会提示格式有问题。
解决方法:将正则表达式改为java(#S:\d\s+\d{8}(\s+#A:[1-9][0-9]*-\s*.*)*)
6.改进建议
以后要根据题目正确的写出正则表达式,看清楚题目要求,要知道哪个的优先级最高。
五、总结
通过这三次题目集,我对Java语言有了更深入的了解,掌握了面向对象编程的基本思想和方法,提高了编程能力和解决问题的能力,完成所有基础语法练习题,使我对数据类型和运算符有了更深入的理解,成功创建了多个类,并实现了类的继承和多态,学会了使用封装来保护类的数据,提高了代码的安全性,掌握了ArrayList和HashMap的基本用法,能够存储和操作大量数据,知道了在创建对象时初始化属性,了解了无参构造方法和有参构造方法的使用场景,学会了正则表达式的用法。
标签:总结,存储,题目,答题,试卷,方法,用来 From: https://www.cnblogs.com/lyj187/p/18504070