一.前言
本学期第二轮大作业即将迎来末尾,其他技术方面是否提升不太好说,但是堆砌代码的技术长了不少,明明可以耗费更多心思设计的更完美一些,但还是选择了重复一堆代码来实现目的,仿佛这样会使我的思路更加清晰明了。比如存入数据完全可以通过一个数组来存入要匹配的类型,我却写了六个循环来匹配数据,导致至少有200行代码重复度极高,明明完全可以依靠一个循环搞定的。
书接上文,仍然是答题判题程序,第四次题目集让我第一次体会到了什么叫做改改就能用,得益于一、二次题目集的教训,第三次题目集大改类的设计,终于在这一次重新拿了满分,本次题目除了新增多选题外,还有填空题,思路倒是不难想,多选题先判断是否有错误答案,再判断与正确答案匹配个数,是否重复写入同一个答案,改一下判题函数的返回值即可,填空题直接判断是否是子集以及答案和标准答案的长度即可,唯独没想到有一个格式错误竟然是答案中包含空格,还不能去掉这无用的空格,狠狠的被摆了一道。——难度适中,题量尚可。
新的开始,家居强电电路模拟程序,第五次题目集刚拿到手的时候其实是完全发懵的,一点也看不懂的,好在第一次只考串联线路,而且设备很少,一次最多只串联三个,于是投机取巧的堆砌代码,两两设备链接,勉强通过。基于题面看不懂的情况,难度还是很大的,但好在老师仁慈,没设下坑,难度可改为适中,题量较大。
第六次题目集,我觉得完全可以算是一道新题,尽管仍是家居强电电路模拟程序,但改变了输入模式,这输入模式一换,就是一道全新的题目,思路一下子就明了了,他竟然提供了并联线路的输入,在此之前我完全以为是像第五次一样,只给设备和引脚,这样的话我就不得不考虑如何根据引脚来判断什么是并联电路的,什么是干路上的,但好在没有下这么大的黑手。根据老师在课堂上的提示,我将并联线路设计成了电器元件。难度较大,题量适中。
二.大作业分析
第四次大作业分析
对比前三次来讲,第四次大作业分析堪称仁慈,没有过多的异常处理,还给了那么多的提示,由于多了多选题和填空题,题目不再是简单的对或错,为此我改变了判题函数,不再是布尔型的,同时题目类新增属性:题目类型(0N1K2Z)
class Tell extends Question{
String tellQA(String Q,String A,int type){
this.type=type;
A=A.trim();
if(type==0) {
if(Q.equals(A)) {
return "true";
}else{
return "false";
}
}else if(type==1){
if(Q.contains(A)&&Q.length()==A.length()) {
return "true";
}else if(Q.contains(A)&&Q.length()!=A.length()) {
return "partially correct";
}else{
return "false";
}
}else if(type==2){
int find=0;
int count=0;
String[] words = Q.split(" ");
String[] Answer = A.split(" ");
for(int i=0;i<Answer.length;i++){
for(int j=0;j<words.length;j++){
if(Answer[i].equals(words[j])){
find=1;
count++;
break;
}
}
if(find==0){
return "false";
}
find=0;
}
if(count== words.length) {
return "true";
}else{
return "partially correct";
}
}
return "false";
}
}
如代码所示,返回的是字符串,正确,错误,部分正确,同时传入题目类型
类图如下
SourceMonitor报表如下
第五次大作业分析
新的大作业,需要新的思路,根据题面,我设计了以下类别
引脚类
包含引脚序号和电压两部分
但结果是完全用不上这东西,但又因为代码还需要这东西运行,不然就要大改,我就勉强留下了
设备类
作为电器的父类,有设备序号,两个引脚,和两端电压的压强差。
变压器类,我觉得需要单独拿出来,这样我会好分析点,所以单独作为一个父类被设计出来
其它子类都是具体设置自己的参数,并没有什么值得分析的。
因为第一次接触这个,输入的信息还不是一整条线路,所以我只能选择最笨的方法来实现,一个一个链接。
最开始是和电源链接,每个设备都要写一次循环来和电源匹配,如果匹配的是电器,那么引脚1电压就是220,引脚2电压就是0,包含开关。
如果是变压器和电源链接,那么变压器引脚1是220引脚2是输出电压,方便后续通过引脚传递电压。
接下来是变压器和电器连接,也是一样的堆代码。通过循环匹配电器,再循环匹配变压器,成功后把前者2引脚电压供给后者1引脚电压
然后是电器和电器链接,主要是看开关在前还是在后,分别再堆两个大循环
最后检测线路是否连通,这样第五次大作业就结束了。
类图如下
SourceMonitor报表如下
第六次大作业分析
第六次大作业可不得了
完全不同于上一次的输入方式,给了我一丝希望,关于如何写线路类设计的希望。
如图所示,T代表串联M代表并联,而且M还是直接用了T作为成员而不是电器,更是给了总线路T3,这样的话,思路就清晰的不得了。
串联线路类设计如下
有电阻,有序号,有电压,有设备链表
并联线路是线路链表
如此一来,先存串联线路,通过6个循环匹配6个设备,并联线路也当作设备存入,例如M1,存入完毕。
再去存并联线路,存入时匹配到对应的线路,再去匹配线路中是否存在开关,如果存在,是否全部闭合,只有线路连通才配存入并联线路中。
计算基础数据,计算所有T的电阻,所有设备电阻已经给出,直接加就行,但是干路设备中的M并没有算,所以先不加。
计算M电阻,上面已经计算了所有T的电阻,如果M的成员大于1通过并联电路电阻公式计算出M电阻,如果等于1,直接将T的电阻给M。
再将M电阻加到干路中,干路电阻就补全了。
最后开始分压,先检测干路线路是否连通,通过检测干路的K开关设备是否闭合,连接的M的线路成员个数,来判断干路是否接通,如果接通,判断是否有变压器,通过变压器给干路T3赋予电压,根据串联线路电压之比等于电阻之比,已知干路电压和干路电阻,各电器电阻,只需要一个简单的乘法就能分压完毕。
M分到电压,根据并联线路电压处处相等,所以T1,T2电压就是分到的电压,最后M成员线路再根据串联线路分压,最后输出所有设备信息
第六次大作业结束。
类图如下
SourceMonitor报表如下
最开始是想把所有设备存到一个容器里的,后来想了想,存到一个容器设计循环思路反而没那么清晰,所以干脆一个设备一个链表,这样思路清晰,排序还可以直接用接口。
三.踩坑心得
对于这几次大作业来说,最为重要的仍是设计,对于敲代码来说,有一个好的设计就如鱼儿得水,有了设计,就有了思路,有了思路就可以一路高歌前行。
对于输入数据来讲,一定要注意边界处理,比如档位变压器,最高就是3档,不可以输出3以上的数值。
对于用户输入的数据,一定要原封不动的保留,切不可私自处理,比如第四次大作业用户给出的答案包含无用的空格,我们只有在对比正确答案时才会去除这些空格,其他时候保留这些空格。
如果你想保留类里面的某些数据不被重新new导致清零,请使用static
针对于测试点不再给予提示,我们自己测试的时候可以考虑由简单到困难,比如本次测试可以从最简单的串联线路,电源-电器-接地,依次增加开关,器件,并联线路,这样可以测出是否有基本数据出错,比如无开关线路默认供压220V写成了0V
四.改进建议
针对家用电器线路这个大作业,我建议直接删除引脚类,改为在函数中处理引脚连接情况,整体分析下来发现完全不需要依靠引脚传递电压,而是在线路搭建完成后电压就分好了,如果有引脚异常链接的情况,也是单独做出一个检测函数,比依靠检测引脚传递情况要好,当然,要是应用到现实肯定是不能这么干的。
对于设备存储,想了想还是改为存储在一个容器内比较好,代码可以变得更加简洁,存入方式也不再是匹配正则表达式,改为匹配设备数组中的参数,这样就可以减少重复循环的次数。
线路方面,还是改为一个链表比较好,但是我的代码依靠双链表循环匹配,已经无力更改了。
针对排序,如果不能使用接口排序,那就在输出时将要输出的数据临时存入到一个数组,进行排序。
五.总结
对于一名学生来讲,写大作业最重要的是读懂题目以及类的设计,宁愿花费三分之二的时间去理解题目,也不要拿到手就开始写,做好类的设计,想好逻辑思路,敲代码也不过是4小时左右的时间,就可以完成基本框架,只需细节调试即可,如果提前设计好,碰到错误就会有思路,知道具体哪里错,怎么改,而不会抓耳挠腮想不清楚,最后迫不得已的一次又一次重写代码,试图理清思路。
善用正则表达式,他的强大虽然不是滥用的理由,但当你无法修补漏洞是,他或许是最好的补丁,比如保存答案时用了trim去除多余空格,顺便把答案的空格扔掉了,但是用正则表达式匹配答案,就可以直接存入带空格的答案。
希望之后的路能够更加顺利!