**前言**
1.第七次题目集的7-1在家居强电电路模拟程序-2的基础上新增了一些内容,控制设备增加了一个互斥开关,比较麻烦的是互斥开关不同的引脚相接其电阻并不相同,而且要从输入信息中读取互斥开关的状态也有点难度,与其他设备不同的是,互斥开关可以出现在一个或两个串联电路中,更加考验我们的算法设计能力以解决准确读取互斥开关状态的问题。另外,本次迭代还加入了新的受控设备———窗帘,有意思的是窗帘的打开程度与电路中所有发光设备的总亮度有光,需要记录电路中的总亮度。这次题目的输入格式更加复杂,因为本次迭代考虑多个并联电路串联在一起的情况和一条串联电路中包含其他串联电路的情况,很好的考察了我们对于信息的处理能力、对字符串和数组相关知识点的掌握还有使用面向对象方法编程的熟练度。此外,相比于前面两题,这次题目的要求更加***钻和细致,非常考验我们当前对于Java语言的熟练度以及较强的逻辑思维和算法设计能力。这次题目的工作量相对较大,对我来说操作难度比较大,需要花费很长的时间来完成。
2.第八次题目集的7-1家居强电电路模拟程序-3是一道非常有难度的题目,题干非常的长,看完容易使人望而生畏。这就很考验我们的信息阅读和信息提取的能力,需要从长篇大论中总结出与我们编写Java程序有关的数据和条件加以整合,还是比较麻烦的。本次作业用到了Java中继承、多态的知识,让我对涉及到的Java知识点更加熟悉,同时还用到了电路相关的基础知识,综合性非常强。本次迭代增加了新的电路设备————二极管,让题目的内容变得更加丰富。另外,在本题中,并联电路M中的串联电路可以包含别的并联电路。最夸张的是增加管脚电压的显示,在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。让我花费了大量的时间来设计正确输出该电器每个管脚的电压的算法,非常有难度啊,写的时候感觉要崩溃了,因为水平确实有限啊。相比于上次题目,本次迭代对我们读取所有电路设备有了更加精确和完整的要求,不能模糊化处理任何电路设备,每个电路设备的所有属性都要准确地得到,非常考验整体思维。
**设计与分析**
1.第七次题目集7-1首先根据题目要求创建好所有的类,再根据细节对类的属性和方法等进行补充。UML类图如下:
本题的重点在于通过读取控制设备的状态获得电路的总电压,再根据总电压求出各受控设备的亮度或速度。容易被忽略的是,本题中的控制设备——开关可以重复出现,而连续调速器和分档调速器最多只能出现其一并且不能同时出现,而且只能直接连VCC。假如电路中有连续调速器或者分档调速器,根据输入信息读取level,再计算出电路电压,最后判断开关是否全部打开;假如电路中既没有分档调速器,也没有连续调速器,只需要判断开关是否全部打开(如果电路中存在开关的话),若全部打开电压为220V,否则为0V。得到电路的总电压后就可以根据受控设备的条件求出相应的亮度(或转速)。 互斥开关的引脚可以重复出现,要准确获取它的连接情况。窗帘主要在于求出电路中的总亮度,获取它的打开程度。
我设计的互斥开关类的代码如下:
1 class MutexSwitch extends ControlDevice { 2 boolean on; 3 4 public MutexSwitch(double voltage, String name, double level, String input) { 5 super(voltage, name, level, input); 6 this.on = true; 7 } 8 9 public void changeOn() { 10 if (!on) { 11 on = true; 12 } else { 13 on = false; 14 } 15 } 16 17 public double getR() { 18 if (on) { 19 return 5; 20 } else { 21 return 10; 22 } 23 } 24 25 public void output() { 26 if (!on){ 27 System.out.println("@" + getName() + ":turned on"); 28 } else { 29 System.out.println("@" + getName() + ":closed"); 30 } 31 } 32 }
在读取输入信息时获取互斥开关的基础状态,代码如下:
1 case 'H': 2 int index = 0; 3 for (int j = 0; j < h.size(); j++) { 4 index = input.indexOf("[H", index + 2); 5 int index1 = input.indexOf('-', index); 6 int index2 = input.lastIndexOf(']', index); 7 char p = input.charAt(index1 + 1); 8 char q = input.charAt(index2 - 1); 9 if (p == '2' || q == '2') { 10 r0 += 5; 11 } else { 12 r0 += 10; 13 } 14 break; 15 }
使用String类的indexOf()方法得到‘H’在字符串中的下标,再通过下标使用charAt()方法判断引脚的数字是‘2’还是‘3’,从而得到接入电路中的是互斥开关的哪一部分,同时得到其正确的的电阻。
我设计的窗帘类的代码如下:
1 class Curtain extends ControlledDevice { 2 double light; 3 int openScale; 4 5 public Curtain(double voltage, String name, String input) { 6 super(voltage, name, input); 7 } 8 9 public void setLight(double light) { 10 this.light = light; 11 } 12 13 public void output() { 14 System.out.println("@" + getName() + ":" + openScale + "%"); 15 } 16 }
本次迭代只需在上次题目的基础上增加一些新的内容,如果写出了上次的题目的话,这次的题目应该也能做出来。
3.第六次题目集7-1在第五次的基础上增加了一些要求。UML类图如下:
增加了并联电路中的并联电路,要考虑受控设备的电阻,让电路变得更加复杂,所要考虑的东西也更多了。 以串联电路类为主体,从单个的串联电路开始分析。 该方法读取一条串联电路中的所有电路设备,放在ArrayList数组里,同时得到设备的名字。 该方法用于判断一条串联电路是否处于通路状态(是返回true,否返回false)。 该方法用于返回处于通路状态下的一条串联电路上所有受控设备的总电阻。 大概的思路如下: 读取输入信息,根据输入信息创建相应的串联电路类和并联电路类对象 读取输入信息中所有开关的操作情况 根据所有控制设备的状态求出主电路的电压 求出各并联电路的电阻进而求出整个电路(主电路)的总电阻 计算求出每个串联电路(除主电路外)的分压 根据受控设备的分压求出每个受控设备的亮度(或转速) 根据题目要求排序输出所有电路设备的工作状态。与上次迭代相比,这次的题目要求对所有电路设备的属性都有精确的输出。最麻烦的就是需要获取每个电路设备两个管脚的电压,算法设计起来还是比较复杂的,感觉同一个串联电路中相邻的电路设备的管脚电压的求法有点类似于递归,最重要的就是得到每个串联电路最左端的电压。有了最左端的电压以后,就可以根据每个电路设备的电压求出它们的俩个管脚的电压。代码实现如下:
1 for (int i = 1; i < cd.getC().size(); i++) { 2 for (int j = 0; j < b.size(); j++) { 3 if (cd.getC().get(i).name.equals(b.get(j).name)) { 4 b.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 5 b.get(j).setRightV(b.get(j).getLeftV() - (int)b.get(j).voltage); 6 cd.getC().get(i).setLeftV(b.get(j).getLeftV()); 7 cd.getC().get(i).setRightV(b.get(j).getRightV()); 8 } 9 } 10 for (int j = 0; j < r.size(); j++) { 11 if (cd.getC().get(i).name.equals(r.get(j).name)) { 12 r.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 13 r.get(j).setRightV(r.get(j).getLeftV() - (int)r.get(j).voltage); 14 cd.getC().get(i).setLeftV(r.get(j).getLeftV()); 15 cd.getC().get(i).setRightV(r.get(j).getRightV()); 16 } 17 } 18 for (int j = 0; j < d.size(); j++) { 19 if (cd.getC().get(i).name.equals(d.get(j).name)) { 20 d.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 21 d.get(j).setRightV(d.get(j).getLeftV() - (int)d.get(j).voltage); 22 cd.getC().get(i).setLeftV(d.get(j).getLeftV()); 23 cd.getC().get(i).setRightV(d.get(j).getRightV()); 24 } 25 } 26 for (int j = 0; j < a.size(); j++) { 27 if (cd.getC().get(i).name.equals(a.get(j).name)) { 28 a.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 29 a.get(j).setRightV(a.get(j).getLeftV() - (int)a.get(j).voltage); 30 cd.getC().get(i).setLeftV(a.get(j).getLeftV()); 31 cd.getC().get(i).setRightV(a.get(j).getRightV()); 32 } 33 } 34 for (int j = 0; j < c.size(); j++) { 35 if (cd.getC().get(i).name.equals(c.get(j).name)) { 36 c.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 37 c.get(j).setRightV(c.get(j).getLeftV() - (int)c.get(j).voltage); 38 cd.getC().get(i).setLeftV(c.get(j).getLeftV()); 39 cd.getC().get(i).setRightV(c.get(j).getRightV()); 40 } 41 } 42 for (int j = 0; j < k.size(); j++) { 43 if (cd.getC().get(i).name.equals(k.get(j).name)) { 44 k.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 45 cd.getC().get(i).setLeftV(k.get(j).getLeftV()); 46 if (k.get(j).on) { 47 k.get(j).setRightV(k.get(j).getLeftV()); 48 } else { 49 k.get(j).setRightV(0); 50 } 51 cd.getC().get(i).setRightV(k.get(j).getRightV()); 52 } 53 } 54 for (int j = 0; j < h.size(); j++) { 55 if (cd.getC().get(i).name.equals(h.get(j).name)) { 56 h.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 57 cd.getC().get(i).setLeftV(h.get(j).getLeftV()); 58 if (s.withH) { 59 h.get(j).setRightV(0); 60 if (h.get(j).on) { 61 if (h.get(j).front) { 62 h.get(j).setV1(h.get(j).getLeftV()); 63 } else { 64 h.get(j).setV3(h.get(j).getLeftV()); 65 } 66 } else { 67 if (h.get(j).front) { 68 h.get(j).setV1(h.get(j).getLeftV()); 69 } else { 70 h.get(j).setV2(h.get(j).getLeftV()); 71 } 72 } 73 } else { 74 h.get(j).setRightV(h.get(j).getLeftV() - (int)h.get(j).voltage); 75 if (h.get(j).on) { 76 if (h.get(j).front) { 77 h.get(j).setV1(h.get(j).getLeftV()); 78 h.get(j).setV2(h.get(j).getRightV()); 79 } else { 80 h.get(j).setV1(h.get(j).getRightV()); 81 h.get(j).setV2(h.get(j).getLeftV()); 82 } 83 } else { 84 if (h.get(j).front) { 85 h.get(j).setV1(h.get(j).getLeftV()); 86 h.get(j).setV3(h.get(j).getRightV()); 87 } else { 88 h.get(j).setV1(h.get(j).getRightV()); 89 h.get(j).setV3(h.get(j).getLeftV()); 90 } 91 } 92 } 93 cd.getC().get(i).setRightV(h.get(j).getRightV()); 94 } 95 } 96 for (int j = 0; j < e.size(); j++) { 97 if (cd.getC().get(i).name.equals(e.get(j).name)) { 98 if (e.get(j).isOn()) { 99 e.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 100 e.get(j).setRightV(e.get(j).getLeftV()); 101 cd.getC().get(i).setLeftV(e.get(j).getLeftV()); 102 cd.getC().get(i).setRightV(e.get(j).getRightV()); 103 } else { 104 e.get(j).setLeftV(0); 105 e.get(j).setRightV(cd.getC().get(i - 1).getRightV()); 106 cd.getC().get(i).setLeftV(e.get(j).getRightV()); 107 cd.getC().get(i).setRightV(e.get(j).getLeftV()); 108 } 109 } 110 } 111 for (int j = 0; j < m.size(); j++) { 112 if (cd.getC().get(i).name.equals(m.get(j).name)) { 113 m.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 114 m.get(j).setRightV(m.get(j).getLeftV() - (int) m.get(j).voltage); 115 cd.getC().get(i).setLeftV(m.get(j).getLeftV()); 116 cd.getC().get(i).setRightV(m.get(j).getRightV()); 117 } 118 } 119 for (int j = 0; j < t.size(); j++) { 120 if (cd.getC().get(i).name.equals(t.get(j).name)) { 121 t.get(j).setLeftV(cd.getC().get(i - 1).getRightV()); 122 t.get(j).setRightV(m.get(j).getLeftV() - (int) t.get(j).voltage); 123 cd.getC().get(i).setLeftV(t.get(j).getLeftV()); 124 cd.getC().get(i).setRightV(t.get(j).getRightV()); 125 } 126 } 127 }
但是运行之后还是有很多问题,也不知道要怎么解决,毕竟实力不允许[笑哭]。但是通过这几次PTA的练习,我对Java语言的掌握程度越来越深,也会更敢于去挑战一些难题。
**踩坑心得**
第七次PTA: 没有充分理解题目的意思,忽略了一些细节。比如,题目给的输入样例里,互斥开关都是作为连接两个串联电路的枢纽,所以一开始做题时没有考虑到互斥开关只有一个管脚接入电路,也就是另一个管脚没有用到的情况,但是又没有发现是这个问题,所以不管怎么改还是这么多分,最后经过同学提醒后才醒悟过来没有考虑到这种情况,浪费了很多时间,追悔莫及。 没有养成良好的编写代码的习惯。写代码时常常忽略用private将成员变量私有化,对有些Java知识点的概念比较模糊,还有很大的进步空间。 写代码的时候容易写着写着脑子就乱了,逻辑混乱,需要多写多练多思考加强编程能力。 写出来的代码比较冗长且可读性不是很强,还需要优化自己写的代码,让它变得更加简练高效并且逻辑清晰。
第八次PTA:通过第八次PTA我发现第七次PTA提交的代码有很多不足的地方,对于那些没有要求输出信息的设备,都是采取模糊处理的方法,所以第八次PTA在对所有电路设备有了更加精确的要求之后,之前写的代码基本作废了,需要进行大量的修改和重写。感觉这次算法设计的很糟糕,导致主函数的代码写起来非常麻烦,写到后面都写不下去了。所以以后一定要根据题目要求更加合理地设计类的属性和方法,从而让自己的代码更加简洁和高效。
通过这两次题目集的磨练,我不仅巩固了Java基础语法,还应用了面向对象编程(OOP)的原则,如封装、继承和多态性,使我对Java的应用有了更广泛的了解。 通过家居强电电路模拟程序的开发,我学习到了如何用Java实现复杂逻辑的建模,以及如何将实际问题转化为程序可解决的方式。 尽管在知识掌握上取得了一定的进步,但也存在一些不足之处。例如,对于复杂的电路模拟,我发现我的算法设计能力还有待提高,程序优化方面也缺乏经验。 针对上述不足,我计划采取以下措施进行改进: 加强算法学习:通过学习计算机科学中的高级算法和数据结构,提高问题解决的效率和质量。 实践项目优化:通过性能分析和调优,提升程序运行效率,增强代码的可维护性和可扩展性。 学习设计模式:深入理解并实践常见的设计模式,提高软件设计的合理性和代码的复用性。 跨学科应用:由于家居强电电路涉及电子学知识,我需要补充相关领域的知识,以更好地理解和模拟电路的行为。在完成作业的过程中,我遇到了许多挑战,比如理解复杂的题目和调试代码错误。这些挑战让我学会了耐心和坚持,我会将这些经历视为宝贵的学习机会,帮助我在未来的学习和工作中保持积极的心态。通过这两次题目集的训练,我不仅提升了自己的编程技能,还学会了如何将编程知识应用于实际问题解决中。接下来的重点是提高自己在算法设计、程序优化和跨学科应用方面的能力,以适应更复杂和挑战性的编程任务。此外,我深刻认识到学习Java语言理论知识与实践操作相结合的重要性。在未来的学习中,我将更加注重实践,通过动手操作来巩固和深化理解。
标签:总结,题目,get,getC,PTA,cd,电路,getLeftV,getRightV From: https://www.cnblogs.com/worldpeacecyzzl/p/18277018