一、前言
第七次大作业:
还是家居电路模拟程序,在上一次的基础上迭代了互斥开关,互斥开关有三个引脚,且每个引脚为了不被短路,存在阻值,还有一个就是迭代了窗帘,根据室内的灯光来进行调节的,所以这次还需要多一个计算总光照的过程。总体上还是跟以前一样把总电路看成串联电路然后一个个设备再去细分。
涉及的知识点:电路的基础知识、多态继承、类的设计等
第八次大作业
本次大作业是最后一版本迭代家居强电电路,添加的内容为电路中有并联的并联,并且添加了二极管,正向导通反向截止,输出方面需要增加的输出有短路状态输出,元器件引脚的信息输出,超过电流限制输出等等。
涉及的知识点:电路的基础知识、类的设计等
期末测验
本次期末测验考的是搭建谷仓抉择,主要考基本逻辑思想、类设计的基础、继承等
二、设计与分析
第七次大作业
对于本次题目,我做了以下类图:
这是本次代码的类图,一共包含四个类,其中有10个类为elec的子类
Main类是负责调用dealstring函数并且出输出的类
dealstring类主要负责处理输入的字符串,将电路的元件和连接顺序全都存储起来
elec类包含了所有受控设备和控制设备的所有基本信息,会将设备的电压电流电阻值记录下来
thread类是一个线路的集合,将这个线路看成一个整体计算电压电阻电流值
主函数逻辑:
初始化函数,调用dealstring类中的dealnow函数对输入的字符串进行处理,在dealstring中分为三类,一类是T开头的线路处理,一类是M开头的并联处理,另一类的是改变各种电器状态的处理,用正则表达式区分这三种,首先是线路处理分为两种,一种是分线路一种是总线路,在分线路中要处理好互斥开关对的线路,将互斥开关不同引脚对应的线路都定义一个thread类进行存储并将这个线路存储在互斥开关类中。改变电路主要是改变控制电路设备的状态。回到main函数中开始对电路的电压还有计算灯光做处理,用正则表达式区分所有设备,计算总电阻后,然后对控制设备进行遍历,算出总电压,就可得总电流,根据这个电流开始对每个设备进行分压,并联上需要对设备进行按阻分流。根据分到的电压可以得出灯光的亮度,定义一个变量将总光照数加起来并返回主函数。将存储所有设备的数组传入处理函数dealstring中的对设备名称进行排序,排序后回到主函数开始按顺序遍历整个电路并输出。
if(Pattern.compile("H\\d+-2").matcher(str).find()){for(int i = 1;i < stemp.length;i+=2){if(stemp[i].startsWith("H")){String htemp = stemp[i].substring(0,stemp[i].indexOf("-"));meswitch me = (meswitch) this.find.get(htemp);me.sett1(tm);tm.mes = true;tm.mesname = htemp;break;}}}else if(Pattern.compile("H\\d+-3").matcher(str).find()){for(int i = 1;i < stemp.length;i+=2){if(stemp[i].startsWith("H")){String htemp = stemp[i].substring(0,stemp[i].indexOf("-"));meswitch me = (meswitch) this.find.get(htemp);me.sett2(tm);tm.mes = true;tm.mesname = htemp;break;}}}
特别插入一下对线路处理中的互斥开关线路处理的代码,将识别到的互斥开关的其中一个线路加入到线路集合里,并且将线路是否存在的变量置true,然后将线路名字记录下来。
这个处理后的线路会加入到互斥开关中的thread变量。
改变控制设备的状态部分除了加入一个互斥开关来决定要连接哪条线路外,和上次大差不差。计算总电阻总电压方面加入了互斥开关的电阻,窗户电阻,窗户的光照输出我是在输出上直接查询总光照后返回开合度。
第八次大作业
根据题目要求,我做了以下类图:
本次实验一共有15个类,增加了二极管的类,是elec的子类
Main类是负责调用dealstring函数、调用计算电阻、计算电压、计算电流的值,然后根据这些数值分配电压,计算光照值,并且出输出的类
dealstring类主要负责处理输入的字符串,将处理的字符串分为三个,线路,并联和改变电路元件状态。通过数组和hashmap将电路的元件和连接顺序全都存储起来,期间需要调用thread类来记录一个线路,有时候一个线路也会看成一个设备。
elec类包含了所有受控设备和控制设备的所有基本信息,会调用thread计算设备内拥有的线路并且计算心啊路的基本信息比如电阻,然后每个设备内都有计算电阻以及各种设备特性信息的函数,并且会将设备的电压电流电阻值以及其他有用的数值记录下来。
thread类是一个线路的集合,有计算这个线路中的电阻以及输入电压输出电压的值,将这个线路看成一个整体计算电压电阻电流值以及其他可参考的数值,用arraylist将所有线路记录下来,用hashmap将相关的类也记录下来。
主函数设计:
首先调用dealstring输入设备基本信息,然后在dealstring 解析出设备的信息,这次与以前不同的是我需要记录引脚的相关信息以应对之后对引脚电压的处理。其他处理步骤和之前差不多,回到main函数后,开始计算各类的电压,计算电压我需要知道每个设备上一个设备的电压值就是这个设备的左引脚值,而这个设备计算出来的电压值就是这个设备右引脚的电压值。然后这次增加了二极管,我需要知道这个二极管是的1引脚是否和vcc相连,如果否的话这条线路就是截止状态,这一部分的难点就是,可能会有并联中的并联,而其中一个并联有断路导致二极管引脚判断不能是从左往右,在这个点上我还没有想到解决方法然后就是将所有引脚值在初始的时候就已经记录下来了,但有一些漏洞,初始的时候我记录的是设备的引脚值,但是有些电路中存在并联内并联,所以还要记录并联的12引脚值,还有线路类的12引脚值,然后这次需要判断短路,如果总r=0的话,那么就是短路。然后其他的就和上次迭代没什么区别,回到主函数输出上,这次输出需要输出是否超出电流设备额定电流的信息,这只需要将额定电流存储在设备的类中然后将设备当前的电流和额定电流做对比,如果前面记录的没问题的话,按照题目要求的输出顺序,理论上输出只需要在上次的基础上加入二极管的输出,类似于开关的输出。
for(String temp : deal.thfind.keySet()){thread tt = deal.thfind.get(temp);cnt2++;for(String temp2 : tt.scircuit){if(Pattern.compile("\\d+").matcher(temp2).matches()){Switch swtemp = (Switch) deal.find.get(temp2);if(swtemp.geton()){cnt1++;tt.u = 0;break;}}}}
以上代码是遍历判断是否开路的其中一部分
这部分在计算电压之前,如果是开路的话那么就不进行计算电压了,减少时间复杂度
期末总结
第一题主要是写一个立方体的类和圆柱体的类,类中有计算体积的方法,然后对比圆柱体和立方体体积大小给出谷仓建设建议,如果不符合题目数据输入的要求需要输出相关提示。
第二题是根据长度值选择谷仓的形状,在这基础上增加了圆锥形这个类,需要计算所有谷仓的和,只需要在输入的时候就直接计算,然后用一个变量将所有的值都相加即可得出相关答案。
第三题是升序排序,我利用了arraylist将所有的体积记录下来,然后用Collections默认排序最后输出答案。
三、踩坑心得
第七次大作业
本次大作业我有一个矛盾点,也就是互斥开关方面,因为我没有考虑互斥开关其中对应的后面可以是接地或者对应的这条线路可以是直接不存在,所以当我把代码改成接地的代码时,那么不存在这边的代码就会出现输出错误,当我把代码修改成不存在时,接地代码就会出现错误的bug而且我想了半天也没有想到解决方法只能将这个称为底层代码bug了。
第八次大作业
这次大作业写的很乱,因为我的逻辑是记录上一个设备的电压值,但是对于并联或者一个线路当作设备的方面,我无法处理并联内部和线路内部的电压值,可能需要用到递归(?但是需要修改的代码实在是太多了,所以没有去尝试,还有一点就是二极管的引脚问题,我之前的代码将设备存储都是将字符串引脚信息忽略,重复的名字忽略,这导致二极管一开始只能记录一个引脚,我也将我的代码大改,但结果不理想,只有二极管的输出是对的,其他代码都是错的,不改则二极管是错的,其他正确的。
期末考试
本次踩坑主要是在读题目上,第二题和第三题长度限制是在5-15用圆锥,但是我一开始写逻辑只写了15以下,没有写5以上,导致第二题和第三题出来的时候没有满分。
四、改进建议
大作业代码中,设备elec的子类太多了,也许我不应该只分这一层父子类,我应该分开关、风扇、灯、窗户、调节器等等这些大类,然后再在这些类之下再分子类,这样的话大类中代码相似的可以互相调用,然后一开始就应该记录引脚信息,因为在第7次大作业的时候还没出现引脚的用处,所以在第八次突然出现了需要输出引脚信息后底层一些代码就无法更改特别多不然会出现意想不到的报错。
五、总结
一个代码迭代第一次的时候,要尽量根据老师给的参考类图来写类,不要自己觉得不需要那么多类就直接归为一个大类从而在这个大类中越写越杂。然后印象比较深的就是期末考试的时候,最后一道题需要升序排列,我一拍脑门,升序=从大到小(?于是当我写完降序代码后看到样例天塌了。然后对于最后一次大作业,感觉难度太大了(对于我来说)我不仅要看懂我前几周写的一坨我还要自己再在这一坨上再写一坨,代码复用性已经很低了,理论知识没能结合实践操作起来,然后就是写题还是边写代码边看题吧,总着看题我容易忘记前面题目说了什么,因为临近期末,复习的欲望逐渐代替完成作业的欲望,所以这次大作业还是比较潦草的。