题目
某航空公司“航空货运管理系统”中的空运费的计算涉及多个因素,通常包括货物重量/体积、运输距离、附加费用、货物类型、客户类型以及市场供需等。
本次作业主要考虑货物重量/体积,以下是具体的计算方式和关键要点:
一、计费重量的确定
空运以实际重量(GrossWeight)和体积重量(VolumeWeight)中的较高者作为计费重量。
计算公式:
体积重量(kg)= 货物体积(长×宽×高,单位:厘米)÷6000
示例:
若货物实际重量为80kg,体积为120cm×80cm×60cm,则:
体积重量 =(120×80×60)÷6000=96kg
计费重量取96kg(因96kg>80kg)。
二、基础运费计算
费率(Rate):航空公司或货代根据航线、货物类型、市场行情等制定(如
CNY 30/kg)。本次作业费率采用分段计算方式:
公式:基础运费 = 计费重量 × 费率
三、题目说明
本次题目模拟某客户到该航空公司办理一次货运业务的过程:
航空公司提供如下信息:
航班信息(航班号,航班起飞机场所在城市,航班降落机场所在城市,航班日期,航班最大载重量)
客户填写货运订单并进行支付,需要提供如下信息:
客户信息(姓名,电话号码等)
货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选航班号,订单日期)
支付方式(支付宝支付、微信支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独计费。
程序需要从键盘依次输入填写订单需要提供的信息,然后分别生成订单信息报表及货物明细报表。
四、题目要求
本次题目重点考核面向对象设计原则中的单一职责原则、里氏代换原则、开闭原则以及合成复用原则
设计因素:单一职责原则(40%)、里氏代换原则(20%)、开闭原则(20%)、
合成复用原则(20%)
输入格式:
按如下顺序分别输入客户信息、货物信息、航班信息以及订单信息。
客户编号
客户姓名
客户电话
客户地址
运送货物数量
[货物编号
货物名称
货物宽度
货物长度
货物高度
货物重量
]//[]内的内容输入次数取决于“运送货物数量”,输入不包含“[]”
航班号
航班起飞机场
航班降落机场
航班日期(格式为YYYY-MM-DD)
航班最大载重量
订单编号
订单日期(格式为YYYY-MM-DD)
发件人地址
发件人姓名
发件人电话
收件人地址
收件人姓名
收件人电话
输出格式:
如果订单中货物重量超过航班剩余载重量,程序输出The flight with flight number:航班号 has exceeded its load capacity and cannot carry the order. ,程序终止运行。
如果航班载重量可以承接该订单,输出如下:
点击查看代码- 客户:姓名(电话)订单信息如下:
- -----------------------------------------
- 航班号:
- 订单号:
- 订单日期:
- 发件人姓名:
- 发件人电话:
- 发件人地址:
- 收件人姓名:
- 收件人电话:
- 收件人地址:
- 订单总重量(kg):
- 微信支付金额:
- 货物明细如下:
- -----------------------------------------
- 明细编号 货物名称 计费重量 计费费率 应交运费
- 1 ...
- 2 ...
复制代码 输入样例:点击查看代码- 10001
- 郭靖
- 13807911234
- 南昌航空大学
- 2
- 101
- 发电机
- 80
- 60
- 40
- 80
- 102
- 信号发生器
- 55
- 70
- 60
- 45
- MU1234
- 昌北国际机场
- 大兴国际机场
- 2025-04-22
- 1000
- 900001
- 2025-04-22
- 南昌大学
- 洪七公
- 18907912325
- 北京大学
- 黄药师
- 13607912546
复制代码 输出样例:点击查看代码- 客户:郭靖(13807911234)订单信息如下:
- -----------------------------------------
- 航班号:MU1234
- 订单号:900001
- 订单日期:2025-04-22
- 发件人姓名:洪七公
- 发件人电话:18907912325
- 发件人地址:南昌大学
- 收件人姓名:黄药师
- 收件人电话:13607912546
- 收件人地址:北京大学
- 订单总重量(kg):125.0
- 微信支付金额:3350.0
- 货物明细如下:
- -----------------------------------------
- 明细编号 货物名称 计费重量 计费费率 应交运费
- 1 发电机 80.0 25.0 2000.0
- 2 信号发生器 45.0 30.0 1350.0
复制代码 我的源码
点击查看代码- import java.util.ArrayList;
- import java.util.List;
- import java.util.Scanner;
- class Cargo {
- private int id;
- private String name;
- private double width;
- private double length;
- private double height;
- private double weight;
- public Cargo(int id, String name, double width, double length, double height, double weight) {
- this.id = id;
- this.name = name;
- this.width = width;
- this.length = length;
- this.height = height;
- this.weight = weight;
- }
- // 计算体积重量
- public double calculateVolumeWeight() {
- return (width * length * height) / 6000;
- }
- // 获取计费重量
- public double getChargeableWeight() {
- double volumeWeight = calculateVolumeWeight();
- return Math.max(weight, volumeWeight);
- }
- // 获取计费费率
- public double getRate() {
- double chargeableWeight = getChargeableWeight();
- if (chargeableWeight < 20) {
- return 35;
- } else if (chargeableWeight < 50) {
- return 30;
- } else if (chargeableWeight < 100) {
- return 25;
- } else {
- return 15;
- }
- }
- // 计算应交运费
- public double calculateFreight() {
- return getChargeableWeight() * getRate();
- }
- public int getId() {
- return id;
- }
- public String getName() {
- return name;
- }
- public double getChargeableWeightFormatted() {
- return Math.round(getChargeableWeight() * 10) / 10.0;
- }
- public double getRateFormatted() {
- return Math.round(getRate() * 10) / 10.0;
- }
- public double getCalculateFreightFormatted() {
- return Math.round(calculateFreight() * 10) / 10.0;
- }
- }
- class Flight {
- private String flightNumber;
- private String departureCity;
- private String arrivalCity;
- private String flightDate;
- private double maxLoad;
- public Flight(String flightNumber, String departureCity, String arrivalCity, String flightDate, double maxLoad) {
- this.flightNumber = flightNumber;
- this.departureCity = departureCity;
- this.arrivalCity = arrivalCity;
- this.flightDate = flightDate;
- this.maxLoad = maxLoad;
- }
- public String getFlightNumber() {
- return flightNumber;
- }
- public double getMaxLoad() {
- return maxLoad;
- }
- }
- class Order {
- private int orderId;
- private String orderDate;
- private String senderAddress;
- private String senderName;
- private String senderPhone;
- private String recipientAddress;
- private String recipientName;
- private String recipientPhone;
- private List<Cargo> cargoList;
- private double totalWeight;
- public Order(int orderId, String orderDate, String senderAddress, String senderName, String senderPhone,
- String recipientAddress, String recipientName, String recipientPhone) {
- this.orderId = orderId;
- this.orderDate = orderDate;
- this.senderAddress = senderAddress;
- this.senderName = senderName;
- this.senderPhone = senderPhone;
- this.recipientAddress = recipientAddress;
- this.recipientName = recipientName;
- this.recipientPhone = recipientPhone;
- this.cargoList = new ArrayList<>();
- this.totalWeight = 0;
- }
- public void addCargo(Cargo cargo) {
- cargoList.add(cargo);
- totalWeight += cargo.getChargeableWeight();
- }
- public int getOrderId() {
- return orderId;
- }
- public String getOrderDate() {
- return orderDate;
- }
- public String getSenderAddress() {
- return senderAddress;
- }
- public String getSenderName() {
- return senderName;
- }
- public String getSenderPhone() {
- return senderPhone;
- }
- public String getRecipientAddress() {
- return recipientAddress;
- }
- public String getRecipientName() {
- return recipientName;
- }
- public String getRecipientPhone() {
- return recipientPhone;
- }
- public double getTotalWeightFormatted() {
- return Math.round(totalWeight * 10) / 10.0;
- }
- public double calculateTotalFreight() {
- double totalFreight = 0;
- for (Cargo cargo : cargoList) {
- totalFreight += cargo.calculateFreight();
- }
- return totalFreight;
- }
- public double getTotalFreightFormatted() {
- return Math.round(calculateTotalFreight() * 10) / 10.0;
- }
- }
- class Customer {
- private int id;
- private String name;
- private String phone;
- private String address;
- public Customer(int id, String name, String phone, String address) {
- this.id = id;
- this.name = name;
- this.phone = phone;
- this.address = address;
- }
- public String getName() {
- return name;
- }
- public String getPhone() {
- return phone;
- }
- }
- public class Main {
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- // 输入客户信息
- int customerId = scanner.nextInt();
- String customerName = scanner.next();
- String customerPhone = scanner.next();
- String customerAddress = scanner.next();
- Customer customer = new Customer(customerId, customerName, customerPhone, customerAddress);
- // 输入货物信息
- int cargoNum = scanner.nextInt();
- List<Cargo> cargoList = new ArrayList<>();
- for (int i = 0; i < cargoNum; i++) {
- int cargoId = scanner.nextInt();
- String cargoName = scanner.next();
- double width = scanner.nextDouble();
- double length = scanner.nextDouble();
- double height = scanner.nextDouble();
- double weight = scanner.nextDouble();
- Cargo cargo = new Cargo(cargoId, cargoName, width, length, height, weight);
- cargoList.add(cargo);
- }
- // 输入航班信息
- String flightNumber = scanner.next();
- String departureCity = scanner.next();
- String arrivalCity = scanner.next();
- String flightDate = scanner.next();
- double maxLoad = scanner.nextDouble();
- Flight flight = new Flight(flightNumber, departureCity, arrivalCity, flightDate, maxLoad);
- // 输入订单信息
- int orderId = scanner.nextInt();
- String orderDate = scanner.next();
- String senderAddress = scanner.next();
- String senderName = scanner.next();
- String senderPhone = scanner.next();
- String recipientAddress = scanner.next();
- String recipientName = scanner.next();
- String recipientPhone = scanner.next();
- Order order = new Order(orderId, orderDate, senderAddress, senderName, senderPhone,
- recipientAddress, recipientName, recipientPhone);
- for (Cargo cargo : cargoList) {
- order.addCargo(cargo);
- }
- if (order.getTotalWeightFormatted() > flight.getMaxLoad()) {
- System.out.println("The flight with flight number: " + flight.getFlightNumber() + " has exceeded its load capacity and cannot carry the order.");
- } else {
- System.out.println("客户:" + customer.getName() + "(" + customer.getPhone() + ")订单信息如下:");
- System.out.println("-----------------------------------------");
- System.out.println("航班号:" + flight.getFlightNumber());
- System.out.println("订单号:" + order.getOrderId());
- System.out.println("订单日期:" + order.getOrderDate());
- System.out.println("发件人姓名:" + order.getSenderName());
- System.out.println("发件人电话:" + order.getSenderPhone());
- System.out.println("发件人地址:" + order.getSenderAddress());
- System.out.println("收件人姓名:" + order.getRecipientName());
- System.out.println("收件人电话:" + order.getRecipientPhone());
- System.out.println("收件人地址:" + order.getRecipientAddress());
- System.out.println("订单总重量(kg):" + order.getTotalWeightFormatted());
- System.out.println("微信支付金额:" + order.getTotalFreightFormatted());
- System.out.println("\n货物明细如下:");
- System.out.println("-----------------------------------------");
- System.out.println("明细编号\t货物名称\t计费重量\t计费费率\t应交运费");
- for (int i = 0; i < cargoList.size(); i++) {
- Cargo cargo = cargoList.get(i);
- System.out.println((i + 1) + "\t" + cargo.getName() + "\t" + cargo.getChargeableWeightFormatted() + "\t" + cargo.getRateFormatted() + "\t" + cargo.getCalculateFreightFormatted());
- }
- }
- }
- }
复制代码 输入点击查看代码- 10001
- 郭靖
- 13807911234
- 南昌航空大学
- 2
- 101
- 发电机
- 80
- 60
- 40
- 80
- 102
- 信号发生器
- 55
- 70
- 60
- 45
- MU1234
- 昌北国际机场
- 大兴国际机场
- 2025-04-22
- 1000
- 900001
- 2025-04-22
- 南昌大学
- 洪七公
- 18907912325
- 北京大学
- 黄药师
- 13607912546
复制代码 输出点击查看代码- 客户:郭靖(13807911234)订单信息如下:
- -----------------------------------------
- 航班号:MU1234
- 订单号:900001
- 订单日期:2025-04-22
- 发件人姓名:洪七公
- 发件人电话:18907912325
- 发件人地址:南昌大学
- 收件人姓名:黄药师
- 收件人电话:13607912546
- 收件人地址:北京大学
- 订单总重量(kg):125.0
- 微信支付金额:3350.0
- 货物明细如下:
- -----------------------------------------
- 明细编号 货物名称 计费重量 计费费率 应交运费
- 1 发电机 80.0 25.0 2000.0
- 2 信号发生器 45.0 30.0 1350.0
复制代码 <ol>
Cargo 类方法分析
核心业务方法
calculateVolumeWeight()
功能:根据公式 体积重量 = (长×宽×高)/6000 计算货物的体积重量。
设计:单一职责原则的体现,专注于体积重量计算。
getChargeableWeight()
功能:比较实际重量和体积重量,取较大值作为计费重量。
设计:依赖 calculateVolumeWeight(),符合合成复用原则。
getRate()
功能:根据计费重量分阶段计算费率(如 flight.getMaxLoad()) { System.out.println("航班超载...");} else { // 输出订单信息}[/code]设计原则遵循情况总结
1.单一职责原则
优点:多数类的方法专注于单一功能(如 Cargo 类的计算方法)。
不足:AirCargoSystem.main() 承担过多职责。
2.开闭原则
不足:Cargo.getRate() 使用条件判断,新增费率需修改原有代码。
改进建议:使用策略模式或工厂模式封装费率计算逻辑。
3.合成复用原则
优点:Order 类通过组合 Cargo 对象实现功能复用。
改进建议
1.重构 AirCargoSystem.main()
将输入处理、业务验证和输出逻辑拆分为独立方法或类。
示例:
点击查看代码- // 输入处理与业务逻辑耦合
- if (order.getTotalWeightFormatted() > flight.getMaxLoad()) {
- System.out.println("航班超载...");
- } else {
- // 输出订单信息
- }
复制代码 2.优化费率计算(开闭原则)
使用策略模式:
点击查看代码- private static Order createOrderFromInput(Scanner scanner) {
- // 封装输入逻辑
- }
- private static void validateOrder(Order order, Flight flight) {
- // 封装验证逻辑
- }
复制代码 3.增强错误处理
添加输入验证(如日期格式、重量合法性),避免程序崩溃。
4.提高代码复用性
将格式化逻辑(如 getXXFormatted())提取为工具类方法。
第二题源码
点击查看代码- interface RateStrategy {
- double calculateRate(double weight);
- }
- class TieredRateStrategy implements RateStrategy {
- // 实现分阶段费率计算
- }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |