在进入总结之前,先讲讲我在学习过程中的曲折的心路历程:在刚开始学习java时,我觉得java与我们上学期接触的c语言(在语法上)没有什么差别,甚至在刚用java写一些简单题目时(数学题),感觉需要打非常多的字母,就例如输入这方面,c语言可能只需要scanf一下,但java却要先import一下,再......(不过多赘述),在我心里java确实没有c语言那么方便,不过在解决前几次简单的pta(小杂毛)过程中,我还是对自己的水平蛮有信心的,但直到....
直到我接触到了java的核心:类设计时,我就知道:it’s hard!第二次的正式大作业的最后一题,就极大考验了我对类设计的理解,我设计的也确实非常不好,导致了在某个点上纠结过多时间,还经常会忘记之前的类设计,导致结构的乱与杂。我最后也没有拿到满分(好难过),以下是我对这三次作业的一个总结:
******(1).前言:
第一次作业知识点:(1).如何设计一个类(2).如何使用一个类(3).如何使用数组(4).正则表达式的使用(5).对字符串的处理
题量:中
难度:低
第二次作业知识点:(1).Collections排序的使用(2).LinkedList类的使用(3).类的设计(4).正则表达式的使用(5).对字符串的处理(6).Pattern以及Matcher的使用
题量:中
难度:中等偏上
第三次作业知识点:(1).日期类的使用(2).LinkedList类的使用(3).类的设计(4).正则表达式的使用(5).对字符串的处理(6).hashmap类的使用(7).Pattern以及Matcher的使用
题量:少
难度:高
******(2).设计与分析:
第一题:
设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三部分:
1、题目数量
格式:整数数值,若超过1位最高位不能为0,
样例:34
2、题目内容
一行为一道题,可以输入多行数据。
格式:"#N:"+题号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式约束:题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
样例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
3、答题信息
答题信息按行输入,每一行为一组答案,每组答案包含第2部分所有题目的解题答案,答案的顺序号与题目题号相对应。
格式:"#A:"+答案内容
格式约束:答案数量与第2部分题目的数量相同,答案之间以英文空格分隔。
样例:#A:2 #A:78
2是题号为1的题目的答案
78是题号为2的题目的答案
答题信息以一行"end"标记结束,"end"之后的信息忽略。
输出格式:
1、题目数量
格式:整数数值,若超过1位最高位不能为0,
样例:34
2、答题信息
一行为一道题的答题信息,根据题目的数量输出多行数据。
格式:题目内容+" ~"+答案
样例:1+1=~2
2+2= ~4
3、判题信息
判题信息为一行数据,一条答题记录每个答案的判断结果,答案的先后顺序与题目题号相对应。
格式:判题结果+" "+判题结果
格式约束:
1、判题结果输出只能是true或者false,
2、判题信息的顺序与输入答题信息中的顺序相同
样例:true false true
在第一次作业的类设计时,我只写了一个叫all的类,其中的属性有编号,内容,标准答案以及我的答案(非标准答案),好处是在创建对象时比较方便,以及对于正确答案与给出的答案比较好比较。缺点是无法对后续类进行拓展,没有体现单一职责功能,这也是后续代码比较乱的重要原因之一,所以缺点是明显大于优点的,只贪图了一时的方便,而且对于字符串的处理全写在了主类里,这非常不好。
第二题:
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-1基础上增补或者修改的内容。
要求输入题目信息、试卷信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三种,三种信息可能会打乱顺序混合输入:
1、题目信息
一行为一道题,可输入多行数据(多道题)。
格式:"#N:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式约束:
1、题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
2、允许题目编号有缺失,例如:所有输入的题号为1、2、5,缺少其中的3号题。此种情况视为正常。
样例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
2、试卷信息
一行为一张试卷,可输入多行数据(多张卷)。
格式:"#T:"+试卷号+" "+题目编号+"-"+题目分值
题目编号应与题目信息中的编号对应。
一行信息中可有多项题目编号与分值。
样例:#T:1 3-5 4-8 5-2
3、答卷信息
答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序与试卷信息中的题目顺序相对应。
格式:"#S:"+试卷号+" "+"#A:"+答案内容
格式约束:答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
样例:#S:1 #A:5 #A:22
1是试卷号
5是1号试卷的顺序第1题的题目答案
22是1号试卷的顺序第2题的题目答案
答题信息以一行"end"标记结束,"end"之后的信息忽略。
输出格式:
1、试卷总分警示
该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100分,该部分忽略,不输出。
格式:"alert: full score of test paper"+试卷号+" is not 100 points"
样例:alert: full score of test paper2 is not 100 points
2、答卷信息
一行为一道题的答题信息,根据试卷的题目的数量输出多行数据。
格式:题目内容+""+答案++""+判题结果(true/false)
约束:如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is null"
样例:3+2=5true
4+6=~22~false.
answer is null
3、判分信息
判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。
格式:题目得分+" "+....+题目得分+"~"+总分
格式约束:
1、没有输入答案的题目计0分
2、判题信息的顺序与输入答题信息中的顺序相同
样例:5 8 0~13
根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。
4、提示错误的试卷号
如果答案信息中试卷的编号找不到,则输出”the test paper number does not exist”,参见样例9。
设计建议:
参考答题判题程序-1,建议增加答题类,类的内容以及类之间的关联自行设计。
第二次的类就设计的比较多,也非常乱,先对我第二次作业的类设计介绍一下:第一个类叫做topic类(题目类,属性有编号,内容,标准答案)(这个题目类倒是符合单一职责)。第二个类叫做paper类(试卷类,属性有编号,题目数量,试卷总分,以及一个链表(放的是题目类的对象),以及分数数组)。第三个类叫做answerpaper类(答卷类:属性有编号,以及一个链表(放的是String类型的答案(非标准答案)))。还有一个主类(里面有一个字符匹配的方法)。总的来说,设计的很差,因为在储存完数据之后,连我自己都用不来了(捂脸),找不到对应数据存放的地方,所以总的来说设计的很乱很杂。
第三题:
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-2基础上增补或者修改的内容,要求输入题目信息、试卷信息、答题信息、学生信息、删除题目信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分五种,信息可能会打乱顺序混合输入。
1、题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
格式:"#N:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式约束:
1、题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
2、允许题目编号有缺失,例如:所有输入的题号为1、2、5,缺少其中的3号题。此种情况视为正常。
样例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
2、试卷信息
试卷信息为独行输入,一行为一张试卷,多张卷可分多行输入数据。
格式:"#T:"+试卷号+" "+题目编号+"-"+题目分值+" "+题目编号+"-"+题目分值+...
格式约束:
题目编号应与题目信息中的编号对应。
一行信息中可有多项题目编号与分值。
样例:#T:1 3-5 4-8 5-2
3、学生信息
学生信息只输入一行,一行中包括所有学生的信息,每个学生的信息包括学号和姓名,格式如下。
格式:"#X:"+学号+" "+姓名+"-"+学号+" "+姓名....+"-"+学号+" "+姓名
格式约束:
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
样例:
#S:1 #A:5 #A:22
1是试卷号
5是1号试卷的顺序第1题的题目答案
4、答卷信息
答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序号与试 卷信息中的题目顺序相对应。答卷中:
格式:"#S:"+试卷号+" "+学号+" "+"#A:"+试卷题目的顺序号+"-"+答案内容+...
格式约束:
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
答案内容可以为空,即””。
答案内容中如果首尾有多余的空格,应去除后再进行判断。
样例:
#T:1 1-5 3-2 2-5 6-9 4-10 7-3
#S:1 20201103 #A:2-5 #A:6-4
1是试卷号
20201103是学号
2-5中的2是试卷中顺序号,5是试卷第2题的答案,即T中3-2的答案
6-4中的6是试卷中顺序号,4是试卷第6题的答案,即T中7-3的答案
注意:不要混淆顺序号与题号
5、删除题目信息
删除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目内容与答案改为一条失效提示,例如:”the question 2 invalid~0”
格式:"#D:N-"+题目号
格式约束:
题目号与第一项”题目信息”中的题号相对应,不是试卷中的题目顺序号。
本题暂不考虑删除的题号不存在的情况。
样例:
N:1 #Q:1+1= #A:2
N:2 #Q:2+2= #A:4
T:1 1-5 2-8
X:20201103 Tom-20201104 Jack
S:1 20201103 #A:1-5 #A:2-4
D:N-2
end
输出
alert: full score of test paper1 is not 100 points
1+1=5false
the question 2 invalid~0
20201103 Tom: 0 0~0
答题信息以一行"end"标记结束,"end"之后的信息忽略。
输出格式:
1、试卷总分警示
该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100 分,该部分忽略,不输出。
格式:"alert: full score of test paper"+试卷号+" is not 100 points"
样例:alert: full score of test paper2 is not 100 points
2、答卷信息
一行为一道题的答题信息,根据试卷的题目的数量输出多行数据。
格式:题目内容+""+答案++""+判题结果(true/false)
约束:如果输入的答案信息少于试卷的题目数量,每一个缺失答案的题目都要输出"answer is null" 。
样例:
3+2=5true
4+6=22false.
answer is null
3、判分信息
判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。
格式:**学号+" "+姓名+": "**+题目得分+" "+....+题目得分+"~"+总分
格式约束:
1、没有输入答案的题目、被删除的题目、答案错误的题目计0分
2、判题信息的顺序与输入答题信息中的顺序相同
样例:20201103 Tom: 0 0~0
根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。
4、被删除的题目提示信息
当某题目被试卷引用,同时被删除时,答案中输出提示信息。样例见第5种输入信息“删除题目信息”。
5、题目引用错误提示信息
试卷错误地引用了一道不存在题号的试题,在输出学生答案时,提示”non-existent question~”加答案。例如:
输入:
N:1 #Q:1+1= #A:2
T:1 3-8
X:20201103 Tom-20201104 Jack-20201105 Www
S:1 20201103 #A:1-4
end
输出:
alert: full score of test paper1 is not 100 points
non-existent question~0
20201103 Tom: 0~0
如果答案输出时,一道题目同时出现答案不存在、引用错误题号、题目被删除,只提示一种信息,答案不存在的优先级最高,例如:
输入:
N:1 #Q:1+1= #A:2
T:1 3-8
X:20201103 Tom-20201104 Jack-20201105 Www
S:1 20201103
end
输出:
alert: full score of test paper1 is not 100 points
answer is null
20201103 Tom: 0~0
6、格式错误提示信息
输入信息只要不符合格式要求,均输出”wrong format:”+信息内容。
例如:wrong format:2 #Q:2+2= #4
7、试卷号引用错误提示输出
如果答卷信息中试卷的编号找不到,则输出”the test paper number does not exist”,答卷中的答案不用输出,参见样例8。
8、学号引用错误提示信息
如果答卷中的学号信息不在学生列表中,答案照常输出,判分时提示错误。参见样例9。
本题暂不考虑出现多张答卷的信息的情况。
看到第三题的类图我自己看了都头皮发麻,连主类一共写了12个类(总算是在一定程度上保证了单一职责),简单介绍一下各个类的职责:1.topic类(题目类)2.paper类(试卷类)3.answerpaper类(答卷类)4.student类(学生类)5.topicinput类(解析输入用来储存题目)6.paperinput类(解析输入用来储存试卷)7.answerinput类(解析输入用来储存答卷)8.delinput类(解析输入用来储存删去的题目)9.studentinput类(解析输入用来储存学生)10.agent_1类(解析删去的题目并对改题目进行处理以删去这道题目)11.agent_2类(用来输出)12.Test类(主类:仅输入)。仅通过类图就可以看出来我的设计,好吧,根本没有设计可言,完全就是在乱写一通,也是向第二题一样,在输出时根本没有头绪(搞得我头都大了)。
******(3).踩坑心得:
在写这次pta时我还是踩了非常多的坑的,提交代码时总是会有那么几个错误,于是得从头开始调试代码,花了好多时间发现了以下的坑,不过这才是真正有意义的东西。现在让我对其说明一下。
【1】.在使用hashmap时,我采用的是用set遍历hashmap,但遍历顺序并不是按照存入顺序来的(可能会一样)就如以下代码及其结果:
正如结果所演示的,遍历出来的顺序并没有按照我的排列顺序。解决方法:使用LinkedHashMap。
【2】.在使用.split函数将字符串切割成字符数组时,在字符串的开头有需要被切割的地方,字符数组下标为0对应的字符串为空,就如以下代码及其结果
正如结果所演示的,ss[0]对应的值为空。
【3】.在使用HashMap时,如果有key值相同的value值,后来输入的value会覆盖之前的value值,就如以下代码及其结果
正如所演示的,后来的value值java会覆盖之前的value值c语言。
******(4).改进建议:
【1】.数据存储上:过多的使用了LinkedList,导致数据的访问比较困难(需要自己翻前面的代码去回忆怎么存的,存到哪里去了),而且也无法做到很灵活的使用,建议是改成更为方便的容器,就如数组之类的。
【2】.字符串的处理上:使用了Matcher以及Pattern去匹配正则表达式,但是用了先储存后判断的方式,虽说可以做到随时调用,但却导致出了一点差错以及不方便的地方:导致了判断Wrong Format的过程非常困难,建议是先判断后存储。
【3】.代码设计上:在存储题目编号时,有可能出现1.2.5题的现象,在原来的代码中使用的是LinkedList的存储方式,但LinkedList有一个非常大的弊端就是在存储完过后很容易忘记下标对应的题目标号是多少(下标肯定与题目编号对不上,就如只有一道题时,题目编号为1,但其下标是0,所以不利于后面的使用),改进建议是将LinkedList改用成其他的容器,就比如hashmap,其特点就是可以随意改变key值。
******(5).总结:
在这几次pta作业中我学会了如何使用更多的java容器:如除了数组之外的LinkedList,HashMap,LinkedHashMap,arrayList.....我也在写代码的过程中理解并逐渐学会了如何设计类的单一职责。同时,学习 Java 是一段充满挑战和收获的旅程,而在这个过程中,踩坑更是不可避免的一部分。通过踩坑,我深刻领悟到了许多关于编程的知识。
其次,我意识到理解和实践并重的重要性。学习 Java 不仅仅是为了掌握其语法规则,更重要的是理解其背后的设计原理和编程思想。通过实践,我不仅加深了对 Java 语言的理解,还提高了自己的编程能力。编写代码、调试程序是学习过程中的重要环节,只有通过不断地实践,才能真正掌握编程技能,才能成为一个优秀的程序员。
此外,我学会了善用调试工具。调试工具可以帮助我们逐步跟踪代码执行过程,找出问题的根源。通过调试工具,我能够更快地定位问题,并找到解决方案。调试是解决问题的有效手段之一,掌握好调试工具对于提高编程效率至关重要。
以上就是我对pta这几次作业的总结,感谢您的观看!!!