第二次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 {
// 实现分阶段费率计算
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 不错,里面软件多更新就更好了
页:
[1]