第三次博客

第三次博客

前言

第七次PTA作业

题目考察知识点分析

本题通过模拟智能家居强电电路,考察对电路原理、设备控制逻辑、数据结构与算法设计、编程能力的综合应用。重点包括电压、电流、电阻计算,开关与调速器的控制,受控设备状态计算,电路连接表示,异常处理,面向对象编程,输入解析,输出格式化,以及迭代开发和代码优化.

第八次PTA作业

题目考察知识点分析

本题在前一题的基础上添加了对电器电压的输出,以及对超出最大电流的异常输出,在对电器的输入输出电压计算时要考虑左右有没有断路的情况。

设计与分析

PTA作业7

类图

类与对象结构分析

1. (电路设备类)CircuitDevice

CircuitDevice是所有电路设备的基类,它包含了所有电路设备的基本属性和一些共用的方法。主要字段有:

  • Cno: 设备编号。
  • InputVoltage: 输入电压。
  • OutputVoltage: 输出电压。
  • electricCurrent: 电流。
  • Pin: 引脚,用于连接其他设备。
  • type: 设备类型,用常量区分不同类型的设备(如开关、调速器等)。
  • resistance: 电阻。

类中还提供了若干 setter 和 getter 方法,用于访问和修改这些字段。方法根据电流和电阻计算电压, 方法则是空方法,留给具体设备实现。CalculateVoltage()``setOUT()

2. (控制设备)Control

Control类表示所有控制电路设备(例如开关、调速器等)。它继承了 的所有属性和方法,并为子类提供了一个构造器。CircuitDeviceCircuitDevice`

3. (受控设备)Controlled

Controlled类表示所有被控制的电路设备(如灯具、风扇、窗帘等)。这类设备的状态可能会受控于其他设备的输入输出。``CircuitDevice`

4. (开关)Switch

Switch表示一个简单的开关设备。它有一个 字段表示开关的状态(开/关)。通过 方法可以切换开关的状态, 方法用来输出当前开关的状态。``ControlStatesetState(),print()`

5. (受控开关)ControlledSwitch

ControlledSwitch表示一个受控的开关设备。它有一个额外的 字段和一个 字段。方法输出当前的开关状态。Control``Resistance2``TwoThreeprint()

6. (调速器)Governor

Governor类是所有调速器(如分档调速器、连续调速器)的基类。它包含一个 字段,用于表示调速器的挡位。子类可以继承该类并实现具体的调速器功能。``gear`

7. (分档调速器)Grading

Grading实现了一个分档调速器。它根据调速器的挡位来设置输出电压,挡位通过 来表示。方法根据挡位设置输出电压。Governor``gear``setOUT()

8. (连续调速器)Continuity

Continuity实现了一个连续调速器。它通过 来表示调速器的连续调节值, 方法根据 设置输出电压。Governor``gearData``setOUT()``gearData

  1. (灯具)Lamp

Lamp表示一个灯具设备。它包含 字段,表示灯具的亮度。不同的灯具(如白炽灯、日光灯)通过继承自 来实现特定的功能。Controlled``light``Lamp

10. (白炽灯)FilamentsLamp

FilamentsLamp实现了白炽灯的亮度计算。通过 方法,根据电压计算灯具的亮度, 方法输出亮度。Lamp``setLighting()``print()

11. (日光灯)FluorescentLamp

FluorescentLamp,实现了日光灯的亮度计算。亮度只有两种状态:亮和灭。方法输出亮度。Lamp``print()

12. (风扇)Fan

Fan类,表示一个风扇设备。它有一个 字段,表示风扇的转速。通过 方法来设置风扇的速度。Controlled``speed``setSpeed()

13. (吊扇)CeilingFan

CeilingFan类 表示一个吊扇设备。它通过 方法根据电压设置风扇的速度。`Fan``setSpeeding()

14. (落地扇)FloorFan

FloorFan类表示一个落地扇设备。它通过 方法根据电压设置风扇的速度。`Fan``setSpeeding()

15. (受控窗帘)ControlledCurtains

ControlledCurtains类继承自受控设备类,表示一个受控窗帘设备。它通过 方法根据电压和某个值来调整窗帘的开合程度。Controlled``setOpening()

16. (电路) SeriesCircuit

Circuitry 类允许动态添加电路设备、修改设备的状态以及计算电流等。它通过正则表达式解析输入指令来控制电路设备,提供了一种灵活的方式来管理和控制各种电气设备

17.(串联电路)SeriesCircuit

SeriesCircuit类继承于SeriesCircuit,用于处理串联电路。

18.(并联电路)ShuntCircuit

ShuntCircuit类继承于SeriesCircuit,用于处理并联电路。

主要函数解析

public void setAllElectricCurrent()	//设置各电器电流
  1. for(CircuitDevice circuitDevice : circuitDevices) { ... }

    • 遍历 circuitDevices 集合中的所有电路设备 (CircuitDevice 类的对象)。

    • 对每个设备,调用

    • setElectricCurrent(getElectricCurrent())方法来设置设备的电流。

      getElectricCurrent() 是获取电流值的函数,这个函数返回当前电路或设备的电流大小。setElectricCurrent() 是设置设备电流的函数,意味着将当前电流值应用到每个设备上。

  2. for(SeriesCircuit s : seriesCircuits) { SetSeriesEC(s); }

    • 遍历所有的串联电路 (SeriesCircuit 对象)。

    • 对于每个串联电路s调用SetSeriesEC(s)方法来设置串联电路中各个设备的电流。

      SetSeriesEC() 方法会递归地设置串联电路及其包含的子电路设备的电流值。

  3. for(ShuntCircuit s : shuntCircuits) { SetShuntEC(s); }

    • 遍历所有的并联电路 (ShuntCircuit 对象)。

    • 对于每个并联电路s,调用SetShuntEC(s)方法来设置并联电路中各个设备的电流。

      SetShuntEC() 方法会递归地设置并联电路及其包含的子电路设备的电流值。

总体流程

  • 首先: 遍历所有普通电路设备,并为它们设置电流。
  • 然后: 遍历所有的串联电路,依次通过 SetSeriesEC 方法设置这些电路及其内部设备的电流。
  • 最后: 遍历所有并联电路,通过 SetShuntEC 方法设置并联电路及其设备的电流。

SetSeriesEC()SetShuntEC() 方法的作用

  • SetSeriesEC() 负责遍历串联电路中的设备,并设置电流。对于串联电路,电流是恒定的,但电压可能分配到不同的设备上。
  • SetShuntEC() 负责遍历并联电路中的设备,并设置电流。对于并联电路,电流根据每个设备的电阻不同进行分配(即电流按电阻成反比分配)。

递归调用

  • SetSeriesEC() 中,如果设备的类型是串联电路 (CLtype),则会递归地调用 SetSeriesEC(),进一步处理串联电路中的子电路。

  • SetShuntEC() 中,如果设备的类型是并联电路 (BLtype),则会递归地调用 SetShuntEC(),进一步处理并联电路中的子电路。

    主要函数顺序图

PTA作业8

类图

类与对象结构分析

相较于上一次的PTA,这次新增加了class DIODE extends Control(二极管类)

  1. 类继承结构
    DIODE 类继承自 Control 类,表示它是一种控制设备。通过继承 Control 类,DIODE 可以复用父类中定义的通用属性和方法(如设置电阻、电流、电压等),同时根据二极管的特性进行扩展。

  2. 类属性
    Cno:设备编号,用于标识该二极管。
    pin:表示二极管的引脚方向,"1" 表示正向导通,其他值表示反向截止。

  3. 功能说明:
    构造函数首先调用父类的构造函数 uper(Cno),初始化设备编号。
    然后设置设备类型为 Etype,并设定最大允许电流为 8A
    根据传入的 pin 参数,判断二极管的工作状态:
    如果 pin 为 "1",表示二极管处于正向导通状态,电阻设为 0。
    否则,二极管处于反向截止状态,电阻设为无穷大(Double.POSITIVE_INFINITY)。

    主要函数解析

    public void setAllDY()//设置各电器引脚电压
    

    1. 设置初始电压

    方法开始时,通过一个 for 循环遍历所有的电路设备(circuitDevices),并对每个设备进行如下操作:

    • 条件判断:如果是第一个设备(即 i == 0),则判断设备类型是否为 FtypeLtype,如果是这两种类型,则不设置电压(这些设备可能有特殊的电压设置规则,因此不做处理)。如果设备不是这两种类型,则继续设置输入和输出电压。

    • 输入电压设置:对于非 FtypeLtype 类型的设备,设置设备的输入电压为 220V。

    • 输出电压设置:接着,判断设备的电流(getElectricCurrent())是否为 0,如果电流为 0,则设备的输出电压为 0。如果电流不为 0,则使用公式计算输出电压:

      Output Voltage=Input Voltage−(Resistance×Electric Current)Output Voltage=Input Voltage−(Resistance×Electric Current)

      然后通过 circuitDevice.setOutputVoltage() 设置该输出电压。

    • 非第一个设备的处理:对于不是第一个设备(即 i != 0)的设备,输入电压将被设置为前一个设备的输出电压(即,circuitDevices.get(i-1).getOutputVoltage())。接着按照相同的方式计算和设置输出电压。

    2. 处理串联电路

    在处理完所有的电器设备后,方法接着通过遍历所有的串联电路(seriesCircuits)来设置串联电路的电压:

    • 对每个 SeriesCircuit(串联电路),调用 setSeriesDY(s) 方法设置串联电路中的设备的电压。

    3. 处理并联电路

    然后,方法再次遍历所有的并联电路(shuntCircuits),并对每个 ShuntCircuit(并联电路),调用 setShuntDY(s) 方法设置并联电路中设备的电压。

    4. 递归设置电压

    setSeriesDYsetShuntDY 方法中,会递归地调用自身来处理电路中复杂的子电路结构:

    • 串联电路处理:对于串联电路中的每个电器设备,如果设备是一个串联电路(SeriesCircuit),则调用 setSeriesDY() 递归地处理这个子电路。其他类型的设备则按照上述方式设置电压。

    • 并联电路处理:对于并联电路中的每个电器设备,如果设备是一个串联电路(SeriesCircuit),则递归调用 setSeriesDY(),如果设备是并联电路(ShuntCircuit),则递归调用 setShuntDY()

      主要函数顺序图

踩坑心得

PTA作业7

忽视了并联电路短路的情况

输入

#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2 K3]
#T3:[VCC M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
#K2
end

输出

@K1:closed
@K2:closed
@K3:turned on
@D1:0
@D2:0
@D3:346

D3正确的输出应该为360因为D1和D2已经短路了D3的电压为220V

将短路情况解决就应在并联的分路判断通的情况下加一个判断电阻是否为0就能解决。

PTA作业8

忽视了串联中包含并联的例子

输入

#T1:[IN P2-1] [P2-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]
#T3:[VCC K2-1] [K2-2 M2-IN] [M2-OUT GND]
#K1
#K3
#K2
end

输出

@K1:closed 220-220 exceeding current limit error
@K2:closed 220-220 exceeding current limit error
@K3:closed 220-220 exceeding current limit error
@B1:200 220-0 exceeding current limit error

由于没有对串联中并联的情况考虑导致M1中的电器缺失缺少了

@D1:0 220-220
@H1:closed 0-220-220 exceeding current limit error
@P2:conduction 220-220 exceeding current limit error

输出

改进建议

  1. 处理并联电路短路情况

问题分析:

在PTA作业7中,忽视了并联电路中可能存在的短路情况。并联电路中,如果某些分支的电阻为0(例如理想导体),则会导致电流无限增大,从而出现电流超过最大限制的错误。

解决方案:

需要在并联电路中对每个分支的电阻进行检查。如果电阻为0(即短路),则需要处理短路情况并输出相应的错误消息。

具体修改方法:

在并联电路中遍历每个设备,判断其电阻是否为0。

如果某个设备为短路,则需要为该设备设置电流为0,并标记为短路设备。

在计算电压时,对于短路设备,跳过电流计算。

2.处理串联电路中包含并联电路的情况*

问题分析:

在PTA作业8中,忽视了串联电路中可能包含并联电路的复杂结构。串联电路和并联电路的混合使得电流和电压的计算变得更加复杂,需要正确地处理这些嵌套的电路。

解决方案:

  • 递归处理子电路: 串联电路和并联电路可以嵌套,因此需要递归地遍历电路设备,处理每个子电路(包括串联和并联)。当一个串联电路内部包含并联电路时,首先处理并联电路中的设备,然后再计算串联电路的电流和电压。
  • 电流和电压分配: 在处理复杂电路时,确保电流和电压的分配符合电路连接的类型(串联电路电流相同,电压分配;并联电路电压相同,电流分配)。

总结

  1. 面向对象设计: 通过设计和实现不同类型的电器设备(如开关、调速器、灯具等),我们加深了对电路工作原理的理解。同时,面向对象编程的思想使得代码结构更加清晰、灵活。特别是使用类继承和多态处理不同设备之间的共性和差异,大大提高了代码的复用性和可维护性。
  2. 电压、电流、电阻计算与设备控制: 在编写代码时,需要细致地进行电流、电压和电阻的计算,确保每个设备的状态准确。这一过程中,我们也遇到了一些挑战,尤其是如何正确处理串联和并联电路中的电流和电压分配。
  3. 异常情况处理: 作业中要求我们对异常情况(如并联电路短路、超载电流等)进行处理。这使我们深刻理解了如何在设计时考虑各种特殊情况,并在代码中做出合适的异常处理。
  4. 递归: 在处理串联和并联电路的电流、电压计算时,我们需要递归地遍历每个设备或电路。通过这种递归的方式,我们实现了电路复杂性较高的计算,最终能够保证电路状态的正确输出。

学期总结

通过本学期的PTA训练,我掌握了许多实用的知识并能熟练的运用到项目中。我熟练的掌握了正则表达式的使用,在处理根据不同的输入进行行不同的操作时有着很大的帮助,并能约定输入的格式,对于错误的输入格式能够判断出来,在需要尽可能多的匹配信息,我们可以使用贪婪匹配,当需要匹配尽可能少的信息时可以用非贪婪匹配,同时我们还能在添加正向肯定 lookahead 断言,来确定我们需要匹配内容的上下文格式,确保正确匹配。对于类的设计我们可以通过设计多态,继承,组合等类的关系来更好的处理类之间的关系。我学会了如何通过继承实现代码复用,减少重复代码。子类可以继承父类的属性和方法,并根据需要进行扩展或重写。我学会了如何使用 try-catch-finally 结构来处理程序中的异常情况,确保程序在遇到错误时不会崩溃,并能够给出合理的错误提示。此外,我还学会了自定义异常类,以便更好地处理特定类型的错误

posted @ 2024-12-28 23:08  yu23  阅读(28)  评论(0)    收藏  举报