##面向对象程序设计——PTA作业集4-6Blog总结

一、先导

对于数字电路模拟程序设计,解析、仿真多级数字逻辑电路,支持基础逻辑门与子电路复用电路,以及相关的数据结构,常见的错误判定,我得到了一些深刻的了解:

  1. 基础语法的字符串处理,循环分支异常捕获;
  2. 集合框架的构建的相关集合工具(如List)的用法;
  3. 面向对象的核心(接口,抽象类,继承多态),都有了相关的一些掌握;
  4. 正则与语法解析,流程和算法;
  5. 内部类与实体封装;

Complexity Metrics(复杂度分析)

因为下面要用到复杂度分析,所以先在此给出一些相关概念。

我们需要使用的主要是方法和类的复杂度分析。

方法的复杂度分析主要基于循环复杂度的计算。循环复杂度是一种表示程序复杂度的软件度量,由程序流程图中的“基础路径”数量得来。

下面我将从程序结构,公测、互测以及bug分析几个方面来总结我第一单元的三次作业。

二、第四次作业(PTA作业集4)

2.1作业要求

数字电路是一种处理离散信号的电子电路。电路中包含与门、或门、非门、异或门、同或门五种元件。用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。
请编程实现数字电路模拟程序

2.2实现方式

全部使用静态全局 ArrayList存储电路所有数据,线性遍历完成解析、信号迭代仿真、分组排序输出:

  1. 读取并解析顶层 INPUT 初始信号;
  2. 读取所有导线语句 [源 目标1 目标2];
  3. createNewGate () 创建逻辑门;
  4. 迭代仿真信号传导(核心 while 循环);
  5. 分组、冒泡排序、打印结果;

2.3代码规模

第四次作业代码规模如下图

屏幕截图 2026-05-17 143234

2.4类图

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

UML4

2.5复杂度分析

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

屏幕截图 2026-06-22 162936

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代码规模

第五次作业的代码规模如下:

屏幕截图 2026-05-17 143234

3.4类图

第五次作业类图如下:

UML5

3.5复杂度分析

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

屏幕截图 2026-06-22 163458

3.6Bug分析

3.6.1公测

  • 输出展示缺陷:失效元件直接隐藏输出,无法区分是解析失败还是引脚信号不全;
  • 电路规则校验缺失:未检测同一输入引脚多条导线驱动冲突,后覆盖前值,逻辑结果错误无提示;
  • 缺少异常捕获,数字转换直接崩溃;

3.6.2互测

  • 让同学测试了我的代码,主要问题如下:
  • 架构与存储缺陷:全局静态容器耦合高,大数据量效率低;无缓存 Map 优化;
  • 引脚校验逻辑漏洞:仅校验输入控制引脚是否存在源,滞后更新会导致计算出错;
  • 内存复用问题:无分区隔离,同名顶层信号与元件引脚会互相覆盖;

3.6.3测试方法

  • 功能用例测试:基础门、三态门、译码器、选择器、分配器单电路用例;多级串联组合电路;畸形非法输入用例,验证运算、解析、输出正确性;
  • 边界值测试:最小 1 控制端器件、最大多路译码 / 分配器;引脚全部悬空、仅单路有效输入;0/1 边界电平、超长串联电路;
  • 对比校验测试:逻辑计算类 Bug;

四、第六次作业(PTA作业集6)

4.1作业要求

4.2实现方法

4.3代码规模

第六次作业的代码规模如下:

屏幕截图 2026-06-22 112153

4.4类图

第六次作业类图如下:

UML6

4.5复杂度分析

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

屏幕截图 2026-06-22 163931

4.6Bug分析

4.6.1公测

  • 超长输入文本、大量连线导致信号循环更新超时、结果偏移;
  • 偶现稳态无法收敛、死循环(极端输入下 changed 持续 true);

4.6.2互测

  • 工厂模式实现不规范、开闭原则破坏;
  • 重复引脚冲突校验未去重,路径前缀拼接遗漏,嵌套输出名称错误;

4.6.3测试方法

  • 边界值:3 层以上嵌套子电路、一条连线数十个目标引脚、无限引脚与门;
  • 异常用例:重复驱动引脚、非法连线、空输入;

五、踩坑心得与错误集锦

本次电路模拟器采用工厂模式开发,踩坑颇多:迭代直接修改信号网导致多层子电路计算出错;输出路径拼接遗漏前缀;连线同引脚误判冲突;GateInfo 封装差,工厂 switch 违反开闭原则,多层嵌套用例大量失准,后续需用临时信号表、完善参数封装。

六、收获总结

本次完成逻辑电路模拟器,运用简单工厂与组合模式实现门电路、嵌套子电路。开发中踩坑众多,迭代直接修改信号网络造成多层子电路计算偏差,输出路径拼接出错。通过修复临时信号存储、完善路径拼接、规范参数封装加深对设计模式理解,学会分层排查逻辑缺陷,提升边界用例测试意识。

七、改进建议

对于Java面向对象程序设计,我认为这门课多在于学生的主观能动性,课上老师提供的是一个方向与思路,给你一些新的知识点的先导,后续掌握知识的过程需要学生本人去主动探索和学习,但对于现在的学生来说,他们会持续迷茫,缺少自律性和更加注重享受快乐的即时性,对于作业集的难度加大,大部分学生的能力远不能够去自我完成,所以我觉得在网课上可以再深入讲解,题目上有个循序渐进的过程,以及在写题目之前能够将该题目所需的知识点写出来,便于掌握能力去解决。对于平时,我觉得可以出点简单测试如线上考试那种,可以巩固知识点。

posted @ 2026-06-22 11:32  hhhhhharibo  阅读(5)  评论(0)    收藏  举报