作业4-6总结
前言
在这三次迭代实验中,我对程序设计有了更深的体会,也学到了许多:
1.理解二进制 0/1 电平、输入输出约束,分清多输入门、双输入门引脚定义规范。
2.掌握复杂数字器件工作逻辑,理解控制引脚、使能条件、二进制编码寻址
3.学会如何处理字符串:拆分、识别自定义格式文本,提取元件、引脚、电平信息
4.列表分类存放不同元件,会按数字从小到大排序输出
5.根据不同器件写对应的计算逻辑,区分多种输出格式
第一次迭代实验
作业要求:数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基本状态:高电平(通常表示为“1”) 和 低电平(通常表示为“0”)。这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。请编程实现数字电路模拟程序。
类图如下:

代码情况:

Bug分析
由于第一次迭代较为简单,并未出现严重错误
测试方法:根据pta上测试点修改
知识点:
- 硬件模型知识点
电平逻辑:0 低电平、1 高电平,二进制基础逻辑运算
5 种基础门电路逻辑规则:
与门 A:多输入全 1 才输出 1
或门 O:多输入任一 1 即输出 1
非门 N:单输入取反
异或 X:双输入不同为 1,相同为 0
同或 Y:双输入相同为 1,不同为 0
元件命名规则区分:
多输入门:标识符 (引脚数)+ 编号(A (8) 1、O (4) 2)
双 / 单输入门:标识符 + 编号(X5、N1、Y4)
引脚规范:元件输出引脚固定 0 号,输入引脚 1~n 连续编号
-
输入解析知识点
全局 INPUT 外部输入解析:名称-电平键值存储
连线块[输出 输入引脚1 输入引脚2...]解析规则
连线约束校验:输入引脚只能单驱动、输出不可短接
终止符 end 截断输入 -
数据结构知识点
全局信号字典:存储所有引脚当前电平(外部输入、门输出引脚)
元件分类容器,同类按编号升序排序
引脚归属解析:拆分元件名-引脚号字符串 -
输出规则
按 A→O→N→X→Y 顺序输出。
题量
实现约5种元件,处理4类输入信息,输出按规则排序。代码量适中。
难度
较为适中
遇到的困难
字符串拆分解析、信号字典映射、分类排序输出
改进建议
改进建议
单独写工具函数解析元件名,统一返回元件类型、引脚数、编号数字。
封装引脚解析函数,统一拆分xxx-num格式;连线处理固定取第一个元素为输出源,剩余全部是输入负载。
统一信号字典键格式,所有引脚统一规范命名,查询更稳定。
封装校验函数:输入引脚全集对比已连接信号,一键判断是否缺输入。
提取编号转为数字再排序,不直接用字符串比较。
第二次迭代实验
1、包含多输入输出的组合电路元件如数据选择器;
2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。
程序输入
1)#元件信息:
用A、O、N、X、Y、S 、M、Z、F分别用作
与门、或门、非门、异或门、同或门、
三态门、译码器、数据选择器、数据分配器九种元件的元件标识符。
电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。
例如:A(8)1表示一个8输入引脚的与门,O(4)2代表一个4输入引脚的或门。
电路中的每个非门、异或门、同或门用“标识符+编号”作为其元件名。
例如:X8表示一个异或门,Y4代表一个同或门,N1代表一个非门。
电路中的数据选择器、数据分配器用“标识符(控制引脚数)+编号”作为其元件名。
例如:Z(2)2代表一个四选一数据选择器,F(3)2代表一个8路数据分配器。
译码器用“标识符(输入引脚数)+编号”作为其元件名。
例如:M(3)1表示一个3-8线译码器。
约束条件:
不同元件的编号可以相同,如X4、Y4。
同一电路中同种元件的编号不可重复,可以不连续
2)引脚信息:
引脚信息由“元件名-引脚号”构成。
例如:A(8)1-2代表与门A(8)1的2号引脚。
含控制引脚的元件如本次添加的所有元件,按控制-输入-输出的顺序排序,
每种类型的引脚按编号从小到大的顺序排序,
例如3-8线译码器M(3)1包含3个输入引脚、3个控制引脚、8个输出引脚,
M(3)1-0/1/2对应控制引脚S1/S2/S3,
M(3)1-3/4/5对应输入引脚A0/A1/A2,
M(3)1-6/7/8/9/10/11/12/13对应输出引脚Y0~Y7。
又如三态门的三个引脚,0号引脚为控制端、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、程序输出
按照与门、或门、非门、异或门、同或门、三态门、译码器、数据选择器、数据分配器的顺序依次输出所有元件的输出引脚电平。
同类元件按编号从小到大的顺序排序。
如果某个元件的引脚没有接有效输入、输入输出之间断开(如三态门)或控制引脚输入无效,元件输出无效,程序输出忽略该元件。
译码器不输出引脚电平,输出其输出为0的引脚的编号。如“M(3)1:3”代表译码器M3的输出引脚Y3输出0,其他引脚输出1。
数据分配器按引脚编号从小到大的顺序输出所有输出引脚的信号,无效状态引脚输出“-”。
如“F(2)1:--0-”代表分配器F1的输出引脚W2输出0信号,其他三个引脚为无效状态。
类图如下


代码情况如下:

知识点
三态门、译码器、数据选择器、数据分配器。
控制引脚与多输出引脚的处理:引脚顺序定义、控制逻辑
输出格式多样化:普通门输出电平,译码器输出有效引脚编号,分配器输出含无效符号“-”的序列。
状态有效性判断
题量
在迭代一基础上增加4类新元件,需修改解析逻辑以处理带控制/输入/输出引脚编号映射,输出规则更复杂
难度较高
遇到的困难
难点:
多类型元件差异化引脚分配规则
控制信号、使能信号、高阻无效态三态逻辑
多格式分支输出,大量 if-else 业务分支
改进建议
设计统一元件结构体,存储类型、控制引脚数、数据输入引脚数、输出引脚列表,解析后统一存入对象。
写专用函数自动生成某器件全部控制 ,输入 ,输出引脚号,不用手动计算。
每种器件的求值逻辑单独封装成独立函数,采用分支分发调用,代码分层清晰。
每个器件计算完成后,统一返回标准化结果,最后统一打印模块根据类型格式化输出。
统一封装 “元件是否有效” 判断函数,一处调用代替多处重复代码。
第三次迭代实验
实验要求
程序输入
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)子电路信息(本题在数字电路模拟程序-1基础上新增的内容)
可以将一部分电路设定为一个子电路,子电路可以在主电路中被引用。子电路的输入按顺序包括以下几部分:
子电路起始信息:C+子电路编号+:
子电路输入信息:
INPUT:输入1+英文空格+输入2+英文空格+....+英文空格+输入n,
子电路输出信息:
OUT:输出1+英文空格+输出2+英文空格+....+英文空格+输出n,
子电路连接信息:(格式与主电路输入信息相同),子电路的元件编号与主电路中的编号可能相同。
子电路结束标志:endc
输入、输出信息的编码可以作为子电路的引脚号在主电路中引用。
子电路元件输出时带上子电路的编号,格式为:子电路编号+“-”+元件编号+“-”+引脚号+“:”+引脚输出
类图如下


代码情况如下

知识点
异常检测与优先级:五种异常类型(多输入、无输入、无输出、输入输出顺序颠倒、输入信号冲突),严格按优先级只报告最先出现的错误,且多条错误只处理第一条。
错误处理优先级
题量
在迭代一基础上新增子电路处理与完整的异常检查机制。解析部分需要同时支持主电路和子电路块,并构建层级连接;异常检测需在连接解析时进行并返回错误
难度高
遇到的困难
子电路的命名空间隔离
异常优先级处理,要求解析时谨慎排序校验逻辑;
错误信息精确匹配格式,输出规范严苛。
改进建议
分段读取输入文本,先一次性预解析、存储所有子电路,再解析主电路,两类电路分开存储。
把 5 种异常封装成有序判断函数,按优先级依次校验,一旦命中直接返回错误、停止后续流程。
输出时把主电路、所有子电路元件合并到统一列表,排序时同时识别子电路编号、元件类型、元件序号。
总结
三次迭代我学会了数字电路基础,搞懂了五种基础逻辑门怎么算 0 和 1,后面又多学了三态门、译码器、选择器这些复杂器件,知道控制引脚、高阻无效是什么意思。还学会把一段电路打包成子电路重复用,清楚布线规矩:一个引脚不能同时接两路信号,不然会冲突。提升了写代码实操能力,拆分各种乱七八糟的元件名、引脚、连线、子电路语句;用字典存所有引脚的电平信号,区分主电路和子电路,避免同名元件数据乱掉。每种器件分开写计算逻辑,还要对应不一样的打印格式;提前检查输入有没有写错,发现错误直接停止运行,不用继续算。学会写程序的思路懂得分步干活:先读全部子电路、再处理主电路;先查错,没问题再计算输出。学会把代码拆成解析、校验、计算、打印几块,堆在一起会很乱。遇到缺信号、开关断开这类情况,知道直接忽略对应的元件。但还有要改进的地方,我代码结构写得乱,扩展性差没用好面向对象封装各类器件,以后再加新门电路要改一大堆代码。需要学学类的封装、命名空间管理,把规则抽出来单独放,改起来更方便。其次,容错、报错功能不完善,要完善更多异常判断,区分不同类型错误,避免程序卡死死循环。而且我的知识面还有缺口。

浙公网安备 33010602011771号