##面向对象程序设计——PTA作业集4-6Blog总结
一、先导
对于数字电路模拟程序设计,解析、仿真多级数字逻辑电路,支持基础逻辑门与子电路复用电路,以及相关的数据结构,常见的错误判定,我得到了一些深刻的了解:
- 基础语法的字符串处理,循环分支异常捕获;
- 集合框架的构建的相关集合工具(如List)的用法;
- 面向对象的核心(接口,抽象类,继承多态),都有了相关的一些掌握;
- 正则与语法解析,流程和算法;
- 内部类与实体封装;
Complexity Metrics(复杂度分析)
因为下面要用到复杂度分析,所以先在此给出一些相关概念。
我们需要使用的主要是方法和类的复杂度分析。
方法的复杂度分析主要基于循环复杂度的计算。循环复杂度是一种表示程序复杂度的软件度量,由程序流程图中的“基础路径”数量得来。
下面我将从程序结构,公测、互测以及bug分析几个方面来总结我第一单元的三次作业。
二、第四次作业(PTA作业集4)
2.1作业要求
数字电路是一种处理离散信号的电子电路。电路中包含与门、或门、非门、异或门、同或门五种元件。用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。
请编程实现数字电路模拟程序
2.2实现方式
全部使用静态全局 ArrayList存储电路所有数据,线性遍历完成解析、信号迭代仿真、分组排序输出:
- 读取并解析顶层 INPUT 初始信号;
- 读取所有导线语句 [源 目标1 目标2];
- createNewGate () 创建逻辑门;
- 迭代仿真信号传导(核心 while 循环);
- 分组、冒泡排序、打印结果;
2.3代码规模
第四次作业代码规模如下图

2.4类图
第一次作业类图如下,其中Main是主类:

2.5复杂度分析
第一次作业的复杂度分析如下:

2.6Bug分析
2.6.1公测
- 输入语法类 Bug:INPUT 行格式异常:INPUT:a b-1 某信号缺少-数值,分割数组长度不足 2,Integer.parseInt 直接抛异常崩溃,无容错判断。
- 边界输入 Bug:多路与 / 或门A(1)1仅 1 个输入引脚,逻辑计算无异常,但不符合电路常识,无校验。
2.6.2互测
让同学测试了我的代码,主要问题如下:
- 存储架构缺陷 Bug:信号查询、门查找全是线性遍历,数据量大时效率极低;无 HashMap 映射缓存,重复遍历冗余。
- 字符串解析隐性 Bug:分割字符串使用单空格分割,多连续空格、制表符分割后产生空字符串元素,未过滤。
2.6.3测试方法
- 边界值测试法:极值边界超多输入多路门、数十级串联电路;非法数值边界输入电平 2/-5、引脚号 0/999 超范围。
- 静态走查:互测阶段逐段核对 ArrayList 下标绑定、循环终止条件、字符串截取逻辑;
三、第五次作业(PTA作业集5)
3.1作业要求
新增带控制引脚元件:三态门、译码器、数据选择器、分配器,支持多输入多输出元件,解析自定义电路描述文本,仿真 9 类数字元件电平运算,迭代传导信号至电路稳态,按指定规则格式化输出所有有效元件运算结果。
3.2实现方法
抽象Component做父类,用 Map 存储信号电平、引脚驱动关系,字符串正则提取括号参数、截取元件编号、分割引脚标识,完成元件名称、引脚号拆分。
3.3代码规模
第五次作业的代码规模如下:

3.4类图
第五次作业类图如下:

3.5复杂度分析
第五次作业的复杂度分析如下:

3.6Bug分析
3.6.1公测
- 输出展示缺陷:失效元件直接隐藏输出,无法区分是解析失败还是引脚信号不全;
- 电路规则校验缺失:未检测同一输入引脚多条导线驱动冲突,后覆盖前值,逻辑结果错误无提示;
- 缺少异常捕获,数字转换直接崩溃;
3.6.2互测
- 让同学测试了我的代码,主要问题如下:
- 架构与存储缺陷:全局静态容器耦合高,大数据量效率低;无缓存 Map 优化;
- 引脚校验逻辑漏洞:仅校验输入控制引脚是否存在源,滞后更新会导致计算出错;
- 内存复用问题:无分区隔离,同名顶层信号与元件引脚会互相覆盖;
3.6.3测试方法
- 功能用例测试:基础门、三态门、译码器、选择器、分配器单电路用例;多级串联组合电路;畸形非法输入用例,验证运算、解析、输出正确性;
- 边界值测试:最小 1 控制端器件、最大多路译码 / 分配器;引脚全部悬空、仅单路有效输入;0/1 边界电平、超长串联电路;
- 对比校验测试:逻辑计算类 Bug;
四、第六次作业(PTA作业集6)
4.1作业要求
4.2实现方法
4.3代码规模
第六次作业的代码规模如下:

4.4类图
第六次作业类图如下:

4.5复杂度分析
第六次作业的复杂度分析如下:

4.6Bug分析
4.6.1公测
- 超长输入文本、大量连线导致信号循环更新超时、结果偏移;
- 偶现稳态无法收敛、死循环(极端输入下 changed 持续 true);
4.6.2互测
- 工厂模式实现不规范、开闭原则破坏;
- 重复引脚冲突校验未去重,路径前缀拼接遗漏,嵌套输出名称错误;
4.6.3测试方法
- 边界值:3 层以上嵌套子电路、一条连线数十个目标引脚、无限引脚与门;
- 异常用例:重复驱动引脚、非法连线、空输入;
五、踩坑心得与错误集锦
本次电路模拟器采用工厂模式开发,踩坑颇多:迭代直接修改信号网导致多层子电路计算出错;输出路径拼接遗漏前缀;连线同引脚误判冲突;GateInfo 封装差,工厂 switch 违反开闭原则,多层嵌套用例大量失准,后续需用临时信号表、完善参数封装。
六、收获总结
本次完成逻辑电路模拟器,运用简单工厂与组合模式实现门电路、嵌套子电路。开发中踩坑众多,迭代直接修改信号网络造成多层子电路计算偏差,输出路径拼接出错。通过修复临时信号存储、完善路径拼接、规范参数封装加深对设计模式理解,学会分层排查逻辑缺陷,提升边界用例测试意识。
七、改进建议
对于Java面向对象程序设计,我认为这门课多在于学生的主观能动性,课上老师提供的是一个方向与思路,给你一些新的知识点的先导,后续掌握知识的过程需要学生本人去主动探索和学习,但对于现在的学生来说,他们会持续迷茫,缺少自律性和更加注重享受快乐的即时性,对于作业集的难度加大,大部分学生的能力远不能够去自我完成,所以我觉得在网课上可以再深入讲解,题目上有个循序渐进的过程,以及在写题目之前能够将该题目所需的知识点写出来,便于掌握能力去解决。对于平时,我觉得可以出点简单测试如线上考试那种,可以巩固知识点。
浙公网安备 33010602011771号