一:前言:
1. 知识点总结:
①:java面向对象类和对象的基本用法
②:关联类,依赖类和组合等类间关系
③:正则表达式的运用
④:Comparator接口及比较器基本使用
⑤:ArrayList的基本使用
⑥:Collections.sort方法使用
2. 题量:
较少,每次题目集不超过3题
3. 难度:
由于题量少,所以每次题目集难度较大,特别是每次题目集的第一题,难点在于类的设计,以及每次迭代增加了许多内容,如何对上次代码进行更改,本次
代码如何做到合适的扩展来适应下次的迭代等都比较难。这次前一个题目集是对上次的迭代,增加了更多类型的题目,例如多选题,填空题,这对判题程序
提出了新的要求,对于后两次题目集,是针对家居电路的,难点在于程序如何设计来实现电器之间连起来,以及在串并联电路情况下电流电压的计算
二:设计与分析:
第四次题目集:(只分析第一题)
1. 类图设计:
这次包括主类我总共设计了16个类,相较于上一题我新添加了继承自抽象题目类的多选题类,填空题类以及一般题目类,以及输出类ViewPrint
2. 源码分析:
1、源码信息:
代码行数:1157
语句行数:594
分支数占总语句数百分比:18.5
方法调用语句数:338
注释语句占总语句百分比:16.4
类和接口数:6
最复杂函数的复杂度:10
平均深度:1.81
最大深度:9+
平均复杂度:3.06
由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在最大深度(Max Depth)
,最复杂函数的复杂度(Maximum Complexity)不合格,其他方面较上次题目集有所改良。
2、源码思路及问题:
思路:首先在Main类中创建五个列表,分别是题目,试卷,答卷,考生和删除列表,用来接收输入的五种信息,在输入一行信息,通过判断第二个字
母来判断输入的是什么信息,在去截取内容信息。然后创建题目对象存题目信息,创建试卷信息存题目及本身的信息,创建答卷对象存试卷及本身的信息,
创建考生对象存答题者的信息;全部输入完后再去给试卷赋题,给答题者赋试卷,这样可以解决乱序的问题,然后再去判题即可,判题方法需要多加两种,
用来判选择及填空题,最后我创建一个输出类,输出答案及得分。
问题:本次程序在第一,二三次的基础上逐渐优化,但存在一个明显的问题,就是if-else语句用的太多了,在判断输入时,在判断答题结果时,都用
到了大量的if-else,虽然可以解决当前的问题但是实在不易扩展。
第五次题目集:(只分析第一题)
1. 类图设计:
这次题目集与前四次不一样,换了一次主题,这次是家居电路,我这次设计了20个类,分别是继承自Device主类的几种用电器,然后是控制电器包括开
关及几种调速器,然后是判断输入类及跟电路相关的检查通路类及赋值通路类。在控制设备和受控设备里都加上一个输出方法用于输出自己的状态。
2. 源码分析:
1、源码信息:
代码行数:758
语句行数:397
分支数占总语句数百分比:19.4
方法调用语句数:140
注释语句占总语句百分比:9.2
类和接口数:11
最复杂函数的复杂度:15
平均深度:1.75
最大深度:7
平均复杂度:2.11
由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在最复杂函数的复杂度
(Maximum Complexity)和每个函数平均包含的语句个数(Average Statements per Method)不合格。
2、源码思路及问题:
思路:我首先创建一个泛型为Device的列表用来装所有的电器,先去判断属于什么信息,然后去解析设备信息,连接信息以及调节信息,然后依次存
到列表中,然后去遍历列表去做调节设备,以及判断电器的状态,最后输出即可。
问题:这次题目集我尽管对了,但设计十分失败,我将所有电器放到一个列表中,对于下次的迭代我直接被淘汰,我需要重构,下次有并联电路,那我
这次设计显然不合理,并且我这次是无法计算电流等属性,尽管这次题目集并没有要求;这次我设计了许多毫无用处的类,比如开关和连续调速器都有一个
抽象开关及抽象调速器类,完全多余,只需要继承自一个控制设备再去扩展就行了,还有在计算亮度时,我写了一个接口,结果就只有灯能用,并且这本应
该作为灯的方法。
第六次题目集:
1. 类图设计:
这次我在老师的建议下,将所有电器继承自主类Device,然后受控设备,控制设备,串联电路,并联电路都去继承Device类,受控设备里包括风扇,灯等,
控制设备包括开关和调速器等,串并联电路看成一个独立的电器设备,然后跟上次一样去解析,这次我是创建一个主干路列表,里面是电器或者是串并联电
路(电器列表),这样就可以实现一条电路可以有多条串并联电路,可满足下次迭代;在计算电流时,我写了一个接口,里面有两个方法,一个是输入电流,
一个是输出电流,然后Device主类去实现它,然后根据需要每个子类去重写即可,这样就可以去计算电流,电压等属性。
2. 源码分析:
1、源码信息:
代码行数:988
语句行数:554
分支数占总语句数百分比:23。8
方法调用语句数:253
注释语句占总语句百分比:11.3
类和接口数:15
最复杂函数的复杂度:24
平均深度:1.79
最大深度:6
平均复杂度:2.03
由上图,可知当前代码在每个函数平均包含的语句个数(Average Statements per Method)和最复杂函数的复杂度(Maximum Complexity)不合格
2、源码思路及问题:
思路:首先创建一个总干路列表,用于存储在干路的电器,里面包括串并联电路(列表),然后去解析三种信息,串联信息,并联信息,调节信息,
依次存进干路或干路中的分路,本题我采用分流的方式去计算电流等属性,先计算总电流,然后通过实现一个接口让电流流过总干路,用电流乘以电阻
的方式去计算电压,然后写一个比较器用于排序,最后输出即可。
问题:本次代码存在的问题就是对于并联电路中还有并联电路处理起来较麻烦,这样时间复杂度比较大,代码效率低
三:踩坑心得:
第四次题目集:
①:
在本输入样例中,对于多选题的答案构成存在着许多坑,我以为只有A, B, C, D四种形式
于是我用以下数据进行测试
我改变了答案的输出顺序,发现输出结果是
也就是说乱序也是对的,A,C与C,A结果是一样的,但我还是过不去有关多选题的全部测试点
于是我用以下数据进行测试
这次新加了不存在的答案V,但我的代码确认为是半对的,正确的是全错才对
对于选择题还有一种测试点,就是答案数量超出A, B, C, D的情况,这也是我后来才考虑到的,以下为测试样例及正确结果展示
本次题目集主要坑集中在选择题上,填空题没有什么坑,不在过多赘述。
第五次题目集:
本次题目集的坑主要在开关的顺序上,以下为样例
①:
这个测试样例考虑的就是开关在电器后面的情形,因为我在检查通路时,是从前往后的,我只能应对开关在前面的情形,如果开关在后面,我是不影响前
面的电器的,正确的如下
于是我重写了检查通路这个方法,因为本次题目集只有干路没有分路,所以在检查时,只要开关是断开的,其他受控设备的相关属性就为0
下面的是一般样例(针对本样例)
第六次题目集:
由于加入了并联电路导致本题的坑比较多
①:
第一个坑就在于判断电路状态上,以下是本样例的输出结果
分路的开关闭合了,但是干路上的连续调速器却是0,所以导致整个电路的受控设备全为0
②:
第二个坑在于部分短路的情况
这次我按一般情况下计算电流,只有70多分,但这第二个坑我后来才想到,以下为测试结果
D1电器为0,这是因为在并联电路中,一条分路只有开关的话,可以说这个并联电路被短路了,那么在分路的D1自然没有任何电流
③:
经过前两个坑,我就卡在了94分,最后两个点一直过不去,直到测到了这个点,以下为修改之前与之后的结果
可以看出问题出现在误差上,因为我是通过计算总电流,然后用电流乘以电阻的形式计算各个电器的电压,这样在计算并联电路电阻时会出现小数,
此时就产生了误差,然后计算的电压就可能变小,针对这个问题,只需要在在计算并联电路电阻时四舍五入即可。
四:改进建议:
第四次题目集:
1.针对判题方法:在本次题目集中,我每种题目的判题程序是写在各自类中,但是这样不方便修改,并且不清晰,我建议可以写一个判题接口,然后
Title主类实现这个方法,然后选择题等子类重写这个方法,这样更能体现单一职责。
2.针对主类:我主类代码120多行,太长了,许多逻辑应该创建一个类来实现,比如在判断输入的是哪种信息时,我写了5个if,以及在输出时,一些、
Wrong Format格式问题也应写在输出类ViewPrint。
第五六次题目集:
第六次是第五次的迭代,所以我主要对题目集六改进:
1.针对并联中有并联:在本次题目集中,我用一个主列表表示干路,里面存着分路(列表)或一些干路上的电器,但是这样写遍历非常麻烦,我在遍历
时需要先判断是否为串并联电路还是干路上的电器,如果是串并联电路,我又要遍历到串并联电路里面去,遍历分路中的电器。如果并联电路里面还
有并联电路,那么遍历起来非常麻烦,时间复杂度就位O(n^3)了,效率太低,所以我建议用链表去写,用链表去实现这种电路。
2.针对计算电流的方式:本题我是用分流的方式去写,即先计算总电流(干路电流),在用电流乘以电阻计算各部分电压,但是这题目集的要求是在输出
前所有的小数用double类型存,最后输出时在截尾,那么我这样算就有误差,最好按分压方式算,就是通过电阻比的形式计算各部分电压。
五:总结:
这三次题目集总共进行了5周,第四次的题目集迭代以及第五次的题目集较简单,多花点时间就能写出来,但是在题目集六,这次老师关闭了测试点提示,
最后两个测试点找了很久都没找出来,是与别人讨论的过程中,他测出来了,并告知我问题出现在哪,我才能通过最后两个测试点。这样的教学显然是有
利的,因为在实际工作中,这些问题本来就需要你自己去测出来,尽管非常痛苦且枯燥。对于老师的严苛教导,我非常感谢,老师主讲设计模式,这些设
计模式才能体现我们的专业能力,简单工厂模式,职责链模式等都需要我们掌握,但在这几次题目集中我都未运用进去,这是这几次题目集我的不足,今
后我要多加改善。
以上就是我针对三次题目集的Blog,感谢助教组和老师们的辛勤付出,感谢共同讨论、分享的同学!
标签:语句,总结性,题目,复杂度,PTA,Blog,电路,并联,电流 From: https://www.cnblogs.com/pickupwind/p/18226880