第二次Blog是对第二类大作业的总结
前言:
前三次题目集的题量不会很大,提出的引脚我是第一次正式这种问题,有点陌生。难度偏小,虽然我没有拿满,老师还把后面的迭代方向告诉了我们,也更方便我们的设计,这一次对我来说应该是一次突破,因为我从未有一次如此清楚我代码的结构和问题,但我也有一种无力感因为我的思路行不通,要更换思路进行变换,理论可行,实践为零。
设计和分析:
踩坑心得和改进建议:
我对异常处理和变化处理的操作一直不太能够实现,对电子元件直接进行电阻处理再根据开关变化对电阻进行二次变化是行不通的,不能正常处理并联电路的问题(开关均闭合,开关一开一闭,开关一开一闭但又一条路电阻为零)。在对这些问题的处理中非零返回是常态,只能放弃这种思路,采用缘路判断:在对处理时遍历判断元器件并进行赋值,再对并联电路进行特殊处理单独写一种方法通过对并联电路的判断来确定电路情况这样可以一举两得同时解决并联套并联的情况(理论可行,实践还在操作通过判断并联电路的大小来判断开关的数量再判断开关的数量是否匹配,若匹配则再进行下一步判断把开关开的电路单拿出来组成新的并联电路)这样就将复杂问题简单化,从而解决问题。另外的问题就是对于其他的问题就是精度丢失。
两次大作业连着没写完让我很崩溃,第一次是设计问题,开关总是保持一种状态,只拿了一半分,排序问题也是不会collection.sort,只能用最原始的取存重排这样就使代码变得更加繁杂。我现在所采用的就是把电子元件当做最大的父类,旗下子类包括连接器,用电器和电路,再对电路,连接器和用电器进行细分,没有采用引脚因为过于麻烦,用电压可以直接清晰地表述出该电路的占电情况,而不是借用引脚把电路串起来,做到遍历电路,但这样也用好处,那就是可以有很大的容错率前提是自己的代码是正确的情况下。
我的改进思路如下:
- 把对连接器状态的判断和设置放在最前面,紧接着就是对电路通路的判断,把通路拿出来重新组装电阻,在这里就包含了并联串并联和并联套并联的情况。
- 把电子元件的创建对象取消电阻,对用电器里包含电阻并在创建对象后用set方法来决定电阻,对全部都关上的情况不视为电阻无穷大,直接重构电路,对于短路的情况也是一样的,在并联电路中只要出现一条短路的情况就直接判断电阻为零,否则对电阻进行计算,相加减。
- 最后是带入电压进行计算,直接让220V进入总线路,根据分压的情况下,判断用电器的状态,并将状态记录下来。
- 输出还是一个一个的输出,用debug来检查输出是否存在漏洞或者问题。
如果上面的思路不行(大概率是会出现非零返回的情况,出错就出在并联电路的电阻上),就要对并联电路的函数进行重写,令其实现重构电路的功能。
我的思路较为复杂,我室友认为可以简化在对电路进行处理的时候就确定好电路,接着用分压的方法完成计算,这样在最先处理的时候就已经完成了对电路的处理,一举两得,而我则是把他们拆成两部分,代码更复杂,考虑的也更麻烦.对最大父类用抽象类,将他们都封装好即可。
我觉得最难的部分就是这里改进部分的实现因为这里涉及多次遍历还有多次的集合嵌套,把并联电路当成用电器,不清楚并联的嵌套程度可能会对题目有影响,因为是多重嵌套,在写这次Blog的时候还没有想到该怎么解决这个问题,其他的就如上述所说就可以实现,我认为我和那些满分代码的最大区别就是思路,我的思路经常不能被实现,就算能被实现也会有很多误差,这些误差会严重影响到代码的实用性,还有就是思想的不同频,我常常不会表达我的问题,我室友也不知道我想讲什么,这样就好像被隔绝在一座荒无人烟的孤岛上,我的本意是用最简单的思路去实现代码功能,结果就是无法实现或者对乱序或特殊操作的难以实现,我自己基础也不是很好,代码经常要写好久,主要的时间就浪费在了思考上,经常带着思路去写代码,写着写着就搞不清楚自己在写什么了,一连几次大作业都没满分,我逐渐开始不自信了,学代码的初期,我依靠ai去理解代码,有一段时间代码还不是很长的时候我会去找ai分析我的代码,看看我错在哪里,我对代码的排序记忆不清楚,经常是这次写完下次就又不记得了,这样的经历让我的代码之路曲折不断,我坚持的原因是蔡柯老师说的要坚持写代码,这次没写完下次·就要更早开始写,要提前构思,如果挂了暑假就做大作业补考。反正就是不能退缩不能不写,写出来了就有进步,对比我第一次写的代码,在对开关的判断上还有重大失误导致开关可以判断状态,但只支持一种状态下的操作,这一度让我的室友直呼牛逼,我的代码能力不是很强,但我想要学好,当初选这个专业的时候就是零基础,我对计算机这类东西一窍不通,但我对写代码开发网页和软件十分感兴趣,来到了昌航就是为了学点真本事回去,身边有这么一群好室友,我一定要坚持下去。
就是这串代码的问题:
点击查看代码
public void calculateResistance(){
for(int i=0;i<Mlist.size();i++){
for(int j=0;j<Mlist.get(i).getTlist().size();j++) {
for(int k = 0; k < Mlist.get(i).getTlist().get(j).getSlist().size();k++) {
if(Mlist.get(i).getTlist().get(j).getSlist().get(k).getName().matches("K\\d")) {
if(((K)Mlist.get(i).getTlist().get(j).getSlist().get(k)).getState()==0){
for(int l=0;l<Mlist.get(i).getTlist().get(j).getSlist().size();l++){
if(!Mlist.get(i).getTlist().get(j).getSlist().get(l).getName().equals(Mlist.get(i).getTlist().get(j).getSlist().get(k).getName())){
clist.add(Mlist.get(i).getTlist().get(j));
}
}
double R=0;
for(int l=0;l<clist.size();l++){
R=R+clist.get(l).getResistance();
}
for(int l=0;l<Tlist.get(Tlist.size()-1).getSlist().size();l++) {
if(Tlist.get(Tlist.size()-1).getSlist().get(l).getName().equals(Mlist.get(j).getName())) {
Tlist.get(Tlist.size()-1).getSlist().get(l).setResistance(R);
}
}
} else if(((K)Mlist.get(i).getTlist().get(j).getSlist().get(k)).getState()==1){
double R=0;
for(int l=0;l<Mlist.get(i).getTlist().get(j).getSlist().size();l++) {
R=R+Mlist.get(i).getTlist().get(j).getSlist().get(l).getResistance();
}
if(R==0){
for(int l=0;l<Tlist.get(Tlist.size()-1).getSlist().size();l++) {
if(Tlist.get(Tlist.size()-1).getSlist().get(l).getName().equals(Mlist.get(j).getName())) {
Tlist.get(Tlist.size()-1).getSlist().get(l).setResistance(R);
}
}
}
}
}
}
}
}
}*/