一、效果展示,直接上成品图
1.界面
![](https://i-blog.csdnimg.cn/blog_migrate/c109cbbbaae64b09a0042ce06b95fa26.png)
2.我要点餐
![](https://i-blog.csdnimg.cn/blog_migrate/8e975ec79bf032e2c6a15d240e734908.png)
3.查看餐袋
![](https://i-blog.csdnimg.cn/blog_migrate/1af84e91deec0a29f64e56cc608ed23f.png)
4.签收订单
![](https://i-blog.csdnimg.cn/blog_migrate/420d22bfe5e938046b33262c3531f6a4.png)
5.删除订单
![](https://i-blog.csdnimg.cn/blog_migrate/90bf8bb5965e06f8030ca80a1eb8d99e.png)
6.我要点赞
![](https://i-blog.csdnimg.cn/blog_migrate/988d4d8949071a66c5ec138f70ee3fb8.png)
7.退出系统
![](https://i-blog.csdnimg.cn/blog_migrate/bb89c9bb800e62ac948e4ea764690b0d.png)
二、数据设计
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();
}
}