吃货联盟订餐系统

一、效果展示,直接上成品图

1.界面

2.我要点餐

3.查看餐袋

4.签收订单

5.删除订单

6.我要点赞

7.退出系统

二、数据设计

1.涉及的数据类型

菜品String、价格double、点赞int、人名String、送餐时间String、 地址String、总金额double、订单状态boolean。

2.两种设计的方法

第一种是使用字符串二维数组存放数据,本篇只介绍使用字符串二维数组

优点:不必考虑数据类型,统一使用String

缺点:后续数据转换代码冗长

第二种是使用多个数据类型的一维数组,分别存放数据,使用相同下标组成一条记录

优点:类型明确后续无需繁琐转换

缺点:使用多个数组,操作一条记录需要控制多个数组

三、逻辑要求

1.我要点餐

将用户输入的信息存入数组中, 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态其中需要对输入的信息进行判断,如时间要求10:00-20:00之间,错误则需要重新输入时间,直到正确为止。

涉及到几个转换方法:1.字符串转双精度Double.parseDouble(str);

2.字符串转整型Integer.parseInt(str);

3.字符串转字符str.charAt(index);

2.查看餐袋

只需遍历数组即可。

3.更新状态

点完餐后状态为已预订,此功能是将输入的姓名的已预订更新为已完成,用于删除订单之前的判断。

4.删除订单

将输入的姓名这条记录删除,删除之前判断状态是否为已完成,否则不能删除。删除操作就是后一条记录赋值给前一条记录,再将最后一条赋null,注意此时操作的都是值,即a[0][0],不是地址a[0],否则很容易报错NullPointerException。

5.我要点赞

将菜品对应的点赞属性加1即可。

6.退出系统

有两种方式,第一种是使用break跳出最外层循环,第二种是System.exit(0);

四、源码

直接使用需要改包名,类名。

package com.bdqn.点餐系统;

import java.util.Scanner;

public class OrderFoodSystem {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // disMesg 0序号 1名称 2单价 3点赞数
        String[][] disMesg = new String[5][8];
        // personMesg 0序号 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态
        String[][] personMesg = new String[10][7];

        int count = 3;

        // 默认菜品信息
        // 第一条
        disMesg[0][0] = "1";
        disMesg[0][1] = "葱爆猪肝";
        disMesg[0][2] = "18";
        disMesg[0][3] = "99";
        // 第二天条
        disMesg[1][0] = "2";
        disMesg[1][1] = "油焖茄子";
        disMesg[1][2] = "12";
        disMesg[1][3] = "99";
        // 第三条
        disMesg[2][0] = "3";
        disMesg[2][1] = "西红柿炒蛋";
        disMesg[2][2] = "15";
        disMesg[2][3] = "99";

        // 默认订单信息 0序号 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态
        personMesg[0][0] = "1";
        personMesg[0][1] = "胡歌";
        personMesg[0][2] = "葱爆猪肝1份";
        personMesg[0][3] = "12:12";
        personMesg[0][4] = "工投创智天地1栋410";
        personMesg[0][5] = "18";
        personMesg[0][6] = "已完成";
        personMesg[1][0] = "2";
        personMesg[1][1] = "胡歌";
        personMesg[1][2] = "油焖茄子1份";
        personMesg[1][3] = "14:30";
        personMesg[1][4] = "工投创智天地1栋410";
        personMesg[1][5] = "12";
        personMesg[1][6] = "已预订";
        personMesg[2][0] = "3";
        personMesg[2][1] = "林峰";
        personMesg[2][2] = "油焖茄子2份";
        personMesg[2][3] = "19:45";
        personMesg[2][4] = "工投创智天地1栋410";
        personMesg[2][5] = "24";
        personMesg[2][6] = "已预订";

        mainInterfacewhile: while (true) {
            // 主界面
            System.out.println("欢迎使用 " + "“" + "吃货联盟订餐系统" + "”");
            System.out.println("******************************");
            System.out.println("1、我要订餐");
            System.out.println("2、查看餐袋");
            System.out.println("3、签收订单");
            System.out.println("4、删除订单");
            System.out.println("5、我要点赞");
            System.out.println("6、退出系统");
            System.out.println("******************************");

            // 输入操作选择
            System.out.print("请选择:");
            int select = sc.nextInt();

            // 换行
            System.out.println();
            // 功能选择
            selectSwitch: switch (select) {
            // 1、我要点餐
            case 1:
                // 显示三个菜品
                System.out.println("********" + "我要订餐" + "********");
                System.out.println("序号\t名称\t单价¥\t点赞数");
                for (int i = 0; i < disMesg.length && disMesg[i] != null; i++) {
                    for (int j = 0; j < disMesg[i].length
                            && disMesg[i][j] != null; j++) {
                        System.out.print(disMesg[i][j] + "\t");
                    }
                    System.out.println();
                }

                // 寻找空串 记录下标
                int index = 0;
                for (; index < personMesg.length; index++) {
                    if (personMesg[index][0] == null) {
                        // 找到就结束循环
                        break;
                    }
                }

                // personMesg 0序号 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态
                // disMesg 0序号 1名称 2单价 3点赞数
                // 输入姓名
                System.out.print("请输入您的姓名:");
                // 存入字符串数组 列号4为订餐人姓名
                personMesg[index][1] = sc.next();
                personMesg[index][0] = ++count + "";

                // 选择菜品序号和份数
                System.out.print("请选择您要点的菜品序号:");
                int orderNumber = sc.nextInt();
                // 存入字符串数组 列号2为菜品
                personMesg[index][2] = disMesg[orderNumber - 1][1];
                System.out.print("请输入几份:");
                int amount = sc.nextInt();
                // 存入字符串数组添加菜品份数
                personMesg[index][2] += (amount + "份");

                // 送餐时间 提示输入范围错误
                while (true) {
                    System.out.print("请输入送餐时间[10:00-20:00]:");
                    String time = sc.next();
                    // 声明两个变量 时间 分钟
                    int hour = 0;
                    int minute = 0;
                    // 满足条件的时间10:00-22:00,字符串长度为5 且 下标2为:
                    if (time.length() == 5 && time.charAt(2) == ':') {
                        // 将对应的转化为整型
                        hour = Integer.parseInt(time.substring(0, 2));
                        minute = Integer.parseInt(time.substring(3, 5)) ; 
                    }
                    // 超过范围给提示
                    if (hour < 10 || hour > 20 || minute < 0 || minute > 60) {
                        System.out.print("时间输入错误!请重新输入:");
                        // 回到循环头 重新输入
                        continue;
                    } else {
                        // 输入正确 存入字符串数组 列号3为送餐时间
                        personMesg[index][3] = time;
                        // 结束 循环
                        break;
                    }
                }

                // 送餐地址
                System.out.print("请输入送餐地址:");
                // 存入字符串数组 列号4为送餐地址
                personMesg[index][4] = sc.next();

                // 计算总金额
                // 找到用户输入的菜品序号对应的下标
                int disIndex = orderNumber - 1;
                double sum;
                // 如果购买金额小于50就要6元配送费
                if (Double.parseDouble(disMesg[disIndex][2]) * amount < 50) {
                    sum = Double.parseDouble(disMesg[disIndex][2]) * amount + 6;
                } else {
                    sum = Double.parseDouble(disMesg[disIndex][2]) * amount;
                }
                // 存入字符串数组列号5为总金额
                personMesg[index][5] = sum + "";

                // 订餐成功展示信息
                // personMesg 0序号 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态
                // disMesg 0序号 1名称 2单价 3点赞数
                System.out.println("您的订单信息:");
                if (sum < 50) {
                    System.out.println("订餐人:" + personMesg[index][1] + "\t下单了:"
                            + personMesg[index][2] + "\t地址为:"
                            + personMesg[index][4] + "\n未满50付配送费6元" + "\t总金额:"
                            + sum + "元。");
                } else {
                    System.out.println("订餐人:" + personMesg[index][1] + "\t下单了:"
                            + personMesg[index][2] + "\t地址为:"
                            + personMesg[index][4] + "\n满50减免配送费6元" + "\t总金额:"
                            + sum + "元。");
                }
                System.out.println("订餐成功!");

                // 更新状态 存入字符串数组 列号6为状态
                personMesg[index][6] = "已预订";

                // 返回
                while (true) {
                    System.out.print("按0返回上一级:");
                    int input = sc.nextInt();
                    if (input == 0) {
                        // 结束本层switch
                        break selectSwitch;
                    } else {
                        System.out.println("输入错误!");
                    }
                }

                // 2、查看餐袋
            case 2:
                // 0序号 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态
                System.out.println("********" + "查看餐袋" + "********");
                System.out.println("序号\t\t订餐人\t\t餐品信息\t\t\t送餐日期\t\t"
                        + "送餐地址\t\t\t¥总金额\t\t订单状态");

                // 遍历输出personMesg数组 订餐人为空就结束循环
                for (int i = 0; i < personMesg.length
                        && personMesg[i][0] != null; i++) {
                    // j=1 即从姓名开始
                    System.out.print((i + 1) + "\t\t");
                    for (int j = 1; j < personMesg[i].length
                            && personMesg[i][j] != null; j++) {

                        System.out.print(personMesg[i][j] + "\t\t");
                    }
                    System.out.println();
                }

                // 返回上一级
                while (true) {
                    System.out.print("按0返回上一级:");
                    int input = sc.nextInt();
                    if (input == 0) {
                        // 结束本层switch
                        break selectSwitch;
                    } else {
                        // 提示错误
                        System.out.println("输入错误!");
                    }
                }

                // 3、签收订单
            case 3:
                // 0序号 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态
                System.out.print("请输入你要签收订单的姓名:");
                String name = sc.next();
                boolean flag = false;
                // 判断有没有该姓名的订单
                for (int i = 0; i < personMesg.length && personMesg[i] != null; i++) {
                    // 判断是否存在 personMesg[i][1]是姓名
                    if (name.equals(personMesg[i][1])
                            && personMesg[i][6].equals("已预订")) {
                        personMesg[i][6] = "已完成";
                        flag = true;
                    }

                }

                // 判断是否全部完成签收
                if (flag) {
                    System.out.println("签收成功!");
                } else {
                    System.out.println("没有您需要签收的订单信息!");
                }

                // 返回上一级
                while (true) {
                    System.out.print("按0返回上一级:");
                    int input = sc.nextInt();
                    if (input == 0) {
                        // 结束本层switch
                        break selectSwitch;
                    } else {
                        // 提示错误
                        System.out.println("输入错误!");
                    }
                }

                // 4、删除订单
            case 4:
                System.out.print("请输入您要删除订单的姓名:");
                name = sc.next();
                // 循环找到name
                // 0序号 1订餐人 2名称 3送餐时间 4送餐地址 5总金额 6订单状态
                int indexName = 0;
                for (int i = 0; i < personMesg.length && personMesg[i] != null; i++) {
                    // 找到姓名
                    if (name.equals(personMesg[i][1])) {
                        indexName = i;
                        // 结束循环 即找到
                        break;
                    }

                }

                // 当订单是完成状态才能删除
                if (personMesg[indexName][6].equals("已完成")) {
                    // 外循环控制行数
                    for (; indexName < personMesg.length
                            && personMesg[indexName][1] != null; indexName++) {
                        // 内循环挪位置覆盖
                        for (int i = 0; i < personMesg[indexName].length; i++) {
                            personMesg[indexName][i] = personMesg[indexName + 1][i];
                        }
                    }

                    // 最后元素 赋空 即删除
                    for (int i = 0; i < personMesg[indexName].length; i++) {
                        personMesg[indexName][i] = null;
                    }
                    System.out.println("删除成功!");

                    // 倘若状态不为已完成
                } else {
                    System.out.println("抱歉,您有订单未完成签收,不能删除!请删除后重试!");
                }

                // 返回上一级
                while (true) {
                    System.out.print("按0返回上一级:");
                    int input = sc.nextInt();
                    if (input == 0) {
                        // 结束本层switch
                        break selectSwitch;
                    } else {
                        // 提示错误
                        System.out.println("输入错误!");
                    }
                }
                // 对菜品点赞
            case 5:
                // 显示三个菜品
                System.out.println("********" + "我要订餐" + "********");
                System.out.println("序号\t名称\t单价¥\t点赞数");
                for (int i = 0; i < disMesg.length && disMesg[i] != null; i++) {
                    for (int j = 0; j < disMesg[i].length
                            && disMesg[i][j] != null; j++) {
                        System.out.print(disMesg[i][j] + "\t");
                    }
                    System.out.println();
                }
                // 提示
                System.out.println("请给好吃的菜点赞[序号]:");
                int number = sc.nextInt();

                // 给用户点赞的菜赋值点赞数 disMesg 0序号 1名称 2单价 3点赞数
                // 字符串类型 = 字符串转换整型+1 再转字符串
                disMesg[number - 1][3] = Integer
                        .parseInt(disMesg[number - 1][3]) + 1 + "";

                // 返回上一级
                while (true) {
                    System.out.print("按0返回上一级:");
                    int input = sc.nextInt();
                    if (input == 0) {
                        // 结束本层switch
                        break selectSwitch;
                    } else {
                        // 提示错误
                        System.out.println("输入错误!");
                    }
                }
            case 6:

            default:
                System.out.println("欢迎下次再次使用!");
                // 结束最外层while循环 程序到此结束
                break mainInterfacewhile;
            }

        }
        // 关闭资源
        sc.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

 林先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值