两次数字电路模拟程序迭代作业

news/2025/12/17 13:46:10/文章来源:https://www.cnblogs.com/yusnn1/p/19349584

前言:
数字电路模拟程序设计是一个综合性较强的题目,融合了字符串处理、图算法、逻辑运算等多个知识点

  • 第一次题目:核心知识点在于数字电路基础,五种基本逻辑门的真值表和逻辑功能;拓扑排序/图遍历,电路连接形成有向图,需要按信号流向顺序计算;字符串解析,复杂的输入格式解析;多输入门处理,与门和或门支持2个以上输入引脚;信号传播模拟,电平从输入引脚通过元件传播到输出引脚。
    对初学者而言题量和难度应该都是中等偏上。

  • 第二次题目:新增核心知识点 控制引脚概念;高阻态处理,三态门的特殊状态需要特殊标记和处理;多输出元件;编码译码原理;选择器/分配器功能。
    此外还有基础知识点扩展:复杂引脚排序规则;无效状态处理;特殊输出格式,译码器只输出有效引脚编号,数据分配器输出带"-"的字符串。
    题量较第一次多出很多,难度也偏难,迭代设计时代码改动偏大。

一. 数字电路模拟程序-1

  • 题目
    编程实现数字电路模拟程序,电路中包含与门、或门、非门、异或门、同或门五种元件,用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。
    电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。
    引脚信息由“元件名-引脚号”构成。

    • 电路的输入格式:INPUT:英文空格+输入1+”-”+输入信号1+英文空格+输入2+....+输入n+”-”+输入信号n
    • 引脚的连接信息格式:[+输出引脚+英文空格+输入引脚1+。。。。+英文空格+输入引脚+]
    • 约束条件:一个输出引脚可以连接多个输入引脚,即将输出引脚的信号传给每一个输入引脚。但一个输入引脚不能连接多个输出引脚。输出引脚不能短接在一起。
    • 输入结束信息:所有输入以end为结束标志,end之后出现的内容忽略不计。
    • 程序输出:按照与门、或门、非门、异或门、同或门的顺序依次输出所有元件的输出引脚电平。同类元件按编号从小到大的顺序排序。
  • 设计与分析:

    1. 类图设计:如下图
      屏幕截图 2025-11-30 165156
    2. 代码分析:
      image
      image
    3. 基础代码规模:
      代码总行数420行,有效代码240行
      包含8个类/接口,平均每个类有4.13个方法,每个方法平均5.39行代码
    4. 复杂度与嵌套深度:
      最复杂方法:Main.main(),复杂度6,位于第 4 行
      最大嵌套深度:7,嵌套深度7属于较高风险
      平均复杂度1.81、平均嵌套深度1.77:
      整体复杂度偏低,但局部方法(如Main.main())和局部代码块(嵌套深度 7)是优化重点。
    5. 其他指标:
      注释占比7.1%:
      注释比例过低,代码的可读性和维护性会受影响,建议补充关键逻辑的注释。
      分支语句占比22.1%:
      分支语句(if/switch 等)占比适中,逻辑分支不算密集。
  • 问题与改进:

    1. Circuit核心类臃肿
      当前问题:Circuit类承担了组件管理创建、输入处理、连接处理、输出计算、排序等多个职责,后续迭代改动大复杂度高。
      改进方案:提取子模块,将Circuit的功能拆分为多个独立的类 / 接口,比如可以多加一个工厂类,承担组件管理创建。加一个计算类承担输出计算、排序功能等。
      2.注释占比少可读性差
      当前问题:注释占比过低,方法 / 变量命名可能不直观(如Yor类名无法直接理解含义),后续维护者难以快速上手。
      改进方案:通过注释、命名、测试等规范,保证代码的可读性和可维护性

二. 数字电路模拟程序-2

  • 题目
    在数字电路模拟程序-1的设计基础上进行迭代设计,数字电路模拟程序2

    • 包含多输入输出的组合电路元件如数据选择器;
    • 元件引脚类型除输入、输出之外,增加控制引脚,如三态门。
  • 设计与分析:

  1. 类图设计:如下图
    image
  2. 代码分析:
    屏幕截图 2025-12-14 202145
    屏幕截图 2025-12-14 202308
    1). 整体代码规模:显著膨胀
  • 总行数:1178 行(之前是 420 行);

  • 有效代码(Statements):652 行(之前是 240 行);
    类 / 接口数量:12 个(之前是 8 个);

  • 方法总数:74 个(之前是 33 个),平均每个类有 6.17 个方法,每个方法平均 8.59 行代码。
    → 代码量几乎是之前的3 倍,但类和方法的增长比例更高,说明系统功能在快速扩展,但也增加了维护压力。
    2).复杂度与嵌套深度:风险极高

  • 最大复杂度:141(之前是 6),对应方法getInputPinCount().getControlPinCount();

  • 最大嵌套深度:9+(之前是 7),位于第 819 行,且9+深度的代码占了 241 行(近 40% 的有效代码);

  • 平均复杂度:6.72(之前是 1.81),平均嵌套深度:5.81(之前是 1.77)。
    → 无论是局部方法还是整体代码,复杂度和嵌套深度都远超合理范围(行业通用阈值:复杂度≤10、嵌套深度≤3),代码可读性、可维护性已严重下降,后续修改极易引入 Bug。
    3).方法级风险:核心方法过于臃肿

  • 从 “最复杂方法” 列表可看到多个高危方法:
    getInputPinCount().getControlPinCount():
    复杂度 141、代码行数 33、嵌套深度 19、方法调用 6 → 极度臃肿,逻辑高度耦合;
    Multiplexer.setPinValue():
    复杂度 54、代码行数 89、嵌套深度 11、方法调用 53 → 方法体过长,调用链极复杂;
    Main.main():
    复杂度 7、代码行数 21、嵌套深度 4、方法调用 13 → 相比整体风险已不算突出,但仍是入口逻辑的潜在瓶颈。
    4).分支与注释:分支密集,注释不足

  • 分支语句占比:22.2%(与之前接近),但代码量翻倍后,实际分支数量大幅增加,逻辑更复杂;

  • 注释占比:15.4%(之前是 7.1%)→ 虽有提升,但仍低于 20% 的合理阈值,核心复杂方法的注释可能缺失。

  • 采坑心得:因为类的设计没有做出太大改变,迭代设计时代码修改范围极大,基本各个核心方法都改了,采坑心得核心:类设计缺乏抽象接口层和模块化拆分,导致迭代时只能修改核心方法,而非扩展新代码;核心类职责臃肿,违反单一职责原则,牵一发而动全身。

  • 改进建议:
    改进建议核心基于开闭原则抽象接口层,用接口固定通用逻辑,具体实现类承载易变逻辑;拆分核心类职责,用工厂模式、配置驱动隔离变化点,让迭代时的修改范围仅限于新增 / 修改独立模块;建立迭代规范,优先通过 “扩展” 实现需求,而非 “修改” 原有核心代码。

三.总结
通过本次数字电路模拟程序的两次迭代开发,我深刻体会到:

  1. 软件工程基本原则的重要性
    ◦ 单一职责原则:第一次设计时Circuit类过于臃肿,导致第二次迭代时修改范围过大
    ◦ 开闭原则:缺乏抽象接口层,无法做到"对扩展开放,对修改关闭"
    ◦ 依赖倒置原则:高层模块直接依赖低层细节,导致耦合度过高
  2. 复杂度控制的必要性
    ◦ 第一次作业时复杂度尚可接受(平均1.81)
    ◦ 第二次作业复杂度急剧上升(平均6.72),其中最高达141,已严重超出合理范围
    ◦ 认识到代码复杂度不仅影响可读性,更直接影响后续维护成本
  3. 设计模式的实际应用价值
    ◦ 工厂模式:用于创建不同元件对象
    ◦ 策略模式:不同元件的计算逻辑可以抽象为算法策略
    ◦ 观察者模式:信号传播可采用事件驱动方式
  4. 迭代开发的经验教训
    ◦ 第一次设计时应考虑后续扩展性
    ◦ 核心逻辑应抽取到独立模块,避免与具体业务逻辑耦合
    ◦ 通过合理的抽象,将易变部分与稳定部分分离

这次项目让我认识到:

  • 设计优于编码:花在前期设计的时间,能显著减少后期修改的成
  • 简单优于复杂:过度设计会增加理解难度,但缺乏设计会导致维护灾难
  • 抽象是关键能力:能否从具体问题中提取通用模式,是软件工程师的核心能力
  • 重构需要勇气:面对已经"能用"但设计糟糕的代码,要有勇气和决心进行重构

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

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

相关文章

探索Python实现全覆盖路径规划之A*算法

python,全覆盖路径规划算法,Astar算法在路径规划的领域里,全覆盖路径规划算法旨在让机器人或设备能够遍历指定区域的每一个角落,这在诸如扫地机器人、无人机测绘等场景中有着重要应用。而A算法,作为一种经典且高效的启…

Anchor Learning with Potential Cluster Constraints for Multi-view Clustering---基于潜在聚类约束的锚点学习用于多视图聚类

注意:是完备视图创新点:1.对锚点进行约束,高质量的锚点应该从不同的数据簇中均匀生成,而不是分散在簇外2.对A(锚点)的更新不强制要求保证A是正交矩阵更符合簇的分布规律(狭长簇的锚点很难保证正…

-希尔排序

并非希儿排序()其实是分组的插入排序,通过分组让元素实现跳跃式移动,减少逆序对数量。一、算法步骤1. 确定增量序列(Gap Sequence)选择递减的增量序列:gap₁ > gap₂ > ... > gapₖ 1…

数字电路模拟程序的总结与分析

一、前言 数字电路模拟是离散信号处理领域的经典工程实践问题,核心目标是精准复现数字电路中各类元件的逻辑行为,在解析多样化的电路拓扑连接、元件引脚定义、输入信号配置的基础上,遵循 “引脚信号单向传输、元件逻…

第二十七周周报

文章目录 摘要Abstract一.背景分析二、创新点三、实验和结果分析总结 摘要 本周研读的文献《基于 GAN 的中文虚假评论数据集生成方法》针对当前中文虚假评论检测研究中缺乏公开数据集的现状,提出了一种利用生成对抗网络(GAN)构建中文虚假评论…

【超全】基于SSM的校园快递一站式服务系统【包括源码+文档+调试】

💕💕发布人: 码上青云 💕💕各类成品Java毕设 。javaweb,ssm,springboot等项目,欢迎咨询。 💕💕程序开发、技术解答、代码讲解、文档, &#x1f31…

嵌入式周记1

Duration:12月8日(周一)----10月14日(周日) 文章目录Duration:12月8日(周一)----10月14日(周日)总结:例程1、timg_32bit_timer_mode_periodic_sle…

vue基于Spring Boot的军事论坛军迷交流平台_6c496w86

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

Superset,基于web的开源BI工具,github三万star

BI工具是数据分析的得力武器,目前市场上有很多BI软件,众所周知的有Tableau、PowerBI、Qlikview、帆软等,其中大部分是收费软件或者部分功能收费。这些工具一通百通,用好一个就够了,重要的是分析思维。 我一直用的Tabl…

40年匠心传承!维乐ANGEL GLIDE坐垫重塑骑行美学

在骑行装备领域,能历经四十余载沉淀仍焕发活力的品牌,必有其坚守的匠心与创新的底气。维乐(VELO)自1979年由余彩云女士创立以来,便怀揣着为每一位骑者打造完美契合配件的执着,在骑行装备赛道上稳步前行&…

Python安装库太慢?配置好这个速度飞起

为什么pip会很慢? 先来了解下pip,pip是一个非常流行的python包管理工具,在命令行中只需要输入pip install package_name,就可以自动安装第三方库。然而pip是从pypi中下载库文件的,pypi是python官方第三方库的仓库&…

vue基于Spring Boot的减肥健身养生人士饮食营养管理系统_5gn4225x

目录 具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring…

基于LabVIEW的转子故障诊断系统:振动信号里的秘密探寻

labview程序设计,基于振动信号的转子不对中,不平衡故障诊断系统设计。 转子不平衡分类:质量不平衡。 转子不对中分类:平行不对中,角度不对中。 信号分析:时域分析,频域分析。 时域分析:无量纲参数分析,有量纲参数分析。…

转子动力学:临界转速计算、Workbench建模、模态振型与坎贝尔图

转子动力学之临界转速计算 workbench 建模 模态振型 坎贝尔图在工厂里那台嗡嗡作响的鼓风机又双叒叕出问题了,轴承温度异常升高时老师傅叼着烟说了句:"这转子怕是遇上临界转速了"。要搞懂这个玄学问题,Workbench里藏着不少实用…

转差频率控制的矢量控制系统Matlab/simulink仿真探索

转差频率控制的矢量控制系统Matlab/simulink仿真搭建模型: 提供以下帮助 波形纪录 参考文献 仿真文件 原理解释 电机参数说明 仿真原理结构和整体框图在电力传动领域,转差频率控制的矢量控制系统有着举足轻重的地位。今天咱们就来唠唠如何在Matlab/simul…

交互噪声(Interaction Noise):推荐系统中被忽视却关键的问题

在推荐系统中,模型学习的核心依据是用户–物品交互数据。然而,这些交互并不总能真实反映用户的内在偏好,其中夹杂的大量干扰信号被称为 交互噪声(Interaction Noise)。如果不加处理,交互噪声会显著降低推荐…

高效的5个pandas函数,你都用过吗?

之前为大家介绍过10个高效的pandas函数,颇受欢迎,里面的每一个函数都能帮我们在数据分析过程中节省时间。pandas还有很多让人舒适的用法,这次再为大家介绍5个pandas函数,作为这个系列的第二篇。1. explodeexplode用于将一行数据展…

信号去噪算法:VMD、优化VMD、WD及多模型混合的Matlab实践

基于变分模态分解算法(VMD)、优化VMD算法、小波阈值去噪(WD)以及多模型混合的信号去噪算法 Matlab语言实现,代码质量极高,方便学习和替换数据。 在信号处理领域,去噪是一项至关重要的任务,它能让我们从嘈杂的数据中提取出真正有用…

每天五分钟:leetcode动态规划-递归与递推_day2

0)先记住一句话(贯穿两种写法)到第 n 阶的方法数:最后一步要么走 1 阶:从 n-1 来要么走 2 阶:从 n-2 来所以永远是:f(n) f(n-1) f(n-2)1)递归版本(从“大问题”往下问“…

基于Java的安全生产考试座位签到智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ?安全生产考试座位签到智慧管理系统主要功能模块包括会员管理、机构管理、考试安排管理、座位管理和理论签到管理。该系统采用SpringMVC开发框架,MySQL数据库,并结合JavaScript和ECharts.js实现数据可视化。普通员工负…