第二次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主类。这里不好复制代码我就直接描述各个类的作用了

  1. 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(主程序类)​。虽说题目说要继承与多态,但我没找到能用的点,也就没用继承,接下来是各个类的作用:

  1. 枚举类型​​
    ​​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类的,但由于输出一直有问题,所以把输出单独拉出来写,但最终还是没解决问题就是
踩坑心得:
写第一次作业集的时候,在前几天写完了前两题,但在最后写第三题的时候,一直在慢慢磨,导致时间不够也就检查不出错误,第二次的题目由于是在第一次的代码上改进,导致也是输出有误。至于代码上的问题,我觉得倒是没踩什么坑。

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

posted @ 2025-05-24 15:47  小乔大王  阅读(26)  评论(0)    收藏  举报