前言
这次的作业是第一次博客作业的迭代和新的一个大作业的两次迭代三次大作业的组合。
1.第四次大作业
这次大作业输入信息分为5种:题目信息、试卷信息、答卷信息、学生信息、删除题目信息。信息可能会打乱且顺序混合输入。需要正则表达式判断是否满足格式,只有正确的格式才能进行储存。这次还是利用ArrayList和HashMap实现对未知大小的信息进行储存。(1)增加了多选题这一种题目种类,这种需要将答案进行合理的分割并进行储存,实现对多种不全选答案进行判断。(2)对输入填空题的判断也有了新的要求,比如答案中有或等需要与标准答案进行比对,如果答案全部包含在正确答案中且不完全相等,这时候可以算是半对,当含有一个错误就整题错误。(3)这次对输入顺序也有了改变,只要是正确格式的信息都可以以任意的先后顺序输入各类不同的信息。(4)这次还对多张信息进行了新的规定,这次考虑到多个同学有多张不同的试卷,输出顺序优先学号、试卷浩,按从小到大按学号排序再按试卷号。这是这次第一部分大作业的最后一次迭代了,难度和题量相对而言比较大,但是在第三次大作业的基础上进行修改还是比较好完成的。
2.第五次大作业
这次大作业是一次全新的改变,这次的目的是设计家具强电电路的模拟程序。这次总共设备有两个大类,分别是控制设备和受控设备。控制设备分为:开关、分档调速器、连续调速器,受控设备分为:灯具和风扇,这次的灯具包括白炽灯和日光灯,风扇只有吊扇一种,然后将每个连接处成对表示设计类将全部设备存储并根据电压、开关和调速器来计算这个受控设备的亮度或转速。这是新的一部分大作业的第一次作业,所以难度比较小,但是因为受控设备的种类很多,需要运用大量的类来定义大量不同类型的对象,所以题量比较大,需要对所有类进行有效梳理,否则容易混乱。
3.第六次大作业
第六次的大作业在第五次的大作业的基础上增加了许多,比如增加了电扇里面加了落地扇,将原本的一条串联改为串并联同时增加了几种子类,此次迭代在上一次的大作业的基础上发生了一些比较大的改变:(1)受控设备:增加了落地扇并给每种电器都增加了电阻.(2)输入格式:从原来的单独输入变为包含在线路信息中输入,并增加了一个字母M来表示并联电路。(3)电路结构:由只含有一条串联电路变为线路中包含一个并联电路。完成此次大作业我们不仅要完全剖析题目中的信息、需要清楚的理解子类与父类之间的关系和调用等方式,还要灵活运用正则表达式将输入样例进行拆分并存储,存储后再将每种不同类型的信息存储到不同的链表中,过程极其严谨,要清楚理清各个类之间的调用关系,方便后面的储存和调用。这次大作业对于我来说难度比较大,题量也很大,任然需要对所有类进行有效的梳理,否则任然容易混乱。
设计与分析
以下是我对每次大作业的代码分析:
1.第四次大作业
这一次的新增了选择题和多选题,总体结构没有太大的改变,在输入时我新增加了判断是否开头为“Z”和“S”的判断并记录下来,在判断结果对错时这两种题目的判断函数。还增加了多个同学有多张不同答卷的情况,需要在输出时对试卷进行排序。
多选题标准答案是在输入时将多个结果切割保存,判断结果对错时遍历这些正确的答案,假如全部正确则是true,错一个则是false,其他则是输出partially correct。
填空题的给分与正常判分差别不是很大,不是全对的情况下,只要改变判断是否答案包含在标准答案之中,即可判断是否是半对还是错误。
输出对试卷排序则是在输出前将答卷先按试卷号从小到大排序,再根据答卷的学号进行第二次排序,这样答卷的顺序就是先学号再试卷号从小到大的顺序进行排序了,再按照原来的函数进行输出结果就好了。
2.第五次大作业
因为这次有许多的种类,需要设计许多类去定义这些种类的电器,而且要理清楚处这些类的使用。首先分别设置这几个类的链表,然后读取输入的数据(以“end”结尾),判断输入的是哪种类型的数据并存入链表中,存入时我用的是“if-else”来分别存储。存储完成后,查看是否有调速器,若有则计算出调速后的电压,并用v将其记录下来。接着循环各个受控设备的链表输出其信息,判断灯的亮度以及吊扇的转速分别传入电压并用change和speed方法来计算。
3.第六次大作业
这次是第五次的迭代,增加了落地扇和并联电路,需要我们对并联电路的分压进行判断。但是这次我使用了继承来划分不同的电器种类,我设计了一个总的父类时电器类,可以储存他们的名字和状态,在设计两个小的子类分别是控制电器和受控电器,受控电器里我增加了电阻这个属性,接下来我再在这两个大类下设计了所有的开关、调速器、灯和电扇的类。这样设计类可以在后面的调用中更好的调用他们,省去许多的判断,也可以让我们的类更加简洁明了。此题同样创建这几类的链表再读取,将全部信息存储完成后就用五个for循环开始对各个链表中的信息根据名字中的编号进行排序,排序完成后与上题相同计算出调速后的电压值用v记录,然后对lines进行循环找到主路对主路上的设备进行各项信息的计算并用change函数对其信息改写。主路判断完成后循环并联路线中的line链表对其路线中的设备进行计算并改写(state为0则直接跳过)。所有信息全部计算并改写完成后按照上一题一样的顺序对各项设备信息进行输出。
三、踩坑心得
1.第四次大作业
对输出排序时顺序搞错了,想直接先根据学号排序后再进行试卷号排序,但是没有想清楚第二次排序时会将学号重新打乱,导致并没有像我们需要的那样先按学号排序,再按试卷号排序
只要将排序的函数改成如下就可以进行正确的排序,并可以正确输出结果
这个错误让我意识到事情的排列顺序需要我们进行详细的思考再进行实施,不能想当然按照我们自己的思路去随意对输出的东西进行排序,这也难怪往往很难得到我们需要的结果,所以我们应该在写代码之前将思路理清,设计好再进行编译。
2.第五次大作业
未考虑到分档调速器已经到达最小档或已经到达最大档时继续减小挡位或者继续增加挡位时应该如何计算电路上的电压,导致输出错误
只需要改变分档调速器的挡位控制,即当处于最小档时无法继续减小,最大档时无法继续增大,改成以下的方法即可解决这个问题
未考虑到Java自己的计算精度导致本来想直接将分档调速器的各个档位直接设为0,0.3,0.6,0.9,后面计算档位时直接除以3即可得到,但是当我这样执行时,0.9除以3时得到的是2.99,导致直接强制类型转换时会变为2,是的挡位有误差,所以需要修改,将档位设为0,1,2,3,再在计算时将其乘以0.3,这样的结果就不会发生错误,即按如下对分档调速器进行修改
这两个错误对我都对我有很大的收获,因为这次的两个错误并不是老师在题面中提出的要求或者思路,而是要基于我们对现实生活的经验和对java的精度理解。
前面一个让我意识到在设计一个程序去执行一个事情时需要自己对这个程序有自己的理解不能一味地靠老师告诉我们哪里需要注意,哪里需要设计一个东西来保护电路的正常进行,需要自己思考好设计出的东西需要能经历什么特殊情况的时候能正常的运行。再根据得到的成绩继续完善自己的思路,记住自己漏考虑的地方,下次再遇到同样类似的情况下能有效避免。
后面那个问题则暴露了我对Java基本概念还是模糊的,无法正确使用java中的计算,从而导致结果的错误,这种错的是十分基础的,而且很难测出来是哪里出现了错误,需要一步一步地去推,所以应该加强对这些基本知识的了解,让我们的程序少走一些弯路。
3.第六次大作业
将日光灯的开关判断编写错误,导致输出日关灯亮度时输出的值是错误的
应该将getState改成getV,getState是判断这个日光灯是否亮,而在输入电压之前日光灯不是亮的导致输出亮度永远是0,需要改成一下方法
这个错误让我以后知道了在判断时需要思考到底是要判断在什么条件下才能进行下面步骤,而不能想当然,随便写一个if-else上去,导致整个程序的输出错误,而且因为这个错误十分小,而导致检查十分困难,从而浪费大量时间。
四、改进建议
1.第四次大作业
这次作业就是前几次作业的新迭代,改进的地方没有太多。
2.第五次大作业
这次大作业新开了一个程序,但是我觉得和现实生活中的电路不太能对应的上,比如说大功率电器不应该进行串联,我们也不会将多个小功率电器进行串联使用,避免因为电路过载而导致危险。而且这次作业的布置时间离上一次过去的很久,导致很久没写大作业思路已经有点不清晰,虽然题面已经出出来了,但是因为样例不够导致不知道从哪里入手。
3.第六次大作业
这次大作业是在第五次大作业的基础上进行的迭代,但是第五次串联大量电器还是没有改变,这次加的是并联电路,根据这个设计程序来考察我们对这些的设计类还是可以锻炼我们的思考能力的。
五、总结
1.这三次大作业让我知道了何用面对对象的设计方式设计我的程序,学会利用类设计对象,并将不同的对象进行分类储存。
2.学会了如何使用正则表达式判断一段字符串是否符合需求,并对字符串进行分割。
3.学会了ArrayList和HashMap,知道如何在不知道大小的情况下储存一系列数据,并进行增删改查。
4.对于正则表达式还需要进一步的学习,加强练习,达到对正则表达式的熟练运用。
5.对于对象的一些调取功能还不是特别熟练,需要培养更加清晰的逻辑思路。
6.新的大作业对类的调用以及一些继承传递有着很多的应用,但是现在对这些方法的使用还是有点不太熟练。
7.代码越来越长,需要我们在每次编写时思路理清,在以后编写程序时应该先想好应该如何设计类以及如何调用,再来编写代码,这样可以让我们省去很多时间。
8.希望老师能在课堂上适当提醒一些想不到的样例,开拓我们的思路。