PTA题目集4~6的总结
一、前言
第四次题目集为答题判题程序4,输入信息有题目信息、试卷信息 、答题信息、学生信息、删除题目信息等。本次作业新增内容有选择题题目信息,填空题题目信息、输出顺序的变化:只要是正确格式的信息,可以以任意的先后顺序输入各类不同的信息,比如试卷可以出现在题目之前,删除题目的信息可以出现在题目之前等、多张试卷信息:考虑多个同学有多张不同试卷的答卷的情况。输出顺序优先级为学号、试卷号,按从小到大的顺序先按学号排序,再按试卷号。考查知识点有:正则表达式的运用、排序等。难度偏大。
第五次题目集为家居强电电路模拟程序1。本题模拟的控制设备包括:开关、分档调速器、连续调速器。模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。输入信息有设备信息、连接信息、控制设备调节信息。考查的知识点有:类与对象、继承、接口、封装、字符串的处理、多态(方法重写与方法重载)。难度适中
第六次题目集为家居强电电路模拟程序2。增加一种落地扇,增加并联电路信息并考虑电阻。主要考查继承多态、类的设计。难度适中。
二、设计与分析
1、第四次题目集:答题判题程序-4
本次作业新增内容:
1、输入选择题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
格式:"#Z:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。
新增约束:标准答案中如果包含多个正确答案(多选题),正确答案之间用英文空格分隔。
例如:
#Z:2 #Q:宋代书法有苏黄米蔡四家,分别是: #A:苏轼 黄庭坚 米芾 蔡襄
多选题输出:
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。
多选题给分方式:
答案包含所有正确答案且不含错误答案给满分;包含一个错误答案或完全没有答案给0分;包含部分正确答案且不含错误答案给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
例如:
#N:1 #Q:1+1= #A:2
#Z:2 #Q:党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信 #A:A B C D
#T:1 1-5 2-9
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-A C
end
输出:
alert: full score of test paper1 is not 100 points
1+1=~5~false
党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信~A C~partially correct
20201103 Tom: 0 4~4
2、输入填空题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
格式:"#K:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。
例如:#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
填空题输出:
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。
填空题给分方式:
答案与标准答案内容完全匹配给满分,包含一个错误字符或完全没有答案给0分,包含部分正确答案且不含错误字符给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
例如:
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#T:1 1-5 2-10
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-瑶琴
end
输出:
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被称为:~瑶琴~partially correct
20201103 Tom: 0 5~5
3、输出顺序变化
只要是正确格式的信息,可以以任意的先后顺序输入各类不同的信息。比如试卷可以出现在题目之前,删除题目的信息可以出现在题目之前等。
例如:
#T:1 1-5 2-10
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-古筝
end
输出:
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被称为:~古筝~false
20201103 Tom: 0 0~0
4、多张试卷信息
本题考虑多个同学有多张不同试卷的答卷的情况。输出顺序优先级为学号、试卷号,按从小到大的顺序先按学号排序,再按试卷号。
2、第五次题目集:家居强电电路模拟程序-1
(1)题目分析
1、控制设备模拟
本题模拟的控制设备包括:开关、分档调速器、连续调速器。
开关:包括0和1两种状态。
开关有两个引脚,任意一个引脚都可以是输入引脚,而另一个则是输出引脚。开关状态为0时,无论输入电位是多少,输出引脚电位为0。当开关状态为1时,输出引脚电位等于输入电位。
分档调速器
按档位调整,常见的有3档、4档、5档调速器,档位值从0档-2(3/4)档变化。本次迭代模拟4档调速器,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压。
连续调速器
没有固定档位,按位置比例得到档位参数,数值范围在[0.00-1.00]之间,含两位小数。输出电位为档位参数乘以输入电压。
所有调速器都有两个引脚,一个固定的输入(引脚编号为1)、一个输出引脚(引脚编号为2)。当输入电位为0时,输出引脚输出的电位固定为0,不受各类开关调节的影响。
所有控制设备的初始状态/档位为0。
控制设备的输入引脚编号为1,输出引脚编号为2。
2、受控设备模拟
本题模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。
灯有两种工作状态:亮、灭。在亮的状态下,有的灯会因引脚电位差的不同亮度会有区别。
风扇在接电后有两种工作状态:停止、转动。风扇的转速会因引脚的电位差的不同而有区别。
本次迭代模拟两种灯具。
白炽灯:
亮度在0~200lux(流明)之间。
电位差为0-9V时亮度为0,其他电位差按比例,电位差10V对应50ux,220V对应200lux,其他电位差与对应亮度值成正比。白炽灯超过220V。
日光灯:
亮度为180lux。
只有两种状态,电位差为0时,亮度为0,电位差不为0,亮度为180。
本次迭代模拟一种吊扇。
工作电压区间为80V-150V,对应转速区间为80-360转/分钟。80V对应转速为80转/分钟,150V对应转速为360转/分钟,超过150V转速为360转/分钟(本次迭代暂不考虑电压超标的异常情况)。其他电压值与转速成正比,输入输出电位差小于80V时转速为0。
要点:
-
本次迭代不考虑两个输出引脚短接的情况
-
考虑调速器输出串联到其他控制设备(开关)的情况
-
不考虑调速器串联到其他调速器的情况。
-
不考虑各类控制设备的并联接入或反馈接入。例如,K1的输出接到L2的输入,L2的输出再接其他设备属于串联接线。K1的输出接到L2的输出,同时K1的输入接到L2的输入,这种情况属于并联。K1的输出接到L2的输入,K1的输入接到L2的输出,属于反馈接线。
-
按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。
-
不考虑输入电压或电压差超过220V的情况。
-
本题只考虑串联的形式,所以所有测试用例的所有连接信息都只包含两个引脚
-
电路中除了开关可能出现多个,其他电路设备均只出现一次。
电源VCC一定是第一个连接的第一项,接地GND一定是最后一个连接的后一项。 -
当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。
-
所有连接信息按电路从电源到接地的顺序依次输入,不会出现错位的情况。
-
连接信息如果只包含两个引脚,靠电源端的引脚在前,靠接地端的在后。
-
对于调速器,其输入端只会直连VCC,不会接其他设备。整个电路中最多只有一个调速器,且连接在电源上。
(2)程序设计与分析
本次程序设计了电路设备类,受控设备和控制设备类继承自电路设备类,开关、分档调速器、连续调速器继承自控制设备类,灯类和电扇类继承自受控设备类、电路类、电源类、接地类。其中,电路类中存放串联电路中所有设备和连接信息,能添加连接信息,添加设备,更新设备状态,输出设备信息。父类——电路设备类中的pin1和pin2分别存放引脚1和引脚2的电压,设备的电压差可由两引脚的差值计算。
-
Device类(电路设备类):有属性引脚1(pin1)、引脚2(pin2)、设备名称(deviceName),构造方法、连接电器方法(用来将其他电器与device连接起来即其他电器的引脚1(pin1)= device的引脚2(pin2))。描述所有电路设备的所有特征。
-
ControlDevice类(控制设备类):有构造方法、抽象方法getPin2()。继承自电路设备类。
-
ControledDevice类(受控设备类):有构造方法。继承自电路设备类。
-
Switch类(开关类):有state属性、无参构造方法、有参构造方法、开关转换方法(toggle())、重写stPin2方法。继承自控制设备类。
-
DialSpeedController(分档调速器类):有gear属性、无参构造方法、有参构造方法、降档方法(decreaseGear())、升档方法(increaseGear())。继承自受控设备类。
-
ContinuousSpeedController(连续调速器):有position属性、无参构造方法、有参构造方法。继承自受控设备类。
-
Lamp类(灯类):有亮度(brightness)属性、计算亮度方法(calculateBrightness),继承自ControledDevice类。
-
Fan类(电扇类):有速度(speed)属性、计算亮度方法(calculateSpeed),继承自Fan。
-
FluorescentLight类(白炽灯类):无参构造方法、有参构造方法、重写calculateBrightness方法。继承自Lamp类。
-
IncandescentLamp类(日光灯类):无参构造方法、有参构造方法、重写calculateBrightness方法。继承自Lamp类。
-
PowerSource类(电源类):电压(voltage)属性、连接设备方法、无参构造方法、有参构造方法。
-
Ground类(接地类):电压((voltage)属性、连接设备方法、无参构造方法、有参构造方法。
-
Circuit类(电路类):存放连接信息和电路中的电器,有存放连接信息、存放设备以及输出方法。
-
3、第六次题目集:家居强电电路模拟程序-2
(1)题目分析
-
本次迭代模拟一种落地扇。
工作电压区间为 [80V,150V],对应转速区间为 80-360 转/分钟。电压在[80,100)V 区间对应转速为 80 转/分 钟,[100-120)V 区间对应转速为 160 转/分钟,[120-140)V 区间对应转速为 260 转/分钟,超过 140V 转速 为 360 转/分钟(本次迭代暂不考虑电压超标的异常情况)输入信息:
-
本次迭代考虑电阻:白炽灯的电阻为 10,日光灯的电阻为 5,吊扇的电阻为 20,落 地扇的电阻为 20
-
输入串联电路信息
一条串联电路占一行,串联电路由按从靠电源端到接地端顺序依次输入的 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]
-
并联电路信息
一条并联电路占一行,并联电路由其包含的几条串联电路组成,串联电路标识之间用英文空格" "分隔。
格式:
"#M"+电路编号+":"+”[”+串联电路信息+" "+....+" "+串联电路信息+”]” 例如:#M1:[T1 T2 T3] 该例声明了一个并联电路,由 T1、T2、T3 三条串联电路并联而成,三条串联电路的 IN 短 接在一起构成 M1 的 IN,三条串联电路的 OUT 短接在一起构成 M1 的 OUT。
约束条件:
本次迭代不考虑并联电路中包含并联电路的情况,也不考虑多个并联电路串联的情况。
要点
-
不考虑输入电压或电压差超过220V的情况。
-
并联信息所包含的串联电路的信息都在并联信息之前输入,不考虑乱序输入的情况。
-
电路中的短路如果不会在电路中产生无穷大的电流烧坏电路,都是合理情况,在本题测试点的考虑范围之内。
-
不考虑一条串联电路中包含其他串联电路的情况
-
输出信息按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、落地扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。
-
调速器的输入端只会直连VCC,不会接其他设备。整个电路最多只有连接在电源上的一个调速器,且不包含在并联单路中。
(2)程序设计与分析
本题程序在上一题的基础上进行扩展,新增的并联电路类继承自电路设备类,看成是一个独立的电路设备。
总体思路为:
遍历并联电路的每条支路,计算出每条支路的总电阻及并联电路的等价电阻,再遍历整条电路,计算电路总电阻,从而得到上每个设备的分压。根据并联电路在整条电路上的分压遍历并联电路,得到并联电路每条支路上每个设备的分压,再根据设备的分压来计算其亮度或速度。
三、踩坑心得
1、第四次题目集:答题判题程序-4
注意失效信息、引用错误、被删除题目提示、格式错误提示、试卷号引用错误提示、学号引用错误的输出顺序和优先级。
2、第五次题目集:家居强电电路模拟程序-1
(1)在Circuit类中添加设备的方法
public void addDevices(String connectionInfo) {
String[] theparts = connectionInfo.split(" ");
if(connectionInfo.startsWith("[VCC")) {
if(theparts[1].startsWith("K")) {
Device dev1 = new Switch(theparts[1].substring(0, theparts[1].length()-3));
devices.put(dev1.getDeviceName(), dev1);
}
else if(theparts[1].startsWith("F")) {
Device dev1 = new DialSpeedController(theparts[1].substring(0, theparts[1].length()-3));
devices.put(dev1.getDeviceName(), dev1);
}
else if(theparts[1].startsWith("L")) {
Device dev1 = new ContinuousSpeedController(theparts[1].substring(0, theparts[1].length()-3));
devices.put(dev1.getDeviceName(), dev1);
}
}
else if(connectionInfo.endsWith("GND]")) {
}
else {
if(theparts[1].startsWith("B")) {
Device dev4 = new IncandescentLamp(theparts[1].substring(0, theparts[1].length()-3));
devices.put(dev4.getDeviceName(), dev4);
}
else if(theparts[1].startsWith("R")) {
Device dev4 = new FluorescentLight(theparts[1].substring(0, theparts[1].length()-3));
devices.put(dev4.getDeviceName(), dev4);
}
else if(theparts[1].startsWith("D")) {
Device dev4 = new Fan(theparts[1].substring(0, theparts[1].length()-3));
devices.put(dev4.getDeviceName(), dev4);
}
}
}
(2)simulate(模仿电路)方法中更新设备部分要根据对象类型转换
//更新设备状态
for(Device device : devices.values()) {
if (device instanceof Switch) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(device);
((Switch) device).setPin2();
}else if(device instanceof DialSpeedController) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(device);
((DialSpeedController) device).setPin2();
}else if(device instanceof ContinuousSpeedController) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(device);
((ContinuousSpeedController) device).setPin2();
}else if(device instanceof IncandescentLamp) {
if(devices.containsKey("K1")) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(devices.get("L1"));
((Switch) devices.get("L1")).setPin2();
devices.get("K1").connectToDevice(device);
((IncandescentLamp) device).calculateBrightness();
}
else if(devices.containsKey("F1")) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(devices.get("L1"));
((DialSpeedController) devices.get("L1")).setPin2();
devices.get("F1").connectToDevice(device);
((IncandescentLamp) device).calculateBrightness();
}
else if(devices.containsKey("L1")) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(devices.get("L1"));
((ContinuousSpeedController) devices.get("L1")).setPin2();
devices.get("L1").connectToDevice(device);
((IncandescentLamp) device).calculateBrightness();
}
}else if(device instanceof FluorescentLight){
if(devices.containsKey("K1")) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(devices.get("L1"));
((Switch) devices.get("L1")).setPin2();
devices.get("K1").connectToDevice(device);
((FluorescentLight) device).calculateBrightness();
}
else if(devices.containsKey("F1")) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(devices.get("L1"));
((DialSpeedController) devices.get("L1")).setPin2();
devices.get("F1").connectToDevice(device);
((FluorescentLight) device).calculateBrightness();
}
else if(devices.containsKey("L1")) {
PowerSource powerSource = new PowerSource();
powerSource.connectToDevice(devices.get("L1"));
((ContinuousSpeedController) devices.get("L1")).setPin2();
devices.get("L1").connectToDevice(device);
((FluorescentLight) device).calculateBrightness();
}
}else if(device instanceof Fan) {
if(devices.containsKey("K1")) {
devices.get("K1").connectToDevice(device);
((Fan) device).calculateSpeed();
}
else if(devices.containsKey("F1")) {
devices.get("F1").connectToDevice(device);
((Fan) device).calculateSpeed();
}
else if(devices.containsKey("L1")) {
devices.get("L1").connectToDevice(device);
((Fan) device).calculateSpeed();
}
}
}
(3)要记得对属性进行初始化
3、第六次题目集:家居强电电路模拟程序-2
(1)对连接信息进行处理时分隔符应为“\\s+”,匹配空格时应匹配>=1个
例如
String[] parts = part[1].split("]\\s+");
String[] parts2 = parts[i].split("\\s+");
String[] parts2 = parts[0].split("\\s+");
String[] parts = part[1].split("]\\s+");
String[] parts2 = parts[i].split("\\s+");
(2)未考虑短路的情况
在并联电路中,如果其中一个支路上没有设备会造成短路。此时并联电路的其他支路上的设备两端的电压都为0。
(3)未考虑并联电路之前没有开关和调速器的情况
若并联电路之前没有开关和调速器,应设整条电路的电压为220,再进行接下来的操作。
(4)测试过程中发现分档调速器连升4级,原因是对档位范围的设定出现错误
应对如下代码进行修改
public void increaseGear() {
if(this.gear <4) {
this.gear ++;
}
}
修改完后的代码为
public void increaseGear() {
if(this.gear <3) {
this.gear ++;
}
}
(5)落地扇两端电压差超过220时速度也为360
@Override
public void calculate() {
if(this.getPressure()>=80&&this.getPressure()<99){
this.setSpeed(80);
}
else if(this.getPressure()>=100&&this.getPressure()<119){
this.setSpeed(160);
}
else if(this.getPressure()>=120&&this.getPressure()<139){
this.setSpeed(260);
}
else if(this.getPressure()>=140){
this.setSpeed(360);
}
}
四、改进建议
1、运用正则表达式的分组对字符串进行解析
2、第六次题目集(家居强电电路模拟程序-2)增加Agent类,降低耦合性
3、电器设备类添加序号属性,保存每个电器的序号,排序时根据序号排序
五、总结
通过这三次题目集,对继承和多态的理解与掌握进一步提高,对需求的分析提取能力得到提升。
接下来需要进一步学习接口的使用与正则表达式。
标签:总结,题目,引脚,devices,电路,PTA,device,设备 From: https://www.cnblogs.com/shiyuying-23201101/p/18239853