航空器配载与货运管理系统作业集 1~3 总结

一、前言
本阶段三次作业围绕航空器配载与货运管理系统迭代开发,从基础的货物管理,到多货舱划分,再到引入旅客管理与载重平衡计算,实现了业务复杂度的层层递进。
作业 1(基础版):核心是实现单货舱的货物录入、装载与容量校验,掌握 Java 基础语法、类与对象的封装思想,题量小,难度低,重点在熟悉业务场景与代码结构。
作业 2(多货舱版):新增前 / 后货舱划分,引入货舱货架位置管理(Position类),实现货物按重量降序的冒泡排序装载,核心是组合关系设计与算法实现,题量中等,难度主要在类间关系梳理与排序逻辑实现。
作业 3(配平计算版):本次迭代的核心,新增旅客与行李管理、载重平衡计算模块,引入了航空力学中的力矩、重心百分比计算,同时强化了输入校验、边界处理与输出格式规范,题量最大,难度最高,重点在复杂业务公式实现、类间依赖关系设计与鲁棒性处理。
二、设计与分析

第一次作业:基础货运管理系统(V1)

  1. 本次作业设计需求
    搭建货物类 Cargo,存储货物编号、货物重量。
    搭建货舱类 CargoCompartment,实现单货舱货物存放、最大载重限制。
    实现基础功能:货物录入、判断货物是否超重、统计当前货舱总重量。
    完成简单控制台输入货物信息,完成装载逻辑。
    基础数据合法性判断:输入重量不能为负数。
  2. 设计思路与开发步骤
    步骤 1:拆分实体类,明确职责
    按照单一职责拆分两大核心实体:
    Cargo 货物类:只负责保存货物自身数据(id、weight),只提供 getter 取值,不写业务逻辑。
    CargoCompartment 货舱类:负责管理一批货物,保存最大载重、已装载货物数组、已装载数量,提供添加货物、计算总重量核心方法。
    步骤 2:确定核心业务逻辑思路
    货舱内部使用数组存放多个货物,设置固定容量满足作业需求。
    设计addCargo()添加货物方法:
    先判断 当前总重量 + 新货物重量 > 最大载重,超出则装载失败,否则存入数组。
    设计getCurrentWeight()遍历货物数组,累加求出实时总载重。
    步骤 3:主程序流程思路
    控制台依次输入货舱最大载重。
    循环录入多件货物编号与重量。
    调用货舱装载方法,判断是否装载成功并提示。
    最终输出货舱已装载总重量。

复杂度分析:
屏幕截图 2026-05-18 190218

类图:

屏幕截图 2026-05-18 194616

第二次作业:多货舱划分 + 货物排序调度(V2)

  1. 本次作业新增设计需求
    在 V1 基础上迭代升级:
    新增位置类 Position,描述货舱货架行列位置。
    货舱分为前货舱、后货舱双货舱结构。
    新增航班类 Flight,统一管理多个货舱,整合所有货舱资源。
    新增货物调度工具类 LoadDispatcher,手写冒泡排序,实现货物按重量降序排序。
    规范输入结构:分开输入前后舱货架行列、最大载重,再输入货物总数、前后舱分配数量。
    强化装载规则:先排序再分配装载,模拟真实货运优先装载重货。
  2. 设计思路与开发步骤
    步骤 1:新增实体类,完善结构
    Position 位置类:仅存储行、列,生成位置名称,与货舱为组合关系,货舱创建自动生成所有货架位置。
    Flight 航班类:作为统一管理者,存放多个货舱对象,提供添加货舱方法,实现一对多管理。
    步骤 2:算法模块独立拆分
    单独创建LoadDispatcher 调度类,不与实体类耦合。
    严格手写冒泡排序,禁止使用集合排序、Lambda 表达式。
    排序规则:货物重量从大到小降序排列,满足航空重货优先装载业务逻辑。
    步骤 3:输入逻辑重构思路
    先录入前舱、后舱各自货架行列数、最大载重。
    录入总货物数量、分配到前舱的货物数量 p。
    分别录入前舱、后舱所有货物信息,分装成两个货物数组。
    分别对两组货物执行冒泡排序。
    步骤 4:装载执行思路
    排序完成后,依次遍历货物数组,调用对应货舱装载方法。
    装载失败判定超重,给出基础提示。
    航班统一汇总前后舱所有装载数据,为第三次配平计算做数据铺垫。

复杂度分析:
屏幕截图 2026-05-18 190213

类图:

屏幕截图 2026-05-18 194730

第三次作业:旅客管理 + 航空器载重平衡配平计算(V3 最终版)

  1. 本次作业新增设计需求(完整版核心需求)
    在 V2 全部功能基础上,完成航空核心载重平衡配平系统:
    新增行李类 Luggage、旅客类 Passenger,实现旅客 + 随身行李管理。
    严格组合关系:行李对象必须在旅客构造方法内部 new 创建,外部不能传入。
    固定标准旅客体重 75kg,旅客总重 = 75kg + 行李重量。
    新增统一输入校验工具类 InputValidator,全局拦截所有非法输入。
    新增配平计算工具类 WeightBalanceCalculator,严格按照航空力矩公式完成重心计算。
    定义系统全局静态常量:空机重量、各区域力臂、MAC 参数、安全重心百分比范围。
    完成全套配平计算公式:旅客力矩、货舱力矩、全机总重量、总力矩、实际重心、重心百分比。
    配平判定:25.0%~38.0% 为安全 GREEN,其余判定危险 RED。
    完善所有异常输出:负数提示、范围超限提示、前后舱超载专属警告。
    输出格式严格与题目样例一字不差,空格、小数、换行、文字全部对齐。
  2. 设计思路与开发步骤
    步骤 1:新增旅客与行李组合结构设计思路
    Luggage 行李类:只存储行李重量,极简实体类。
    Passenger 旅客类
    私有成员包含final 行李对象,保证生命周期绑定。
    构造方法只接收行李重量,内部自动 new 行李对象,满足题目强制组合要求。
    提供方法计算单人总重量(标准体重 + 行李)。
    Flight 航班类升级:新增旅客集合,实现航班批量管理旅客。
    步骤 2:全局输入校验统一化思路
    抽离所有输入判断逻辑,封装为InputValidator工具类。
    提供三类静态方法:校验整数非负、校验浮点数非负、数值区间范围校验。
    所有输入数据全部先走校验,一旦非法直接输出指定语句并终止程序。
    重点校验:前舱货物数量 p 必须满足 0 ≤ p ≤ m。
    步骤 3:航空配平计算类设计核心思路
    WeightBalanceCalculator 纯工具类:
    不定义航班成员变量,仅通过方法形参传入 Flight 对象,实现依赖关系。
    所有航空基准数据全部定义为静态常量,统一管理便于修改。
    严格按照题目五步公式顺序编写代码:
    1)计算旅客总重量 + 旅客总力矩
    2)遍历所有货舱,计算货物总重 + 货舱总力矩
    3)累加空机数据,算出全机总重量、全机总力矩
    4)计算实际重心 CG
    5)换算 % MAC 重心百分比
    临界值判定思路:
    采用大于等于、小于等于,边界值 25.0、38.0 直接判定为安全,解决测试点临界错误。
    步骤 4:装载超载警告逻辑优化思路
    装载前预先计算装载后总重量,不再装载后再取值。
    前后舱超载分别输出题目指定格式警告语句,区分 [1] 前舱、[2] 后舱。
    出现超载立即终止程序,不再继续执行后续计算。

三、采坑心得

  1. 临界值判断错误
    问题表现:测试点始终答案错误,多次提交无法通过。
    根因分析:最初的代码中,配平安全判断条件写反了,误将>= CG_MIN && <= CG_MAX写成了> CG_MIN && < CG_MAX,导致临界值 25.0% 和 38.0% 被误判为危险,与题目要求不符。
    解决方法:对照题目公式,重新编写判断逻辑,使用>=和<=,并通过样例数据验证临界值计算结果,最终解决了该问题。

  2. 输出格式不匹配
    问题表现:舱单输出的空格、缩进、符号与题目样例不一致,导致多个测试点 “答案错误”。
    典型问题:
    标题前缺少固定空格,如航班 CA1234 载重平衡舱单前未按题目要求加 5 个空格。
    货物箭头->前的空格数量错误,导致格式与样例不符。
    空机力臂输出为16.25,未按样例保留一位小数为16.3。
    解决方法:逐行对照题目输出样例,对所有输出语句进行格式化调整,使用printf控制小数位数,确保每个空格、符号、换行都与题目要求完全一致。

  3. 输入校验顺序错误
    问题表现:前舱货物数量p超出0~m范围时,程序未按要求终止,导致测试点不通过。
    根因分析:最初的代码中,对p的范围校验放在了读取货物信息之后,导致p超出范围时,输入流已经读取了部分货物数据,程序异常终止,无法正确输出提示信息。
    解决方法:调整校验顺序,在读取前舱货物信息之前,先对p进行范围校验,超出范围则立即终止程序,保证了输入校验的有效性。

  4. 货舱超载警告数值错误
    问题表现:货舱超载时,警告信息中的当前载重数值错误,与题目要求不符。
    根因分析:最初的代码中,警告信息直接使用front.getCurrentWeight(),但此时货物已经被装载,导致显示的数值为装载后的重量,而非题目要求的 “装载前当前重量 + 货物重量”。
    解决方法:在调用addCargo之前,提前计算当前重量 + 货物重量,并将该数值传入警告信息,确保数值与题目要求一致。

  5. 组合关系实现不规范(旅客与行李)
    问题表现:最初的代码中,Luggage对象在外部创建后传入Passenger构造器,违反了题目 “行李必须在旅客构造器内部 new” 的要求。
    解决方法:删除Passenger的Luggage参数,改为接收行李重量,在构造器内部new Luggage(luggageWeight),并将Luggage声明为private final,确保外部无法修改,严格实现组合关系。

复杂度分析:
屏幕截图 2026-05-18 190156

类图:

image

四、改进建议

  1. 代码可扩展性优化
    目前CargoCompartment固定支持 2 个货舱,若后续扩展更多货舱,需修改Flight类的compartments数组长度。可改为使用ArrayList动态管理货舱,提升代码的可扩展性。
    旅客与货物的排序逻辑目前仅支持按重量降序,可将排序规则抽象为方法参数,后续可扩展按货物编号、旅客行李重量等多种规则排序。
  2. 异常处理精细化
    目前所有异常处理均直接终止程序,可优化为自定义异常类,对不同类型的异常(如输入格式错误、数值非法、业务逻辑错误)进行分类处理,同时返回更友好的错误信息。
    增加对Scanner输入流的异常处理,避免因输入格式错误(如输入非数字)导致程序崩溃。
  3. 代码复用性提升
    CargoCompartment的addCargo方法中,超载判断逻辑可提取为独立的canAddCargo方法,简化代码结构,提升可读性。
    旅客总重量、货物总重量的计算逻辑可封装为工具方法,在多个模块中复用,减少重复代码。

五、总结

  1. 本阶段学习收获
    通过三次作业的开发,我系统掌握了以下知识与技能:
    面向对象设计:熟练运用类与对象、封装、组合关系等思想,实现业务逻辑的模块化拆分,严格遵循单一职责原则。
    Java 基础语法:巩固了数组、集合(ArrayList)、循环、分支、方法重载等基础语法,提升了代码的规范性与可读性。
    算法实现:掌握了冒泡排序的手写实现,理解了算法与业务场景的结合,满足题目对算法的约束要求。
    鲁棒性处理:理解了输入校验、边界值判断、异常处理的重要性,学会了如何通过代码保证程序在非法输入与异常场景下的稳定性。
    工程规范:深刻体会到输出格式、代码结构、命名规范对程序正确性的影响,养成了对照需求逐行检查的习惯。
  2. 后续学习方向
    深入学习面向对象的高级特性,如多态、接口、设计模式,为后续复杂系统开发打下基础。
    学习单元测试框架(如 JUnit),掌握单元测试用例的编写方法,提升代码的可靠性与可维护性。
    学习 Java 集合框架的底层原理,理解ArrayList与LinkedList的区别,以及不同场景下的集合选型。
    深入学习航空配载的业务知识,理解重心计算、力矩平衡的物理原理,提升对业务逻辑的理解深度。
  3. 对课程与作业的建议
    三次作业的迭代设计非常合理,从基础到复杂,逐步引入新的知识点与业务逻辑,能够很好地引导学生循序渐进地掌握面向对象开发的方法。
    建议后续作业可提供部分测试用例的输入输出样例,帮助学生更快地定位输出格式与计算逻辑的问题,减少无效提交。
    建议在课堂中增加对代码设计规范、类间关系设计的讲解,帮助学生更好地理解题目中的设计要求,避免因设计错误导致扣分。
posted @ 2026-05-18 19:52  情绪失控  阅读(19)  评论(0)    收藏  举报