前三次大作业总结
一、前言
这三次作业都是完成一个答题判题程序,但是每一次的都在增加新的内容,所以难度逐次增加。
1.第一次作业
程序输入三部分内容:题目数量、题目内容、答题信息。设计类并根据所输入的信息使用正则表达式进行切割,把每一部分存进各个对象中的属性中并调用函数进行判题。因为是第一次大作业,所以题目相对简单,题量不是很大,难度也适中。
2.第二次作业
程序在第一次的基础上增加了内容,这次输入的内容也是三种:题目信息、试卷信息、答卷信息。因为上次给出了题目的数量所以可以直接使用数组,但是这次需要我们学习ArrayList和HashMap的知识来实现对未知大小的信息进行储存,并会遍历去寻找我们需要的内容。这次也增加了计算试卷总分的输出内容,也争对答案信息缺少时进行了"answer is null"的输出。对比第一次大作业难度有了不少的增加,因为增加了一些功能所以题量也有所增加,因为当时的ArrayList与HashMap没有掌握透彻,难度稍微偏大。
3.第三次大作业
程序内容继续在第二次的基础上进行增加,这次输入的信息内容增加到了五种:题目信息、试卷信息、答题信息、学生信息、删除题目信息。这次的信息会打乱输入,也需要正则表达式判断输入的信息是否满足格式,只有正确的格式才能进行储存。这次仍然需要熟练使用ArrayList和HashMap的知识来实现对未知大小的信息进行储存,在主函数中也要使用List对每一种类的所有对象进行储存,并增加了许多限制,例如:(1)试卷中的题目储存可以不按照题目自身的编号但是在答卷中答案输入的答案编号是按照它所匹配的试卷试题的顺序进行匹配;(2)增加了学生信息,在每一次判断答卷时需要判断试卷,题目,学生是否存在;(3)题目错误引用:答案不存在,引用错误题号,题目被删除,每一种情况输出的结果都有所不同等等。题量增加了很多,需要有清晰的逻辑,难度也大大提升。
二、设计与分析
以下是我对每次大作业的代码分析:
1.第一次大作业
因为第一次的输入格式比较简单,所以我设计了一个试题类来储存所有的试题(题号,内容,答案),并将这些属性封装,编写了一些get,set函数对这些属性进行编写。
也使用了有参与无参的构造器方便主函数创建新的对象。
也在类里面编写了一个判断答案正确与否的方法,并且能返回结果。
在主函数中我循环接收输入的信息并进行切割存放进问题对象中,并建立数组对所有问题进行储存,答案直接存进答案数组中
再对答案与各个问题中的标准答案进行比对

这次作业让我知道了如何使用类,并学会了如何创建对象并使用它的方法。
2.第二次大作业
这次作业的输入信息种类有所增加,所以我设计了题目类,试卷类和答卷类。在主函数中循环输入这三种信息的时候,用正则表达式对其进行分割并创建相应的对象并用List进行储存


因为在输出得分前需要给出试卷是否为100分,所以遍历储存试卷的List,并调用每个试卷对象中的总分方法判断总分
再进行一次遍历将所有的试卷信息,答案信息,判断是否正确,并计算总得分等信息全部输出

在这一次的大作业里面,我初次使用ArrayList与HashMap,了解到如何储存一类中的所有对象,并对这些对象进行增删改查,也进一步加深了如何切割字符串并进行储存。
3.第三次大作业
这次输入的信息种类在第二次的基础上增加到了五种,但是我还是设计了三个类,题目增加了判断输入的信息是否符合格式要求,不符合则不能储存,所以使用了一个函数,用正则表达式对每种信息都进行判断


输入并将不同的信息储存到相应的List中,因为题目引用错误的不同,输出的答案也有所不同,因为题目被删除这个引用错误在输入时就可以进行对所有题目以及所有试卷各自所含题目的答案进行修改,与其它的题目进行区分
在试题输入时我将所有的试题全部进行储存,而在试卷输入时,试卷每增加一个题目,都需要去全部题目中通过题目编号遍历并将找到的试题储存金试卷的题目List里
下面是在试卷类里面增加题目的方法,如果找不到,对这题进行标记,在后面输出时,输出这题不存在

因为还是要输出试卷是否为100分,所以还是遍历List并找到对应对象使用方法返回它的总分并进行判断
接下来对所有答卷进行遍历,因为答案全部存在相应答卷对象的属性中,所以我将对答卷进行判断的过程放在答卷类的方法中,传进去所有的试卷信息和学生信息,在每一张答卷中进行判断并输出
先通过答卷的序号遍历所有试卷并找出对应试卷,如果找不到就输出“找不到试卷”,找到了就遍历这张试卷所有的题目,并记录现在遍历到第几道题,并在同时找到这份答卷中的答案List寻找此顺序号所对应的答案并进行判断,如果找不到则输出“答案不存在”
在遍历到下一张答卷前,在调用一个答卷方法,输出每道题的得分并计算总得分,但是要先判断这个学生是否在学生的列表中,不在则输出“这个学生不存在”,找到则遍历相应试卷的题目判断每道题是否正确,只有正确才会输出相应分值并加入总分,其余情况全部按0分处理

在这次的作业里我更加透彻的了解到ArrayList和HashMap的增删改查以及相互嵌套的用法,也加深了使用正则表达式方法的印象,会使用其进行字符串的判断和字符串的拆分,这次题目的结构更加的复杂,信息更加的繁杂,需要理清逻辑再进行编码,也在编码的过程中我不仅增强了我的思维能力,也让我认识到面向对象的优点,可以让我的代码更加有条理。
三、踩坑心得
1.第一次大作业
在对题目进行遍历时,没考虑到题目可能乱序输入,导致答案出错,正确的输入输出是
出错时的输出是
所以需要将题目按顺序输出,再与答案进行比较,就是将
更改为
这个错误让我明白了要细心读题,了解到不同输入方式可能会对输出造成的影响,并需要想办法解决这些麻烦。
2.第二次大作业
遍历题目时因为Map并不能按输入顺序储存所有的题目信息,所以导致输出的题目与答案不能匹配,导致出现错误,正确的输入输出是
错误输出时输出的是
这时我们可以改变储存方式,用其他的方式进行输出,就是将
更改为
所以以后在使用这些工具的时候需要了解到每一个工具的优缺点和可能会在运用时产生的错误,也让我对List和Map有了更加深刻的认识。
3.第三次大作业
在开始输入的时候,应该先判断这一题是否存在,再去删除这一题并作记号,正确的输入输出时
错误的输入输出是
所以应该先判断这一题是否存在,再去修改,就是将
改成
还有在判断输入切割时,使用的正则出现了错误,使正确的输入无法正确储存,正确的输入输出
错误的输入输出
所以需要改变正则表达式对字符串的拆分,即将

改为

在这次作业我学习到了许多正则表达式的使用方法,也知道需要从多个方面思考问题,不能按照自己的思路随意拆分,要结合实际情况。而且不同的情况需要确定先后顺序,不能想当然。
四、改进建议
1.第一次大作业
这次大作业是规定的大小的,所以可以直接定义数组对所有的对象进行储存,但是在实际生活中很少出现这种特殊情况,所以最好将数组改为List,以免输入的题目超出数组大小导致编译错误。
2.第二次大作业
这个作业的顺序是乱序,最好能将所有题号按照试卷添加题目的顺序将这张试卷所拥有的题目储存在试卷类中,可以节省许多不必要的麻烦,并且方便我们查找代码,答卷也是同样,将该答卷的所有答案存进该答卷中,这样不用每次都去所有的题目或答案中寻找,也可以让代码的逻辑更加清晰。
3.第三次大作业
这次作业没有判断删除的题目是否存在,所以应该提前设置一个判断以免错误删除导致新增错误信息,题目的错误引用可以更改题目信息进行记录,方便查找。
五、总结
1.这三次大作业让我知道了何用面对对象的设计方式设计我的程序,学会利用类设计对象,并将不同的对象进行分类储存。
2.学会了如何使用正则表达式判断一段字符串是否符合需求,并对字符串进行分割。
3.学会了ArrayList和HashMap,知道如何在不知道大小的情况下储存一系列数据,并进行增删改查。
4.对于正则表达式还需要进一步的学习,加强练习,达到对正则表达式的熟练运用。
5.对于对象的一些调取功能还不是特别熟练,需要培养更加清晰的逻辑思路。
6.希望老师能在课堂上适当提醒一些想不到的样例,开拓我们的思路。

浙公网安备 33010602011771号