当前位置: 首页 > news >正文

作业集1-3总结

前言:
本阶段三次作业集以航空货运与载重平衡为主题,逐步构建了一个完整的航班配载系统。三次作业的难度呈阶梯式上升,从简单的货物装载到引入多货舱管理,再到最终的重量与平衡计算,知识点层层递进。
题量与难度分析:
作业 代码行数 类数量 难度系数
作业一 约150行 4个 ★
作业二 约250行 8个 ★★
作业三 约300行 10个 ★★★
作业一掌握基本的类设计和集合使用;作业二在此基础上增加了多货舱管理的复杂度,要求理解类之间的协作关系;作业三引入了物理计算公式,需要将业务逻辑准确地转化为代码实现。
第一次作业集
1、知识点
(1) Java语法基础:
类与对象定义
构造方法
属性封装(private)
方法定义与调用
this关键字

(2) 集合框架:
ArrayList声明与初始化
泛型使用
add() / get() / size()
集合遍历

(3) 算法
冒泡排序(降序)
累加求和

(4) 输入输出
Scanner使用
nextLine()
nextDouble()
nextInt()
printf格式化输出

(5)面向对象
封装
单一职责原则
类间关联关系

(6)业务逻辑
货物重量排序
总重量计算
超载判断
2、类图设计
第一次作业类图如下:(共计4个类)
image
类之间的关系说明:
Flight类聚合Cargo类,即一个航班包含多个货物;CargoSorter类与Flight类之间是依赖关系,排序器需要访问Flight中的货物列表;Main类负责协调所有类的协作。
3、SourceMontor分析
第一次题目集代码规模如下
屏幕截图 2026-05-16 105603
设计亮点
1.单一职责原则:Cargo、Flight、CargoSorter各自承担独立职责。
2.封装性良好:使用private修饰属性,通过getter方法访问。
4、作业一踩坑记录
1、Scanner的nextLine换行问题:
问题描述:在读取航班代号、最大载重、货物数量之后,需要循环读取货物名称和重量。实际运行时发现,第一次读取的货物名称总是空字符串。
(1)测试数据:
text
CA1234
10000.0
2
钢铁
500.0
木材
300.0
(2)实际输出:第一个货物名称为空,重量为500.0
(3)预期输出:第一个货物名称为"钢铁",重量为500.0
(4)问题原因:nextInt方法只读取整数值,不会读取后面的换行符。当循环中第一次调用nextLine时,会立即读取到nextInt留下的换行符,导致货物名称为空字符串。
2、冒泡排序边界条件错误:
(1)问题描述:手写冒泡排序时,程序运行时出现ArrayIndexOutOfBoundsException。
(2)问题代码:
for(int i = 0; i < n-1; i++) {
for(int j = 0; j < n-i; j++) {
if(list.get(j).getWeight() < list.get(j+1).getWeight()) {
}
}
}
(3)问题原因:内层循环中j的最大值为n-i-1,因为需要比较j和j+1。当j = n-i时,j+1 = n-i+1,超出列表范围。
(4)解决方案:内层循环条件改为j < n-1-i。
3、浮点数精度导致超载误判:
(1)问题描述:货物总重量计算后,与最大载重比较时出现误判。
(2)测试数据:
货物1:5000.0kg
货物2:3000.0kg
货物3:2000.0kg
实际总和:10000.000000001
最大载重:10000.0
(3)实际输出:警告:严重超载
(4)预期输出:配载状态:正常
(5)问题原因:浮点数在计算机中以二进制存储,某些十进制小数无法精确表示,累加后产生微小误差。
(6)解决方案:引入误差容忍值EPS=1e-6。
第二次作业集
1、知识点:
(1)Java语法基础
类与对象定义(8个类)
构造方法(带参数初始化)
属性封装(private)
方法定义与调用
this关键字
静态方法(InputValidator)

(2)集合框架
ArrayList声明与初始化
泛型使用(ArrayList、ArrayList
add() / get() / size()
集合遍历(普通for循环、增强for循环)
集合嵌套(Flight存放货舱列表,货舱存放货物列表)

(3)算法
二级排序(重量降序 + 输入顺序升序)
冒泡排序(多条件比较)
线性查找(按ID遍历查找货舱)
累加求和(货舱当前重量计算)

(4)输入输出
Scanner使用
next() / nextDouble() / nextInt()
输入顺序:航班→货舱→货物
关联输入(货物需指定目标货舱ID)
printf格式化输出(装载结果、货舱状态)

(5)面向对象
封装 (属性私有,行为封装)
单一职责原则(每个类只做一件事)
类间关联关系(聚合:Flight→CargoCompartment→Cargo)
关联对象模式(CargoWithTarget绑定货物与目标货舱)

(6)业务逻辑
货舱容量管理(独立容量限制)
货物重量二级排序
货物分配到指定货舱
装载成功/失败判断
货舱级超载判断
班级超载判断(最大起飞重量、最大业载重量)
2、类图设计:
第二次作业集类图如下

image

类之间的关系说明:
Flight 包含多个 CargoCompartment,CargoCompartment 包含多个 Cargo,CargoWithTarget 绑定 Cargo 和 目标货舱ID

3、SourceMontor分析
屏幕截图 2026-05-16 105852

设计亮点:
1、关联对象模式:CargoWithTarget将货物与目标货舱绑定,解决排序后对应关系丢失的问题
2、二级排序:先按重量降序,重量相同时按输入顺序升序,体现实际业务规则
3、分层架构:Flight → CargoCompartment → Cargo,三层结构职责清晰,易于扩展
4、输入验证模块化:InputValidator集中管理验证逻辑,代码复用性高
5、行为封装:addCargo方法内部自动检查容量,调用者无需关心判断逻辑

4、作业二踩坑记录:
1、排序后目标货舱对应关系丢失:
(1)问题描述:货物排序后,原本与Cargo绑定的targetId对应不上,导致货物被装入错误的货舱。
(2)测试数据:
货物名称 重量 目标货舱
钢铁 500kg 前货舱
木材 800kg 后货舱

排序后木材(800kg)应排在第一位,但输出时木材的目标货舱显示为"前货舱"(错误)。
(3)问题原因:排序操作只调整了Cargo列表的顺序,没有同步调整对应的targetId列表,导致货物与目标货舱的绑定关系错位。
(4)解决方案:
采用两步策略——
创建cargoWithTargetList保存完整的货物-目标绑定关系
提取cargoList单独排序
排序后,根据inputorder匹配对应的targetId
2、浮点数精度导致货舱超载误判:
(1)问题描述:判断货舱是否超载时,出现与作业一类似的问题。
(2)测试数据:
货舱最大载重:5000.0kg
已装载货物总重:4999.999999kg
新货物重量:0.000001kg
计算后当前重量:5000.000000kg
(3)实际输出:超载
(4)预期输出:正常(刚好满载)
(5)解决方案:同样引入误差容忍值。

第三次题目集
1、知识点:
(1)Java语法基础
类与对象定义(10个类)
构造方法(带参数初始化)
属性封装(private)
方法定义与调用
this关键字
静态常量(WeightBalanceCalculator)

(2)集合框架
ArrayList声明与初始化
泛型使用(ArrayList、ArrayList
add() / get() / size()
集合遍历(累加旅客重量、货物重量)

(3)算法
累加求和(旅客总重、货物总重、总力矩)
数学计算(力矩、重心、MAC百分比)
范围判断(安全重心范围25%-38%)

(4)输入输出
Scanner使用
next() / nextDouble() / nextInt()
输入验证(getvalidInt、getvalidDouble)
输入顺序:货舱尺寸→旅客行李→货物信息
printf格式化输出(载重平衡舱单)

(5)面向对象
封装(属性私有)
单一职责原则(各类职责明确)
类间关联关系(Flight包含Passenger和CargoCompartment)
工具类设计(WeightBalanceCalculator静态方法)

(6)业务逻辑
旅客总重计算(75kg标准体重 + 行李重量)
力矩计算(重量 × 力臂)
重心计算(总力矩 ÷ 总重量)
MAC百分比计算((CG - 15.0) ÷ 5.0 × 100)
安全评估(GREEN / RED)
空机重量和力矩(40000kg、16.25m)
前货舱力臂12.0m,后货舱力臂22.0m
旅客力臂18.0m

2、类图设计:
第三次类图设计如下:

屏幕截图 2026-05-16 131300
类之间的关系说明:
Flight是核心,聚合CargoCompartment和Passenger;Main依赖所有类,WeightBalanceCalculator依赖Flight进行计算。

3、SourceMontor分析

屏幕截图 2026-05-16 110110

设计亮点:
常量集中管理:WeightBalanceCalculator集中定义所有物理常量(空机重量、力臂、MAC参数、安全范围)
静态工具类:计算力矩、重心、MAC百分比的方法均为静态,纯函数式设计
完整业务建模:旅客(含标准体重+行李)、前后货舱(不同力臂)、空机,覆盖航空配载核心要素
安全评估:根据重心百分比MAC自动判断GREEN/RED,输出直观
输入验证增强:getvalidInt/getvalidDouble方法统一处理边界检查和错误退出
4、作业三踩坑记录:
1、输入格式理解错误:
(1)问题描述:按照作业二的思路,以为每条货物都需要指定目标货舱ID,导致输入解析错误。
(2)作业三的输入格式:
text
前货舱行数 前货舱列数 前货舱最大载重
后货舱行数 后货舱列数 后货舱最大载重
旅客人数
旅客1行李重量
旅客2行李重量
...
货物总数
前货舱货物数量
货物ID1 货物1重量
货物ID2 货物2重量
...
后货舱货物1 后货舱货物1重量
...
(3)错误理解:以为每条货物后面需要跟目标货舱ID。
(4)问题原因:没有仔细阅读需求文档,沿用了作业二的设计思维。
(5)解决方案:认真阅读需求,理解输入格式的变化。前货舱货物先输入,后货舱货物后输入,顺序决定归属。
2、重心计算遗漏空机部分:
(1)问题描述:计算出的重心位置明显偏小,与预期不符。
(2)测试数据:
空机重量:40000kg,力臂:16.25m
旅客总重:5000kg,力臂:18.0m
货物总重:3000kg,平均力臂:17.0m
(3)错误计算:只计算了旅客和货物的力矩
总力矩 = 5000×18.0 + 3000×17.0 = 90000 + 51000 = 141000
总重量 = 5000 + 3000 = 8000
重心 = 141000 ÷ 8000 = 17.625m(偏小)
(4)正确计算:加入空机部分
总力矩 = 40000×16.25 + 5000×18.0 + 3000×17.0 = 650000 + 90000 + 51000 = 791000
总重量 = 40000 + 5000 + 3000 = 48000
重心 = 791000 ÷ 48000 = 16.48m(正确)
(5)解决方案:在WeightBalanceCalculator中加入空机力矩计算。
3、旅客总重量计算遗漏标准体重:
(1)问题描述:旅客总重量计算结果明显偏小,导致重心位置计算错误。
(2)测试数据:
旅客人数:3人
行李重量:10kg, 20kg, 15k
(3)错误计算:旅客总重 = 10 + 20 + 15 = 45kg
(4)正确计算:旅客总重 = 75×3 + 45 = 270kg
(5)问题原因:航空配载中每位旅客除行李外还有标准体重(75kg),最初只计算了行李重量。
(6)解决方案:在Passenger类的构造方法中计算总重量。

总结:
1 、学习收获
通过本阶段三次作业的实践,我在以下几个方面有了明显的提升:
(1)面向对象设计能力的提升:
从作业一简单的类和对象定义,到作业二的多类协作与关联对象设计,再到作业三的完整业务建模,我逐步掌握了封装、单一职责原则、聚合关系、关联对象模式等核心概念。
(2)Java集合框架的了解加深:
掌握了ArrayList的声明、初始化、添加、遍历等基本操作,理解了泛型的类型安全作用,学会了集合嵌套的使用场景。
(3)代码调试与问题定位能力:
通过Scanner换行问题、排序后数据丢失、浮点数精度误判等踩坑经历,学会了分析问题原因、设计测试用例、验证解决方案的完整调试流程。
2、不足与改进:
(1)缺少接口设计:
LoadDispatcher和CargoSorter功能相似但各自独立,没有统一接口。
改进:
定义Sortable接口,声明sort方法,不同排序器实现该接口,便于切换排序策略。

通过这三次作业,我从一个简单的货物装载程序逐步构建了一个完整的航班载重平衡系统,不仅锻炼了Java编程能力,更培养了将现实业务转化为软件解决方案的思维模式。

http://www.jsqmd.com/news/834375/

相关文章:

  • 3步智能清理:用AntiDupl.NET告别电脑中的重复图片困扰
  • 20252810 2024-2025-2 《网络攻防实践》实践9报告
  • Python try...except ImportError 语句详解
  • HttpOnly Cookie 深度解析
  • AICoverGen终极指南:5步打造专业级AI翻唱的完整解决方案
  • AI助手开发实战:从资源索引到生产级系统搭建指南
  • Purpur性能调优实战指南:7大核心优化方案深度解析
  • 2026年号易平台官方邀请码08888:从零到皇冠的完整实操手册 - 号易官方邀请码08888
  • 2026年要看!威海甲醛检测治理公司该怎么选择?这份实用推荐别错过! - 得意的笑125
  • 2026年4月臭氧发生器公司口碑推荐,混合机/台车烘箱/二维混合机/热风循环烘箱,臭氧发生器企业哪个好 - 品牌推荐师
  • 163MusicLyrics:一键获取网易云QQ音乐歌词的专业工具
  • 2026年Exchange零日危机:CVE-2026-42897在野利用全解析与防护指南
  • 从用户评论到精准推荐:手把手教你用事理图谱做消费意图识别(附真实电商案例)
  • 从SolidWorks到Geant4仿真:我的第一个粒子探测器CAD模型导入全记录(含CADMesh避坑点)
  • 3步实现AutoHotkey脚本独立运行:Ahk2Exe编译工具完全指南
  • LrcHelper:网易云音乐双语歌词下载神器 - 5分钟快速上手指南
  • 佛山全区域上门黄金回收 六大正规品牌 五区全覆盖高价回收全品类闲置 - 金掌柜黄金回收
  • 胖东来 1000 元面值购物卡回收行情深度剖析 - 购物卡回收找京尔回收
  • 从《西部世界》到现实:AI智能体如何重塑游戏NPC与虚拟社会?
  • 为初创团队搭建统一的大模型调用与管理平台
  • CAPL进阶篇-----键盘事件在自动化测试中的实战应用
  • 解锁BIM设计新维度:Rhino.Inside.Revit如何实现参数化设计革命
  • AXI Crossbar架构解析:从总线协议到片上互联的实战设计
  • BG3ModManager:博德之门3模组管理终极解决方案
  • Android滚轮控件WheelView:告别复杂选择器开发的终极解决方案
  • 广东成人学历提升报名条件是什么?成考、开放教育、自考报考要求与正规机构选择 - 优选机构推荐
  • 观察 Taotoken 在多地域请求下的延迟与稳定性表现
  • 终极指南:Windows平台APK安装器如何让安卓应用无缝运行
  • 3分钟掌握League Akari:英雄联盟终极智能助手完全指南
  • gdsdecomp终极指南:如何一键恢复Godot游戏项目的完整源代码