yu_tongya 2026-04-18 11:55 采纳率: 0%
浏览 13

航空器配载与货运管理系统

在航空业中,航班起飞前需要进行严格的“配载”,即计算飞机的旅客、货物、行李的重量分布,计算出飞机的重心位置,以确保飞行安全。
设计一个基础的航班货运配载模块。系统需要记录航班的基本信息(航班号、最大起飞重量、最大业载重量)。地勤人员可以按照货物重量从高到低向该航班添加货物(货物名称、重量)。系统需要实时计算当前已装载的总重量,并判断是否超载。
【设计要求】
类设计必须符合单一职责原则(SRP),参考类图如下所示(仅作参考,可自行加工具类)。
注意:类设计如果违背了SRP,此题不得分。

image.png

输入格式:
第1行:输入航班号flightNo(字符串,例如CA1201)
第2行:输入该航班最大载重重量maxWeight(实型数,例如1200.0)
第3行:输入该航班要装载的货物件数n(整型数,例如10)
从第4行开始,循环输入要装载的货物的名称cargoName(字符串)和cargoWeight重量(实型数)
提示:在使用Scanner输入的时候,nextLine()方法会接受上一次输入的回车符号,因此,建议大家在nextLine()之前再加一个nextLine(),如下代码所示:

int a = scanner.nextInt();// 从键盘输入a的值后会回车
scanner.nextLine();//该行代码专门接收上一行代码的回车符号
String s = scanner.nextLine();//此时s才能接收输入的第二行数据
输入如下:
25 //a=25
abc //s="abc"
输出格式:
前n行按照装载顺序依次输出货物的信息,格式如下:
货物[名称 重量:重量值kg]
第n+1行输出装载的总重量以及该航班最大载重量,格式如下:
总重量: 重量值kg / 最大载重: 载重值kg
最后一行输出配载状态,如果没有超载,则输出配载状态:正常,如果超载则输出警告:严重超载
注意:输出的数值均保留1位小数。
这是题目
过不了的测试点:排序,超载测试

import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //输入航班信息
        Flight.flightNo = sc.nextLine();
        Flight.maxWeight = sc.nextDouble();
        Flight.n = sc.nextInt();

        //输入货物信息
        LoadManifest.cargoList = new Cargo[Flight.n];
        for (int i = 0; i < Flight.n; i++) {
            LoadManifest.cargoList[i] = new Cargo();
            LoadManifest.cargoList[i].name = sc.next();
            LoadManifest.cargoList[i].weight = sc.nextDouble();
        }

        CargoSorter.cargoSorter(LoadManifest.cargoList);

        //计算总重量
        double totalWeight = 0;
        for(int i = 0; i < Flight.n; i++){
           totalWeight += LoadManifest.cargoList[i].weight;
        }

        // int index = Flight.n - 1;
        // if(totalWeight > Flight.maxWeight){
        //     while(totalWeight > Flight.maxWeight && index >= 0){
        //         totalWeight -= LoadManifest.cargoList[index].weight;
        //         index--;
        //     }
        // }

        //输出结果并且判断是否超重
        for(int i = 0;i < Flight.n;i++){
            System.out.println("货物[" + LoadManifest.cargoList[i].name + " " + "重量:" + LoadManifest.cargoList[i].weight + "kg]");
        }
        System.out.println("总重量: " + totalWeight + "kg / " + "最大载重: " + Flight.maxWeight + "kg");
        if(totalWeight > Flight.maxWeight){
            System.out.println("警告:严重超载");
        } else{
            System.out.println("配载状态:正常");
        }
    }

    //货物
    static class Cargo{
        String name;
        double weight;
    }

    //航班
    class Flight{
        static String flightNo;
        static double maxWeight;
        static int n;
    }

    //航班货物装载清单
   class LoadManifest{
        static Cargo[] cargoList;
    }

    //货物排序
    static class CargoSorter{
        public static void cargoSorter(Cargo[] cargoList){
            Cargo cargoTerm = new Cargo();
            for(int i = 0;i < cargoList.length;i++){
                for(int j = 0;j < cargoList.length - 1 - i;j++){
                    if(cargoList[j].weight < cargoList[j + 1].weight){
                        cargoTerm = cargoList[j];
                        cargoList[j] = cargoList[j + 1];
                        cargoList[j + 1] = cargoTerm;
                    }
                }
            }
        }
    }
}

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2026-04-18 11:57
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    根据题目要求,我们需要设计一个**符合单一职责原则(SRP)**的航空器配载与货运管理系统。目前提供的代码存在一些问题,包括:

    1. 类设计违反 SRPFlight, LoadManifest, CargoSorter 等类承担了过多职责。
    2. 货物排序逻辑错误:当前的排序逻辑是按重量从低到高排序,而题目要求是从高到低排序。
    3. 超载处理逻辑缺失:当前没有对超载进行处理,而是直接输出总重量。

    ✅ 一、系统设计思路

    我们按照 单一职责原则(SRP) 来重新设计类结构,确保每个类只负责一个功能。

    🧩 类结构设计

    1. FlightInfo

      • 负责存储航班信息(航班号、最大起飞重量、最大业载重量)
      • 不参与计算或排序等其他操作
    2. Cargo

      • 负责存储单个货物的信息(名称、重量)
    3. CargoList

      • 负责管理一组货物
      • 提供添加货物、排序、计算总重量等功能
    4. CargoSorter

      • 仅负责对货物列表进行排序(按重量从高到低)
    5. LoadManager

      • 负责装载货物、判断是否超载、输出结果

    ✅ 二、详细实现步骤

    1. 定义 Cargo

    public class Cargo {
        private String name;
        private double weight;
    
        public Cargo(String name, double weight) {
            this.name = name;
            this.weight = weight;
        }
    
        public String getName() {
            return name;
        }
    
        public double getWeight() {
            return weight;
        }
    }
    

    2. 定义 FlightInfo

    public class FlightInfo {
        private String flightNo;
        private double maxWeight;
    
        public FlightInfo(String flightNo, double maxWeight) {
            this.flightNo = flightNo;
            this.maxWeight = maxWeight;
        }
    
        public String getFlightNo() {
            return flightNo;
        }
    
        public double getMaxWeight() {
            return maxWeight;
        }
    }
    

    3. 定义 CargoList

    import java.util.ArrayList;
    import java.util.List;
    
    public class CargoList {
        private List<Cargo> cargos = new ArrayList<>();
    
        public void addCargo(Cargo cargo) {
            cargos.add(cargo);
        }
    
        public void sortCargoByWeightDescending() {
            cargos.sort((c1, c2) -> Double.compare(c2.getWeight(), c1.getWeight()));
        }
    
        public double calculateTotalWeight() {
            return cargos.stream().mapToDouble(Cargo::getWeight).sum();
        }
    
        public List<Cargo> getCargos() {
            return cargos;
        }
    }
    

    4. 定义 LoadManager

    public class LoadManager {
        private FlightInfo flightInfo;
        private CargoList cargoList;
    
        public LoadManager(FlightInfo flightInfo) {
            this.flightInfo = flightInfo;
            this.cargoList = new CargoList();
        }
    
        public void addCargo(Cargo cargo) {
            cargoList.addCargo(cargo);
        }
    
        public void sortCargos() {
            cargoList.sortCargoByWeightDescending();
        }
    
        public double getTotalWeight() {
            return cargoList.calculateTotalWeight();
        }
    
        public boolean isOverloaded() {
            return getTotalWeight() > flightInfo.getMaxWeight();
        }
    
        public List<Cargo> getCargos() {
            return cargoList.getCargos();
        }
    }
    

    5. 主程序 Main

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            // 输入航班号
            System.out.print("请输入航班号: ");
            String flightNo = scanner.nextLine();
    
            // 输入最大载重
            System.out.print("请输入最大载重: ");
            double maxWeight = scanner.nextDouble();
    
            // 输入货物数量
            System.out.print("请输入货物件数: ");
            int n = scanner.nextInt();
    
            // 创建航班信息对象
            FlightInfo flightInfo = new FlightInfo(flightNo, maxWeight);
    
            // 创建加载管理器
            LoadManager loadManager = new LoadManager(flightInfo);
    
            // 输入货物信息
            for (int i = 0; i < n; i++) {
                System.out.print("请输入第" + (i + 1) + "件货物名称: ");
                String name = scanner.next();
                System.out.print("请输入第" + (i + 1) + "件货物重量: ");
                double weight = scanner.nextDouble();
    
                Cargo cargo = new Cargo(name, weight);
                loadManager.addCargo(cargo);
            }
    
            // 排序货物
            loadManager.sortCargos();
    
            // 计算总重量
            double totalWeight = loadManager.getTotalWeight();
    
            // 输出货物信息
            System.out.println("\n货物装载信息如下:");
            for (Cargo cargo : loadManager.getCargos()) {
                System.out.printf("货物[%s 重量:%.1fkg]\n", cargo.getName(), cargo.getWeight());
            }
    
            // 输出总重量和最大载重
            System.out.printf("总重量: %.1fkg / 最大载重: %.1fkg\n", totalWeight, flightInfo.getMaxWeight());
    
            // 判断是否超载
            if (loadManager.isOverloaded()) {
                System.out.println("警告:严重超载");
            } else {
                System.out.println("配载状态:正常");
            }
    
            scanner.close();
        }
    }
    

    ✅ 三、关键修改说明

    🔹 1. 修正货物排序逻辑

    • 原代码使用的是升序排序,但题目要求是降序排序(从重到轻),已通过 sort() 方法调整。

    🔹 2. 优化类职责划分(SRP)

    • 每个类只负责一个职责:
      • Cargo: 存储货物信息
      • FlightInfo: 存储航班信息
      • CargoList: 管理货物集合
      • LoadManager: 负责装载、排序、判断是否超载

    🔹 3. 支持输入格式正确性

    • 使用 scanner.nextLine()scanner.nextDouble() 的组合方式,避免因回车符导致的读取错误。

    ✅ 四、测试用例示例

    输入:

    CA1201
    1200.0
    5
    A 300
    B 200
    C 400
    D 100
    E 200
    

    输出:

    货物装载信息如下:
    货物[C 重量:400.0kg]
    货物[A 重量:300.0kg]
    货物[B 重量:200.0kg]
    货物[E 重量:200.0kg]
    货物[D 重量:100.0kg]
    总重量: 1200.0kg / 最大载重: 1200.0kg
    配载状态:正常
    

    ✅ 五、总结

    优点:

    • 符合 单一职责原则(SRP)
    • 逻辑清晰,易于扩展和维护
    • 支持正确的货物排序和超载检测

    建议改进点:

    • 可以增加异常处理(如负数重量、无效输入等)
    • 可以将输出格式统一为方法,便于复用

    如果你有更多需求(比如导出数据、保存日志等),也可以继续扩展这个系统。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月18日