- 前言
- 第四次大作业blog
- 设计与分析
- 踩坑心得
- 改进建议
- 总结
- 第五次大作业
- 设计与分析
- 踩坑心得
- 改进建议
- 总结
- 第六次大作业
- 设计与分析
- 踩坑心得
- 改进建议
前言
第四次作业考察了我们list和map的使用,以及对正则表达式的掌握情况,类的设计与方法的使用,第五次作业和第六次作业是电路模拟,需要一定的物理电学知识。总体来说第四次和第六次作业较难,第五次作业相对容易。题量:第四次和第五次题量适中,第六次作业题量较少。
第四次大作业blog
设计与分析
第四次大作业在上一次的基础上增加了多选题和填空题,本次作业需要存储的信息很多,我用了很多个map和list才完成存储,新增了两个map分别用于存储多选题和填空题的题目,答案仍然存在原来的lsit中。由于每种题目所存的map不同,所以在本次作业中新增了一个属性用于判断题目的类型,使用了map.containsKey()方法判断每个map中是否含有某个key。
本次作业还使用了继承,新增的多选题和填空题和原来的题目所包含的属性基本相同,所以可以直接继承。多选题的多个答案用split方法以空格分开存到数组里,然后再分别遍历答案数组和标准答案数组,判断他们的内容与长度,便可判断是正确、错误还是部分正确。
填空题则是使用matches方法判断答案与标准答案是否有相同元素,如果没有则可以直接判断错误、,如果有相同元素再使用equals方法判断两个字符串是否相同,若相同则全部正确,否则部分正确。
踩坑心得
在继承的使用过程中不太熟悉,经常出现问题。
改进建议
1、类的划分:目前代码中有很多类,但是它们的划分并不清晰。
2、代码的冗余:有些代码是重复的,可以考虑抽象出来成为公共的方法。
3、异常处理:在输入解析和数据处理过程中,应该加入异常处理机制,以防止非法输入或数据处理过程中的错误。
总结
本次作业难度相当大,我花了几乎所以的时间来写这道题,幸好最后写出来了,之前的努力也都没白费。通过这次作业我深刻了解了继承的用法以及继承带来的好处。通过继承,子类可以继承父类的属性和方法,使得代码的编写变得更加简洁和高效。
1、代码复用:继承允许子类使用父类的代码,而不是每次都从头开始编写相同的代码。这增加了代码的复用性,减少了代码冗余,使得程序更加简洁和易于维护。
2、抽象和扩展:继承有助于实现抽象和扩展功能。通过继承,可以抽取出父类中的共性,形成子类,子类可以在此基础上增加新的功能或对已有功能进行扩展。
3、提高代码的可重用性:子类可以继承和扩展父类的方法和属性,使得代码具有较高的可重用性,这有助于减少代码量,提高代码的执行效率。
4、降低代码的耦合度:通过继承,可以让代码的耦合度降低,提高代码的灵活性和可维护性。子类通过继承父类,可以将父类的方法和属性组合起来,形成自己的方法,这样减少了代码之间的耦合关系,使得代码更易于理解和维护。
第五次大作业
设计与分析
第一次的电路模拟程序,我写了一个父类,这个是所有的电路元件,包括串并联的父类然后灯泡类和风扇类继承这个父类,具体的灯泡和风扇继承上面所写的灯泡类和风扇类。但是我第一次作业没有写串联类,将在第二次作业中补上。
第五次大作业我分为三步,首先是对输入的读取和存储,然后判断各个软件包括开关,调速器,灯泡和风扇的状态,最后是计算他们分别的电压并且输出结果。输入的读取我还是跟上次的大作业一样,用正则表达式来匹配输入的字符串,然后再用多态的方法创建了一个声明类型为最大父类,实际类型为他们本身的类的对象,并且将这个对象存入hashmap中。后面的开关和调速器的输入我先匹配他们是什么类型,然后再判断map里面有没有这个对象如果有的话,开关就相对应的加一个档位或者减一个档位,调速器就读取它们的档位并且存起来。输入完成后从map里面循环找分别找到开关,分档调速器和连续调速器,获取他们的档位求出相对应的电压。在每个子类中写出根据题目要求计算出对应电压所对应的亮度和转速的方法。排序输出的话,在父类中分别将kflbrd对应为543210。父类中重写compare to将每一个元件进行排序。然后从Map 对象中获取所有的值,然后把这些值转换成一个 Cir 类型的列表。这个列表将包含 Map 中所有值的 Cir 对象。假设 Cir 是一个自定义的类或者一个枚举类型。最后按照顺序输出。
在写这道题目的过程中,我没有考虑到最后输出要按照题目所给的要求排序后再输出,所以在这个问题上我没有考虑周全,最后出了错误。并且在存储输入信息时,没有首先想到用hashmap来存储,走了很多弯路。
踩坑心得
1、开始没有设计总的父类,在后续的过程中思路混乱,代码复杂,后来老师发了类图,设计了总的父类,相对来说能够简化代码,并且提高代码的可复用性。
2、没有仔细阅读题目,没注意到要排序输出,因此在后面总是有测试点过不了。
改进建议
1、添加一个串联类,以便在后续的迭代中可以直接使用,不需要重新设计串联与并联类。
2、将电压的计算放在每个类中的方法里,简化main方法,提高代码的可复用性。
总结
本次作业是第一次迭代,题目难度不算很大,我在分析题目输入方面有待提高。
第六次大作业
设计与分析
第六次大作业在上一次作业的基础上加入了并联电路。所以在这次作业中我分别写了串联类和并类继承父类。是作业的输入也相较于上次作业发生了比较大的变化。上次作业是一条串联分多行输入,而这次作业是一条串联一行输入。因此这次作业的正则表达式与上次有所不同。不过我也还是按照上次的方法先对每个中括号中的元素用空格分隔开存入数组中,然后再判断他们的类型。这样输入一条串联时就要用到循环。并联电路中是两条串联电路,在并联类中写了一个串联类的array list,存储并联中的每条串联,包括他们的名字和串联电路中的元件。输入时,我根据串联电路的最后来判断是并联中的子串联还是整个电路的总串联。电路中的信息输入完成之后,我也是按照与上一次作业一样的方法来判断电路中的开关和调速器的档位,并将他们的档位记录下来。这次作业比上次多作业还多了一个电路元件落地扇,落地扇的信息与吊扇一样,输出中也将每一种电器元件按照数字的方法来将它们排序输出。不过这次作业中的计算电压和电阻对我来说是一个难点。计算电压的过程中,我将每一个电路元件每一条串联电路和并联电路中的串联电路中的原件单独计算他们的电压。这种方法显得非常地复杂冗余,在以后的作业中我将会把电压的计算写在串联和并联类的中的一个方法里,然后直接在main方法中调用这些方法,这样能极大的简化代码的复杂程度。
踩坑心得
1、开始时没有仔细分析题目,跟第五次一样直接用map存储数据,后来发现本次作业相较于上次作业新增了很多内容,无法直接用map存储,因此经过仔细的分析和与同学的讨论,使用map与list共同存储,解决了之前碰到的问题。
2、第六次大作业的输入也与上次作业有所区别,本次作业的串联是一行输入,而上次是分多行输入,因此本次作业的输入不能与上次相同,而我刚开始与上次相同,因此总是非零返回。并且在这次作业的正则表达式匹配过程中也遇到了困难。
3、在输入过程中map元素的添加放错了位置,导致后来出现了一些问题。
改进建议
计算电压的部分过于复杂,并且出现错误时很难发现
点击查看代码
for (int i1 = 0; i1 < vcc.getList().size(); i1++) {if(vcc.getList().get(i1).getName().startsWith("M")) {for(int i2 = 0;i2<((Parallel)vcc.getList().get(i1)).getList().size();i2++) {if(((Parallel)vcc.getList().get(i1)).getList().get(i2).state){for(int i3 = 0;i3<((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().size();i3++) {if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("D")) {double U1 = vcc.getList().get(i1).dz/dz2*U;((D)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(U1*((D)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).dz/((Parallel)vcc.getList().get(i1)).getList().get(i2).dz);}else if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("A")) {double U1 = vcc.getList().get(i1).dz/dz2*U;((A)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(U1*((A)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).dz/((Parallel)vcc.getList().get(i1)).getList().get(i2).dz);}else if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("B")) {double U1 = vcc.getList().get(i1).dz/dz2*U;((B)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(U1*((B)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).dz/((Parallel)vcc.getList().get(i1)).getList().get(i2).dz);}else if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("R")) {double U1 = vcc.getList().get(i1).dz/dz2*U;((R)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(U1*((R)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).dz/((Parallel)vcc.getList().get(i1)).getList().get(i2).dz);}else {}}}else{for(int i3 = 0;i3<((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().size();i3++) {if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("D")) {((D)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(0);}else if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("A")) {((A)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(0);}else if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("B")) {((B)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(0);}else if(((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3).getName().startsWith("R")) {((R)((Parallel)vcc.getList().get(i1)).getList().get(i2).getList().get(i3)).cul(0);}else {}}}}}else if (vcc.getList().get(i1).getName().startsWith("D")) {double U1 = vcc.getList().get(i1).dz / dz2 * U;((D) (vcc.getList().get(i1))).cul(U1);} else if (vcc.getList().get(i1).getName().startsWith("A")) {double U1 = vcc.getList().get(i1).dz / dz2 * U;((A) (vcc.getList().get(i1))).cul(U1);} else if (vcc.getList().get(i1).getName().startsWith("R")) {double U1 = vcc.getList().get(i1).dz / dz2 * U;((R) (vcc.getList().get(i1))).cul(U1);} else if (vcc.getList().get(i1).getName().startsWith("B")) {double U1 = vcc.getList().get(i1).dz / dz2 * U;((B) (vcc.getList().get(i1))).cul(U1);}else{}
点击查看代码
public void culU(double U){double U1;for(int i = 0;i<list.size();i++){if(list.get(i) instanceof A){U1 = (A)list.get(i).dz/dz*U;((A)list.get(i)).cul(U1);}else if(list.get(i) instanceof B){U1 = (B)list.get(i).dz/dz*U;((B)list.get(i)).cul(U1);}else if(list.get(i) instanceof R){U1 = (R)list.get(i).dz/dz*U;((R)list.get(i)).cul(U1);}else if(list.get(i) instanceof D){U1 = (D)list.get(i).dz/dz*U;((D)list.get(i)).cul(U1);}else if(list.get(i) instanceof Series){U1 = (Series)list.get(i).dz/dz*U;((Series)list.get(i)).culU(U1);}else if(list.get(i) instanceof Parallel){U1 = (Parallel)list.get(i).dz/dz*U;((Parallel)list.get(i)).culU(U1);}}
}
点击查看代码
public void culU(double U){for(int i = 0;i<list.size();i++){((Series)list.get(i)).culU(double U);}}