1-知识点,题量,难度总结
1.this与super的区分与使用,如何正确使用多态(用父类类型创建子类对象,并调用子类中重写父类中的抽象方法)(在大作业5中的第二道修改学生信息中)(第三道中父类向下转型,另外还有子类向上转型)。
2接口的使用,多态的具体体现(例如在第一次家居强电电路模拟程序大作业中我使用了多个接口来达到编程的目的,其中有接口Device抽象类(所有设备的父类,包含属性与方法)接口Fan(风扇抽象类),接口Light(灯抽象类),有白炽灯(incandescent类),日光灯(Fluoredescent类)都继承灯类(其中灯类中有计算流明ux的抽象方法),吊扇(ceiling类)继承风扇类(风扇类中有计算风速的抽象方法))
3.继承与多态的结合,一个子类(白炽灯)既继承了父类(device),又实现了接口(Light)。
4.comparable接口与compareTo方法重写,以及排序collection.sort的使用(在大作业四和大作五和六中)
5.题量总结,大作业四用了640行,五用了470行,六用了1020行,这三次大作业的题量对于我来说能接受,大作业六纯属是因为类太多才导致代码行数太多,其实就是在一些相似的类中改一些属性和方法。在四中发现原来在构思设计类时由于方法并不是很完善,导致后续出现很多错误,而且这些错误之间基本没有什么联系,也就是说如果要改代码的话就需要改很多代码,可能导致原有代码的逻辑会发生较大改变。
6.难度总结:题目难度都还可以,因为在前几次大作业的设计思路都没有构思完全,所以导致修改代码时需要带上原有的逻辑进行设计,这就导致难度加大了好多。
2-设计思路
大作业四:由于是在大作业三的基础上改一些细节,使其输入方法发生一些改变。
原思路:
设计思路:
单选题,填空题,多选题由于都是题目所以都继承question类,其中包含题号,题目类型,标准答案和抽象方法判断一道题目是完全正确,部分正确还是错误。
1.先判断每行的输入格式,将格式不正确的输出,并将格式正确的存入到一个字符串数组中。
2.读取被删除的题号,并将之存到一个ArrayList里,没有则不需要判断。
3.再读取到题目信息时,判断该题是否被删除,不被删除的话则正常将每个信息存入,并放到一个ArrayList中,否则将内容换成the question num invalid~0。
读取多选题信息时,先将读取到的答案分开存入到一个arrayList中,填空题答案则是放到一个字符串中。
4.读取试卷信息,根据试卷信息将从questionList中提取相应题号存入到该paper中的questiongList中。
5.读取学生信息。
6.读取答卷信息,先判断该答卷号能否找到相应的试卷,不能的话则输出The test paper number does not exist;反之则正常判断。
空:判断答卷答案是否小于试卷上的题目数量,小于的话则证明有空的答案;(answer is null)
不存在:判断试卷信息上题号是否在questionList中找的到,找不到的话则说明不存在;(non-existent question)
找学号:在学生信息中找,没找到的话则输出(is Not found),找到的话则正常输出学号,姓名,分数,总分。
7.情况判定
(1).该题为空,直接输出answer is null。
(2).该题存在,判断是否存在,存在则判断是否正确。不存在则输出non-existent question。
(3).多选题,填空题判定方法,先判断标准答案中是否包含学生答案,如果不包含,则答案为错误答案,如果包含,则往下判断是否相等,如果相等,则为全对,不相等则则为部分正确,其他情况则为错误答案。
大作业五:
设计思路:因为设备有两个引脚,所以只需要找一个引脚所接收的设备,一旦用正则表达式找到就直接为其创建一个相应的对象,然后进行判断是哪种设备。然后进行电压计算和设备信息输入。
1.将Device类设置为所有设备类的父类。其中包含抽象方法,一些get(set)方法,还有一个display用于输出该设备的相关信息。
2.电路电压判断,如果是开关判断,就设置为两种状态,开关打开电压为0,否则为220。而分档调速器和连续调速器则是用其挡位乘以220,最后输出电压大小。
3.利用接口Fan和Light实现计算风速和流明ux的方法。
4.其他设备类(如Incandescent)则有名字name,电阻resistance,电压差pd。其中也有一些重写的方法(如Calspeed,Calux,display)。
5.其中开关Switch,分档调速器SplitGovernor,连续调速器Continuous则分为输入电压inputpd,输出电压outputpd。输入电压固定为220,输出电压则由2说明得出。
6.设备都接上comparable接口进行排序,按顺序进行输出。
大作业六:
设计思路:
1.主线路外的串联电路,先匹配以#T开头的,在进行二次匹配去找这行是否有OUT的,找到了则知道这行串联为某并联里的电路。并将所有串联电路均放在一个ArrayList中。
另外每个串联Line类中有求总电阻的方法,如果该行只有一个开关,则判断是否为短路还是断开,此情况算出的该路总电阻,电压均为0;其他则是要将开关放到一个Arrayist中,判断所有开关是否闭合,如果该路没有开关,则正常进行计算。该路如果为正常通路,则每个设备的电压则是由该设备电阻除以总电阻乘以该路总电压进行计算得到的。
2.找到并联电路,jiang匹配到的T\d去找1中所提及的ArrayList中的电路,找到了之后再创一个ArrayList去储存该并联电路中的所有线路。该并联电路中还有计算总电阻的方法,首先去判断每条路上的电阻是否为0,如果不为0,则正常将其的电阻带入计算,为0的话则忽略。该并联电压为每条路(正常通路)上的总电压。
3.匹配主线路,先找开关,分档调速器或者连续调速器,对总电路进行电压计算,然后读取总分路上的各个设备,如果匹配到了开关,则判断开关状态,之后也是将总电路的电阻算出,每个设备的电阻除以总电阻就得到了各个设备分到的电压,之后就是将电压带进去计算,输出每个设备的信息。
类图:
3-踩坑心得
1.大作业四中用到comparable接口时把大小搞反了,本来是从小到大输出,结果按从大到小输出了。
2.大作业五中忽略了只可能有一种设备的情况,导致后面为其创建对象时有一个对象为空,不能进行正常计算。
3.设计思路一开始运用到了两个引脚,后面发现不需要两个引脚也能输出。
4在使用继承时没有将串联并联也设置为Device的子类,导致后续无法计算电阻。
5.如果匹配到了开关一定要判断是哪条线路上的开关,因为不判断的话后续就无法根据开关对该路进行情况判断,所以每一条串联上都需要一个ArrayList去存放开关类。
6.细节问题,要先将开关,分档,连续调速器的情况先处理完,然后再去算每一条串联的电阻,再去算每一条并联电路的电阻,一步一步来,不能随便算,要不然很容易将逻辑搞混。
7.再计算完毕每一条并联电路的电压时一定要为其中的每一条串联电路赋电压值,每条串联电路也是同样为每一个设备赋值,要不然后续有些设备输出为空。
4-改进建议
在大作业六中并没有判断该路是否为短路的情况,所以在后续大作业中我应该加一些判断短路断路的情况,另外正则表达式的用法也需改进,发现前几次因为正则表达式使用不当导致信息无法正常输入,数据也无法提出和赋值,所以在后续的代码改进中会仔细将正则表达式构思清楚,另外一些接口的使用,抽象方法的重写也应该改换,要不然后续检查的时候很难查出问题。再后续添加了窗帘和互斥开关后,我认为窗帘由于是根据光的强度来判断打开程度,所以不妨将日光灯和白炽灯作为窗帘类的一种属性,而互斥开关的两条路分别作为两条串联电路,而具体指向哪条则根据正则表达式来对信息进行读取。
心得:一定要先构思,先构思,先构思,不要先编码,要不然后续找逻辑错误很难找,边写代码边构思出的代码很不完善,再后续找错中可能要大改,缝缝补补很浪费时间和精力。
5-总结
1.题目难度还可以,就是在第六场大作业中没有测试点的提示就需要花大量的时间去想会不会还有其他可能的测试点,如果没有想到的话测试点基本是过不了。
2.老师上课都会讲对题目的一些思路,我觉得这方面做得很好,要不然有时候挤破头想到的一点思路可能都是不完全正确的思路就很磨人。
3.学习到了继承更升入的方法和多态的使用,可以灵活掌握接口的使用方法,例如comparable的排序,另外再使用ArrayList时也知道将类型设置为父类,然后添加子类对象也可以照常遍历子类对象并调用子类中重写分类的方法达到目的。