NCHUD-数字电路模拟程序----作业集4~6的总结性blog

一.前言:

作业集4:
知识点:类的定义与封装、字符串解析、与、或、非、异或、同或的运算。

题量:中等,约300行左右代码,逻辑稍微直白。

难点:1.需要理解什么是与、或、非、异或、同或,同时,还要理解“不断扫描、计算已知输入的门”这一循环过程;2.需要解析输入格式,例如元件名,这在之前是完全没碰到过的,所以我并没有什么经验。

作业集5:
知识点:加入了更复杂的元件抽象,如:三态门、译码器、数据选择器、数据分配器;需要控制引脚与多输出引脚的处理;控制引脚和输出引脚;不同元件输出不同的格式。

题量:多,代码量激增至500行左右,部分类显得有些臃肿。

难点:对于新加入的元件的功能或行为的理解;理解和引脚,防止发生编号偏移;输出格式多变,容易遗漏或者常出现格式错误。

作业集6:
知识点:组合模式;子电路的解析;多种异常输入的检测;复杂的状态管理。

题量:代码量并没有过多膨胀,大概400行代码左右,但是逻辑分支非常多。

难点:相较于上次,难度上升了好几个档次。首先是要去理解设计模式,例如Component的使用、Leaf和Composite如何协作等;再是子电路的处理,在解析连接时,子电路内的引脚名要加前缀,但又要保留原名以便计算。编译运行过程中经常会出现双重前缀或找不到信号;异常检测的优先级是这次的重点之一,在给出的输入、输出样例中,各种异常输入的案例占多数。判断一个 token 是输出还是输入非常容易出错(例如 C1-A 在子电路内部是输入,在主电路中可能是输出);最后是调试极其困难,因为一旦出错,就要从头到尾读一遍代码来追踪信号并分析错误。

总结:在三次题目集中,抽象层次不断提高,不再是简单的封装类问题,更多是设计和逻辑运算的问题,例如组合模式的运用。每次题目集都是在挑战程序结构设计。对于此类题目,我感觉学会画类图之类的很重要,把各种信息用图或者表格罗列出来,这样在设计代码时脑中就会比较清晰。

二、设计与分析

作业集4
题目要求
1、电路元件
电路中包含与门、或门、非门、异或门、同或门五种元件。元件特征如下:
与门:
包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是高电平,输出引脚才是高电平,只要有一个输入引脚为低电平,输出引脚输出低电平。
或门:
包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是低电平,输出引脚才是低电平,只要有一个输入引脚为高电平,输出引脚输出高电平。
非门:
包含一个输入引脚和一个输出引脚。输出引脚的电平与输入引脚的电平相反,如输入为低电平,输出则为高电平。
异或门:
包含两个输入引脚和一个输出引脚。当两个输入引脚电平不一致时输出引脚输出高电平,否则输出低电平。
同或门:
包含两个输入引脚和一个输出引脚。当两个输入引脚电平一致时输出引脚输出高电平,否则输出低电平。

2、程序输入

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。

5、后续迭代设计
数字电路模拟程序1(本次作业):
基础逻辑门元件构成电路
数字电路模拟程序2:
1、包含多输入输出的组合电路元件如数据选择器;
2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。
数字电路模拟程序3:
增加带反馈的电路、时序电路元件,如D触发器、JK触发器。
数字电路模拟程序4:
1、增加子电路;
2、增加程序异常输入的检测。

类图:
QQ20260624-153435

构建了共三个类:Signal、Gate、和Main。
Signal类表示电路中的一根信号线,包含名字(如 "A"、"X1-0")、值和是否已确定的标志 fixed。
Gate类表示一个逻辑门元件。内部包含类型常量(A/O/N/X/Y)、名字、输入引脚数、编号、输入引脚连接到的信号名数组 inputSources、计算 computed、输出值 output。
Main类:主类,负责读取输入、解析连接、反复调用 compute 最后排序输出。

读取数据后,为每个外部输入创建 Signal 对象并加入 signals 列表。
读取连接信息,为每个目标引脚在其所属 Gate 记录源信号的名字。然后进入模拟循环,如果某个门的所有输入引脚都已有确定的信号,则计算出输出值,并将输出作为一个新的 Signal加入列表。排序后输出。

作业集5
题目要求
三态门:
三态门的作用类似于电路中的开关。包含一个输入引脚、一个输入控制引脚、一个输出引脚。当控制引脚为高电平时,三态门输入输出之间导通,输出电平等于输入电平;当控制引脚为低电平时,三态门输入输出之间呈现高阻态(类似开关断开),输出为无效状态。
译码器:

译码器的作用是讲输入的编码转换为一路有效信号。一个译码器包含两个或多个输入引脚(如图中的A2\A1\A0)、三个控制引脚(如图中的S3\S2\S1)、4个或多个输出引脚(如图中的Y7~Y0)。根据输入输出的数量有2-4线译码器、3-8线译码器等。
当控制引脚当S1 =1,S2 +S3 =0时,译码器正常工作,输出引脚只有一个输出信号0,其余输出为1;哪个引脚输出0由输入引脚的编码决定,例如:图中的3-8线译码器三个输入引脚信号的编码与输出引脚的编码对应,A2\A1\A0输入000时,Y0输出0,其余输出1;A2\A1\A0输入001时,Y1输出0,其余输出1;依次类推。
控制引脚不满足S1 =1,S2 +S3 =0时,译码器处于无效状态,所有输出为无效值。
数据选择器:
数据选择器的作用是从多路输入信号中选择一个,并将其信号直接送往唯一的输出端,选择哪一路输入信号由控制端决定。如图所示控制端有两个则输入端有4个,S1\S0是两个控制端,D3D0是输入端,S1\S0的4种信号组合00、01、10、11分别选择D3D0其中一路输入。如S1S0=00,则Y=D0;S1S0=01,则Y=D1;S1S0=10,则Y=D2;S1S0=11,则Y=D3
根据输入引脚数量的不同有二选一数据选择器(1个控制端)、四选一数据选择器(2个控制端)、八选一数据选择器(3个控制端)等
数据分配器:
数据分配器的作用与数据选择器正好相反,是将唯一的一路输入信号输出到多路输出引脚的其中之一,选择哪一路输出引脚输出由控制端决定。如图所示控制端有两个AB,输出端有4个W0\W1\W2\W3,D是输入端,AB的4种信号组合00、01、10、11分别选择W3~W0其中一路输出,其他三路输出为无效状态。如AB=00,则W0=D;AB=01,则W1=D;AB=10,则W2=D;AB=11,则W3=D。
根据输出引脚数量的不同有二路数据分配器(1个控制端)、四路数据分配器(2个控制端)、八路数据分配器(3个控制端)等
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、测试输入默认满足以下条件:
1)每个元件的输入引脚连续编号。假设元件有n个输入引脚,则其编号取值范围为[1,n],且引脚号不重复。
2)本题涉及的五种元件都只有一个输出引脚,输出引脚号默认为0。
5、本系列题目的迭代设计
数字电路模拟程序1:
基础逻辑门元件构成电路
数字电路模拟程序2(本次作业):
1、包含多输入输出的组合电路元件如数据选择器;
2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。
数字电路模拟程序3:
增加带反馈的电路、时序电路元件,如D触发器、JK触发器。
数字电路模拟程序4:
1、增加子电路;
2、增加程序异常输入的检测。

类图:
QQ20260624-153313

Gate 类大幅扩充:类型常量增加了 S(三态门)、M(译码器)、Z(数据选择器)、F(数据分配器)。增加了 controlCount、outputCount、outputStr、decoderZeroOut 等属性。

程序按照“控制引脚 → 输入引脚 → 输出引脚”的顺序连续编号,不同元件的具体映射在构造方法中处理。其中三态门负责检查控制引脚(0)和输入引脚(1),控制为1则输出=输入,否则不计算;译码器负责检查三个控制引脚和全部输入,满足 S1=1, S2=0, S3=0 时,根据地址输入计算出唯一输出0的引脚,为每个输出引脚生成对应信号;数据选择器根据控制引脚编码选择一个输入端,将其值输出;数据分配器根据控制编码将唯一的数据输入端分配到对应输出引脚,其他输出无效

作业集6

题目要求
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
输入、输出信息的编码可以作为子电路的引脚号在主电路中引用。
子电路元件输出时带上子电路的编号,格式为:子电路编号+“-”+元件编号+“-”+引脚号+“:”+引脚输出
例如:定义一个编号2的子电路,包含A、B两个输入和一个输出O:
C2:

INPUT:A B

OUT:C

[A X1-1]

[B X1-2]

[X1-0 Y1-1]

[A Y1-2]

[Y1-0 C]

endc
主电路中的运用:
INPUT: A-1 B-1

[A C2-A]

[B C2-B]

[C2-C N1-1]

[N1-0 OUT]

end
输出信息:
C2-X1-0:0

C2-Y1-0:0

N1-0 :1
所有子电路信息都在主电路信息之前定义完成。
6)异常输入信息(本题在数字电路模拟程序-1基础上新增的内容)
当出现各类异常输入情况时,电路应输出相应提示,异常情况包括:
1.一个连接信息中包含两个或多个输入,输出:ERROR:“连接信息”+“英文空格”+include more than one input
例如:
INPUT: A-1 B-1

[A B A2-1]
应输出:
ERROR: [A B A2-1] include more than one input
2.一个连接信息中没有输入信息,输出:ERROR:“连接信息”+“英文空格”+include none input
例如:
INPUT: A-1 B-1

[C1-1 C2-1]
应输出:
ERROR: [C1-1 C2-1] include none input
注意:C1-1 C2-1引脚是元件的输入引脚,但作为连接信息,元件的输入引脚属于连接系统的输出,所以是none input
3.一个连接信息中没有输出,输出:ERROR:“连接信息”+“英文空格”+include none output
例如:
INPUT: A-1 B-1

[A]

应输出:ERROR: [A] include none output
4.一个连接信息中输入输出写反,输出:ERROR:“连接信息”+“英文空格”+input and output sequence error
例如:
INPUT: A-1 B-1

[A2-1 A]

应输出:ERROR: [A2-1 A] input and output sequence error
5.一个输入引脚接受中来自多个不同输出的信号,输出:ERROR:“输入引脚”+“英文空格”+input signal conflict
例如:

INPUT: A-1 B-1

[A A2-1]

[B A2-1]

应输出:ERROR: A2-1 input signal conflict
注:如果一条输入出现了多种异常,按以上异常先后顺序为优先级,顺序靠前者优先级越高,最后输出优先级最高的异常输出。
当电路输入信息中多条输入都包含异常,只处理排在最前面的异常信息。
7)输入结束信息
所有输入以end为结束标志,end之后出现的内容忽略不计
3、程序输出
按照与门、或门、非门、异或门、同或门的顺序依次输出所有元件的输出引脚电平。同类元件按编号从小到大的顺序排序。
如果某个元件的引脚没有接有效输入,元件输出无法计算,程序输出结果忽略该元件
4、测试输入默认满足以下条件:
1)每个元件的输入引脚连续编号。假设元件有n个输入引脚,则其编号取值范围为[1,n],且引脚号不重复。
2)本题涉及的五种元件都只有一个输出引脚,输出引脚号默认为0。
5、后续迭代设计
数字电路模拟程序1(本次作业):
基础逻辑门元件构成电路
数字电路模拟程序2:
1、包含多输入输出的组合电路元件如数据选择器;
2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。
数字电路模拟程序3:
增加带反馈的电路、时序电路元件,如D触发器、JK触发器。
数字电路模拟程序4:
1、增加子电路;
2、增加程序异常输入的检测。

类图:

QQ20260624-152940

新增抽象类 Component:定义了 isComputed()、compute(signals)、getOutputName()、getType()、getNumber() 五个抽象方法,作为所有电路节点的统一接口。
leaf类继承 Component,内部包装一个 Gate 对象;Composite类继承 Component,内部包含inputNames、outputNames以及前缀 prefix。

在解析子电路内部的连接时,所有引脚名称都会被加上前缀,例如 A → C1-A,N1-1 → C1-N1-1,以避免不同子电路或主电路间的命名冲突。另外,在解析连接行时,先用checkError检测各种错误,若发现错误则打印并退出。

心得:第四次作业的代码只有几个直接的类,修改起来还算容易。到了第五次,Gate类急剧膨胀,如果继续堆积功能,维护将变得异常困难。第六次新增门类型增加了Gate类的分支,用更复杂的抽象换取更灵活的可扩展性。

三、踩坑心得

在三态门等元件中,基础门输出 name-0:value;三态门输出 name-2:value;选择器输出 name-控制+输入:value;译码器输出 name:0的引脚号;分配器输出 name:输出字符串。很容易在输出分支中写错字符串拼接。所有要将所有输出格式化集中到一个方法中,用元件类型常量清晰分支,并用样例逐个比对,确保每个分支的输出字符串完全匹配。

第六次作业时,光将注意放在后面的判断错误的情况上,使得提交后,发现大量非零返回,测试案例发现没有结果,修改后只是答案错误。
image
在Composite类中将
if (Main.subInputFullNames.contains(token)) return true;
if (Main.subOutputFullNames.contains(token)) return false;

修改为
if (Main.subInputFullNames.contains(token)) return false;
if (Main.subOutputFullNames.contains(token)) return true;

再修改
String realGateName = gateName;
if (isSubCircuit) {
realGateName = gateName.substring(comp.prefix.length());
}

成功通过部分答案测试点通过,但剩下的不知如何修改。
image

四、改进建议

题目集4
建议提取独立的类来进行字符串处理和列表查找等通用功能,Gate类只保留门的计算和自身属性。
冒泡排序效率稍低,我需要学习和使用更高效的排序方法。

题目集5
题目集4类似,部分类过于臃肿,需要建立一些工具类来分担一些工作。比如Main类中,需要进行多个if-else的判断,建议在Gate类中增加 getOutputString()方法,由门自己负责生成最终输出文本,Main 只需调用并打印。

题目集6
对于多子路问题我没有解决,需要思考如何解决多子路的问题。
Leaf的circuitId和Gate.name的组合方式复杂,可以增加一个字段fullName,使fullName = circuitId + gate.name,后续可以直接按fullName查找。

五、总结

这是我首次接触到电子元件相关知识,这种难度令我感到很有压力,但也学到了很多东西。如不同元件(基础门、三态门、译码器、选择器、分配器)的引脚编号规则不同,子电路的引入又带来了全局唯一命名和前缀管理需求。我学会了用常量定义引脚布局、用前缀区分电路层级,并通过全局搜索唯一全名来避免冲突。还有学会最终信息的流动来寻找和修改错误。部分基础工具的手动实现锻炼了我对字符串操作的熟练度还有对异常检测的重视。在之后,我急需学习java基础知识以外的进阶知识,因为基础知识已经不足以支持我完成目前的作业,尤其是更加高效的排列方式和组合模式之类的设计理念,都是我非常欠缺的。最后,对于之前知识的巩固和练习必不可少,我在部分偏复杂的问题前不能很快速的反应或在解决简单问题时编码的速度过慢,这都是平常缺少练习导致的问题。

posted @ 2026-06-24 19:53  罗忆豪  阅读(4)  评论(0)    收藏  举报