面向对象第二次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属性,如果需要频繁地根据计费重量排序,可以考虑使用TreeSetPriorityQueue来代替List

2. 减少重复计算

OrderFirm类中的calculateSumBillingWeight()calculateSumValue()方法中,每次调用都会遍历整个goodList列表。为了减少重复计算,可以在添加或修改货物时更新总计费重量和总计费金额,而不是每次都重新计算。

3. 提高代码可读性与模块化

  • 将复杂的打印逻辑拆分为更小的方法。
  • printGoodListInfo()方法中,循环变量i可以直接从0到goodList.size(),不需要使用<= goodList.size()-1这种写法。

4. 简化条件判断

虽然在这个例子中没有特别复杂的条件判断,但在编写类似Good类的calculatePrice()方法时,可以考虑使用switch语句或者将价格规则存储在一个映射表中以简化代码。

总结

​ 在本次项目中,我开发并优化了一个航空货运管理系统的模拟程序。该系统旨在帮助用户通过命令行界面进行货物运输的订单管理,包括计算货物的计费重量、运费以及打印订单详情等功能。通过对代码的分析与优化,我不仅增强了对数据结构和算法的理解,还学习了如何编写更高效且易于维护的代码。

posted on 2025-05-21 14:34  轶方  阅读(19)  评论(0)    收藏  举报