三次航空器配载大作业总结:从单一货舱到配平计算的迭代成长

前言
拿起这三次 Java 航空器配载大作业,能清晰感受到课程循序渐进的设计思路 —— 从最基础的单一货舱货物装载、重量排序,到多货舱管理、独立职责拆分,再到最终的航空专业配平计算、力矩重心校验,核心考察点始终围绕面向对象单一职责原则(SRP)、类与类之间的组合 / 聚合关系、数据校验、自定义排序算法,以及真实业务场景的逻辑落地。
题目梯度非常贴合 Java 初学者的学习节奏,第一次作业简单上手,熟悉类的封装和基础排序;第二次迭代拆分职责,强化多类协作;第三次结合航空专业知识,加入复杂计算和输入鲁棒性要求。从一开始只会写简单的实体类,到后来能独立完成 10 个类的协作开发,整个过程踩坑无数,也收获满满,接下来就和大家分享我的代码分析、思路与心得。

第一次航空器配载作业:单一货舱基础配载
题目分析
这是配载系统的入门版本,核心需求非常简洁:
定义航班类、货物类,严格遵循单一职责;
输入航班号、最大载重、货物信息;
按货物重量从高到低排序后装载;
实时计算总重量,判断是否超载;
按格式输出货物信息、总重量和配载状态。
考察重点:Java 类的封装、选择排序算法、控制台输入输出、基础业务逻辑判断。
设计思路
类拆分:货物类(HuoWu)只管理名称和重量;航班类(HangBan)管理航班信息、货物数组、总重量计算和超载判断,完全符合 SRP 原则;
装载逻辑:先接收所有货物输入,存入数组,再用选择排序实现重量降序;
超载判断:实时累加货物重量,与最大载重对比,输出对应状态;
输入处理:处理字符串和数值输入,规避换行符带来的输入异常。
问题与解决
排序逻辑错误:一开始写反了判断条件,导致升序输出,修改比较运算符后解决;
输入异常:nextLine()读取数值时捕获回车符,导致数据读取错位,增加空nextLine()消化换行符;
小数格式:输出要求保留 1 位小数,使用String.format统一格式化。

1779067484566

1779067511175

第二次航空器配载作业:多货舱管理与重量排序装载
题目变化 & 分析
在第一次作业基础上迭代升级,是本次大作业的核心难点:
新增多货舱功能,每个货舱独立最大载重、位置网格;
强制要求单一职责原则,拆分出位置类、货舱类、调度类、输入校验类;
货物需指定目标货舱,按重量降序装载,校验货舱是否超载;
新增航班全局校验:总重量对比最大起飞重量、最大业载重量;
同等重量货物保持输入顺序,使用冒泡排序。
考察重点:类的组合 / 聚合关系、多类协作、自定义排序、多层超载判断、输入规范化。
设计思路
精细化类拆分(严格 SRP):
Position:货舱位置,仅管理行列;
Cargo:货物,管理名称、重量、目标货舱;
CargoCompartment:货舱,管理载重、货物装载;
Flight:航班,管理货舱数组、总重量计算;
LoadDispatcher:调度类,仅负责货物排序;
InputValidator:校验类,仅负责数据范围校验;
装载逻辑:先排序货物,再依次尝试装入目标货舱,货舱内部判断是否超载;
双层超载判断:货舱独立超载 + 航班全局超载;
输出规范:严格按照题目要求输出装载结果、货舱状态、全局状态。
问题与解决
空指针异常:查找货舱时未找到对应 ID,返回 null 后直接调用方法,增加非空判断解决;
排序不符合要求:一开始用了Collections.sort,题目要求手动冒泡排序,重写排序逻辑;
全局状态判断遗漏:同时超过起飞重量和业载重量时,输出错误,优化多条件分支判断。

1779067588130

1779067597761

第三次航空器配载作业:配平计算(最终迭代版)
题目更改 & 核心分析
这是难度最高的最终版本,完全贴合真实航空业务:
新增旅客、行李类,旅客固定体重 75kg,行李为组合关系;
核心新增力矩、重心、% MAC 配平计算,这是航空配载的核心专业知识;
严格限制:禁止继承、接口、多态,类数控制在 10 个左右;
超强鲁棒性要求:输入负数、超出范围立即终止程序;
货舱固定为前舱(ID=1)、后舱(ID=2),必须用冒泡排序;
超载立即输出警告并终止程序,最终输出专业配平舱单。
考察重点:类的细粒度拆分、组合关系实现、航空专业公式计算、输入合法性校验、程序鲁棒性、复杂格式化输出。
设计思路
新增类设计:
Luggage:行李,仅管理重量;
Passenger:旅客,组合行李,计算总重量(75kg + 行李);
WeightBalanceCalculator:纯计算工具类,所有配平公式封装于此;
优化InputValidator:统一处理非负数、范围校验,非法直接退出;
核心计算逻辑:严格按照题目 5 步公式,计算总重量、总力矩、实际重心、% MAC,最终判断安全 / 危险;
输入处理:全程使用校验类方法,负数、非法值立即终止;
装载校验:前 / 后舱超载立即警告并退出,不执行后续计算;
输出:完全还原航空配平舱单格式,小数统一保留 1 位。
问题与解决
空数组访问:无旅客 / 无货物时,遍历集合报错,增加空值判断;
计算精度错误:重心百分比公式写错,对照题目公式逐行核对修正;
程序终止逻辑:超载后未立即退出,增加isOverload标记,校验后直接System.exit(0);
排序错误:按货物编号排序时逻辑混乱,重写冒泡排序,保证编号升序输出。
1779067611370

1779067621168

踩坑心得
三次作业迭代下来,踩的坑几乎覆盖了 Java 面向对象新手所有易错点:
第一次作业:没提前规划类结构,直接上手写代码,导致排序、输出反复修改,浪费大量时间;输入换行符处理不熟练,一直报数据格式错误,最后还是缺类导致没有满分。
第二次作业:违背单一职责原则,把排序、装载、校验全写在主类,代码混乱不堪;空指针异常频发,都是类之间调用时未做非空判断;多条件超载判断逻辑混乱,输出结果错误。
第三次作业:专业公式理解不透彻,重心计算错误;旅客与行李的组合关系写错,行李无法初始化;输入校验不严谨,非法数据导致程序崩溃;未遵守题目要求,误用了Collections.sort,被判定扣分。
最大的感悟:先设计后编码真的太重要了!第三次作业因为提前画好了类图、梳理了计算流程,写代码时一气呵成,修改量远小于前两次。

改进建议
严格遵守设计原则:单一职责原则不是空话,一个类只做一件事,后期迭代修改会轻松十倍;
输入校验前置:所有数据先校验再处理,尤其第三次作业,非法输入直接终止;
算法严格按要求:题目指定冒泡排序就不要用工具类,细节决定得分;
模块化拆分:把输入、计算、输出完全分离,后期需求变更只需要修改对应模块,不用动全部代码;
专业公式逐行核对:配平计算类作业,公式错一步,结果全错,一定要逐行对照题目要求。

总结
这三次航空器配载大作业,完美完成了我从 Java 语法新手到面向对象编程的思维转变。
从最开始只会写两个简单实体类,到后来独立完成 10 个类的协作开发,理解了组合、聚合、单一职责的真正含义;从只会简单的输入输出,到能实现航空专业的力矩、重心计算,不仅提升了编程能力,更学会了先设计、后编码、模块化开发的良好编程习惯。
对比最开始写代码的手忙脚乱,现在能清晰梳理业务逻辑、拆分类职责、处理异常、优化代码,这种成长是最珍贵的。同时也建议老师可以增加更多测试样例,让我们能更清晰地定位代码问题,而不是盲目排查~
总的来说,这三次大作业干货满满,既巩固了 Java 核心知识,又接触了真实的航空配载业务,为后续的编程学习打下了坚实的基础!👍

posted @ 2026-05-18 09:33  weoo2399  阅读(5)  评论(0)    收藏  举报