一.前言
第四次大作业是第三次大作业的迭代,增加了题目的类型,即题目可以有选择题和填空题,其中选择题也可能有多选题,存在多个答案。以此增加了对继承和多态的使用,同时也考验了正则表达式的匹配,输入时的情况与第三次改变较大。接下来五到六次大作业则改变为对电路的设计,总体也是考察对继承和多态的理解和使用,同时也考察了抽象以及接口的使用(使用到抽象或接口会使得题目更加简单)。总体来说题量正常,难度并不算太大。
二.设计与分析
由于第四次与第五次和第六次大作业属于不同的系统迭代,这里分作两部分分析
1.答题判别系统--第四次大作业
以下为我设计的类图:
第四次大作业属于是第三次大作业的迭代,而这次新增加了题目的类型,最适合的做法即设置之前的题目类为父类,填空题和选择题分开(因为答案格式不一样),如此可以解决更改后的信息问题,同时也要修改正则表达式来实现对信息更新后的匹配(第四次大作业与第三次大作业改变较大)。
由于输入信息的类别依据于信息前#+字母中的字母决定,因此设计如上正则表达式来匹配各种不同信息再分别进行存储。与第三次大作业的匹配是大致相同的,只需要重点考察填空题和选择题的判别以及答案的输入。同时也要注意因为题目类型的改变导致答案的改变,答卷类存储答案时也需做出相应的调整。争对填空题,答案一般为中文,多个答案时一般以或为间隔,将答案分隔开,因此个人认为可以在正则表达式匹配到之后进行信息输入时,便对字符串依据或分割(一个答案时也可以进行),就需要使用到sqrt函数以及正则表达式的配合。之后将获取的答案放到一个数组中,将数组传入到对应的hashmap中,便完成了答案的获取。由于选择题也存在多个答案的情况,但格式与填空类并不相同,字母(选项)之间使用空格分隔,此时便不能使用大作业三对信息获取的常用套路————对数据依据空格分隔开(因为存在错误格式输入的情况,继续依照大作业三的获取方式会使得错误格式判别更加复杂),因此对选择题输入需要做别养的设计。同时还要更改答卷信息的输入,由于题目都可能存在多个答案,答案一般使用数组储存,再依靠hashmap查找存储数据的数组,因此答卷类只需要判别输入的答案并将它们分隔开,以适应之前存入答案的格式,之后进行一一判别,这种做法也同时更利于对半对情况的判断。最后则是学生信息的更改,这次大作业中一个学生可以拥有多张答卷,这就需要对答卷信息的存储进行相应的更改,将学生类与答卷类进行关联,这里使用hashmap依据答卷序号进行的匹配就能很好的解决问题,其他设计与第三次大作业大致相同,无过多更改。
2.强电路模拟系统--第五次大作业和第六次大作业
由于第六次大作业是第五次大作业的迭代,其中包括大部分第五次大作业的设计,只是新加了并联类以及一个设备,还有对输入信息的更改,此处主要对第六次大作业进行分析
此为对应第六次大作业的设计类图
再对类的主要关系进行分析时,我们可以主要对第五次大作业进行分析。第五次大作业给出了两个大类,一个是控制设备类,包括开关,调速器等,同时对调速器设置了相应限制,及只能第一个连在电源上,可以省去很多情况的考虑。一个是受控设备类,包括风扇,日光灯等家具,主要依据电压差进行不同档次的工作,即输出的工作信息随电压改变而改变。这也提供了我们设计两个父类的思路,同时利用抽象和接口设置子类均可使用的方法,能更好完成这个程序。由于第五次大作业只有串联,考虑的情况大多与开关有关,同时没有错误信息的输入,因此输入的信息并不难进行分割并分开存储。第六次大作业加入了并联,也算加入了电路类这一大类,串联类和并联类为其子类,同时输入信息格式与答题判题程序输入的信息有一个共同点,便是信息前面有#+字母以便区分,因此使用到的正则表达式进行获取与答题判题程序大致相同。需要注意的只是对控制设备状态的改变。不过我们可以开局设置一个电压为V。输入信息的同时算出对应电阻,在所有信息输入完成后再进行电压的计算,能够方便很多。同时也需要对开关重点关照,因为开关没有调速器的限制,可以放在任何地方,且开关的状态决定着一条电路的情况。因此我设计了输入类,输出类和计算类来辅助对各种情况的判别。
三.踩坑心得
此处我也对第四次大作业和第五次第六次大作业分开进行分析
1.答题判题程序
踩的坑主要有三个。由于hashmap中不存在对象时再去引用,则会出现非零返回和报错,而我依据题目设计对错误信息判别式,错误的信息会被忽略掉而不会创建对象,因此这里踩了第一个坑————没有对引用对象进行是否为空的判断,导致出了非零返回
第二个坑则是因为题目所要求的输出信息的格式顺序,而我当时并没有注意到,因此导致输出结果的格式与答案的不一样,出现大量错误。第三个坑则是多学生多试卷乱序输入的问题
由于我没有考虑到乱序输入的情况,同时由于使用的是hashmap,并不会对学号进行自主排序,因此输出的信息与答案输出的信息也是不同的,才导致这些出错。后面我换成了treemap,利用treemap的自主排序,解决了大部分问题,但仍存在部分测试点未通过。
2.强电路模拟系统
第五次大作业较为简单,经过对开关的各种情况考虑,能够简单的通过所有的测试点,因此并没有踩到什么坑。而第六次大作业踩到的坑则主要也有三个。
第一点则是忽略了只有一条串联的考虑,即与第五次大作业输入的信息类似,整条电路为一条串联,没有并联,而我在设计时并没有考虑到这种情况,因此出现了大量错误。
经测试以上均为单串联的情况,因此只需加入对并联数量的是否为0的判断就能够很好的解决问题。
第二点则同样是对开关的考虑不全,由于并联中的开关可以有多个,也可能没有开关,在进行电压计算时情况不同,比如一个开关断开导致整个通路为串联,而我没有考虑到这个情况,依旧导致断的通路存在电压。
第三点则是对改变控制设备信息的输入。由于存在不对改变控制设备的情况,而我没有考虑到这一点,导致电压一直为220,输出的信息出错。
四.改进建议
1.答题判题程序
由于输入信息的多样,个人认为可以设计一个专门的输入类,来避免在主函数考虑到多种情况因此导致主函数过长,增加了函数修改所需要的时间和精力。同时争对输出信息的排序,个人认为可以设计一个专门的排序类来对输出信息进行排序,能够更好的解决hashmap输出信息不符合格式的情况。
2.强电路模拟系统
对于强电路模拟系统,个人认为对于输入类需要进行改进,以便适应之后错误信息的输入以及多种不存在的情况,减少非零返回次数。多设计一个专门针对开关的情况判别类,避免在计算类或者其他类中塞入大量开关情况的判别导致代码很难更改。同时对计算类也需要改进对电阻的计算,由于下次大作业迭代新增了互斥开关以及多个并联的情况,对电阻的计算对于电压的判断尤为重要,因此个人认为在输入信息之后电阻就需要计算完成存储在电路中,便如我设计的类中电路的属性电阻(之前大作业我并没有有增加这个,而是电阻直接计算)。同时可以增加一个计算接口用于替代设计类中大量格式相同的计算。
五.体会
对于这三次大作业,主要考察对于抽象类和接口的应用以及继承和多态的理解,而经过这三次锻炼,也让我对于继承的应用更加熟络,同时对于正则表达式的运用,动态数组以及hashmap的运用更为得心应手,同时也让我认识到对于接口的学习需要进一步加强,对于接口的运用也需要多加练习。并且改掉看到题目直接写代码的陋习有了一定进步,形成面向对象程序设计的核心素养以及设计思路,养成先设计类图在写代码的习惯。对于类的设计更需要系统化,对象化。在这几次大作业中也有许多获得优秀成绩的学生,说明这几次大作业并不算很难,对于我也算一种全方面的锻炼。