第二次blog作业
前言:
关于这两次题目集,知识点主要集中在继承与多态、容器这两个知识点。题目量的话,两次题目集都是三题,并且也是都用了从易到难的题目顺序来排列。难度的话,我觉得对于掌握了,就只要掌握了继承与多态以及容器基础的人来说,这次题目集是没有问题的,所以难度不大我认为。但是但是,我两个题目集的最后一题都没有完成,这就有点难受了。。。具体的话转移到踩坑心得来描述吧
设计与分析:
关于各个题目集的前两题就不过多描述了,基本上都会写。对于第一个航空货运管理系统,题目如下:
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为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位小数。

观察题目要求,这题是没有要求用继承与多态的,知识点只有一个容器,但他的输入输出也算一个难点,我就是因为输入输出错了导致没分。这个题目我写了四个类,客户类,货物类,订单类,航班类。航班类与货物类有组合关系,订单类与货物类,航班类有组合关系。噢对,当然还有Main主类。这里不好复制代码我就直接描述各个类的作用了
- Customer(客户类)
职责:存储和管理客户的基本信息。
核心方法:
getName():返回客户姓名,用于订单信息展示。
getPhone():返回客户电话,用于联系信息验证或展示。
构造方法:初始化客户ID、姓名、电话和地址。
作用:
作为订单的关联实体,提供发件人或收件人的基础信息(如姓名、电话),但实际订单中会单独存储这些信息(避免直接依赖客户类)。
2. Goods(货物类)
职责:管理货物的属性和计费规则。
核心方法:
getName():返回货物名称,用于明细展示。
getWeight():返回货物重量,用于计算运费和航班负载。
getRate():根据货物类型返回计费费率(如发电机25元/kg,信号发生器30元/kg)。
构造方法:初始化货物ID、名称、尺寸(长宽高)和重量。
作用:
存储货物物理属性(重量、尺寸)。
实现差异化计费逻辑(通过getRate()方法)。
3. Flight(航班类)
职责:管理航班的负载能力和状态。
核心方法:
getFlightNumber():返回航班号,用于订单关联。
getMaxLoad():返回航班最大负载,用于校验。
getCurrentLoad():返回当前已装载重量。
canCarry(double load):检查航班是否能承载指定重量(剩余容量≥负载)。
addLoad(double load):增加航班当前负载(用于订单确认后更新)。
构造方法:初始化航班号、起降机场、日期和最大负载。
作用:
确保订单重量不超过航班运力(通过canCarry()校验)。
动态更新航班负载(通过addLoad())。
4. Order(订单类)
职责:整合客户、货物和航班信息,处理订单逻辑。
核心方法:
getTotalWeight():计算订单所有货物的总重量(遍历goodsList累加)。
getTotalFee():计算订单总运费(货物重量×各自费率后累加)。
其他getter方法:如getOrderId()、getSenderName()等,用于获取订单各字段信息。
构造方法:绑定订单ID、日期、收发方信息、货物列表和关联航班。
作用:
作为核心业务类,关联客户、货物和航班。
提供订单的统计功能(总重量、总费用)。
封装订单完整信息供展示或处理。
然而对于输出问题,示例不够多我没找出来,用pta上的例子就是对的。
对于第二次的最后一题:
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户类型[可输入项:Individual/Corporate]
客户编号
客户姓名
客户电话
客户地址
货物类型[可输入项:Normal/Expedite/Dangerous]
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
支付方式[可输入项:Wechat/ALiPay/Cash]
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
客户:姓名(电话)订单信息如下:
航班号:
订单号:
订单日期:
发件人姓名:
发件人电话:
发件人地址:
收件人姓名:
收件人电话:
收件人地址:
订单总重量(kg):
[微信/支付宝/现金]支付金额:
货物明细如下:
明细编号 货物名称 计费重量 计费费率 应交运费
1 ...
2 ...
注:输出中实型数均保留1位小数。

这个是类图,这次写了7个类,枚举类,Customer(客户类),Cargo(货物类), Flight(航班类),Order(订单类),OrderPrinter(订单打印类),Main(主程序类)。虽说题目说要继承与多态,但我没找到能用的点,也就没用继承,接下来是各个类的作用:
- 枚举类型
CargoType(货物类型枚举)
作用:定义货物分类标准,影响计费规则。
包含值:NORMAL(普通)、DANGEROUS(危险品)、URGENT(紧急)、EXPEDITE(加急)。
业务关联:通过Cargo.getRate()方法实现差异化费率。
CustomerType(客户类型枚举)
作用:区分客户身份以提供不同折扣。
包含值:PERSONAL(个人)、CORPORATE(企业)。
业务关联:通过Customer.getDiscountRate()方法返回不同折扣率(个人9折,企业8折)。
2. Customer(客户类)
职责:管理客户信息及折扣策略。
核心方法:
getDiscountRate():根据客户类型返回折扣率(企业客户享受更低费率)。
getName()/getPhone():提供客户基本信息供订单展示。
优化点:
客户类型通过枚举实现,避免硬编码折扣逻辑,便于扩展新类型(如VIP客户)。
3. Cargo(货物类)
职责:管理货物属性、计算运费及重量规则。
核心方法:
getChargeableWeight():返回计费重量(实际重量与体积重量的较大值,体积重量=长×宽×高/6000)。
getRate():根据货物类型和计费重量返回阶梯费率(如危险品20kg以下80元/kg)。
getFee(double discountRate):计算单件货物的最终运费(计费重量×费率×折扣)。
业务规则:
危险品费率最高,加急/紧急次之,普通最低。
重量越大单价越低(阶梯定价)。
4. Flight(航班类)
职责:管理航班运力及负载状态。
核心方法:
canCarry(double weight):检查航班剩余运力是否能承载新订单。
addLoad(double weight):更新航班当前负载(成功下单后调用)。
设计特点:
负载校验与更新分离,确保线程安全(实际场景可能需要加锁)。
5. Order(订单类)
职责:整合订单所有关联实体,处理核心业务逻辑。
核心方法:
getTotalWeight():计算订单总计费重量(所有货物计费重量之和)。
getTotalPayment():计算订单总支付金额(所有货物运费之和,含客户折扣)。
关联关系:
聚合Cargo、Customer、Flight对象,通过组合实现数据整合。
扩展性:
支持多种支付方式(字段paymentMethod),但逻辑由OrderPrinter处理展示。
6. OrderPrinter(订单打印类)
职责:格式化输出订单详情,实现展示逻辑与业务逻辑分离。
核心方法:
print(Order order):按模板输出订单信息,包括:
客户、航班、收发方基本信息。
货物明细表(编号、名称、计费重量、费率、运费)。
本地化支付方式名称(如"WeChat"转"微信支付")。
设计优势:
符合单一职责原则,避免Order类臃肿。
格式化逻辑集中管理(如数字保留1位小数)。
7. Main(主程序类)
职责:程序入口,协调对象创建与流程控制。
关键流程:
输入处理:
动态解析枚举值(如将字符串"Dangerous"转为CargoType.DANGEROUS)。
批量构建货物列表(使用Stream计算总重量)。
业务校验:调用flight.canCarry()检查运力,超载则立即终止。
结果输出:通过OrderPrinter打印标准化订单。
本来我是不打算写OrderPrinter类的,但由于输出一直有问题,所以把输出单独拉出来写,但最终还是没解决问题就是
踩坑心得:
写第一次作业集的时候,在前几天写完了前两题,但在最后写第三题的时候,一直在慢慢磨,导致时间不够也就检查不出错误,第二次的题目由于是在第一次的代码上改进,导致也是输出有误。至于代码上的问题,我觉得倒是没踩什么坑。

这个是第一次的输出,没找出问题,没去断点调试了,第二次的题目现在看不到测试的,就没有图片提供了。
改进建议:
下几次的题目集我打算先做最后一题,再合理安排时间,这样就能完成整个题目集了。
总结:
继承与多态以及容器我现在是学的算基础的都会了,这两个题目集算给了我一个提醒,要合理的安排时间去完成,不能慢慢磨。

浙公网安备 33010602011771号