Blog-3 题目集7~8的总结

news/2024/12/28 21:45:03/文章来源:https://www.cnblogs.com/bolg-666-cc/p/18637948

22207203-陈思思
一、前言
(一)第7次题目集(家居强电电路模拟程序-3)

  1. 知识点:
  • 串联电路:电流相同,电压分配。
  • 并联电路:电压相同,电流分配。
  • 类的设计:电路设备类、受控设备类、控制设备类、串联电路类、并联电路类。
  • 数据结构:使用列表或字典存储电路信息、设备状态。
  • 算法:递归或迭代计算电压、电流和设备状态。
  • 输入输出:读取并解析输入信息,按指定格式输出设备状态。
  1. 题量:
  • 输入信息涉及多个串联和并联电路,每条信息可能包含多个设备。
  • 设备种类较多,包括开关、调速器、灯、风扇、窗帘等。
  • 每种设备都有不同的工作原理和状态展示方式。
  1. 难度中等:
  • 需要理解电路基本原理,并正确模拟不同设备的行为。
  • 需要设计合理的类结构和算法,以处理复杂的电路连接关系。
  • 根据输入信息动态调整设备状态,并输出结果,要求有一定的逻辑处理能力。
  1. 挑战点:
  • 互斥开关的状态管理和电流分配。
  • 调速器的档位控制和计算其输出电压。
  • 窗帘的开启比例计算依赖于电路中所有灯的亮度总和。
  • 多条串联电路的并联关系处理,确保电压和电流分配正确。
  • 输入信息的解析和电路结构的构建,需要细致的编码和调试。

(二) 第8次题目集(家居强电电路模拟程序-4)

  1. 知识点:
  • 面向对象编程:需要设计多个类来表示不同的设备(如开关、调速器、灯、风扇、窗帘和二极管)及其公共特征。
  • 电路模拟:理解基本电路原理,如串联和并联电路的工作方式、电压分配和电流计算。
  • 状态管理:每个设备有不同的状态和参数,需要管理这些状态的变化。
  • 输入解析:从输入文本中解析出设备信息、连接信息以及控制命令。
  • 异常处理:包括电流限制和短路检测。
  • 电压计算:根据输入电压和各设备的特性计算各引脚的电压。
  • 数据结构:使用合适的数据结构(如字典、列表)来存储设备信息和电路连接关系。
  1. 题量:
  • 输入信息中包括设备信息、连接信息、控制信息等多个方面,需要解析和处理这些信息。
  • 输出信息要求详细记录各个设备的状态和参数,以及每个引脚的电压。
  • 示例提供了不同类型的电路配置,从简单的到复杂的,可以用于测试程序的鲁棒性。
  1. 难度高:
  • 难度高:题目虽然涉及电路模拟,但没有涉及复杂的物理模型或电路特性,非常适合用于学习和练习面向对象设计。
  • 逻辑复杂度:需要设计复杂的逻辑来处理电路中的串联和并联关系,以及设备之间的相互影响。
  • 异常检测:需要实现电流限制和短路检测,增加了程序的复杂性。
  • 细节处理:题目对输出格式要求很详细,需要仔细处理每个设备的状态和参数的输出。

二、 设计与分析

(一) 第7次题目集

  1. 类图
    家居强电电路模拟程序-2的基础上增加了受控类和控制类,分担基类的功能,增添了控制设备互斥开关类和受控设备窗帘类。

    Electric类:作为所有设备的基类,定义了设备的基本属性和方法。
    Switch、ME_Switch、FenDangSwitch、LianXuSwitch、Lump、Riguang、Diaoshan、LuodiFan、DayLight类:继承自Electric类,实现了具体设备的功能。
    Bi和Chuan类:用于实现串联电路与并联电路。
    Complain类:负责根据输入信息创建相应的电路设备。
    Main类:程序的入口,负责整个流程的控制,包括读取输入、解析输入、计算电压、更新电压和输出结果。

  2. SourceMonitor报表分析

    复杂度:AnswerSheet.gradeAnswers() 方法的复杂度最高,为19,这表明该方法可能需要进一步优化以提高可维护性。
    注释:只有7.7%的代码行包含注释,建议增加注释以提高代码的可读性和可维护性。
    分支语句:13.2%的语句是分支语句,这表明代码中存在一定的逻辑分支,但整体上处于合理范围内。
    方法调用:共有255个方法调用语句,表明代码具有较好的模块化和重用性。

(二) 第8次题目集

  1. 类图
    在家居强电电路模拟程序-3的基础上增加了电子设备二极管

  2. SourceMonitor报表分析

    基瓦特图 (Kiviat Graph):显示了不同指标的分布情况,包括平均复杂度、平均深度、最大深度等。
    块直方图 (Block Histogram):显示了代码块的分布情况,有助于理解代码结构。
    复杂度:Calculate_shuV.calculate_shuV() 方法的复杂度最高,为28,这表明该方法可能需要进一步优化以提高可维护性。
    注释:只有5.6%的代码行包含注释,建议增加注释以提高代码的可读性和可维护性。
    分支语句:27.8%的语句是分支语句,这表明代码中存在较多的逻辑分支,但整体上处于合理范围内。
    方法调用:共有340个方法调用语句,表明代码具有较好的模块化和重用性。

三、 踩坑心得
(一) 第7次题目集

  1. 受控开关的实现
    题目要求互斥开关有3个引脚,并且只有两种状态:接通2号引脚或接通3号引脚。初始状态为接通2号引脚。
    解决方法:需要为互斥开关创建一个新的类ME_Switch,并实现其状态切换和电压计算逻辑。
    定义3个属性及状态的切换:
public int state = 0; // 0: 接通2号引脚, 1: 接通3号引脚
public int resistance12 = 5; // 1、2引脚之间的电阻
public int resistance13 = 10; // 1、3引脚之间的电阻
public void regulate(String vs) {if (vs.equals("+")) {state = 1 - state; // 切换状态}}
//计算电压
public void reshuV(double shuop) {if (state == 0) {shuV = shuop * resistance12 / (resistance12 + resistance13); // 计算电压} else {shuV = shuop * resistance13 / (resistance12 + resistance13);}}
  1. 窗帘的实现
    (二) 第8次题目集
  2. 题目要求二极管有正向导通和反向截止两种状态。
    解决方法:需要为二极管创建一个新的类Diode,并实现其导通和截止逻辑。
    定义一个属性来判断二极管的导通还是截止:
public boolean conduction = true; // true: 导通, false: 截止
//计算二极管的电压并判断
public void reshuV(double shuop, double shuop2) {if (shuop == shuop2) {conduction = (shuop != 0); // 两端电压相等时,如果电压不为0,则导通} else {conduction = true; // 两端电压不相等时,导通}if (conduction) {shuV = shuop;} else {shuV = 0;}}
  1. 短路检测
    短路检测
    总电阻计算:遍历电路中的所有设备,累加每个设备的电阻值。
    短路判断:如果总电阻为0,则电路发生短路,返回true;否则返回false。
    应用场景:在计算电压之前调用此方法,如果检测到短路,则输出错误信息并终止程序。
    public static boolean isShortCircuit(Map<String, Electric> circuit) {double totalResistance = 0;for (Electric dev : circuit.values()) {totalResistance += dev.resistance;}return totalResistance == 0;}

四、 改进建议
在题目集7中,有很多异常处理,我是用的是在相应的类中自行处理,之后可以引入自定义异常类来处理不同类型的错误。例如:InputFormatException:处理输入格式错误的情况。QuestionNotFoundException:处理试卷中引用了不存在题号的情况。StudentNotFoundException:处理学生信息中不存在的学号。在处理题型的整理时,有些逻辑是重复的。之后改进可以将重复的逻辑提取成辅助方法或函数。例如,处理输入的逻辑可以整合到一个方法中,通过参数区分不同的处理方式,减少代码的冗余。当前支持的题型是选择题、填空题、多选题,可以考虑实现其他题型,如:简答题、排序题等。
题目集7和8中,一些类(如 Electric 类)包含多个职能,可能会造成类的职责不明确,之后会考虑改进将设备的每个功能(如状态管理、电压调整)进一步抽象为小的类。可以创建接口或抽象类,以提供设备状态和行为的一致框架。当前题目只支持开关、调速器、灯具和风扇。如果需要增加新设备,需大幅修改现有代码。之后会使用工厂模式来创建电器对象,以便能够轻松添加新的电器类型而不需更改现有代码结构。
五、总结
在本次实验中,我们完成了两个题目集的任务,分别是家居强电电路模拟程序-3和家居强电电路模拟程序-4。这些任务涵盖了类与对象、继承与多态、集合、正则表达式、业务逻辑处理和设计模式的应用。
首先,在答题判题程序中,我们定义了多个类来封装不同类型的题目,如单选题、多选题和填空题。通过使用Map、Set和List等集合类,实现了对题目、考试卷和学生信息的高效管理。策略模式和命令模式的应用使评分逻辑和输入处理更加灵活。不过,代码中存在一些复杂方法和较低的注释覆盖率,需要增加注释并优化这些方法。
其次,在家居强电电路模拟程序7中,我们在原有基础上增加了混合电路,使系统的逻辑更加复杂。我们设计了一个基类Electric和多个子类,如开关、分档、连续、白炽灯、日光灯和吊扇。通过继承关系,复用了基类的代码,避免了重复。输入处理方面,通过正则表达式和字符串解析技术,成功处理了多种格式的输入,并实现了设备的连接和状态管理。尽管如此,主函数的复杂度较高,需要进行功能拆分,降低复杂度。
最后,在家居强电电路模拟程序8中,通过引入不同的前缀字符和标签化的方式,区分了串联和并联电路,简化了电路管理。尽管如此,代码中仍存在重复的逻辑和复杂的控制结构,计划引入工厂模式来创建电器对象,并进一步抽象设备功能。
在整个实验过程中,我深刻体会到设计模式的重要性。合理运用设计模式可以提高代码的灵活性和可扩展性,降低系统复杂度。此外,异常处理也不可忽视。在答题判题程序中,通过自定义异常类处理各种错误情况,提高了系统的健壮性和错误处理的清晰度。
总之,通过这次实验,我在面向对象编程和设计模式方面有了更深的理解和实践。未来,我将继续优化代码结构,提高代码的可读性和可维护性,争取在实际项目中应用所学知识,解决更复杂的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860567.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

已有docker镜像构建过程分析

转载请注明出处: 1.使用docker history进行分析  docker history 命令用于查看指定镜像的历史层信息,它显示了镜像创建过程中的每一层,包括创建时间、创建者、大小和注释等信息。 查看镜像历史docker history myimage:latest使用示例:root@controller1:~# docker images …

Linux操作文件IO

Linux操作文件IO参考自:【北京迅为】嵌入式linux开发指南_v1.1(i.MX6ULL)文件 IO 是 Linux 系统提供的接口,针对文件和磁盘进行操作,不带缓存机制; 标准 IO 是 C 语言函数库里的标准 I/O 模型,在 stdio.h 中定义,通过缓冲区操作文件,带缓存机制。Linux 系统中一切皆文…

K230学习记录

K230学习记录 参考自: # 立创庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源 # 开发板官网:www.lckfb.com # 技术支持常驻论坛,任何技术问题欢迎随时交流学习 # 立创论坛:www.jlc-bbs.com/lckfb串口0(115200),连接进入打印U-Boot信息ctrl+R可以快速重装…

windows与虚拟机linux通过ssh进行连接并上传文件

windows与虚拟机linux通过ssh进行连接并上传文件 windows配置 以管理员打开powershell下载和启动安装ssh客服端 Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 Start-Service sshd Set-Servi…

[Java/网络/HTTP(S)] 基于`Http(s)URLConnection`的网络请求工具(HttpRequestUtils)

1 序轻量级HTTP网络请求工具,接续:[Java SE/JDK/网络] 核心源码精讲:java.net.HttpURLConnection - 博客园/千千寰宇 [身份认证/JWT] 身份认证方案与HTTP请求中Authorization Header - 博客园/千千寰宇 【推荐】 [网络/HTTPS/Java] PKI公钥基础设施体系:数字证书(X.509)、C…

2024/12/17 【字符串】LeetCode 459.重复的子字符串 【❌】

https://programmercarl.com/0459.%E9%87%8D%E5%A4%8D%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html#%E6%80%9D%E8%B7%AF https://leetcode.cn/problems/repeated-substring-pattern/ 子串结束位置大于中间位置的话,一定不能重复组成字符串。 如果 next[len - 1] != -1…

一起鸿蒙吧,现在到了「绝佳时刻」

摘要:它已经不止于可用和好用,而是迈向“必用”的新阶段了。 10月22日,原生鸿蒙操作系统如约而至。 作为一个全新的操作系统,原生鸿蒙拥有流畅、安全、智能、互联、精致五大原生特性,为无数用户开启了一个全新的数字生活方式。 如果你正在犹豫是否要升级原生鸿蒙系统,那么…

题目集7~8总结性博客

前言 在本学期的学习过程中,我们共完成了三次题目集的练习,其中第七题和第八题集在知识点、题量和难度上具有一定的代表性。总体而言,这两次题目集涵盖了面向对象编程(OOP)、设计模式、数据结构与算法、软件工程等多个核心知识点。 知识点总结: 面向对象编程(OOP): 类…

Python 中使用 Matplotlib 进行多图绘制

Python 中使用 Matplotlib 进行多图绘制 Matplotlib 是 Python 中非常强大的数据可视化工具,它可以用来生成简单到复杂的各种图形。无论是处理单张图表还是多图并列展示,Matplotlib 都能提供高效的支持。在本篇文章中,我们将介绍如何使用 Matplotlib 绘制多图,以便在同一画…

fping 的使用方法

fping简介 fping是一个小型命令行工具,用于向网络主机发送ICMP回应请求,类似于ping,但在ping多个主机时性能要高得多。 fping完全不同于ping,因为可以在命令行上定义任意数量的主机,或者指定包含要ping的IP地址或主机列表的文件。 与ping要等待某一主机连接超时或发回反馈…

.NET Bioss相关数据读写

本文我们介绍针对Bios如何读取、写入数据,比如最常见的SN读取以及烧录 WMI查询 先看看WMI方式,可以用于查询和管理Windows系统的各种信息,包括读取BIOS信息 WMI-Win32_BIOS,可以查看Bios版本、制造商以及Bios Sn等:1 var searcher = new ManagementObjectSear…