(1).前言:
第七次pta难度很大,主要体现在互斥开关的设计上:
互斥开关:
互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。
开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。
互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。
互斥开关的默认状态为1、2引脚接通,1、3引脚断开。
图1中所示的互斥开关可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。
在之前的设计上,我只将电器设置为是两个引脚,所以在书写互斥开关类时无法继承之前的电器类,因为电器类中只有两个引脚,所以无法继承,于是我另外书写了一个具有三个引脚的互斥开关类。但也没有很好的实现其功能。
主要考察的是对上一次题目的进一步迭代以及继承,其中互斥开关的设计很难。
第八次的pta难度也很大,主要体现在二极管的设计上:
二极管
增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。
图2 二极管符号
二极管的标识符为’P’,左侧管脚编号为1,右侧管脚编号为2。
二极管如果两端电压相等,没有电流流过,分以下两种情况输出:
1、如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则状态为导通,反之为截止。
2、如果两端电压不为0,二极管导通。
(2).设计与分析:
第七次:
第七次相对于第六次各类之间的关系的耦合性经过我的修改没有那么高了,且做到了类之间具有单一指责。
第八次:
(3).踩坑心得:
第七次踩的坑:
在省略小数上:当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。在这一点上,我做了类型转换导致了精度不准确,输出了错误的值。
(4).改进建议:
各类之间关系并不是特别明确,类间的关系也很冗杂,耦合性还是比较高的。
在类的设计上也还是很不好的:
在设计时也没有遵循类的单一职责
如:class Fswitch extends Equipment{
private int lever=0;
private double output=0;
public Fswitch(int node) {
super(node);
}
public int getLever() {
return lever;
}
public void setLever(int lever) {
this.lever = lever;
}
public void setOutput(double output) {
this.output = output;
}
public void up(){
if(this.lever0||this.lever1||this.lever2) {
this.lever++;
}
else {
return;
}
}
public void down() {
if(this.lever1||this.lever2||this.lever3) {
this.lever--;
}
else {
return;
}
}
public void ele(){
this.output=0.3this.lever220;
}
public double getOutput() {
return output;
}
}
这是分档开关类,但在里面却有通电的方法,没有保证单一职责原则。
(5).总结:
写了这么多次pta之后,发现类的设计是非常重要的,不然代码就会显得非常复杂,导致自己都看不懂自己的代码,且代码要具有复用性,不能是所谓的“一次性”代码,我总是急于求成,拿到题目的第一时间就开始下手,写出了很多只为了当下能过一些测试点的一次性代码,后期根本无法进行迭代,导致每一次写得都非常的痛苦,一坐就是一天,然后也过不了什么测试点。
如在这个建议类图上,我并没有按照给出的类图设计控制设备类与受控设备类,导致后面实现不了多态,然后就写了无数的if-else,导致非常的痛苦。
在pta发布的第一时间,我并没有仔细看题目,看题目总是走马观花:
本题不考虑输入电压或电压差超过220V的情况。
输入信息以end为结束标志,忽略end之后的输入信息。
本题中的并联信息所包含的串联电路的信息都在并联信息之前输入,不考虑乱序输入的情况。
只要不因短路而造成无穷大的电流烧坏电路(如电路中的部分短接),都是合理情况,在测试点的考虑范围之内。会造成无穷大的电流的短路本次迭代不考虑。
本次迭代考虑多个并联电路串联在一起的情况。
本题考虑一条串联电路中包含其他串联电路的情况。例如:
T3:[VCC K1-1] [K1-2 T2-IN] [T2-OUT K2-1] [K2-2 T1-IN] [T1-OUT GND]
本例中T1\T2两条串联电路T3的一个部分,本题考虑这种类型的输入。
在写题目的时候我都没有仔细观察这个条件,导致写的非常的纠结,直到看到了这个条件我才恍然大悟。
在第八次pta的设计上:
受控串联的电路符号为S,其最低工作电压为50V,电压达到或超过50V,窗帘即可正常工作,不考虑室外光照强度和室内空间大小等因素,窗帘受室内灯光的光照强度控制。
当电路中所有灯光的光照强度总和在[0,50)lux范围内,窗帘全开;
在[50,100)lux范围内,窗帘打开比例为0.8;
在[100,200)lux范围内,窗帘打开比例为0.6;
在[200,300)lux范围内,窗帘打开比例为0.4;
在[300,400)lux范围内,窗帘打开比例为0.2;
在400lux及以上范围内,窗帘关闭。
当电压低于50V,窗帘不工作,默认为全开状态。
如果电路中没有灯或者灯全部关闭,光照强度为0,窗帘处于全开状态。
这个条件我也没有看清楚,将窗帘的打开比例设置错了。所以导致结果输出都是错的。
import java.util.;
import java.util.regex.;
class Equipment{
private int node;
public Equipment() {}
public int getNode() {
return node;
}
public void setNode(int node) {
this.node = node;
}
public Equipment(int node) {
super();
this.node = node;
}
}
class Switch extends Equipment implements Comparable{
private int state=0;
public void change() {
if(this.state0) {
this.state=1;
}
else {
this.state=0;
}
}
public Switch(int node) {
super(node);
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
@Override
public int compareTo(Switch ss) {
return Integer.compare(super.getNode(),ss.getNode());
}
}
class Fswitch extends Equipment{
private int lever=0;
private double output=0;
public Fswitch(int node) {
super(node);
}
public int getLever() {
return lever;
}
public void setLever(int lever) {
this.lever = lever;
}
public void setOutput(double output) {
this.output = output;
}
public void up(){
if(this.lever0||this.lever1||this.lever2) {
this.lever++;
}
else {
return;
}
}
public void down() {
if(this.lever1||this.lever2||this.lever==3) {
this.lever--;
}
else {
return;
}
}
public void ele(){
this.output=0.3this.lever220;
}
public double getOutput() {
return output;
}
}
class Lswitch extends Equipment{
private double lever=0;
private double output=0;
public Lswitch(int node) {
super(node);
}
public double getLever() {
return lever;
}
public void setLever(double lever) {
this.lever = lever;
}
public double getOutput() {
return output;
}
public void ele() {
this.output=220*this.lever;
}
}
class Blamp extends Equipment{
private double light;
public Blamp(int node) {
super(node);
}
public double getLight() {
return light;
}
public void eleLight(double v) {
if(v>0&&v<=9) {
this.light=0;
}
else if(v>=9&&v<=10) {
this.light=50(v-9);
}
else if(v>10&&v<=220) {
this.light=(v-10)(5.0/7.0)+50;
}
}
}
class Rlamp extends Equipment{
private double light;
public Rlamp(int node) {
super(node);
}
public double getLight() {
return light;
}
public void eleLight(double v) {
if(v==0) {
this.light=0;
}
else {
this.light=180;
}
}
}
class Fan extends Equipment{
private double roll;
public double getRoll() {
return roll;
}
public void setRoll(double roll) {
this.roll = roll;
}
public Fan(int node) {
super(node);
}
public void eleroll(double v) {
if(v<80){
this.roll=0;
}
else if(v>=80&&v<=150){
this.roll=(v-80)4+80;
}
else if(v>150) {
this.roll=360;
}
}
}
public class Main {
public static void main(String[] args) {
ArrayListalls=new ArrayList();
Fswitch F1=null;
Lswitch L1=null;
Blamp B1=null;
Rlamp R1=null;
Fan fan1=null;
//ArrayListall=new ArrayList();
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
String s=input.nextLine();
if(s.equals("end")) {
break;
}
else {
if(s.startsWith("[")) {
String regex="[K|F|L|B|R|D]\d-1";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
char first=matcher.group().charAt(0);
if(first'K') {
Switch stem=new Switch((int)(matcher.group().charAt(1))-48);
alls.add(stem);
}
else if(first'F') {
Fswitch stem=new Fswitch((int)(matcher.group().charAt(1))-48);
F1=stem;
}
else if(first'L') {
Lswitch stem=new Lswitch((int)(matcher.group().charAt(1))-48);
L1=stem;
}
else if(first'B') {
Blamp stem=new Blamp((int)(matcher.group().charAt(1))-48);
B1=stem;
}
else if(first'R') {
Rlamp stem=new Rlamp((int)(matcher.group().charAt(1))-48);
R1=stem;
}
else if(first'D') {
Fan stem=new Fan((int)(matcher.group().charAt(1))-48);
fan1=stem;
}
}
}
else if(s.startsWith("#")) {
if(s.contains("K")) {
int num=(int)(s.charAt(2))-48;
for(Switch tem:alls) {
if(tem.getNode()num) {
tem.change();
}
}
}
else if(s.contains("F")) {
if(s.contains("-")) {
F1.down();
}
else if(s.contains("+")) {
F1.up();
}
}
else if(s.contains("L")) {
String regex="[0-9]+.?[0-9]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
double lever= Double.parseDouble(matcher.group());
L1.setLever(lever);
}
}
}
}
}
Collections.sort(alls);
boolean ele=true;
for(Switch s:alls) {
System.out.print("@K"+s.getNode()+"