当前位置: 首页 > news >正文

数字电路模拟blog

数字电路模拟blog

前言

知识点:

本次设计有关与SOLID设计,要求设计要符合SOLID原则。本次OOP作业是非常强的逻辑问题,要求把逻辑逻辑电路中电门,输入引脚,输出引脚全部用代码抽象建模出来,个人认为需要通过一个类似工厂的类,来表示电门之间的信号传递,因为本次的输入具有严谨性,所有还需要不同的拆解类,将输入信息拆解成有效的数值然后储存在对应的类中,所有本次OOP的迭代作业需要本人具有强逻辑性,以及将题目中的抽象表达精确提取出来,并通过抽象思维用类建模出来,难点就在与如何化抽象逻辑为代码。

题量:

第一次作业要求将逻辑电路的五大逻辑电门表示出来,并且通过连接信息得出最后的电门输出引脚,在初步构思方面,由于本人没有对于逻辑电门的了解,所有开始大部分时间都在了解逻辑电门之间的关系以及对应计算方法,第一次逻辑已经开始上强度了,代码量也偏多。主要是时间都花在理解逻辑,和如何建模传播信号。

第二次作业相当于在第一次五大电门的基础上又增加了四种特殊的电门,其中三太门的逻辑比较好写,后面的三种模拟器由于计算方法和二进制有关所以写起来也比较快,第二次整体还是在第一次的基础上加上了四个子类,所有延续第一次设计电门子类的思想还是比较好写,在逻辑性方面,后面的三种模拟器方面可能逻辑性偏强一点,需要多花点时间。

第三次作业是延续第一次作业迭代,在第一次基础上加上了子电路和连接信息检查,所以不用增加电门的子类,连接信息检查有5种错误,可能因为名字关系一开始设计成了逻辑系统的子类,后面二者其实强关联关系其实更适合,所有多耗费了点时间,在检查错误的检查类中的逻辑性其实感觉要强于子电路,因为要对连接信息拆解和排查错误,还要解决优先级问题。

总结:这三次题目个人认为都是考察学生的抽象思维和逻辑思维,这二者在题目中体现的难度非常高,还要使代码符合SOLID原则,继承和接口使用较多,要求对逻辑电路要求抽象建模出来,还要清楚电路之中的引脚输入输出关系,难度从易到难,是本人有史以来写过最难的题目,代码量庞大,需要花费大量的精力和脑力思考如何表示。

设计与分析

第一次作业:

代码分析结果如下:

屏幕截图 2026-06-14 174730

解释:

1.由于实在太难写的时候完全没考虑代码注释,所有代码注释率偏低。

2.方法拆分很细,单个方法平均只有1-2个行,逻辑清晰

3.整体复杂度不高,大部分方法都很简单。

类图如下:

第四次类图

心得与设计:要具备强大的逻辑思维能力和抽象建模能力,一开始设计一个抽象的父类同意五大电门的同一属性和统一方法,由于计算方法不同,所以需要重写计算方法,对于电路信息传播的建模,我的思路是用一个连接类储存所有的连接信息,由于第一个是输出引脚,所以作为源单独储存,后面全部都用原件名用列表储存。对于连接系统设计的有储存INPUT的哈希表,还有连接信息类的列表用于根据连接信息传播信号,在增加连接信息的同时根据连接信息创建电门,对于核心的计算方法,首先外循环用连接类的列表,根据连接类中的源获得输出引脚,其中的获得输出引脚有两种拆解方法。内循环用后续原件名的列表在电门哈希表中创建电门,将对应的编号和输出引脚存入,直到输入引脚达到数量在进行计算,最后输出。

输入和输出要求:

程序输入

1)元件信息:

用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。

电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。

例如:A(8)1表示一个8输入引脚的与门,O(4)2代表一个4输入引脚的或门。

电路中的每个非门、异或门、同或门用“标识符+编号”作为其元件名。

例如:X8表示一个异或门,Y4代表一个同或门,N1代表一个非门。

约束条件:

不同元件的编号可以相同,如X4、Y4。

同一电路中同种元件的编号不可重复,可以不连续

2)引脚信息:

引脚信息由“元件名-引脚号”构成,。

例如:A(8)1-2代表与门A(8)1的2号引脚。

3)电路的输入信息:

电路的输入格式:

INPUT:英文空格+输入1+”-”+输入信号1+英文空格+输入2+....+输入n+”-”+输入信号n

例如:

“INPUT: A-0 B-1 C-0”代表整个电路包括3个输入:A、B、C 分别输入0,1,0信号。

4)连接信息

引脚的连接信息格式:

[+输出引脚+英文空格+输入引脚1+。。。。+英文空格+输入引脚+]

例如:

[A A(8)1-1 A(8)1-3 X5-2]

代表信号从引脚A发送给与门A(8)1的1、3两个引脚,以及异或门X5的2号引脚。

[Y8-0 N1-1 O(4)2-3 Y2-1]

代表信号从引脚Y8-0发送给非门N1的1号引脚、或门O(4)2的3号引脚、同或门Y2的1号引脚。

约束条件:

一个输出引脚可以连接多个输入引脚,即将输出引脚的信号传给每一个输入引脚。但一个输入引脚不能连接多个输出引脚。

输出引脚不能短接在一起。

5)输入结束信息

所有输入以end为结束标志,end之后出现的内容忽略不计

3、程序输出

按照与门、或门、非门、异或门、同或门的顺序依次输出所有元件的输出引脚电平。同类元件按编号从小到大的顺序排序。

如果某个元件的引脚没有接有效输入,元件输出无法计算,程序输出结果忽略该元件

4、测试输入默认满足以下条件:

1)每个元件的输入引脚连续编号。假设元件有n个输入引脚,则其编号取值范围为[1,n],且引脚号不重复。

2)本题涉及的五种元件都只有一个输出引脚,输出引脚号默认为0。

 

踩坑及解决过程:

屏幕截图 2026-06-14 225555

开始时,出现多层联级电路非零返回,本人想过时连接信息中出现多个输出引脚,但是不对,也想过时迭代次数不够,想过加循环次数盖过但都不是,最终锁定INPUT的位置可能不是第一行,但我这里思路出现误区,以为INPUT的信息都是无用信息,但是其实不是,答案其实是INPUT之上连接信息也要算进去。所以在循环中加入if/else循环。

总结:

题目开始初步锻炼我们的逻辑思维能力,以及对抽象事务的建模能力,在测试时不应该在同一个死胡同卡太久,调试是核心能力,报错和测试失败是成长的契机,学会排查,总结,才能不断提高代码水平。

第二次作业

对代码分析如下:

屏幕截图 2026-06-15 161047

解释:

这次新增了注释,由于迭代只需要新增加四个电门子类,所有代码除了输出由于每个原件的输出方式都不一样,所有switch语句有较多的分支,方法颗粒度细,方法复用性强,代码嵌套深度极低,没有复杂多层判断,圈复杂度整体健康。对比上一次有了较好的提示。

类图如下:

屏幕截图 2026-06-15 162230

屏幕截图 2026-06-15 162307

心得:由于这次作业只需要增加四个电门子类,只需要重写对应的计算方法,和新增创建的方法就可以,所有对第一次设计的原始结构比较满意,很好的顺应了第二次的迭代需求,但随着门的增多,边界值的判断也变得越来越多,一不小心就会漏几个边界值判断。

设计过程:

本次迭代就是新增四个逻辑电门子类,主要是理解四个电门的各自的计算逻辑,三态门主要是设计控制引脚和输入引脚的关系,和无效引脚的判断,数据选择器是通过得到的控制引脚,通过二进制转换输出对应位置的引脚输出,分配器则是通过已知的输入引脚,再根据判断引脚的二进制转换就可锁定输出引脚,译码器于数据选择器是类似的逻辑。其次在根据头字符创建的switch语句中增加四个原件就行,其中加入列表要进行多次空判断。

踩坑过程及其解决过程:

屏幕截图 2026-06-15 165500

这次的问题在于对于Z元件的输出边界判断问题,题目只要求其中一个有效值,本人一开始认为输出中会有无效值输入,所以对于元件边界判断过于严格,导致频繁出错。解决方法,重写Z元件的有效值判断,只需要判断Z元件的控制引脚和唯一输出引脚是否有效即可。

第三次作业

代码分析如下:

屏幕截图 2026-06-17 222550

解释:

1.复杂度单点失衡:ErrorChecker里checkMain、checkCircuit两个校验方法嵌套太深、if 分支过多,是全项目维护痛点;

2.局部代码嵌套过多

3.16个类,分工明确,没有违背之前的设计原则,整体架构分层清晰。

 

类图如下:

屏幕截图 2026-06-18 003046

屏幕截图 2026-06-18 003111

设计过程

这里解释没有用题目提示的设计提示,是因为,虽然设计提示和我的想法相似,但是需要大改抽象父类,所以还是选择设计子电路和主系统强关联关系。首先应为是子电路,所以联系到和系统一样负责链接和计算信号传递,以及赋值,另外子电路的拆解方法不一样,所以要新的拆解类,其中propagate()是子电路信号的计算方法,与主电路系统计算方法相似,对外提供setInput(),设置端口电平、getOutput()读取端口电平,其次在设计差错类,因为只需要返回一个出错,所有可以按照优先级按顺序写if语句代表优先级,其次在用判断是否为源,判断源的数量,源的类型,以及是否为目标节点,目标节点个数,通过这些方法来判断拆解的连接信息。在主类中通过end读取所有行信息,子电路进入子电路列表并且初始化,先查错再计算。

踩坑过程及其解决过程:

屏幕截图 2026-06-18 004227

屏幕截图 2026-06-18 004235

这次踩的坑有的大,首先在异常检查方面,由于再看题目测试样例中,只需要检查主电路,但其实是要子电路和主电路都要检查。在几个非零返回方面,由于我没有考虑子电路与子电路之间相互传播的关系,所以在源的拆解方面会出问题,导致非零返回,解决方法则是增加子电路之间的访问权限,所有子电路互相持有引用,支持跨子电路端口访问。但在写的方面,某些正则表达式写的太过严格导致出错,source 创建门元件时增加 !src.matches("C\\d+-.*") 条件,防止把 C1-B 这类子电路输出端口错误地当作门元件名去创建。

总结:

对于这次PTA作业,掌握了更加高级的正则表达式,也更加熟练的运用抽象思维建模,但这题难度确实有点大,基本要么每天花3-4个小时修改,要么查错。

改进建议

(1)通过这三次迭代作业让我逐渐认识到了接口和继承的用法,以及逻辑思维和抽象思维对于编码的重要性。

(2)在迭代思维方面,懂得了好的基础框架才能适合未来的迭代,对于这方面还有所欠缺,需要加强自己逻辑框架的构建能力和思维能力;

(3)在测试方面,提前练习边界值测试,平时练习主动测试零数据,最大值,最小值,非法数据等特殊情况,提升程序健壮性。

总结

1.在本次迭代作业中,我学到了对于特定字符的拆解方法,如IndexOf,split,正则表达式,以及对继承和接口更加熟练,理解到了好的代码底层和框架对于后续迭代的重要性,开始关注代码间的复合性,可维护性。也掌握了对于抽象信息的抽象建模编程。

2.类之间的工厂模式,或者说是一个系统管理。对相应的类做该做的事,对应的类应该起单独作用,有的起统筹作用。

对题目的改进建议:

题目有时候还是太难了,经常熬夜写到一两点,以及题目的提示希望给清楚点。

 

http://www.jsqmd.com/news/1033038/

相关文章:

  • 零碳供电所照明控制系统技术解析:标准要求与产品落地
  • 传奇 3 光通版手游官网下载:传奇 3 光通版全网唯一最新官方下载渠道
  • 电商人效率革命:对话式AI工作台PixPix操作指南(附教程)
  • 电脑自动化 AI OpenClaw 2.7.9 零基础部署分步教学(含安装包)
  • RTOS的灵魂——任务的“优先级反转与抢占”!实战讲解物联网任务调度的顶层设计思想
  • 2026年近期上海餐饮业如何选择好的牛油火锅红油定制厂家 - 品牌鉴赏官2026
  • 学生党AI学习指南:GPT、Gemini、WPS AI三工具协同实战
  • 2026豆包AI视频课:零基础+配套素材+实操闭环
  • 专访星艺装饰佛山业务负责人李泽鲲:七大维度筑牢环保家装底线,直营体系守护佛山人居健康 - Guangdong1
  • FIFA 23 Live Editor终极指南:免费开源修改器深度解析与使用教程
  • 基于C++ 实现(界面)教室管理系统
  • 2026年6月优秀的西安加固优质公司推荐几家:以恒大加固为例剖析选择逻辑 - 品牌鉴赏官2026
  • 【无人机控制】基于matlab LQR和PSO的无人机舰队分散控制系统设计【含Matlab源码 15634期】含报告
  • Kali渗透测试实战:远程操控安卓设备实现信息取证与监控
  • 2026年天津离婚律师推荐 赵毓丽8年婚姻家事实战经验 - 本地品牌推荐
  • imx6ull: 基于Buildroot定制化构建,集成FFmpeg与Nginx-RTMP的嵌入式流媒体服务器实践
  • 终极指南:在Windows上完美运行Android应用,WSABuilds让你的电脑变身双系统平台
  • 构建之法阅读笔记 11
  • 5分钟快速上手Gopeed:一款全平台多协议下载器的终极选择
  • 2026年更新:探寻南海地区信誉与实力兼备的阳台封窗厂家可靠之选 - 品牌鉴赏官2026
  • Gemini 3.1 Pro+DeepSider:新人零门槛AI工作流实战指南
  • ZigBee HA设备结构体:智能家居设备开发的核心数据模型
  • LLM 应用 Evals 评测体系实战指南(2026):从零建立自动化质量评测
  • 5步快速上手OpenWrt路由器固件:R5S设备完整安装与优化指南
  • 【AI测试智能体】拒绝玄学调参!我用 30 次真实 LLM 调用,拆解了 Agent 性能崩盘的 3 个维度
  • WarcraftHelper终极指南:让魔兽争霸3焕发新生的免费开源神器
  • 2026年湖北人造草坪平台如何选择:聚焦全链条服务与硬核实力的专业之选 - 品牌鉴赏官2026
  • FIFA 23 Live Editor终极指南:免费开源修改器的完整使用教程
  • 洞察2026年当前佛山专业的澳标铝合金门窗企业选择标准:聚焦合规与美学双轮驱动 - 品牌鉴赏官2026
  • 国内大模型合规应用实战:RAG与本地化部署技术指南