(个人解题思路系列)用数组来写快递系统

本文介绍了一个基于数组存储的快递管理系统的设计思路,包括快递录入、删除、修改和查看功能。管理员能进行快递操作,普通用户仅能通过取件码取件。系统分为视图类、数据类、数据导入类、数据调用类和主执行类五个部分,其中数据以二维数组形式存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快递系统(数组储存)的分析解题思路

前言

本系列是我自己关于遇到过的编程题目进行的分析思路总结,希望能够帮助到需要帮助的那些需要帮助的编程小白,同时也欢迎各位前辈予以指正和批评指导,谢谢。

题目:

任务用于熟悉快递管理业务,完成快递管理控制台项目,具体需求如图。
在这里插入图片描述

个人初步分析

  1. 需存储的数据有快递单号,快递公司,取件码,柜子位置(个人认为实际生活中位置应该是快递员选择指定),这里要求采用二维数组的方式存储数据
  2. 管理员有快递录入,快递删除(根据单号),快递修改(根据单号),查看所有快递(遍历)4个功能
  3. 普通用户只能根据取件码取快递

个人解题思路

说明

1.快递系统
① Views类(视图类)
② Data类(数据存储类)
③ Import类(数据使用类)
④ Call类(执行方法调度类)
⑤ Main类(程序执行类)
2.实现功能
① 快递员
快递录入
- 柜子位置生成(系统随机生成)
- 快递单号生成(输入)
- 快递公司(输入)
- 取件码(系统随机生成)
快递信息修改
快递删除
全部快递查找
② 普通用户
快递取件
- 输入取件码,取出快递同时删除系统内快递信息

1.视图类Views

根据要求进行各类视图的编码

/**
 * 视图类
 */
public class Views {
    private Scanner input = new Scanner(System.in);

    /**
     * 欢迎用方法
     */
    public void welcome(){
        System.out.println("欢迎使用XXX快递系统");
    }
    /**
     * 结束再见用方法
     */
    public void bye(){
        System.out.println("欢迎下次使用,再见!");
    }
    /**
     * 身份选择菜单
     */
    public int menu(){
        // 交互菜单
        System.out.println("请根据以下提示,输入功能序号:");
        System.out.println("1.快递员");
        System.out.println("2.普通用户");
        System.out.println("0.退出");
        // 输入交互内容
        String text = input.nextLine();
        // 定义num
        int num = -1;
        // 异常处理
        try{
            num =  Integer.parseInt(text);
        }catch (NumberFormatException e){

        }
        // 如果不是0,1,2则重新输入
        if (num<0 || num>2){
            return menu();
        }
        return num;
    }

    /**
     * 快递员菜单
     */
    public int cMenu(){
        System.out.println("请根据以下提示,进行取件操作:");
        System.out.println("1.快递录入");
        System.out.println("2.快递修改");
        System.out.println("3.快递删除");
        System.out.println("4.查看所有快递");
        System.out.println("0.退出");
        // 输入交互内容
        String text = input.nextLine();
        // 定义num
        int num = -1;
        // 异常处理
        try{
            num =  Integer.parseInt(text);
        }catch (NumberFormatException e){

        }
        // 如果不是0,1,2,3,4则重新输入
        if (num<0 || num>4){
            System.out.println("选择内容错误,请重新选择");
            return cMenu();
        }
        return num;
    }
    /**
     * 录入信息
     */
    public Data insert(){
        System.out.println("请根据以下提示,输入快递信息:");
        System.out.print("请输入快递单号:");
        System.out.println();
        // 输入快递单号
        String number = input.nextLine();
        System.out.print("请输入快递公司:");
        // 输入快递公司
        String company = input.nextLine();
        Data e = new Data();
        // 数据录入
        e.setNumber(number);
        e.setCompany(company);
        return e;
    }
    /**
     * 查找快递
     */
    public String findByNumber(){
        System.out.println("请根据以下提示,输入快递信息:");
        System.out.print("请输入需要进行操作的快递单号:");
        // 输入需查找快递单号
        String number = input.nextLine();
        // 返回快递单号数据
        return number;
    }
    /**
     * 查找快递
     */
    public void printData(Data e){
        System.out.println("快递信息如下:");
        System.out.println("快递公司:"+e.getCompany()+",快递单号:"+e.getNumber()+",取件码:"+e.getCode());
    }
    /**
     * 查找快递
     */
    public void printNull(){
        System.out.println("快递不存在,请检查您的输入!");
    }
    /**
     * 修改快递信息
     */
    public void update(Data e){
        System.out.print("请输入新的快递单号:");
        System.out.println();
        // 输入新的快递单号
        String number = input.nextLine();
        System.out.print("请输入新的快递公司:");
        // 输入新的快递公司
        String company = input.nextLine();
        e.setNumber(number);
        e.setCompany(company);
    }
    /**
     * 删除快递菜单
     */
    public int delete(){
        System.out.println("是否确认删除?");
        System.out.println("1.确认删除");
        System.out.println("2.取消删除");
        System.out.println("0.返回上级目录");
        // 输入交互内容
        String text = input.nextLine();
        // 定义num
        int num = -1;
        // 异常处理
        try{
            num =  Integer.parseInt(text);
        }catch (NumberFormatException e){

        }
        // 如果不是0,1,2则重新输入
        if (num<0 || num>2){
            return delete();
        }
        return num;
    }
    /**
     * 遍历显示全部快递信息
     */
    public void printAll(Data[][] es){
        int count = 0;
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                if(es[i][j] != null) {
                    count++;
                    System.out.print("第"+(i+1)+"排,"+(j+1)+"列快递,");
                    printData(es[i][j]);
                }
            }
        }
        if(count == 0){
            System.out.println("暂无快递信息");
        }
    }
    /**
     * 普通用户菜单
     */
    public int uMenu(){
        System.out.println("请根据以下提示,进行取件操作:");
        System.out.print("请输入您的取件码:");
        // 输入交互内容
        String text = input.nextLine();
        // 定义num
        int num = -1;
        // 异常处理
        try{
            num =  Integer.parseInt(text);
        }catch (NumberFormatException e){

        }
        if(num<100000 || num>999999){
            System.out.println("输入有误,请重新输入");
            return uMenu();
        }
        return num;
    }
    /**
     * 存储重复
     */
    public void dataExist(){
        System.out.println("此单号在快递柜中已存在,请勿重复存储");
    }
    /**
     * 快递取件码打印
     */
    public void printCode(Data e){
        System.out.println("快件的取件码为:"+e.getCode());
    }
    /**
     * 快递取件码打印
     */
    public void success(){
        System.out.println("操作成功");
    }
}
2.数据类Data

此类中快递单号,快递公司,取件码的生产

/**
 * 快递数据存储类
 */
public class Data {
    // 单号
    private String number;
    // 快递公司
    private String company;
    // 取件码
    private int code;
    // 全参构造方法
    public Data(String number, String company, int code) {
        this.number = number;
        this.company = company;
        this.code = code;
    }
    // 无参构造方法
    public Data() {
    }
    // toString方法
    public String toString() {
        return "Data{" +
                "number='" + number + '\'' +
                ", company='" + company + '\'' +
                ", code=" + code +
                '}';
    }
    // 对比快递单号
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Data data = (Data) o;
        return Objects.equals(number, data.number);
    }
    // 返回快递单号
    public String getNumber() {
        return number;
    }
    // 赋值快递单号
    public void setNumber(String number) {
        this.number = number;
    }
    // 返回快递公司
    public String getCompany() {
        return company;
    }
    // 赋值快递公司
    public void setCompany(String company) {
        this.company = company;
    }
    // 返回取件码
    public int getCode() {
        return code;
    }
    // 赋值取件码
    public void setCode(int code) {
        this.code = code;
    }
}
3.数据导入类Import

主要为数据的操作和存储,在这里采用2维数组进行存储,主要为录入,修改,删除和遍历操作

/**
 * 快递数据导入类
 */
public class Import {
    // 假设快递柜的存放格为10X10的规格,共100个,定义一个二维数组
    private Data[][] data = new Data[10][];
    // 定义一个快递柜存储数
    private int size;
    // 构建二维数组data[10][10]
    {
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                data[i] = new Data[10];
            }
        }
    }
    // 定义随机数
    private Random random = new Random();

    /**
     * 录入数据
     */
    public boolean add(Data e) {
        if (size == 100) {
            return false;
        }
        // 随机产生两个0-9的数
        int x = -1;
        int y = -1;
        while (true) {
            x = random.nextInt(10);
            y = random.nextInt(10);
            if (data[x][y] == null) {
                // 此位置无快递
                break;
            }
        }
        // 取件码
        int code = randomCode();
        e.setCode(code);
        data[x][y] = e;
        return true;
    }
    /**
     * 随机生成取件码
     */
    private int randomCode(){
        while(true) {
            // 随机生成6位取件码
            int code = random.nextInt(900000) + 100000;
            Data e = findByCode(code);
            // 判断是否重复
            if(e == null){
                return code;
            }
        }
    }
    /**
     * 查询快递单号
     */
    public Data findByNumber(String number){
        Data e = new Data();
        e.setNumber(number);
        for(int i=0;i<10;i++) {
            for (int j = 0; j < 10; j++) {
                if (e.equals(data[i][j])){
                    return data[i][j];
                }
            }
        }
        return null;
    }
    /**
     * 查询取件码
     */
    public Data findByCode(int code){
        for(int i=0;i<10;i++) {
            for (int j = 0; j < 10; j++) {
                if(data[i][j] != null)
                if (data[i][j].getCode() == code){
                    return data[i][j];
                }
            }
        }
        return null;
    }
    public String findByPosition(int code){
        for(int i=0;i<10;i++) {
            for (int j = 0; j < 10; j++) {
                if(data[i][j] != null)
                    if (data[i][j].getCode() == code){
                        String n = "快递位置为"+i+"行"+j+"列";
                        return n;
                    }
            }
        }
        return null;
    }
    /**
     * 多于操作,为了mvc更圆润
     */
    public void update(Data oldData,Data newData){
        delete(oldData);
        add(newData);
    }
    /**
     * 删除快递数据
     */
    public void delete(Data e){
        p:for(int i=0;i<10;i++) {
            for (int j = 0; j < 10; j++) {
                if (data[i][j] != null)
                    if (e.equals(data[i][j])) {
                        data[i][j] = null;
                        break p;
                    }
            }
        }
    }
    /**
     * 遍历
     */
    public Data[][] findAll(){
        return data;
    }
}
4.数据调用类Call

该类主要是各种数据方法的调用

/**
 * 调度类
 */
public class Call {
    // 初始化视图对象
    private static Views v = new Views();
    // 初始化视图对象
    private static Import i = new Import();
    /**
     * 快递员菜单交互调度
     */
    public void cClient() {
        while (true){
            int menu = v.cMenu();
            switch (menu){
                case 0:
                    return;
                case 1:// 快递录入
                    typing();
                    break;
                case 2:// 快递修改
                    modify();
                    break;
                case 3:// 快递删除
                    delete();
                    break;
                case 4:// 所以快递查询
                    ergodic();
                    break;
            }
        }
    }
    /**
     * 遍历快递调度
     */
    public void ergodic() {
        Data[][] data = i.findAll();
        v.printAll(data);
    }

    /**
     * 删除调度
     */
    public void delete() {
        // 输入快递单号
        String number = v.findByNumber();
        // 查找快递对象
        Data e = i.findByNumber(number);
        if(e == null){
            v.printNull();
        }else{
            v.printData(e);
            int type = v.delete();
            if(type == 1){
                // 删除目标
                i.delete(e);
                // 提示成功
                v.success();
            }
        }
    }
    /**
     * 修改调度
     */
    public void modify() {
        // 提示输入快递信息
        String number = v.findByNumber();
        // 查找数据
        Data e = i.findByNumber(number);
        Data e2 = e;
        // 打印快递信息
        if(e == null){
            v.printNull();
        }else{
            v.printData(e);
            // 提示修改
            v.update(e2);
            i.update(e,e2);
            v.printData(e2);
        }
    }
    /**
     * 存储调度
     */
    public void typing() {
        // 提示输入快递信息
        Data e = v.insert();
        // 数据是否已经存储过
        Data e2 = i.findByNumber(e.getNumber());
        // 存储快递
        if(e2 == null) {
            // 未存储过,进行存储
            i.add(e);
            v.printData(e);
        }else{
            // 信息已经在系统内
            v.dataExist();
        }
    }
    /**
     * 普通用户取件调度
     */
    public void uClient() {
        // 取件码获取
        int code = v.uMenu();
        // 根据取件码去除快递
        Data e = i.findByCode(code);
        if(e == null){
            v.printNull();
        }else{
            v.success();
            System.out.println(i.findByPosition(code));
            v.printData(e);
            i.delete(e);
        }
    }
}
5.程序执行类Main

为初始操作界面和Call类方法的调用

/**
 * 程序执行类
 */
public class Main {
    // 初始化视图对象
    private static Views v = new Views();
    // 初始化调度方法
    private static Call c = new Call();
    public static void main(String[] args) {
        // 1.欢迎
        v.welcome();
        m:while(true){
            // 弹出身份选择菜单
            int menu = v.menu();
            switch (menu){
                case 0:
                    break m;
                case 1:
                    c.cClient();
                    break;
                case 2:
                    c.uClient();
                    break;
            }
        }
        // 结束使用,退出离开
        v.bye();
    }
}

实际运行效果图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值