一.前言
这几次题目集重点考察的知识点是继承与多态以及抽象类与接口以及对前面所学的知识的一些应用等。
与之前三个题目集相类似,这三次题目集也是将分值大部分给与了第一题,甚至是全部的分值都在第一题中,伴随的两道小题都是考察的基本功,难度普遍简单,而第一题与之前类似,都是迭代类题型,从一开始就要打好基础,层层递进,一旦某一环节出了差错,就会导致后面的题目编写困难甚至无从下手,考察的知识点增多也意味着难度比以往更大,需要耗费更多的时间去布局与思考,才能把题目写好。
二.设计与分析
请根据如下要去设计一个智能家居强电电路模拟系统。
1、控制设备模拟
本题模拟的控制设备包括:开关、分档调速器、连续调速器。
开关:包括0和1两种状态。
分档调速器
按档位调整,常见的有3档、4档、5档调速器,档位值从0档-2(3/4)档变化。本次迭代模拟4档调速器,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压。
连续调速器
所有控制设备的初始状态/档位为0。
控制设备的输入引脚编号为1,输出引脚编号为2。
2、受控设备模拟
本题模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。
灯有两种工作状态:亮、灭。在亮的状态下,有的灯会因引脚电位差的不同亮度会有区别。
风扇在接电后有两种工作状态:停止、转动。风扇的转速会因引脚的电位差的不同而有区别。
白炽灯:
亮度在0~200lux(流明)之间。
日光灯:
亮度为180lux。
输入信息:
1、设备信息
分别用设备标识符K、F、L、B、R、D分别表示开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇。
2、连接信息
一条连接信息占一行,用[]表示一组连接在一起的设备引脚,引脚与引脚之间用英文空格" "分隔。
3、控制设备调节信息
开关调节信息格式:
分档调速器的调节信息格式:
连续调速器的调节信息格式:
4、电源接地标识:VCC,电压220V,GND,电压0V。没有接线的引脚默认接地,电压为0V。
输入信息以end为结束标志,忽略end之后的输入信息。
输出信息:
按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。
输出格式:@设备标识+设备编号+":" +设备参数值(控制开关的档位或状态、灯的亮度、风扇的转速,只输出值,不输出单位)
本题只考虑串联的形式,所以所有测试用例的所有连接信息都只包含两个引脚
设计思路:
通过设置各个类来实现智能家居系统的操控
1.受控设备类、控制设备类
String[] parts ;
String deviceId ;
public void parseInput(String input) { String[] lines = input.split("\\n"); for (String line : lines) { // 控制设备调节信息 if (line.startsWith("#")) handleControlDevice(line); else if (line.startsWith("[")) { // 连接信息 handleConnection(line); } else if (!line.isEmpty()) { // 设备信息 handleDevice(line); } } } private void handleControlDevice(String line) { String[] parts = line.substring(1).split(" "); String deviceId = parts[1]; Device device = devices.get(deviceId); if (device!= null) { if (parts[0].equals("K")) { ((SwitchDevice) device).getState(); } else if (parts[0].equals("F")) { ((MultiSpeedRegulatorDevice) device).incrementState(); } else if (parts[0].equals("L")) { ((ContinuousSpeedRegulatorDevice) device).setState(Double.parseDouble(parts[2])); } } }
2.电路设备类
static abstract class MultiSpeedRegulatorDevice extends Device { private int state; public MultiSpeedRegulatorDevice(String id) { super(id); state = 0; } @Override public void setState(int state) { this.state = state; } public double getState() { return state; } public void incrementState() { setState(state + 1); } }
static abstract class ContinuousSpeedRegulatorDevice extends Device { private double state; public ContinuousSpeedRegulatorDevice(String id) { super(id); state = 0.0; } @Override public void setState(double state) { this.state = state; } public double getState() { return state; } }
static abstract class IncandescentLampDevice extends Device { private double brightness; public IncandescentLampDevice(String id) { super(id); brightness = 0.0; } @Override public void setState(int state) { if (state <= 9) { brightness = 0; } else { brightness = (state - 10) / 11 * 200; } } public double getBrightness() { return brightness; } }
3.输出类
for (Device device : devices.values()) { if (device instanceof SwitchDevice) { SwitchDevice switchDevice = (SwitchDevice) device; System.out.println("@" + device.getId() + ":" + (switchDevice.isOn()? "closed" : "turned on")); } else if (device instanceof MultiSpeedRegulatorDevice) { MultiSpeedRegulatorDevice multiSpeedRegulatorDevice = (MultiSpeedRegulatorDevice) device; System.out.println("@" + device.getId() + ":" + multiSpeedRegulatorDevice.getState()); } else if (device instanceof ContinuousSpeedRegulatorDevice) { ContinuousSpeedRegulatorDevice continuousSpeedRegulatorDevice = (ContinuousSpeedRegulatorDevice) device; System.out.println("@" + device.getId() + ":" + String.format("%.2f", continuousSpeedRegulatorDevice.getState())); } else if (device instanceof IncandescentLampDevice) { IncandescentLampDevice incandescentLampDevice = (IncandescentLampDevice) device; System.out.println("@" + device.getId() + ":" + incandescentLampDevice.getBrightness()); } else if (device instanceof FluorescentLampDevice) { FluorescentLampDevice fluorescentLampDevice = (FluorescentLampDevice) device; System.out.println("@" + device.getId() + ":" + (fluorescentLampDevice.isOn()? "180" : "0")); } else if (device instanceof CeilingFanDevice) { CeilingFanDevice ceilingFanDevice = (CeilingFanDevice) device; System.out.println("@" + device.getId() + ":" + ceilingFanDevice.getSpeed()); } }
4.电路运行类
public void simulate() { for (String[] connection : connections.values()) { String inputPin = connection[0]; String outputPin = connection[1]; Device inputDevice = devices.get(inputPin); Device outputDevice = devices.get(outputPin); if (inputDevice!= null && outputDevice!= null) { int inputState = (int) inputDevice.getState(); outputDevice.setState(inputState); } } }
请根据如下要去设计一个智能家居强电电路模拟系统。
以下题目介绍中加粗的部分为本次迭代在“家居强电电路模拟程序-1”的基础上增加的功能要求。
本次迭代模拟一种落地扇。
工作电压区间为 [80V,150V],对应转速区间为 80-360 转/分钟。电压在[80,100)V 区间对应转速为 80 转/分 钟,[100-120)V 区间对应转速为 160 转/分钟,[120-140)V 区间对应转速为 260 转/分钟,超过 140V 转速 为 360 转/分钟(本次迭代暂不考虑电压超标的异常情况)
本题不考虑输入电压或电压差超过220V的情况。
输入信息以end为结束标志,忽略end之后的输入信息。
本题中的并联信息所包含的串联电路的信息都在并联信息之前输入,不考虑乱序输入的情况。
电路中的短路如果不会在电路中产生无穷大的电流烧坏电路,都是合理情况,在本题测试点的考虑范围之内。
落地扇:
private void simulateFloorFan(FloorFan floorFan) { double voltageDifference = floorFan.getVoltageDifference(); double speed = calculateFloorFanSpeed(voltageDifference); floorFan.setSpeed(speed); } private double calculateFloorFanSpeed(double voltageDifference) { if (voltageDifference < 80) { return 0; } double speed = voltageifference * FLOOR_FAN_VOLTAGE_RATIO; if (speed > 360) { return 360; } return speed
并联电路
private void simulateParallelGroupCircuit(ParallelGroupCircuit circuit) { List<SeriesCircuit> seriesCircuits = circuit.getSeriesCircuits(); for (SeriesCircuit seriesCircuit : seriesCircuits) { simulateSeriesCircuit(seriesCircuit); } }
.
踩坑心得
在设计时没有考虑到类之间的关系,导致调用时出现报错的情况,程序无法运行
在使用ArrayList数组时没用考虑引用,导致出错
.
改进建议:
在编写程序时应考虑各个电路设备以及控制设备之间的关系,以及串联电路与并联电路的区分。不应该直接粗暴地定义各个类再将其组合。
.
总结:
通过这三次pta题目集的练习,学会了抽象类,接口的使用方法,继承与多态及上转型和下转型的基本概念及使用方法和List相关类的使用方法。也知道了自己在Java程序编写以及知识点掌握上还有很多不足,需要自己在课上和课后去学习和解决,这门课程的学习是多写多练的结果,需要自己多在上面花时间。