OOP第三次博客

write_by_23201707_gongjunjie

oop第三次博客

一:前言

这次博客不出意外是oop课程的最后一次博客了,不过这次博客pta只有两题,但是我想说的是,最后一次pta也是够难的,
但是好像我自己的设计也有很大的问题,第七次pta遗留下了一点问题,导致第八次出现了很多问题

二:关于三次pta作业

题目依然是电路的迭代
知识点:
1.需要进行类的设计,对数组进行封装,要考虑类间关系
2.此次pta使用了正则表达式匹配
3.需要保证类的单一职责原则
4.达到开闭原则,以至于后面迭代的时候可以通过加类而不是疯狂改代码
5.需要用到list
6.需要一点电学基本知识
题量:
第七次的题目量其实还是可以的,我的设计还是可以应对第七次的pta,不过一开始也是改了一段时间,总感觉自己的设计开闭性不够好,
第八次就是比较难的了,我也是用了整整一天才把基本逻辑给写出来,然后又花了好多时间去琢磨测试点,也是比较令人头大
难度:
本人认为第七次的难度还是中等的,因为这次的迭代并没有颠覆我的设计,所以我可以继续按我以前的逻辑写,
不过还是有几个测试点过不了,经过一段时间就能改出来,
第八次pta就比较的难写了,尤其是后面还加了几个测试点,就有点过不了测试点,不过我的程序也确实有点问题

三:关于设计与分析

第七次pta作业

关于类设计

本次设计和大体还是依据上次的设计加上了互斥开关和窗帘两个类,然后加上了一些方法去处理这两个类,互斥开关是继承的Control控制类,窗帘继承的BeControlled被控制类
但是窗帘还要和灯进行关联,所以我就将日光灯和白炽灯进行抽象成一个灯类,然后再继承,这样就可以利用多态处理窗帘的开关问题

对于信息的处理依然是和上次一样,关于类间关系,只是加上了窗帘和互斥开关两个类

分析代码

1.首先就是关于互斥开关的处理,一开始写完有好几个测试点没有过,互斥开关的1-2引脚默认是闭合的,1-3引脚是不闭合的,
所以我就生成了两个对象,然后如果引脚是1-2,直接是闭合状态,而1-3引脚就是默认状态是不闭合的,
这个处理我写在了一开始创建这个对象时,利用正则表达式提取设置互斥开关对象的引脚对象,
然后写了一个设置其开闭状态的函数,在生成对象后就对其状态进行设置,如果是1-2引脚就闭合
2.关于窗帘,问题在于和灯的关联设置其开闭的尺寸,所以我在当所有的数据都读取完后并进行初始化对象后,
将我的连接的最大类传给窗帘计算开闭大小的方法中,然后遍历这个数组找到灯类型,然后将他们的亮度相加,
在进行对窗帘的开闭尺寸进行计算

3.关于改变互斥开关的状态,我是将其1-2引脚和1-3引脚的对象的状态都进行改变
4.其实关于互斥开关一开始我还是比较难以抉择它到底是Control控制类还是BeControlled被控制类,因为Control类可以改变电压,而开关刚好就可以,
但是由于互斥开关又有电阻,这就比较的麻烦,因为前一次的迭代中只有BeControlled被控制类才有电阻,我算电阻就会有些问题,但是最后还是加到了控制类,算电阻方面就判断了一下,
如果是互斥开关就多判断一次
5.这次迭代相较于上次主要的问题就是在于有短路的情况,这个短路会导致和它并联的路没有电流,也就没有电势差,但是当时我没有想这么多,直接就当做全没有电压,因为我的迭代没有去考虑电流,所以就直接让被短路的电路电压为0,并在算电阻的时候也进行了修改,先判断这个路是不是被短路,如果出现短路,那么这一路的电阻就算0,我一开始忘记让电阻为0,导致有两个点一直没有过去

踩坑心得

1.第一个需要注意的地方是互斥开关只输出1-2引脚的开闭状态,1-3的是不输出的,所以输出这里要加以限制
2.电路中可能会出现只有1-2引脚,或者只有1-3引脚的互斥开关的情况,如果是1-2 引脚其实还是正常输出,但是1-3引脚就有点麻烦了,
因为没有1-2引脚的互斥开关的对象,所有我写了一个方法,去搜索是否存在这样一个对象,如果只有1-3引脚没有1-2引脚,
那么我会判断此1-3引脚互斥开关的状态,然后在最大的link数组直接加上一个1-2引脚的对象,并且其开关的状态是和1-3引脚相反的,
这样输出的时候就可以直接输出1-2引脚的互斥开关的状态

点击查看代码
    public void searchMutexSwitch(ArrayList<Link> link){
        int a = 0;
        int b = 0;
        int k = 0;
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < link.size(); j++) {
                if(link.get(j).getNumber()==i&&link.get(j) instanceof MutexSwitch){
                    k=1;
                    MutexSwitch c = (MutexSwitch) link.get(j);
                    if(c.getPins()==2){
                        a = 1;
                    }
                    if(c.getPins()==3){
                        if(c.getState()==0){
                            b=1;
                        }
                    }
                }
            }
            if(k==1){
                if(a==0&&b==1){
                    MutexSwitch temp = new MutexSwitch();
                    temp.setNumber(i);
                    temp.setPins(2);
                    temp.setState(1);
                    link.add(temp);
                }
                else if(a==0&&b==0){
                    MutexSwitch temp = new MutexSwitch();
                    temp.setNumber(i);
                    temp.setPins(2);
                    temp.setState(0);
                    link.add(temp);
                }
            }
            k=0;
            a=0;
            b=0;
        }
    }

3.电路会出现短路问题,这个问题就比较的难搞,我是根据并联电路中某个串联电路其总电阻是否为0,而且这一路要是通路,这样和它并联的其他路就是被短路了,
而被短路的那一路,我就将其电压设置为0,而且将其电阻返回值为0,不然算总电阻时就会使电阻多加上了被短路的电阻
4.此次电路会加上多个并联电路的串联,但是因为我上次的迭代提前写了这一点,所以也是很简单的过了这个点

5.第五个当然就是关于窗帘,灯的亮度是叠加的,我一开始就在犹豫于灯是否可以取最大的,但是后面还是叠加

改进建议

1.对于结构上可以进一步优化,对每一种类型的电器进行抽象,后面可以更加简洁的使用这些电器
2.对于算电阻R的时候有一些问题,当电阻为0时还是传回了1/R,但是这次我巧妙的避开了这个问题,导致下一次迭代在这里栽了大跟头,果然写程序还是不能对bug视而不见啊
3.可以加入引脚类型,引脚类里就放这个引脚的电压,然后利用电压差来计算电器的运作,这样有利于后期迭代

第八次pta作业

对于这次的pta我还是有很多东西要说的,因为这是写的最艰难的一次,甚至最后只得了74分,感觉整个人都不好了,但是因为马上要进行其它科目考试,
所以即使心有不甘,我也只能把一些时间花在复习上,虽然好像也写了好几天的pta,我同学直接整个人都不好了,每天都在改bug,
虽然他比我开启的晚了一天,但是我觉得他和我花的时间几乎差不多了,还是很难受对于这次pta没有满分
但是有一个问题我想说的是,为什么电压永远是标准电压220V,我还刻意留了一手,结果竟然没有换电压,但是就算换可能难度也不大,所以老师才没在这里设置问题吧

关于类设计

1.关于类设计其实因为这次的迭代要输出引脚电压,所以导致我以前那个逻辑无法支撑,所以我加上了一个引脚类型,用来存储引脚编号和电压,
然后把输入信息的提取进行了很多的修改,只是改这个就花费了我一天半的时间,因为一开始我坚持不用引脚,不想重新写自己的设计,
但是当我写了半天之后发现这个逻辑没有办法写后面的逻辑,所以就把整个对输入信息的提取与利用重新改了一遍,导致我改了一天才回到上次pta的进度,这个是让我很难受的地方,后面把基本逻辑写完之后,发现好多地方写的不对,后面又进行了长时间的改bug环节
2.这次的类主要加上了引脚类和二极管类
3.依然是多态的使用,但是这次我在各个类中加了很多方法,这样才能满足这次pta的要求

分析代码

1.第一个要说的是我的整体逻辑的改变,我加入了引脚类,但是这样我对输入信息的处理就出了一些问题,需要进行改变,所以我就先把输入信息处理部分改了一改,我舍弃了以前的处理逻辑,加上了引脚这个类,每一个电器都会有两个引脚类型,一个1引脚,一个2引脚,但是互斥开关会有自己的3引脚,这个是别的电器没有的,所以我的输入就有所改变,并且对于互斥开关搜索也进行了改变,这时候就更加的复杂了去搜索这个电器,但是好在我也改了出来
2.第二个要加的便是管脚电压的显示在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压,这个可是一个大改,我也是改了很久,我的处理就是以前那个电压不舍弃,那个只是用来对电器的工作状态的判断,然后我在这个基础上去加上引脚电压的计算,我的逻辑是设置一个随着电路改变的电压,去记录电器的输入电压,然后用这个电压减去电器的分压,再往后面去传下去,遇到并联电路就将这个电压分别传给每个电路
3.第三个是电流限制问题

这个我的处理是为每个电器都设置一个最大电流属性,这样就可以在算其电流时进行对比,从而判断电流是否过大
4.第四个就是关于短路的问题,这个短路判断是总电路那里, 我的判断是如果电路总电阻为0,并且开关都是开着的,那么就输出“short circuit error”

5.第五个是电路变得更加复杂的问题,串联里可以有串联和并联,这样就比较麻烦,所以我又把电路的处理改进了一下

踩坑心得

1.第一个坑是关于输出引脚电压,这个改了很久依然有问题,所以我就换了一个思路,直接给一个临时电压,这个电压是会随着电器而改变,所以就可以当做每个电器的输入电压
2.第二个点是关于电流的计算,这个计算第我放在了计算电压的时候,一并计算电流,这样就可以不用再进行遍历一个函数一个函数的传过来
3.串联电路里有并联使得电路变得非常复杂,在计算引脚电压的时候出现一些问题,因为前面我计算电阻的方法,如果那个串联电路中有开关未闭合,那么我就传回0,但是电路逻辑是没有遇到那个开关就有引脚电压,只是电势差为0,我就在串联类和并联类里又加上了一个求电阻的方法,这个求电阻的方法不会因为开关没有闭合就传回0
4.第四个点是我的并联电路在求电阻的时候,因为要传回1/R,当R为0的时候就会使得传回NaN,但是因为我前面的迭代将这个巧妙的避开了,导致这次我不敢轻易的去改这个,我改了这个结果其他的又出现了问题,真的难受
5.我认为在写代码之前就是需要认真的思考该怎么写,不能写一步看一步,否则就会出现写了很久发现写的不行的情况,本人也是深受其害,导致代码改了很久
6.有一个需要注意的点是当一个电路被短路时,另外一路是有引脚电压的,这个电压不会被电器所分压,电器的电势差为0
7.第七个就是二极管的问题,我认为把二极管当成一个开关用可能会造成一些问题,比如断路问题,但是我实在没什么好处理的办法,就只能这样处理

改进建议

1.对于求1/R时,要判断R是否为0
2.对于电路的设计我认为可以加上状态,这个状态用来判断是否短路,应该会更加明确
3.对于每个电器类都可进一步抽象,有利于后期加类

总结

学习到的内容

1.正则表达式
关于正则表达式方面我认为收获还是很大的,正则表达式可以对有用信息进行提取,而本次题集我主要是使用了对匹配信息进行分组来达到提取有用信息进行输入的目的,有同学用的是split对信息进行切割,感觉两种方法都挺好,都可以对有用信息进行提取,还有正则表达式的开始符号,不能将信息都放在一个字符串中使用,不然就会出错,正则表达式的非贪婪匹配(.*?)和前瞻断言(?=),可以解决空字符的问题,这两个东西都非常好用,但是对于正则表达式还是有很多东西不够熟练,希望在后期的训练中一点一点积累,最终能熟练掌握正则表达式
2.类设计
这几次的题目集都是在训练我们的类设计能力,但是主要还是考察了类的单一职责原则,就是让类的功能单一化,提高代码的可复用性,为后续迭代做准备,经过三次的pta练习对于类的单一职责我有了初步的认识,但是这两次的类设计并不够好,需要进行更改,为下一次的迭代做准备
3.对于电路的设计问题有了更加进一步的认识,如果下次遇到类似问题可以更好的处理
总的来说,个人认为老师们的教学方法还是很好的,可以学到很多东西,虽然过程比较艰辛,但是收获很多,可以学到很多知识
关于oop的第三次blog就到此结束

posted @   破疑  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示

目录导航