(1)前言:
本篇文章总体分析PTA中题目集8-题目集9:
<1> 题目集8总共3道题目,前2道均为简单题,主要分别考察对NCHU_点线面问题和NCHU_雨刷问题的扩展继承和多态;第三道题为中等题,考察对NCHU_航空货运管理系统的类设计,以及类间关系设计。
<2> 题目集9总共3道题,前两道均为简单题,NCHU_魔方问题考核抽象类的继承和多态,实现程序的扩展;NCHU_点线面问题(容器类)考核对容器的使用(ArrayList和LinkedList)实现对点,线和面对象的增删改查和遍历操作;第三道为中等题,为题目集8的NCHU_航空货运管理系统程序的后续重构以及继承和多态的设计,重点实现对客户类型(Customer),支付方式(PayMethod)和货物类型(Cargo)的泛化处理。
(2)设计与分析
1. 题目集8 NCHU_航空货运管理系统(类设计):
题目分析:
点击查看输入输出格式:
**输入格式:**
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
**输出格式:**
**① 如果订单中货物重量超过航班剩余载重量**,
程序输出The flight with flight number:航班号has exceeded its load capacity and cannot carry the order. ,程序终止运行。
**② 如果航班载重量可以承接该订单**,输出如下:
客户:姓名(电话)订单信息如下:
-----------------------------------------
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):(货物计费重量总和)(非实际总重量)
微信支付金额:
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
点击查看输入输出样例1:
**输入样例1:**
C002
张伟
13712345678
北京市朝阳区
4
P001
电子产品
50
30
20
2
P002
办公文具
40
25
15
5
F005
实验器材
30
40
50
12
E003
防护包装
60
60
60
32
CA1501
北京市首都国际机场
上海浦东国际机场
2025-05-10
100
ORD20250424-006
2025-04-24
北京市海淀区中关村
李强
13987654321
上海浦东新区
王芳
15823456789
**输出样例1:**
客户:张伟(13712345678)订单信息如下:
-----------------------------------------
航班号:CA1501
订单号:ORD20250424-006
订单日期:2025-04-24
发件人姓名:李强
发件人电话:13987654321
发件人地址:北京市海淀区中关村
收件人姓名:王芳
收件人电话:15823456789
收件人地址:上海浦东新区
订单总重量(kg):58.0
微信支付金额:1850.0
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 电子产品 5.0 35.0 175.0
2 办公文具 5.0 35.0 175.0
3 实验器材 12.0 35.0 420.0
4 防护包装 36.0 30.0 1080.0
设计类图:

SouceMonitor分析图:




对源码的分析:
高复杂度模块:
Cargo.java的MaxComplexity达到6,表明存在高度复杂的代码逻辑(如深层嵌套、多重条件分支)。应该对该文件中的高复杂度方法进行重构,采用策略模式或分解为多个单一职责的方法。
平均复杂度:
多数文件的AvgComplexity在1.0-1.67之间,整体复杂度可控,但需关注Calculate.java(Avg 1.67)中可能存在的冗余逻辑。
分支覆盖率低下:
Calculate.java分支覆盖率仅11.1%,Customer.java和Flight.java为0%,表明对条件分支(如if/else、switch)的测试严重缺失。需补充测试用例。
注释比例偏低:
除IllegalOverweight.java(42.9%)和Information.java(33.3%)外,其他文件注释比例均低于25.7%(如Customer.java仅2%)。建议在关键算法、复杂逻辑处增加文档注释(如Javadoc),提升可读性。
2. 题目集9 NCHU_航空货运管理系统(继承与多态):
点击查看输入输出格式:
**输入格式:**
客户类型[可输入项:Individual/Corporate]
客户编号
客户姓名
客户电话
客户地址
货物类型[可输入项:Normal/Expedite/Dangerous]
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
支付方式[可输入项:Wechat/ALiPay/Cash]
**输出格式:**
客户:姓名(电话)订单信息如下:
-----------------------------------------
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
[微信/支付宝/现金]支付金额:
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
点击查看输入输出样例1:
**输入样例1:**
Individual
C004
陈明
19676543210
广州市天河区
Dangerous
7
E001
精密仪器
60
80
100
110
E002
实验器材
30
40
50
12
E003
防护包装
60
60
60
32
J001
电子产品
30
40
20
2.5
J002
机械配件
55
75
40
28
J003
办公设备
60
80
100
72
J004
宣传资料
25
35
5
0.7
MU5302
广州白云国际机场
成都双流国际机场
2025-05-12
3000
ORD20250412-003
2025-04-12
广州市越秀区环市东路368号
赵敏
13766523212
成都市武侯区人民南路四段1号
周涛
15478965432
Wechat
**输出样例1:**
客户:陈明(19676543210)订单信息如下:
-----------------------------------------
航班号:MU5302
订单号:ORD20250412-003
订单日期:2025-04-12
发件人姓名:赵敏
发件人电话:13766523212
发件人地址:广州市越秀区环市东路368号
收件人姓名:周涛
收件人电话:15478965432
收件人地址:成都市武侯区人民南路四段1号
订单总重量(kg):270.7
微信支付金额:8224.5
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 精密仪器 110.0 20.0 2200.0
2 实验器材 12.0 80.0 960.0
3 防护包装 36.0 50.0 1800.0
4 电子产品 4.0 80.0 320.0
5 机械配件 28.0 50.0 1400.0
6 办公设备 80.0 30.0 2400.0
7 宣传资料 0.7 80.0 58.3
设计类图:

设计类图分析:
在上一次题目集8的基础上,将客户类型(Customer),支付方式(PayMethod)和货物类型(Cargo)进行泛化处理为抽象类,不同类型的子类继承它们并重写方法,实现多态。
SouceMonitor分析图:


对源码的分析:
截图中Kiviat图显示:
平均复杂度异常:
Calculate.java(AvgSymptess=0.79)平均符号复杂度较低,但AvgStmts/Method=3.73表明方法内语句数较多,可能存在冗余计算或过长方法。
最大复杂度(11)和平均复杂度(11)严重偏离中心
平均块深度(2.58)接近合理范围上限
注释覆盖率(31.5%)和分支比例(21.7%)指标需要优化
块直方图显示深度3-5的代码块占比显著(红色柱状),需要优先重构这些区域的代码。
(3)采坑心得
1. 题目集8 NCHU_航空货运管理系统(类设计):
出现的问题:

对应提交的错误源码:
点击查看代码
//订单总质量
public double totalMass() {
double totalmass = 0.0;
for(Cargo weight : cargos) {
totalmass += weight.getWeight();
}
return totalmass;
}
改进后提交的正确源码:
点击查看代码
//订单总质量(计费)
public double totalChargeMass() {
double totalmass = 0.0;
for(Cargo weight : cargos) {
totalmass += weight.chargeWeight();
}
return totalmass;
}
采坑心得体会:
① 第一次计算“订单总重量”时加和的是实际的货物重量,而正确的逻辑应为加和计费的货物重量。
2. 题目集9 NCHU_点线面问题再重构(容器类):
出现的问题:

对应提交的错误代码:
点击查看代码
public void remove(int index) {
if(index < list.size())
list.remove(index - 1);
else
return;
}
改进提交后正确代码:
点击查看代码
public void remove(int index) {
if(index <= list.size())
list.remove(index - 1);
}
采坑心得体会:
① 未考虑移除最后添加的元素,即 index == list.size() 的情况成立。
(4)改进建议
1.重构高复杂度模块:
优先重构Cargo.java和Calculate.java,简化条件分支。
2.增强测试覆盖:
针对分支覆盖率低于20%的文件补充单元测试。
3.完善注释规范:
为关键类/方法添加文档注释,明确输入输出、异常类型。
4.职责拆分:
将Main.java的启动逻辑与业务逻辑分离,拆分大文件为独立服务类。
5.使用策略模式或状态模式替代条件分支。
6.将长方法拆分为多个单一职责的小方法。
7.提取重复代码为独立方法,例如将运费计算逻辑封装到工具类中.
(5)总结
通过题目集8-9的迭代设计,NCHU_航空货运管理系统在以下层面实现提升:
1.从面向过程的类设计演进到基于抽象与多态的扩展架构。
2.通过边界条件测试、复杂度治理降低运行时风险。
3.规范化注释与模块拆分,提升可维护性。
浙公网安备 33010602011771号