作业集4~6的总结

NCHUD数字电路模拟程序迭代作业三次实训博客合集

数字电路模拟程序1(基础门电路)实训总结

一、作业前言

本次为系列迭代作业第一阶段,题号7-1 NCHUD-数字电路模拟程序-1,作业定位较难,满分100分,为本系列基础奠基作业。本次作业仅包含5种基础逻辑门:与门A、或门O、非门N、异或门X、同或门Y;核心知识点聚焦自定义引脚解析、门电路逻辑运算、电路拓扑信号传递、元件正则解析、信号单向流转规则;整份作业共10组测试样例,覆盖正常输入、元件输入缺失、多引脚连接三大场景;无异常校验、无子电路、无复合型器件,业务逻辑纯粹,核心考察面向对象封装、字符串正则解析、图结构信号传递基础能力。

作业迭代定位:搭建数字电路最底层运算框架,统一引脚、门、信号三大核心实体结构,为后续复合型器件、子电路、异常校验迭代预留扩展接口。

二、设计与源码分析

2.1 整体架构设计(PowerDesigner类图)

本次作业采用**分层实体类设计,无抽象父类,采用普通实体耦合设计,适配初期快速开发,类结构如下:

  1. Pin引脚类:核心属性:完整引脚名fullName、电平值value、是否赋值标识hasValue;负责存储全局所有引脚状态,包含自定义构造方法切割元件名+引脚号。

  2. Gate门基类:属性:元件类型type、全名name、输入引脚数量numInputs、元件编号id、输入引脚集合inputs、输出引脚output;统一封装所有门的共有属性。

  3. Main主控类:维护三大全局容器:Gate集合、Pin全局引脚池、连接关系集合;负责输入解析、正则匹配、信号拓扑传递、门逻辑计算、排序输出。

类图核心关系:Gate聚合Pin,一个门绑定多个输入Pin、一个固定输出Pin(输出引脚固定为0号);全局Pin池实现引脚单例管理,避免重复创建引脚对象。
2.2 SourceMonitor代码指标分析

本次最终AC源码统计:总代码行数426行,注释行数48行,空白行62行,有效业务代码316行;平均圈复杂度3.2,高复杂度集中在门类型正则解析方法、信号递归流转方法;方法总数11个,其中工具方法5个、业务计算方法5个、main入口1个。

2.3 核心源码逻辑分析

2.3.1 元件正则解析核心

区分两类元件命名规则:①带输入引脚数:A(n)x、O(n)x;②无引脚数:Nx、Xx、Yx;编写两组正则表达式拆分标识符、引脚数量、元件编号,存入Gate对象,同种元件编号唯一性在校验层做判定。

2.3.2 五大门运算逻辑

  • 与门:全部输入为1,输出1,否则0;存在任意输入未赋值,放弃输出

  • 或门:任意输入为1,输出1,否则0;输入缺失舍弃元件

  • 非门:单输入取反;异或:双输入不等为1;同或:双输入相等为1

2.3.3 信号流转规则

遵循单向流转:连接式[输出端 输入端1 输入端2...],输出引脚电平同步赋值给所有输入引脚;限制:单个输入引脚仅绑定一个输出源,作业测试用例保证合规,无需异常拦截。

2.4 设计心得

初期采用硬编码判断门类型,后期优化为正则匹配,大幅降低新增元件修改成本;全局单例Pin池是本次最优设计,解决了引脚重复实例化、电平状态不同步的核心bug;输出排序规则提前定义枚举顺序:A>O>N>X>Y,同类元件按编号升序排序,直接适配题目输出要求。

三、采坑心得(量化+结构+测试佐证)

3.1 高频BUG及数据统计

本次作业提交12次,AC通过率25%,核心踩坑4类,附带测试用例佐证:

  1. 引脚切割BUG(提交失败4次):直接使用split("-")切割引脚,遇到A(2)1-1这类带括号元件名,切割下标错乱;修复:从后往前查找最后一个短横线分割引脚号,而非固定下标分割,测试样例1修复后引脚绑定正常。

  2. 门输入缺失判定遗漏(提交失败3次):异或、同或仅判定引脚对象非空,未判定hasValue状态,导致缺引脚输入的X2元件输出乱码;对标样例6优化:所有门运算前置全输入有效性校验,无效直接返回不输出。

  3. 输出排序错误(提交失败2次):仅按编号排序,未区分门类型优先级,出现异或门排在与门前的输出错误;修复:自定义优先级Map,排序先按类型权重、再按编号升序。

  4. 多级电路递归死循环(提交失败3次):串联电路A→N→O多级传递,无引脚已计算标记,反复递归赋值;新增computed计算标记位,引脚计算完成后锁定状态,终止回溯。

3.2 结构设计踩坑

未设计抽象Gate父类,五大门运算逻辑冗余重复,每个门单独写compute方法,代码冗余度高达40%,后续迭代新增器件需要复制模板代码,扩展性极差。

四、改进建议

  1. 重构门结构:抽取AbstractGate抽象父类,定义抽象compute()方法,五大门作为子类重写运算逻辑,降低代码冗余,符合开闭原则。

  2. 封装正则工具类:将元件解析、引脚解析正则统一封装,避免业务层散落正则代码,方便后续新增器件修改正则规则。

  3. 新增状态枚举:定义PinStatus枚举(有效0/1、无效),替代布尔hasValue+int value双变量,状态可读性更强。

  4. 提前做拓扑排序:对电路连接关系做拓扑排序,固定计算顺序,替代递归遍历,降低栈溢出风险。

五、阶段总结

本次作业夯实Java字符串处理、面向对象基础、有向图信号流转三大能力;吃透数字电路5种基础门硬件逻辑,实现硬件逻辑代码化;短板在于前期面向对象设计不规范,未使用抽象类优化架构,代码复用率低;后续需要深耕设计模式、组合模式,适配后续子电路、复合型器件迭代开发。

数字电路模拟程序2(复合型器件+控制引脚)实训总结

一、作业前言

本次为系列迭代第二阶段,题号7-1 NCHUD-数字电路模拟程序-2,作业定位困难,满分100分;在作业1基础上新增4类复合型器件:三态门S、译码器M、数据选择器Z、数据分配器F,全局合计9类电路元件;新增核心规则:控制/输入/输出引脚分级排序、差异化输出规则、器件无效态判定、新式元件命名规则;作业共计10组专项样例,覆盖三态门高阻、译码器单点零输出、选择器多路选通、分配器无效占位四大场景;核心新增知识点:分级引脚管理、器件控制逻辑、差异化输出格式、高阻无效态建模、拓展正则解析。

迭代升级点:从纯输入输出门电路,升级为带控制引脚的组合时序电路,架构要求支持多引脚分类、差异化运算、差异化打印逻辑。

二、设计与源码分析

2.1 PowerDesigner优化后类图

吸取作业1架构缺陷,本次重构采用抽象父类+子类继承架构,贴合后续组合模式开发,核心类结构升级:

  1. Pin引脚类升级:新增引脚类型枚举(控制引脚、输入引脚、输出引脚),新增引脚归属类型、引脚序号属性,区分0号控制引脚、输入引脚、输出引脚。

  2. AbstractGate抽象门父类:统一属性:类型、全名、编号、控制引脚数、输入引脚数、输出引脚数;定义抽象ListcalcOutput()差异化输出方法,强制子类实现自定义运算+输出。

  3. 九大门子类:继承抽象门,分别实现calcOutput:基础5门沿用原有逻辑,新增4类器件独立编写控制校验、选通、译码逻辑。

  4. CircuitContext上下文类:全局统一管理引脚池、连接关系、元件仓库、排序权重,解耦输入解析和运算逻辑。

核心类关系:上下文组合抽象门,抽象门聚合分级Pin;完全遵循开闭原则,新增器件仅需新增子类,无需修改主控代码。

2.2 SourceMonitor代码指标

本次AC源码总代码行数892行,注释行数136行,空白行108行,有效业务代码648行;平均圈复杂度4.7,高复杂度集中在译码器编码换算、分配器多路赋值、连接关系绑定模块;子类数量9个,工具方法12个,架构复用率提升至68%,相较于作业1冗余代码减少37%。

2.3 核心新增逻辑分析

2.3.1 新式元件命名解析规则

  • 译码器M(n)x:n为输入引脚数量,自动换算控制引脚3个、输出2^n个

  • 选择器Z(k)x:k为控制引脚数量,输入引脚数=2^k

  • 分配器F(k)x:k为控制引脚数量,输出引脚数=2^k

2.3.2 分级引脚编号规则(硬性考点)

统一规则:0起始优先控制引脚→输入引脚→输出引脚;以3-8译码器M(3)1为例:0/1/2控制、3/4/5输入、6-13输出,代码内置引脚区间算法,自动分配引脚编号,无需手动赋值。

2.3.3 差异化输出逻辑

  1. 三态门:控制0直接无效舍弃,控制1直通输入电平

  2. 译码器:仅输出唯一0电平引脚编号,其余为1,控制不合法直接舍弃

  3. 数据分配器:选中引脚输出信号,其余输出占位符"-"

2.4 设计心得

抽象父类是本次架构最优优化点,完美适配九类元件差异化运算;引脚分级建模彻底理清控制/输入引脚区别,解决三态门控制端和输入端绑定错乱问题;上下文统一容器管理,让信号流转代码无需适配器件类型,通用性极强,为作业4子电路组合模式埋下架构伏笔。

三、采坑心得(测试+结构数据佐证)

3.1 提交量化数据

本次累计提交18次,AC通过率17%,为三次作业调试成本最高的一次,六大核心坑点:

  1. 译码器控制逻辑判定错误(失败5次):误写判定条件S1=0、S2+S3=1,和题目完全相反;对标样例8复测,修正判定:S11且S2+S30才工作,否则全部无效。

  2. 分配器引脚顺序颠倒(失败4次):控制码00选通W0,初期写成W3,输出字符顺序完全反转,样例10输出格式错误;手绘分配器流程图核对硬件时序,修正下标映射关系。

  3. 引脚类型混绑(失败3次):连接语句把控制引脚当作普通输入绑定,未做引脚类型校验,器件直接判定无效;新增引脚Type校验,禁止跨类型非法绑定。

  4. 元件排序权重更新遗漏(失败2次):新增四类器件未加入排序权重Map,输出顺序错乱;补全固定排序权重:A>O>N>X>Y>S>M>Z>F。

  5. 高阻态建模缺失(失败2次):三态门控制为0时,未做无效标记,依旧输出电平;新增NULL_STATE全局无效常量,统一标记舍弃元件。

  6. 2的n次方计算溢出(失败2次):控制引脚大于3时,输出数量计算int溢出;改用BigInteger计算译码器、分配器端口数量,适配题目最大引脚规格。

3.2 架构遗留问题

本次仅实现类继承,未实现组合模式,无法嵌套封装电路;所有信号流转依旧全局扁平化流转,不支持子电路嵌套调用,无法适配作业4子电路开发需求;异常校验模块完全空白,没有连接格式错误拦截能力。

四、改进建议

  1. 引入组合模式接口:定义CircuitComponent顶层接口,同时让门元件、子电路实现该接口,统一eval求值方法,无缝适配嵌套调用。

  2. 独立异常校验模块:抽取ConnectionChecker校验类,优先级分级校验连接语句,提前拦截非法连接,适配作业4异常体系。

  3. 引脚配置表外置:将各类器件引脚区间、数量、编号规则写入配置Map,硬编码改为配置读取,修改器件规格无需改动业务逻辑。

  4. 优化输出打印策略:策略模式分装九类元件打印逻辑,解耦运算和打印代码,方便修改输出格式。

五、阶段总结

本次作业掌握带控制端组合电路硬件原理,吃透译码器、选择器、分配器工业逻辑;熟练使用抽象继承优化项目架构,理解设计模式对迭代开发的价值;学会差异化状态建模(有效电平、高阻无效、占位符);短板在于未提前布局组合模式,架构不支持嵌套电路,缺失异常校验体系,需要补齐软件工程组合模式、优先级校验相关知识。

数字电路模拟程序4(子电路+全局异常校验)实训总结

一、作业前言

本次系列最终迭代作业,题号7-1 NCHUD-数字电路模拟程序-4,作业定位困难,满分100分;在作业1基础上回退基础器件(仅5类基础门),两大核心新增模块:①子电路定义、嵌套引用、跨层级引脚寻址;②五级优先级异常连接校验;保留原有门运算逻辑,新增跨层级信号溯源、冲突检测、优先级异常输出;作业共计8组异常专项样例+4组子电路样例,覆盖5类连接异常、输入引脚信号冲突、子电路端口映射、跨层级元件输出打印;核心知识点:组合模式落地、多级电路嵌套、优先级异常校验、引脚归属判定、跨域信号绑定。

迭代核心:补全工程化能力,从单纯电路运算,升级为语法校验+电路解析+嵌套运算+合规输出全流程模拟器,为本系列收官作业。

二、设计与源码分析

2.1 最终版组合模式类图(PowerDesigner)

严格贴合题目给定组合模式UML图开发,落地Component、Leaf、Composite三层架构,为全系列最优架构:

  1. Component抽象组件:顶层接口,定义eval()求值、getPin()获取引脚、getOrder()排序三大抽象方法,统一普通门、子电路行为。

  2. Leaf叶子节点:基础五类门电路,继承组件接口,实现单一门逻辑运算。

  3. Composite容器节点:SubCircuit子电路类,内部聚合多个Leaf门组件、本地端口映射表;实现子电路整体求值,完成外部端口→内部元件引脚映射。

拓展全局校验模块:独立ExceptionChecker校验类,内置五级异常优先级,按题目顺序排序:多输出输入→无输入→无输出→顺序颠倒→引脚冲突,优先级依次递减。

2.2 SourceMonitor代码指标

最终AC源码总代码行数1268行,注释行数212行,空白行154行,有效业务代码902行;平均圈复杂度5.1,高复杂度集中在异常优先级判断、子电路跨层级引脚解析、引脚冲突哈希校验;类总数16个,包含模式组件、校验、实体、工具四大包;代码复用率76%,完全复用作业1门运算代码,仅新增子电路、校验模块。

2.3 两大核心新增模块源码分析

2.3.1 子电路模块逻辑

  1. 解析流程:先行批量解析所有Cx:~endc子电路,存入子电路仓库,主电路后引用

  2. 端口映射:子电路INPUT别名绑定内部引脚,OUT内部引脚绑定对外别名,主电路通过Cx-别名寻址

  3. 输出规则:子电路元件输出格式固定:子电路编号-元件名-引脚号:电平,统一层级打印格式

2.3.2 五级优先级异常校验(核心考点)

单条连接语句按固定优先级校验,命中即终止后续校验,优先级顺序及判定逻辑:

  1. 优先级1:连接内存在2个及以上系统输出引脚→多输入异常

  2. 优先级2:无可供赋值的输入引脚→无输入异常

  3. 优先级3:连接仅有输出、无接收引脚→无输出异常

  4. 优先级4:输出、输入引脚顺序颠倒→时序错误异常

  5. 优先级5:输入引脚被多个输出绑定→信号冲突异常

全局规则:多条连接异常,仅输出第一条最高优先级异常,直接终止电路运算。

2.4 设计心得

组合模式完美适配子电路嵌套特性,把子电路和普通门同等当作电路组件,求值逻辑统一,无需区分层级;异常优先级采用if顺序判定,而非并行判定,精准贴合题目优先级规则;使用HashMap存储输入引脚绑定源,一键判定引脚冲突,校验效率极高;全系列架构迭代到此完成闭环,从无架构→继承架构→组合架构,完全适配题目迭代规划。

三、采坑心得(代码+测试+流程图佐证)

3.1 最终作业提交量化数据

本次提交21次,AC通过率14%,为三次作业调试难度最高,踩坑全部贴合题目迭代新增点:

  1. 异常优先级颠倒(失败6次):最初并行判定所有异常,低优先级异常覆盖高优先级,样例8直接报错;绘制异常优先级流程图,严格从上至下顺序判定,命中直接return输出异常,修复优先级覆盖问题。

  2. 子电路编号域隔离错误(失败5次):主电路、子电路元件编号全局共用,判定同编号元件重复报错;新增层级命名空间,子电路内部编号仅本级有效,跨层级互不干扰,适配题目同编号约束。

  3. 引脚归属判定混淆(失败4次):元件输入引脚作为连接输出端时,误判定为输入引脚,触发无输入异常;建立引脚归属字典:元件0号为输出,其余为输入,连接首位一定是输出属性引脚,重做属性判定规则。

  4. 冲突检测漏判子电路引脚(失败3次):仅校验主电路引脚,未校验Cx-别名端口绑定冲突;拓展冲突池,把子电路对外端口纳入全局引脚绑定哈希表,统一冲突校验。

  5. 子电路元件排序失效(失败3次):子电路元件未按类型+编号排序,输出杂乱;子电路内部独立排序,汇总后和主电路元件合并排序输出。

3.2 全系列架构复盘踩坑总结

作业1:无设计模式,硬编码开发,适配小型项目,不可扩展;作业2:继承模式优化元件,可扩展器件,不可嵌套;作业4:组合模式+继承双层架构,可扩展、可嵌套、可校验;三次架构重构耗费大量调试时间,得出结论:迭代类项目必须前期贴合题目迭代规划选型设计模式,后期重构成本成倍增加。

四、全系列代码改进建议

  1. 全局异常解耦:将五级异常编写为责任链模式,每个异常校验类独立,新增异常仅新增责任节点,不用修改原有校验代码,适配后续新增电路异常规则。

  2. 缓存电路计算结果:对子电路、门电路求值结果增加缓存,多级复用同一子电路时,无需重复计算,优化时间效率,适配题目800ms时间限制。

  3. 正则预编译:所有元件、引脚、子电路正则表达式全局预编译,避免每次解析重复编译,降低CPU开销。

  4. 日志分级打印:开发debug日志打印引脚绑定、运算过程,快速定位引脚冲突、赋值失效问题,缩减测试调试时长。

  5. 完善时序闭环:预留反馈引脚接口,直接适配后续时序电路、带反馈电路迭代,无需大规模修改现有架构。

五、全阶段三次作业综合性总结

5.1 习得知识与能力

  1. 专业知识:吃透9类数字硬件门电路、组合电路、子电路封装硬件原理,掌握电平导通、选通、译码、高阻、端口映射电路底层逻辑,打通计算机硬件逻辑与代码建模的关联。

  2. 编码能力:精通Java复杂字符串解析、正则分组匹配、容器高阶用法、拓扑信号流转、哈希冲突校验;掌握分层开发、异常分级处理、排序规则定制开发。

  3. 设计模式:循序渐进掌握普通实体、继承抽象类、组合模式三种架构选型,理解迭代式开发架构设计核心要点,读懂UML类图并落地编码。

  4. 工程能力:学会使用SourceMonitor做代码质量分析、PowerDesigner绘制业务类图、量化BUG统计、基于测试用例定向调试。

5.2 不足与后续学习方向

  1. 不足:时序电路建模能力薄弱,尚未学习触发器时序反馈逻辑;责任链、策略模式实操熟练度不足;复杂正则分组容错能力有待提升。

  2. 后续学习:深耕组合模式、责任链、策略三大电路适配设计模式;学习时序电路时钟、反馈闭环建模;学习代码度量优化,降低代码圈复杂度,写出低冗余、高可扩展业务代码;研究数字电路仿真底层建模逻辑。

posted @ 2026-06-24 22:02  guoziyuan321  阅读(1)  评论(0)    收藏  举报