一、前言
1. 核心知识点
-
- 编程实现:正则表达式解析文本(元件、引脚、输入信号),Map/List/Queue 等数据结构管理元件与信号,面向对象编程(封装元件属性与行为、继承多态拓展元件类型),信号传播的迭代模拟逻辑,自定义排序规则实现结果输出。
- 电路原理:第一次覆盖与、或、非、异或、同或 5 类基础门电路的逻辑规则;第二次新增三态门、译码器、数据选择器、数据分配器 4 类元件,涉及控制引脚、输入输出引脚的分类管理及不同元件的有效工作条件与输出规则。
2. 题量与难度
-
- 两次均为单道综合编程题,第二次在第一次基础上拓展元件类型(5 类→9 类)、引脚规则(新增控制引脚分类)、输出格式(译码器 / 数据分配器特殊输出),代码量与逻辑复杂度显著提升,难度从基础门电路模拟升级为复杂数字元件的综合系统模拟。
二、设计与分析
1.源码量化分析
-
-
-
- 核心指标对比
-
-
| 度量指标 | 第一次题目(基础门电路) | 第二次题目(拓展元件) | 变化核心原因 |
|---|---|---|---|
| 代码总行数 | 277 | 553 | 新增三态门、译码器等 4 类元件,补充引脚分类、特殊输出逻辑 |
| 类数量 | 3 | 13 | 采用 “抽象基类 + 子类” 分层设计,拆分不同元件封装逻辑 |
| 最大方法复杂度 | 12(Gate.calculateOutput()) |
39(Main.main()) |
需兼容 9 类元件的解析、信号传播及差异化输出规则 |
| 代码最大嵌套深度 | 8 | 9+ | 元件类型判断、引脚分类匹配等分支嵌套增加 |
| 注释占比 | 0% | 0% | 未添加功能性、逻辑性注释 |
报表解读:
数电1:

数电2:

第二次题目Main.main()复杂度飙升至 39,因需处理元件解析、引脚分类、特殊输出等多分支逻辑;代码深度达 9+,反映嵌套层级增加。
2.代码结构设计分析
(1) 第一次作业:扁平式封装

(2) 第二次作业:抽象分层架构

分析:该架构采用抽象基类 + 子类多态设计:
3.设计心得
4.课堂测验分析
4.1 答题概况
4.2 核心错误拆解
4.3 错误根源
4.4 改进方向
三、采坑心得
1. 踩坑点
(1)代码耦合严重,扩展难:
(2)信号传播无序,计算出错:
问题:按 “线性遍历” 计算所有元件,忽略元件间的输入依赖(比如先算与门,再算给它供输入的非门),导致 测试用
例因 “输入未就绪” 输出空值:
for (Gate gate : allGates) {gate.calculate(); // 依赖未满足就计算,易出错
}
改进:用 “队列” 实现异步信号传播,先算有外部输入的元件,再算依赖其输出的元件:
Queue<String> pinQueue = new LinkedList<>();
// 先将外部输入引脚加入队列
pinQueue.addAll(inputSignals.keySet());
while (!pinQueue.isEmpty()) {String currentPin = pinQueue.poll();// 计算当前引脚对应的元件输出// 将输出引脚加入队列,供后续元件使用
}
2. 心得
四、改进建议
五、总结
- 数字电路模拟作业总结
2. 课堂测验总结
