outside_的第三次博客作业
--Wenxiaowenyy
前言:
这次博客是本学期的最后一次博客,也是大一的最后篇博客,回顾这学期学习java的热情以及完成大作业的积极性比起学c语言的时候减少了许多,原因有很多,其一是自己变懒惰了,其二是这学期的java比起上学期的c语言的确难度增加了许多,不过世上没有后悔药吃,感觉都是自己作的,希望暑期的实训和下学期能够更加勤奋,更加努力,不要荒废自己,不要天天待在寝室里。好了,接下来就是对这学期最后两次大作业进行分析啦!
内容包含:
1.总结PTA大作业前三次题目集的知识点,题量,难度等
2.对题目提交的源码进行分析
3.仔细回忆自己做题时所踩的坑,总结反思,避免下次再犯
4.改进建议
5.个人总结、个人反思
题目集7
题目集7是上次博客中提到的题目集6的迭代,相比上次题目集6,这次增加了互斥开关,以及另一个电器窗帘,此次的窗帘与电灯的亮度有关联,所以输出数据的判定会与之前的用电器不同,类之间的联系也会更加紧密,难度较难,因为对于互斥开关的处理是个棘手的问题。考察的知识点有正则表达式,字符串一系列的处理操作、电器的继承、父类方法的重写以及正则表达式对输入的处理,正则表达式一如既往的还是所考察的知识点。
该题的难点有三个,其一是对于电阻的计算,因为加入互斥开关的话,要考虑总电阻的变化和哪个线路是通路,再进行计算电阻。其二是对于互斥开关的开关接在哪里的问题,它有两个接口,要如何判定互斥开关接在哪个接口上是个重要的问题。其三是灯的亮度与窗帘的开合百分比的处理,要根据灯泡的总亮度来控制窗帘开合百分比。
下面是本次迭代增加的窗帘和互斥开关的部分代码:
窗帘类:
点击查看代码
class Curtain extends Device {private double rate=100;public Curtain(String type,String num,int p1,int p2,int R){super(type,num,p1,p2,R);}public void setV(int v1,int v2){super.setV(v1,v2);}public double getRate(double bright){if(super.getR()*super.getI()<50)this.rate=100;else{if(bright<50)this.rate=100;else if(bright>=50&&bright<100)this.rate=80;else if(bright>=100&&bright<200)this.rate=60;else if(bright>=200&&bright<300)this.rate=40;else if(bright>=300&&bright<400)this.rate=20;elsethis.rate=0;}return this.rate;}public void show(double bright){if(super.getR()*super.getI()<50)this.rate=100;else{if(bright<50)this.rate=100;else if(bright>=50&&bright<100)this.rate=80;else if(bright>=100&&bright<200)this.rate=60;else if(bright>=200&&bright<300)this.rate=40;else if(bright>=300&&bright<400)this.rate=20;elsethis.rate=0;}System.out.println(String.format("@S%s:%.0f%%",super.getNum(),this.rate));}}
互斥开关:
点击查看代码
class Mutex extends Device {private int state = 1;Mutex(String type,String num,int p1,int p2,int R) {super(type, num, p1, p2, R);}public void setV(int v1,int v2){super.setV(v1,v2);}@Overridepublic void change(double a){if(this.state==1)this.state=0;elsethis.state=1;}public int getState(){return this.state;}@Overridepublic void show(double I){if(this.state==1)System.out.println("@H"+super.getNum()+":closed");
// else
// System.out.println("@H"+super.getNum()+":turned on");}public double getR(){return super.getR();}public void changeR(double R){super.changeR(R);}}
圈复杂度:
类图:
该题我遇到的问题:
1.互斥开关的处理 解决方案:将互斥开关拆分成为两个单独的开关处理
2.窗帘闭合度的计算 解决方案:多次测试,找出出错原因
题目集8:
题目集8是电器迭代的最后一次了,这次增加了二极管以及短路情况,还有就是输出也改了,需要使用到引脚了,前几次我都没使用到引脚,这次输出就得输出各个引脚的电压,同时也增加了电路复杂程度,难度的话可以说算是最难的一次了,毕竟是最后一次了,并且我也只拿了一点点分😂。考察的知识点有正则表达式,字符串一系列的处理操作、电器的继承、父类方法的重写以及正则表达式对输入的处理。
该题的难点有很多,一是对于新加入的电路元件二极管,如何对其导度进行判断,二是电流的计算,如何计算整体电流来判断电流是否使用电器发热过高,三是各个引脚的电压,对于各个引脚的电压计算也是一个难点,要判断这是属于用电器的哪个引脚,还要计算电压,四是对于电路情况的分析,此次的电路情况十分复杂,所以对于各个电路的处理至关重要,影响到电压和电流。
下面是新增用电器二极管的代码:
点击查看代码
public class Diode {private String name; // 二极管的名称private boolean isForward; // 是否正向接入private double voltage; // 二极管的电压private final double MAX_CURRENT = 8; // 二极管的最大电流public Diode(String name) {this.name = name;this.isForward = false; // 默认为反向接入this.voltage = 0; // 默认电压为0V}// 设置二极管为正向接入public void setForward() {this.isForward = true;}// 设置二极管为反向接入public void setReverse() {this.isForward = false;}// 设置二极管的电压public void setVoltage(double voltage) {this.voltage = voltage;}// 获取二极管的电压public double getVoltage() {return this.voltage;}// 计算二极管的电流public double getCurrent() {if (isForward) {// 正向接入时,电阻为0,电流由外部电路决定return voltage / 0; // 实际上这里会得到无穷大的电流,需要外部电路限制} else {// 反向接入时,视为断路,电流为0return 0;}}// 检查电流是否超过最大限制private boolean isCurrentLimited() {double current = getCurrent();return current > MAX_CURRENT;}// 输出二极管的模拟结果public String getOutput() {if (isForward) {return "@" + name + ":conduction " + voltage + "-0";} else {return "@" + name + ":cutoff " + voltage + "-0";}}// 模拟二极管的工作,返回输出结果和是否超过电流限制public String simulate() {String output = getOutput();if (isCurrentLimited()) {output += " exceeding current limit error";}return output;}
}
圈复杂度:
该题我遇到的问题:
1.二极管的处理 解决方案:仔细审题,分析二极管
2.电流的计算 解决方案:多次根据测试样例,看计算的电流是否正确
3.引脚电压的计算 解决方案:优化各类中的引脚方法以及数据
个人总结与反思:
1.要加强类的设计以及类与类之间关系的设计
2.要培养自己的耐心
3.要培养自己根据题目意思来想测试用例的能力
最后,希望自己下个学期能够更加努力,同时也希望下个学期的难度稍微大一点,更能磨练自己。