首页 > 其他分享 >PTA题目集7~8的总结性Blog

PTA题目集7~8的总结性Blog

时间:2024-12-28 17:30:13浏览次数:5  
标签:总结性 计算 电阻 PTA Blog 电路 并联 电压 设备

· 前言

本次的两个作业,由家居强电电路模拟程序- 3、家居强电电路模拟程序 -4组成。
家居强电电路模拟程序-3模拟强电电路的运行,支持各种控制设备、受控设备的运行逻辑、计算各设备的电压、电流、亮度、转速等参数、支持电路的串联与并联结构。;最后家居强电电路模拟程序-4则在前一题的基础上增加了并联中包含并联的内容,扩展了系统的功能和适用场景,新增内容如下:电器增加管脚电压的显示、增加电流限制功能,输出超流错误提示、短路检测功能,短路时仅输出“short circuit error”、支持并联电路中包含并联电路的嵌套结构、增加二极管元件,模拟正向导通、反向截止的电路特性。

· 题目集概述

· 家居强电电路模拟程序 - 3

1. 题目核心分析

功能点分解

  1. 控制设备

    • 模拟开关(0/1状态)、互斥开关、分档调速器(固定档位)、连续调速器(范围档位)。
    • 开关和调速器根据状态影响电压传输,互斥开关根据电阻实现双分支。
  2. 受控设备

    • 灯具(白炽灯、日光灯):根据电压差计算亮度。
    • 风扇(吊扇、落地扇):根据电压差计算转速。
    • 受控窗帘:根据总光照强度控制窗帘的开合比例。
  3. 电路连接与状态计算

    • 串联电路:按输入到输出顺序连接设备,计算电压分布、电流。
    • 并联电路:实现各分支共享电压,不同支路的电流叠加。
    • 串联和并联电路间嵌套组合。
  4. 输入输出格式

    • 支持控制设备的操作指令。
    • 模拟电路参数输出,包括设备状态、亮度、转速、窗帘开合比例等。

2. 流程设计

  1. 输入解析
    • 解析设备、线路、操作指令信息。
    • 建立所有设备的实例并保存设备连接关系。
  2. 电路组装
    • 根据线路信息构建串联和并联电路。
    • 按连接关系计算设备电压、电流分布。
  3. 状态更新与计算
    • 执行控制设备的状态调整。
    • 重新计算受控设备的亮度、转速和窗帘状态。
  4. 输出生成
    • 按设备类型和编号顺序输出最终状态或参数。

3. 计算逻辑设计

3.1. 电压与电流计算
  1. 串联电路:
    • 总电阻 R_total= R_i求和。
    • 总电流 I = V_cc / R_total。
    • 每个设备的电压 V_i = I * R_i。
  2. 并联电路:
    • 总电流 I_total = I_i求和。
    • 每个分支的电流 I_branch = V_branch / R_branch。
3.2. 设备状态计算
  • 灯具亮度:按电压差比例线性增长或固定输出。
  • 风扇转速:按电压差分段增长或线性增长。
  • 窗帘开合:根据光照强度范围设置比例。

运行逻辑分析

1. 系统的运行流程图

  1. 输入解析阶段

    • 解析输入中的设备定义、线路拓扑和指令操作。
    • 构建设备和线路对象实例。
  2. 电路组装阶段

    • 按串联或并联连接设备,组装电路。
    • 初始化输入电压、电阻,并计算初始状态。
  3. 状态更新阶段

    • 执行输入的控制设备指令。
    • 根据指令更新电压分布、电流及设备状态。
  4. 输出生成阶段

    • 输出所有设备的最新状态参数,如开关状态、亮度、转速、窗帘比例等。

2. 运行逻辑详细步骤

2.1 输入解析阶段

输入格式:

# [线路定义]
# [设备定义]
# [操作指令]
end
  1. 线路定义解析

    • [A-B]格式描述的电路段,每段为一条连接。
      • 示例[VCC K1-1] [K1-2 F1-1] [F1-2 B1-1] [B1-2 GND]
      • 解析为:从VCCK1-1K1-2F1-1F1-2B1-1B1-2GND
  2. 设备定义解析

    • 设备的属性通过编号定义。
      • 示例K1: SwitchF1: CeilingFan
      • 解析为设备对象,并保存到设备映射表。
  3. 操作指令解析

    • 控制设备的状态切换。
      • 示例
        • #F1+:控制风扇F1增加档位。
        • #K1:打开或关闭开关K1
      • 操作结果更新到设备属性。

2.2 电路组装阶段

基于线路定义,构建电路的逻辑连接关系。

  1. 按电路段连接设备

    • 按解析结果,连接每个设备的输入、输出引脚。
    • 构建串联电路或并联电路对象。
  2. 电路初始化

    • 电阻计算
      • 串联:总电阻$R_{total} = \sum R_i$。
      • 并联:总电阻$1 / R_{total} = \sum (1 / R_i)$。
    • 电压、电流分布
      • 根据电源电压,初始化设备的电压、电流分布。

2.3 状态更新阶段

当收到控制指令后,更新设备和电路状态。

  1. 更新控制设备状态

    • 开关类设备:
      • Switch的状态切换on/off
    • 调速器类设备:
      • StepRegulator的档位调整。
    • 状态变化会影响后续设备的输入电压。
  2. 重新计算电压与电流分布

    • 串联电路
      • 计算总电流 $I = V_{total} / R_{total}$。
      • 逐设备分配电压 $V_i = I \cdot R_i$。
    • 并联电路
      • 各分支共享相同电压 $V_{branch}$。
      • 逐分支计算电流 $I_{branch} = V_{branch} / R_{branch}$。
  3. 更新受控设备状态

    • 灯具:
      • 根据电压差,计算亮度(白炽灯线性,日光灯恒亮)。
    • 风扇:
      • 根据电压差,计算转速或档位(线性或分段增长)。
    • 窗帘:
      • 根据总光强计算开合比例(光强与电压相关)。

2.4 输出生成阶段

生成格式化的输出结果,包括设备最新状态。

  1. 输出格式

    • 按设备编号顺序输出状态参数。
      • 开关:@K1: turned on/off
      • 风扇:@F1: 1(表示当前档位)。
      • 窗帘:@B1: 50(表示当前开合比例)。
    • 示例:
      @K1: turned on
      @F1: 2
      @B1: 80
      
  2. 结果排序

    • 按设备编号进行排序,确保输出顺序与输入一致。

3. 模块间交互逻辑

以下是系统主要模块的交互关系:

  1. 输入模块

    • 解析设备和线路信息。
    • 解析操作指令并传递给电路模块。
  2. 电路模块

    • 根据设备连接构建电路。
    • 计算电流、电压分布并传递给设备模块。
  3. 设备模块

    • 接收电压、电流信息更新状态。
    • 根据控制设备的指令调整受控设备参数。
  4. 输出模块

    • 格式化设备状态,生成最终输出。

4. 逻辑实现细节

4.1. 核心算法
  • 电路电流与电压分布计算

    • 串联:
      R_total = sum([R1, R2, ...])
      I = V_total / R_total
      V_i = I * R_i
      
    • 并联:
      R_total = 1 / sum([1/R1, 1/R2, ...])
      V_branch = V_total
      I_branch = V_branch / R_branch
      
  • 灯具亮度计算

    Brightness = (V_input / V_max) * 100   # 线性比例
    
  • 风扇转速计算

    Speed = (V_input / V_max) * Max_Speed   # 分段或线性
    
  • 窗帘开合比例

    Open_Rate = (Light_Intensity / Max_Intensity) * 100
    
4.2. 输入指令处理
  • 示例指令#K1
    • 查找设备编号为K1的设备对象。
    • 切换状态on/off,并通知相关电路重新计算状态。

5. 总结与优化点

  1. 分层设计

    • 输入解析 → 电路组装 → 状态更新 → 输出生成,清晰解耦各个模块职责。
  2. 高内聚低耦合

    • 设备和电路模块独立,状态变化通过接口通信,方便扩展。
  3. 高效计算

    • 串联与并联计算逻辑清晰,高效分配电压和电流。
  4. 兼容性

    • 输入支持多样化控制指令,输出支持按需扩展格式。

知识点总结

1. 面向对象编程 (OOP)

核心思想:
  1. 抽象与封装

    • 根据设备功能,将电路中的开关调速器灯具风扇等抽象为不同类,提取通用特性至基类CircuitDevice
    • 封装每个设备的属性(如电压、电阻、状态)和方法(如calculate_output)。
  2. 继承与多态

    • 子类(如SwitchLamp)继承基类,通过多态实现特定设备的行为,例如:
      • 白炽灯和日光灯的亮度计算逻辑不同,但均通过Lamp类的接口调用。
    • 调速器的分档调速和连续调速通过多态接口set_level()实现。
  3. 耦合与解耦

    • 通过电路类(SeriesCircuitParallelCircuit)管理设备的连接与电压计算,减少设备类之间的直接依赖,降低耦合度。

2. 电路知识与模拟

电路模拟原理
  1. 电压、电流分布

    • 串联电路中逐设备分配电压。
    • 并联电路中各分支共享电压,分别计算电流。
  2. 动态调整

    • 当开关状态或调速器档位发生变化时:
      • 重新计算总电路的电阻。
      • 更新电压分布,改变受控设备的亮度、转速等状态。

3. 软件设计方法

系统模块划分
  1. 设备模块

    • 每种设备为一个类,封装特定行为:
      • 开关控制:切断/接通电路。
      • 灯具亮度:根据输入电压计算亮度。
      • 风扇转速:根据电压分配计算档位或转速。
      • 窗帘比例:根据光强控制开合。
    • 设备类的接口设计:
      • 例如,update_voltage(input_voltage)用于传递设备输入电压。
  2. 电路模块

    • 包括串联和并联电路:
      • 串联电路:
        • 计算总电阻 $R_{total}$。
        • 按设备分配电压。
      • 并联电路:
        • 计算等效电阻。
        • 分支共享电压,独立计算电流。
    • 电路的接口设计:
      • calculate_circuit():执行电流、电压分布的计算。
      • add_device():支持动态添加设备。
  3. 输入/输出模块

    • 输入
      • 解析设备定义(如设备类型、编号)。
      • 解析连接关系(串联/并联拓扑)。
      • 解析控制指令(如开关切换、档位调整)。
    • 输出
      • 格式化设备状态,包括开关状态、亮度、转速等。

6. 知识点总结关键表

知识点分类 涉及内容
面向对象编程 抽象类、继承、多态、接口设计
电路物理原理 串联与并联电路、电压电流分布、电功率公式
软件模块设计 分层设计、设备模块与电路模块的解耦、输入输出解析

源码结构分析


1. 源码功能概述

该程序实现了一个模拟电路系统,支持各种电气设备(如开关、灯、风扇、窗帘等)的控制、连接、状态切换以及计算相关的电路参数(如电阻、电压、亮度等)。程序核心部分包括电路模型定义、设备的抽象及其具体实现、电路分析和操作命令解析。


2. 程序核心结构

主要组成部分:

  1. 设备类层次结构:

    • Device:设备基类。
    • ControlDeviceControlledDevice:分别表示控制设备和被控制设备。
    • 具体设备类型继承自这两个抽象类,包括开关、灯、风扇等。
  2. 电路模型:

    • Circuit:电路类,包含设备管理、连接信息管理、电路分析和状态计算的逻辑。
    • SimulationCircuit:用于模拟复杂的子电路和并联电路。
  3. 命令解析:

    • 主程序 Main 解析输入的命令,调用相关类处理设备的状态和电路的分析。

3. 核心方法解析

3.1 calculateResistance 方法

功能:计算整个电路的总电阻,包括串联和并联部分。

  • 实现原理:
    1. 遍历电路中的每条连接(从 connections 获取)。
    2. 判断该连接是否属于并联电路。
    3. 对于串联电路,直接累加电阻;对于并联电路,计算其等效电阻。
  • 作用: 提供电阻总值以进一步计算电压分配。
3.2 calculateVoltages 方法

功能:分配电路中各设备的电压。

  • 实现原理:
    1. 通过总电阻计算电路中主电压分布。
    2. 根据设备电阻占总电阻的比例分配电压。
    3. 特殊逻辑处理调速器、灯、窗帘等设备的状态。
3.3 parseDevices 方法

功能:将输入的电路设备信息解析并实例化设备对象。

  • 实现原理:
    1. 遍历电路定义(Circuits)的设备清单。
    2. 根据设备类型(通过前缀识别)实例化具体的设备对象。
    3. 将设备对象添加到 Circuit.devices 中,供后续操作使用。
3.4 executeCommands 方法

功能:根据输入命令,操作设备的状态。

  • 实现原理:
    1. 区分命令类型(如开关、调速器等)。
    2. 调用设备的特定方法执行相应的状态切换。
    3. 更新设备状态后触发电路重新计算。
3.5 printStatus 方法

功能:输出当前电路中所有设备的状态。

  • 实现原理:
    1. 遍历 Circuit.devices
    2. 按设备类型分类打印状态(如亮度、转速等)。
    3. 格式化输出,按设备编号排序。

4. 类图设计

关键类说明:

  1. Device:设备基类,包含设备通用属性和方法(如电压、电阻等)。
  2. ControlDevice:控制设备(如开关、调速器),负责影响被控设备。
  3. ControlledDevice:被控设备(如灯、风扇等),根据控制信号调整自身状态。
  4. Circuit:管理所有设备及连接,负责电路的分析、计算和操作。
  5. SimulationCircuit:模拟子电路,用于处理并联电路的特殊逻辑。

5. 顺序图设计

以下展示了程序在解析输入命令并计算电路状态的执行过程:

用户输入 -> Main.main() -> parseDevices()
                                 |
                                 v
                        Circuit.addDevice()
                                 |
                                 v
                         Circuit.calculateResistance()
                                 |
                                 v
                        Circuit.calculateVoltages()
                                 |
                                 v
                          Circuit.printStatus()

关键步骤:

  1. 用户输入设备和电路连接信息。
  2. parseDevices 方法解析并实例化设备对象。
  3. calculateResistance 方法计算电路的总电阻。
  4. calculateVoltages 方法分配电压并更新设备状态。
  5. printStatus 方法输出设备的最终状态。

6. 踩坑心得

  1. 输入解析:

    • 设备类型和电路连接格式多样,容易解析出错。
    • 需注意命令格式的边界条件,如空行或非法字符。
  2. 设备连接:

    • 并联电路的等效电阻计算较复杂,需考虑短路和开路的情况。
    • 开关与多状态开关(ExclusiveSwitch)的连接状态判断较为繁琐。
  3. 电压分配:

    • 需准确区分串联和并联设备的电阻占比。
    • 灯光亮度和风扇转速等非线性关系需单独处理。
  4. 状态更新:

    • 设备状态更新需保证实时性,不能遗漏对其他设备的影响。
  5. 命令执行:

    • 设备状态切换的命令执行顺序对最终输出有重要影响。

· 家居强电电路模拟程序 - 4

1. 题目分析

核心任务
设计并实现一个能够模拟智能家居强电电路的系统,支持控制设备、受控设备的状态变化、电路电压和电流计算、短路检测、电流限制、管脚电压显示等功能。本次迭代重点增加以下功能:

  • 管脚电压显示。
  • 电流限制与超限检测。
  • 短路检测。
  • 并联电路中包含并联的支持。
  • 二极管的特性实现。

2. 源码结构分析

模块划分

  1. 设备类

    • 所有设备(如开关、调速器、灯、风扇等)的基类和子类。
    • 新增二极管 Diode 类,模拟正向导通、反向截止特性。
  2. 电路类

    • 串联电路类 SerialCircuit
    • 并联电路类 ParallelCircuit
    • 支持嵌套并联和串联电路的处理。
  3. 电路模拟核心

    • 电阻计算:考虑串联和并联规则。
    • 电压分配:基于设备的电阻比例。
    • 短路检测与处理。
    • 电流限制和超限检测。
  4. 输入输出模块

    • 输入解析:设备、连接信息和控制命令。
    • 输出状态:支持按要求格式输出设备状态及管脚电压。
类图设计如下:

2.功能与实现的新增难点


1. 管脚电压显示
难点分析
  1. 精度要求严格

    • 管脚电压需保留整数部分,截尾处理可能引入精度误差。
    • 各设备引脚电压显示需按编号排序。
  2. 嵌套电路的管脚电压传递

    • 串联和并联电路的管脚电压需要逐级计算和传递。
    • 并联电路中包含子电路时,需确定每条子电路输入输出电压。
解决方案
  • 在设备类中新增 getPinVoltages 方法,每个设备计算并返回引脚电压。
  • 对于并联和串联电路,通过递归调用获取所有子电路的管脚电压。

2. 电流限制与超限检测
难点分析
  1. 设备电流计算复杂

    • 电流由设备两端电压差和设备电阻决定。
    • 并联电路中,各分支电流需要单独计算。
  2. 多设备电流检测逻辑

    • 每个设备有不同的最大电流限制。
    • 需在输出状态时动态检测并标记超限设备。
解决方案
  • Device 类中增加 checkCurrentLimit 方法,根据实时电流与限制值比较。
  • 在电路计算后统一检测所有设备是否超限,并标记输出信息。

3. 短路检测
难点分析
  1. 短路的多样性

    • 串联电路中直接短接。
    • 并联电路中某分支短接导致整体短路。
  2. 短路对电路计算的影响

    • 短路后电路电阻为0,可能导致无法分配电压和电流。
解决方案
  • 在电阻计算阶段,若总电阻为0,立即标记短路。
  • 在状态输出阶段,优先检测短路并终止其他输出,显示 "short circuit error"。

4. 并联电路中包含并联
难点分析
  1. 多层嵌套解析复杂度

    • 并联电路中包含子并联电路,可能无限递归。
    • 各子电路需独立解析并返回等效电阻和电压。
  2. 电流分配复杂性

    • 嵌套并联电路中,每层电路电流需按等效电阻分配。
解决方案
  • ParallelCircuit 类中,递归处理嵌套的子并联电路,逐级计算等效电阻。
  • 在电压分配阶段,按各分支电阻比例分配电压和电流。

5. 二极管的特性实现
难点分析
  1. 正向导通与反向截止逻辑复杂

    • 二极管需实时判断电流方向。
    • 若两端电压相等,需根据连接方向决定导通或截止状态。
  2. 影响电路整体计算

    • 二极管导通时电阻为0,影响电路总电阻。
    • 二极管截止时电阻为无穷大,影响电路的连接有效性。
解决方案
  • Diode 类中实现 updateState 方法,判断电流方向并设置电阻。
  • 在电路解析时,单独处理二极管的正反向连接,确保电阻计算准确。

6. 输出格式的要求
难点分析
  1. 格式化输出

    • 设备状态和参数需要按类型和编号排序输出。
    • 管脚电压需严格按照要求显示整数值。
  2. 异常信息的插入

    • 超限和短路信息需动态插入,不破坏整体输出结构。
解决方案
  • outputStatus 方法中,按设备类型分组并排序。
  • 检测异常后,动态修改输出格式,插入错误信息。

3.核心方法讲解及源码分析

以下是代码中的几个核心方法,它们是整个电路模拟逻辑实现的关键部分:


1. calculateCircuitVoltage 方法

功能

  • 负责整个电路的电压分配和电流计算。
  • 短路检测、电压分配和设备特性更新均在此实现。

源码分析

public void calculateCircuitVoltage() {
    SeriesCircuit maincircuit = (SeriesCircuit)devices.get(Main.Maincircuit);
    if (maincircuit.isDuanlu) {
        System.out.println("short circuit error");
        return;
    }
    if (maincircuit.isSeriesOpen()) {
        maincircuit.setInputVoltage(220.0); // 设置主电路电压
        return;
    }
    maincircuit.setInputVoltage(220.0);  // 设置主电路输入电压
    maincircuit.setDianshicha(220.0);    // 设置主电路电位差

    // 遍历设备,更新每个设备的状态
    for (String deviceName : devices.keySet()) {
        Device device = devices.get(deviceName);
        if (device instanceof Curtain) {
            Curtain curtain = (Curtain) device;
            curtain.setLightIntensity(maincircuit.getLightIntensity()); // 设置光强影响窗帘状态
        }
    }
}

分析

  1. 短路检测

    • 检查主电路 isDuanlu 状态。如果短路(电阻为 0),直接输出错误信息。
  2. 断路检测

    • 如果电路未完全闭合(如某处开关断开),直接设置电压,但不进行进一步计算。
  3. 电压分配

    • 设置主电路输入电压为 220V,同时传递电位差给子电路和设备。
  4. 设备状态更新

    • 对如窗帘等受环境(如光照强度)影响的设备进行状态更新。

2. calculateSeriesResistance 方法

功能

  • 递归计算串联电路的总电阻,考虑设备断路和短路的情况。

源码分析

public void calculateSeriesResistance() {
    for (Map.Entry<String, Device> entry : SmCircuit.entrySet()) {
        if (isSeriesOpen()) { // 检查断路
            this.resistance = 0.0;
            return;
        } else {
            Device device = entry.getValue();
            if (device instanceof ExclusiveSwitch) {
                ExclusiveSwitch exclusiveSwitch = (ExclusiveSwitch) device;
                if (exclusiveSwitch.isConnectedToCircuit(name)) {
                    this.resistance += exclusiveSwitch.getResistance(name);
                }
            } else if (device instanceof ControlledDevice) {
                ControlledDevice controlledDevice = (ControlledDevice) device;
                if (controlledDevice.inputPin.equals("1")) {
                    this.resistance += controlledDevice.getResistance();
                }
            } else if (device instanceof SimulationCircuit) {
                if (device instanceof SeriesCircuit) {
                    SeriesCircuit serialCircuit = (SeriesCircuit) device;
                    serialCircuit.calculateSeriesResistance();
                    this.resistance += serialCircuit.getresistance();
                } else if (device instanceof ParallelCircuit) {
                    ParallelCircuit parallelCircuit = (ParallelCircuit) device;
                    parallelCircuit.calculateParallelResistance();
                    this.resistance += parallelCircuit.getresistance();
                }
            }
        }
    }
}

分析

  1. 断路检测

    • 如果电路中任何设备断开(开关未闭合、灯泡断路等),总电阻直接设为 0。
  2. 逐个设备电阻计算

    • 对电路中每个设备,根据其类型(如开关、受控设备、子电路)分别计算电阻,并累加到总电阻。
  3. 递归处理嵌套子电路

    • 对于子电路(串联或并联),递归调用其对应的电阻计算方法,完成多层嵌套电路的处理。

3. calculateParallelResistance 方法

功能

  • 计算并联电路的等效电阻,考虑短路和断路情况。

源码分析

public void calculateParallelResistance() {
    double totalResistance = 0;
    this.isDuanlu = false;

    if (isParallelOpen()) { // 并联电路断路检测
        return;
    }
    for (Map.Entry<String, List<SeriesCircuit>> entry : parallelList.entrySet()) {
        List<SeriesCircuit> subCircuits = entry.getValue();
        for (SeriesCircuit subCircuit : subCircuits) {
            subCircuit.calculateSeriesResistance();
            double subResistance = subCircuit.getresistance();
            if (subCircuit.isDuanlu) { // 如果某支路短路
                this.isDuanlu = true;
            }
            if (subResistance != 0) {
                totalResistance += 1.0 / subResistance; // 并联电阻计算公式
            }
        }
    }

    if (this.isDuanlu) {
        this.resistance = 0.0; // 短路时总电阻为 0
    } else {
        this.resistance = totalResistance == 0 ? 0 : 1.0 / totalResistance;
    }
}

分析

  1. 断路处理

    • 如果并联电路所有支路均断开,则不计算总电阻。
  2. 支路递归计算

    • 对每个支路调用其串联电路的电阻计算方法,获取支路电阻。
  3. 短路处理

    • 如果任一支路短路,则并联电路整体短路,总电阻设为 0。
  4. 等效电阻计算

    • 根据并联电路公式 $ \frac{1}{R} = \sum \frac{1}{R_i} $ 计算总电阻。

4. setInputVoltage 方法

功能

  • 递归设置电路中各设备的输入电压,并传递电压到下游设备。

源码分析

public void setInputVoltage(double inputVoltage) {
    this.inputVoltage = inputVoltage;
    if (!isSeriesOpen() && !isDuanlu) { // 只有在电路未断路或短路时传递电压
        return;
    }

    for (Map.Entry<String, List<String[]>> entry : connections.entrySet()) {
        String key1 = entry.getKey();
        List<String[]> values = entry.getValue();
        for (String[] parts : values) {
            String device1 = parts[0].split("-")[0];
            String device2 = parts[1].split("-")[0];
            Device device = SmCircuit.get(device2);
            device.setInputVoltage(inputVoltage);
        }
    }
}

分析

  1. 递归电压传递

    • 将主电路的输入电压递归分配到子设备和子电路。
  2. 断路/短路跳过

    • 如果电路短路或断路,不再继续传递电压。
  3. 子设备电压更新

    • 对于下游设备或子电路,递归调用其 setInputVoltage 方法完成更新。

5. isSeriesOpenisParallelOpen 方法

功能

  • 检测串联或并联电路是否断路。

源码分析

串联电路

public boolean isSeriesOpen() {
    if (SmCircuit.isEmpty()) {
        this.isDuanlu = true; // 电路为空,标记短路
    }
    for (Map.Entry<String, Device> entry : SmCircuit.entrySet()) {
        Device device = entry.getValue();
        if (device instanceof Switch && !((Switch) device).status) {
            lineOpen = true; // 开关断开
            break;
        }
    }
    return lineOpen;
}

并联电路

public boolean isParallelOpen() {
    for (Map.Entry<String, List<SeriesCircuit>> entry : parallelList.entrySet()) {
        List<SeriesCircuit> subCircuits = entry.getValue();
        for (SeriesCircuit subCircuit : subCircuits) {
            if (!subCircuit.isSeriesOpen()) {
                this.parallelOpen = false; // 只要有一条支路闭合,则并联电路有效
                return false;
            }
        }
    }
    this.parallelOpen = true; // 所有支路均断开
    return true;
}

分析

  1. 串联电路断路检测:

    • 检查是否有开关断开或其他设备状态导致电路不闭合。
  2. 并联电路断路检测:

    • 检查是否所有支路均断开。

总结

  • 核心方法实现了电路模拟的电压、电流分配,以及短路、断路的动态检测。
  • 通过递归调用,支持嵌套的复杂电路模型。
  • 各类设备的状态更新(如灯亮度、风扇转速)与电路行为紧密关联,形成完整的模拟流程。

4. 踩坑心得

  1. 嵌套电路解析

    • 复杂嵌套并联和串联电路容易导致解析错误。
    • 解决:采用递归解析,确保层次清晰。
  2. 短路检测

    • 电路中存在短路情况,可能导致总电阻为0。
    • 解决:在电阻计算过程中实时检查是否存在短路。
  3. 电流限制

    • 需要动态计算设备电流并与限制值比较。
    • 解决:在状态更新时统一检查。
  4. 二极管实现

    • 需要考虑两端电压相等时的特殊状态。
    • 解决:根据接入方向和电压差处理。
  5. 管脚电压显示

    • 精度和格式要求严格(舍去小数部分)。
    • 解决:统一在输出时截尾,避免误差。

总结

这两次题目集的完成让我收获很多,尤其是在面对复杂问题时的分析和解决能力有了很大的提升。刚开始觉得题目有点挑战,但一步步做下来,发现其实关键在于理清思路,把复杂的逻辑拆分成小模块,再逐一解决。比如在电路题目里,开始总想着直接套公式,但后来慢慢意识到,电路的动态特性需要通过抽象建模去处理,状态管理和逻辑设计比单纯的计算更重要。

这次作业让我真正体会到模块化设计的好处。通过将设备的状态和功能分开,不仅让代码更清晰,也方便调试和扩展。尤其是在电阻、电压、电流计算这些环节,学会了用统一的逻辑去处理动态变化,比最开始那种“写完再改”的混乱方式高效多了。同时,我对递归、动态更新这些算法也有了更深的理解,但也发现自己在算法优化和性能分析上还需要继续加强,尤其是在遇到更复杂的场景时,效率问题会变得很明显。

课程方面,老师的讲解内容其实挺扎实,但有些地方如果能配合更多实际案例,比如把一个复杂的电路设计从头到尾剖析清楚,可能会更有帮助。另外,作业如果能提供一些基础测试用例,就能让我们快速验证自己的逻辑对不对,少花点时间在调试最基本的错误上。

总体来说,这次题目集的设计还是非常有价值的,让我对编程和物理模型结合的能力有了很大提升。但在未来的学习中,我觉得还可以多关注一些图结构和复杂系统的模拟,这部分内容对提升解决问题的深度会更有帮助。最后一点建议是,希望课程里能有更多交流机会,比如课下组队或者案例分享,大家一起讨论其实会碰撞出不少新思路。

标签:总结性,计算,电阻,PTA,Blog,电路,并联,电压,设备
From: https://www.cnblogs.com/353882Q/p/18637515/QRTblog

相关文章

  • BLOG-3
    Java题目集7~81.前言本次博客围绕题目集7-8展开讨论,从基础的电路设备行为模拟出发,逐步扩展到复杂的电路连接、异常检测与状态输出,具体包括以下知识点知识点总结控制设备1.开关:两个引脚,状态为0或1,控制电路的通断。可作为基本的电路单元,提供电压传导或切断功能。2.互斥开关:......
  • BLOG-3
    前言在完成题目集7和8的过程中,我们进一步提升了对于物理系统模拟的理解,并掌握了更加复杂的面向对象编程技巧。这两次作业不仅在逻辑深度上更加复杂,还引入了更加丰富的设备类型与电路规则,对代码结构和算法提出了更高的要求。家居强电电路模拟程序-3:主要模拟串联与并联电......
  • BLOG-3
    BLOG-3一、前言  在第7次和第8次的大作业,我们完成了家居强电电路模拟程序3和4。经过前面大作业的多次训练,我积累了了宝贵的实践经验,这不仅巩固了我对Java编程语言核心概念的理解,还进一步加深了我对面相对象设计原则的掌握。在完成这两个大作业的过程中,要求我们特别注重类的设......
  • 第三次Blog 题目集7~8
    一,前言在题目集7和8中,我们逐步完善了智能家居强电电路模拟程序的功能和复杂性。题目集7以基本电路元件的特性和连接为核心,涵盖了开关、调速器、灯、风扇等设备的模拟,实现了多种控制设备和受控设备的电路设计与状态输出;而题目集8在此基础上新增了管脚电压显示、电流限制检测、短路......
  • 第三次BLOG
    一、前言  在家居强电电路模拟程序-1和家居强电电路模拟程序-2的基础之上,最后两次的大作业难度飞升。  家居强电电路模拟程序-3,引入了互斥开关和受控窗帘,这两者都不同于之前的控制设备和受控设备,对于互斥开关,要考虑他的引脚问题和正接反接,而受控窗帘不是仅仅根据电压差来......
  • BLOG-3
    一.前言1.知识点:(1)因为需要使用子类所以应该还是要使用抽象类和接口来让子类通过父类提供的接口来实现它们需要的功能,就像第七次大作业中的设备父类的抽象showStatus函数还有control函数等等,因为不同的设备展现状态的方法不同而且不同的设备对电路的控制效果也不同,所以应该使用......
  • blog-3
    前言在过去的几周内,我们完成了家居强电电路模拟程序-3以及 家居强电电路模拟程序-4的练习,涉及多个知识点和编程技巧。整体来说,这两次题目集共包含了2道题目,题目难度逐步增加。(折叠代码是不在行列计算内的,只是我觉得结合代码能讲的更清楚我的思路,由于上次可能因为这个原因有些同......
  • pta7~8总结blog
    一、前言本次blog是针对发布题目集7和8的总结。1、题目集7,只有一题,电路模拟程序3。输入串联总电路、并联电路、并联电路分支电路信息后,程序要从连接信息中,提取设备信息如设备类型、输入引脚、输出引脚,最后输出控制设备的状态、受控设备的亮度、转速以及窗帘打开比例。与电路模......
  • blog3-题目集7~8
    一、前言:本次的Blog,是电路3和电路4,首先我想说的是在电路2的时候,我并没有拿到满分,直到做到电路3的时候我才发现了电路2缺少的部分,就是嵌套的串联电路,之前是没有考虑在一个T里面还有T的,电路3的一个测试样例这才点醒了我,随后也是修改了电路2的代码,拿到了满分。二、设计与分析:大......
  • JAVA-PTA题目集总结3
    ​1.前言    经过这两次对家具强电电路模拟的迭代,我对JAVA编程语言有了更深入的理解,同时在程序开发设计环节也有了很大的进步,吸收了上次编程练习的教训后,我在本阶段的编程练习中也有针对性的进行了改进。        本次的JAVA练习内容丰富,包括各种数据结构的应用......