撇瞥 发表于 2025-5-30 13:36:28

第二次Blog作业-航空货运管理系统

题目
某航空公司“航空货运管理系统”中的空运费的计算涉及多个因素,通常包括货物重量/体积、运输距离、附加费用、货物类型、客户类型以及市场供需等。
本次作业主要考虑货物重量/体积,以下是具体的计算方式和关键要点:
一、计费重量的确定
空运以实际重量(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 {    // 输出订单信息}设计原则遵循情况总结
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 {
    // 实现分阶段费率计算
}


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

盖彗云 发表于 3 天前

不错,里面软件多更新就更好了
页: [1]
查看完整版本: 第二次Blog作业-航空货运管理系统