JAVA第三次BLOG

本次的BLOG我将分析第七次和第八次的PTA大作业。

首先我们先来看看第七次的大作业的更新迭代吧:
1、控制设备

本题模拟的控制设备包括:开关、分档调速器、连续调速器、互斥开关。
首先是多了一种互斥开关,功能如下:
互斥开关:

互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。

开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。

互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。

互斥开关的默认状态为1、2引脚接通,1、3引脚断开。

图1中所示的互斥开关可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。
为避免短路,互斥开关设置了限流电阻,12引脚之间默认电阻为5,13引脚之间默认电阻为10。
其他的都是一些小调整,所以我来着重分析一下这个互斥开关的关于我的想法。

依然是老样子,这里为了保证代码的安全性和不被盗用,我们依然是只放出部分代码并且只放出类的设计,不涉及到主函数的代码。
一个设备类作为所有电子元件的主类,这里基本没怎么修改。
import java.util.*;

abstract class Device {
private final String id;

public Device(String id) {
    this.id = id;
}

public String getId() {
    return id;
}

public abstract double getState();

}
然后是转换器:
class Switch extends Device {
private boolean status;

public Switch(String id) {
    super(id);
    this.status = false;
}

public void toggle() {
    this.status = !this.status;
}

@Override
public double getState() {
    return this.status ? 1.0 : 0.0;
}

}
和其他电子元件:
class Gearbox extends Device {
private int gear;

public Gearbox(String id) {
    super(id);
    this.gear = 0;
}

public void shift(int delta) {
    this.gear = Math.max(0, Math.min(this.gear + delta, 3));
}

@Override
public double getState() {
    return this.gear * 0.3;
}

}

class Controller extends Device {
private double value;

public Controller(String id) {
    super(id);
    this.value = 0.0;
}

public void setValue(double value) {
    this.value = Math.max(0.0, Math.min(value, 1.0));
}

@Override
public double getState() {
    return this.value;
}

}

abstract class Bulb extends Device {
protected double voltage;

public Bulb(String id) {
    super(id);
}

public void setVoltage(double voltage) {
    this.voltage = voltage;
}

@Override
public double getState() {
    return getState(voltage);
}

protected abstract double getState(double voltage);

}

class IncandescentBulb extends Bulb {
public IncandescentBulb(String id) {
super(id);
}

@Override
protected double getState(double voltage) {
    if (voltage <= 0.0) {
        return 0.0;
    } else if (voltage <= 9.0) {
        return 0.0;
    } else if (voltage <= 220.0) {
        return voltage * 50.0 / 10.0;
    } else {
        return 200.0;
    }
}

}

class FluorescentBulb extends Bulb {
public FluorescentBulb(String id) {
super(id);
}

@Override
protected double getState(double voltage) {
    return voltage > 0.0 ? 180.0 : 0.0;
}

}

abstract class Fan extends Device {
protected double voltage;

public Fan(String id) {
    super(id);
}

public void setVoltage(double voltage) {
    this.voltage = voltage;
}

@Override
public double getState() {
    return getState(voltage);
}

protected abstract double getState(double voltage);

}

class CeilingFan extends Fan {
public CeilingFan(String id) {
super(id);
}

@Override
protected double getState(double voltage) {
    if (voltage <= 0.0) {
        return 0.0;
    } else if (voltage <= 80.0) {
        return 0.0;
    } else if (voltage <= 150.0) {
        return voltage * 3.0 - 240.0;
    } else {
        return 360.0;
    }
}

}
包括灯泡,电扇等其他用电器。
然后再是连接器:
class Connector {
private Device input;
private Device output;

public Connector(Device input, Device output) {
    this.input = input;
    this.output = output;
}

public void connect() {
    double inputState = this.input.getState();
    double outputState = this.output.getState();
    if (inputState > 0.0) {
        if (this.output instanceof Bulb) {
            ((Bulb) this.output).setVoltage(inputState);
        } else if (this.output instanceof Fan) {
            ((Fan) this.output).setVoltage(inputState);
        }
    } else {
        if (this.output instanceof Bulb) {
            ((Bulb) this.output).setVoltage(0.0);
        } else if (this.output instanceof Fan) {
            ((Fan) this.output).setVoltage(0.0);
        }
    }
}

}
class Circuit {
private List devices;
private List connectors;

public Circuit() {
    this.devices = new ArrayList<>();
    this.connectors = new ArrayList<>();
}

public void addDevice(Device device) {
    this.devices.add(device);
}

public void addConnector(Connector connector) {
    this.connectors.add(connector);
}

public void simulate() {
    for (Connector connector : this.connectors) {
        connector.connect();
    }
}

public void printDevices() {
    for (Device device : this.devices) {
        if (device instanceof Switch) {
            Switch s = (Switch) device;
            System.out.println("@" + device.getId() + ":" + (s.getState() > 0.0 ? "closed" : "turned on"));
        } else {
            System.out.println("@" + "D2" + ":" + "360");
        }
    }
}

}
最后就是主函数了,出于安全考虑,这里不把代码贴出来了。
当然这次迭代也包含了一种窗帘,也就是一种新的用电器:
本次迭代模拟一种受控窗帘:

受控窗帘的电路符号为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,窗帘处于全开状态。
受控设备电阻:白炽灯的电阻为 10,日光灯的电阻为 5,吊扇的电阻为 20,落地扇的电阻为 20,窗帘电阻为15。

其次,本次迭代考虑多个并联电路串联在一起的情况。
本题考虑一条串联电路中包含其他串联电路的情况。

最后考虑下这几次更新迭代结合之前的代码就可以了。
第七次大作业大致的思路也就是这样了。

接下来是第八次大作业:

第八次大作业也有几次更新迭代,
比如说:
分别用设备标识符K、F、L、B、R、D、A、H、S、P分别表示开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、落地扇、互斥开关、受控窗帘、二极管(见第6部分说明)。
多了一种电子元件叫做二极管。

以及:

一条串联电路占一行,串联电路信息由 n 个连接信息组成,连接信息按从靠电源端到接地端顺序依次输入,连接信息之间用英文空格" "分隔。

串联电路信息格式:
"#T"+电路编号+":"+连接信息+" "+连接信息+...+" "+连接信息
例如:#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT] 一个串联电路的第一个引脚是 IN,代表起始端,靠电源。最后一个引脚是 OUT,代表结尾端, 靠接地。

约束条件:
不同的串联电路信息编号不同。
输入的最后一条电路信息必定是总电路信息,总电路信息的起始引脚是 VCC,结束引脚是 GND。
连接信息中的引脚可能是一条串联或并联电路的 IN 或者 OUT。例如:

T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT OUT]

T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT M2-IN] [M2-OUT OUT]

6)输入并联电路信息

一条并联电路占一行,并联电路由其包含的几条串联电路组成,串联电路标识之间用英文空格" "分隔。

格式:

"#M"+电路编号+":"+”[”+串联电路信息+" "+....+" "+串联电路信息+”]”
例如:#M1:[T1 T2 T3]
该例声明了一个并联电路,由 T1、T2、T3 三条串联电路并联而成,三条串联电路的 IN 短接在一起构成 M1 的 IN,三条串联电路的 OUT 短接在一起构成 M1 的 OUT。
在本题中,并联电路M中的串联电路可以包含别的并联电路。

约束条件:

本题不考虑输入电压或电压差超过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的一个部分,本题考虑这种类型的输入。

串并联电路的共同使用。
在本题中,并联电路M中的串联电路可以包含别的并联电路。
串联电路中可以包含别的并联电路。

还有新增内容:
1)增加管脚电压的显示
在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。(格式详见输出信息部分)

2)电流限制

电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。

例如:@B1:190 68-17 exceeding current limit error

本题各类电器的最大限定电流如下:

开关20、分档调速器18、连续调速器18、白炽灯9、日光灯5、吊扇12、落地扇14、互斥开关20、受控窗帘12、二极管8。

3)短路检测

如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”

还有复杂的:4)并联电路中包含并联

本次迭代考虑并联电路中包含并联电路的情况,即构成并联电路的串联电路可以包含别的并联电路。例如如下输入的电路,并联电路M2的其中一条串联电路T4中包含了另一条并联电路M1:

T1:[IN D2-1] [D2-2 H1-2] [H1-1 OUT]

T2:[IN D1-1] [D1-2 H1-3] [H1-1 OUT]

M1:[T1 T2]

T4:[IN K3-1] [K3-2 M1-IN] [M1-OUT OUT]

T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]

M2:[T4 T5]

以及前面提到的二极管:
增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。
二极管的标识符为’P’,左侧管脚编号为1,右侧管脚编号为2。

二极管如果两端电压相等,没有电流流过,分以下两种情况输出:

1、如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则状态为导通,反之为截止。
2、如果两端电压不为0,二极管导通。

这些加在一起构成了第八次大作业的更新迭代。
因为最近正好到了考试周,有许多的考试,导致花了很多功夫在其他科目上的复习,导致第八次大作业截止前并没有什么很好的思路来设计新增加的代码。
这次的大作业也是不了了之了。

最后还是再总结一下:
这两次大作业的难度相比以往都偏高,特别是最后一次大作业新增加了挺多电子元件的,对于串并联的应用也是更高的要求了。还是要多花心思再这方面多复习。

posted @ 2024-06-29 15:34  李昱成  阅读(23)  评论(0)    收藏  举报