面向对象第二次blog
前言
题量和难度
题目集8
3题 中
题目集9
3题 中高
设计和分析
题目1:
7-43 NCHU_航空货运管理系统(类设计)
分数 60
中等
作者 段喜龙
单位 南昌航空大学
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第九周作业题目说明.pdf
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为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位小数。
输入样例:
在这里给出一组输入。例如:
10001
郭靖
13807911234
南昌航空大学
2
101
发电机
80
60
40
80
102
信号发生器
55
70
60
45
MU1234
昌北国际机场
大兴国际机场
2025-04-22
1000
900001
2025-04-22
南昌大学
洪七公
18907912325
北京大学
黄药师
13607912546
输出样例:
在这里给出相应的输出。例如:
客户:郭靖(13807911234)订单信息如下:
-----------------------------------------
航班号:MU1234
订单号:900001
订单日期:2025-04-22
发件人姓名:洪七公
发件人电话:18907912325
发件人地址:南昌大学
收件人姓名:黄药师
收件人电话:13607912546
收件人地址:北京大学
订单总重量(kg):125.0
微信支付金额:3350.0
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 发电机 80.0 25.0 2000.0
2 信号发生器 45.0 30.0 1350.0
复杂度分析:
customer.java

有效语句数 (Statements):39
有效代码语句总数,表明文件实际执行的逻辑代码量较多。
分支语句百分比 (Percent Branch Statements):0
表示分支语句(如 if-else、switch 等)占比为 0%。分支语句比例较少,说明文件逻辑简洁简单
函数调用语句数 (Method Call Statements):16
表示函数调用的数量占有效语句的大部分,暗示该程序具有较多的功能调用。
注释比例 (Percent Lines with Comments):5%注释比例 (Percent Lines with Comments):5%
注释行占比较低, 5%。建议适当增加注释,提高代码的可读性和可维护性。
Flight.java

函数调用语句数 (Method Call Statements):0
表示函数调用的数量占有效语句的大部分,该程序没有功能调用。
注释比例 (Percent Lines with Comments):3.8%注释比例 (Percent Lines with Comments):3.8%
注释行占比较低, 3.8%。建议适当增加注释,提高代码的可读性和可维护性。
OrderFirm.java

有效语句数 (Statements):31
一共178行,但是有效代码语句总数31,表明文件实际执行的逻辑代码比例较少,
分支语句百分比 (Percent Branch Statements):0
表示分支语句(如 if-else、switch 等)占比为 0%。分支语句比例较少,说明文件逻辑简洁简单
函数调用语句数 (Method Call Statements):14
表示函数调用的数量占有效语句的一半,暗示该程序具有较多的功能调用。
注释比例 (Percent Lines with Comments):5%注释比例 (Percent Lines with Comments):2.2%
注释行占比很低, 2.2%。建议增加注释占比,继续提高代码的可读性和可维护性。
Main.java

有效语句数 (Statements):48
一共91行,但是有效代码语句总数48,表明文件实际执行的逻辑代码比例很大
分支语句百分比 (Percent Branch Statements):6.3
表示分支语句(如 if-else、switch 等)占比为 6.3%。分支语句比例适中
函数调用语句数 (Method Call Statements):38
表示函数调用的数量占有效语句的大部分,暗示该程序具有很多的功能调用。
注释比例 (Percent Lines with Comments):5%注释比例 (Percent Lines with Comments):15.4%
注释行占比很高, 15.4%。继续保持
题目2
航空快递以速度快、安全性高成为急件或贵重物品的首选。本题目要求对航空货运管理系统进行类设计,具体说明参看说明文件。
OO第九周作业题目说明.pdf
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为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位小数。
输入样例:
在这里给出一组输入。例如:
10001
郭靖
13807911234
南昌航空大学
2
101
发电机
80
60
40
80
102
信号发生器
55
70
60
45
MU1234
昌北国际机场
大兴国际机场
2025-04-22
1000
900001
2025-04-22
南昌大学
洪七公
18907912325
北京大学
黄药师
13607912546
输出样例:
在这里给出相应的输出。例如:
客户:郭靖(13807911234)订单信息如下:
-----------------------------------------
航班号:MU1234
订单号:900001
订单日期:2025-04-22
发件人姓名:洪七公
发件人电话:18907912325
发件人地址:南昌大学
收件人姓名:黄药师
收件人电话:13607912546
收件人地址:北京大学
订单总重量(kg):125.0
微信支付金额:3350.0
货物明细如下:
-----------------------------------------
明细编号 货物名称 计费重量 计费费率 应交运费
1 发电机 80.0 25.0 2000.0
2 信号发生器 45.0 30.0 1350.0
复杂度分析
修改不多,添加了继承和多态的相关代码,扩写了有关的新的选项相关的代码,复杂度基本不变
customer.java

Flight.java

Good.java

Main.java

OrderFirm.java

采坑心得
1
原始实现中的calculateSumBillingWeight()和calculateSumValue()方法每次调用都会遍历整个goodList来重新计算总计费重量和总计费金额。这在货物数量较大时会导致性能问题。为了减少不必要的重复计算,可以在添加或更新货物时实时更新总计费值,而不是每次都重新遍历整个列表:
public void addGood(Good good) {
if (goodList == null) {
goodList = new LinkedList<>();
}
good.calculateBillingWeight();
good.calculatePrice();
goodList.add(good);
updateTotals(good);
}
private void updateTotals(Good good) {
sumBillingWeight += good.getBillingWeight();
sumBilling += good.getBilling();
}
这样,每次添加新货物或修改现有货物的信息时,只需简单地更新总计费重量和总计费金额即可,避免了重复遍历整个货物列表。
2
原printGoodListInfo()方法包含了所有关于打印货物明细的逻辑,这使得该方法显得冗长且难以理解。我将其拆分为几个子函数:
private void printHeader() {
System.out.println("\n货物明细如下:");
System.out.println("-----------------------------------------");
System.out.println("明细编号\t货物名称\t计费重量\t计费费率\t应交运费");
}
private void printGoodsDetails() {
for (int i = 0; i < goodList.size(); i++) {
Good good = goodList.get(i);
System.out.printf("%d\t%s\t%.1f\t%.1f\t%.1f\n",
i + 1, good.getName(), good.getBillingWeight(), good.getRate(), good.getBilling());
}
}
public void printGoodListInfo() {
printHeader();
printGoodsDetails();
}
这种方法不仅使每个函数的功能更加明确,也便于未来的扩展和维护。
改进建议
1. 数据结构的选择
在当前的OrderFirm类中,对于goodList属性,如果需要频繁地根据计费重量排序,可以考虑使用TreeSet或PriorityQueue来代替List。
2. 减少重复计算
在OrderFirm类中的calculateSumBillingWeight()和calculateSumValue()方法中,每次调用都会遍历整个goodList列表。为了减少重复计算,可以在添加或修改货物时更新总计费重量和总计费金额,而不是每次都重新计算。
3. 提高代码可读性与模块化
- 将复杂的打印逻辑拆分为更小的方法。
- 在
printGoodListInfo()方法中,循环变量i可以直接从0到goodList.size(),不需要使用<= goodList.size()-1这种写法。
4. 简化条件判断
虽然在这个例子中没有特别复杂的条件判断,但在编写类似Good类的calculatePrice()方法时,可以考虑使用switch语句或者将价格规则存储在一个映射表中以简化代码。
总结
在本次项目中,我开发并优化了一个航空货运管理系统的模拟程序。该系统旨在帮助用户通过命令行界面进行货物运输的订单管理,包括计算货物的计费重量、运费以及打印订单详情等功能。通过对代码的分析与优化,我不仅增强了对数据结构和算法的理解,还学习了如何编写更高效且易于维护的代码。
浙公网安备 33010602011771号