完整代码在文章末尾
1.我要订餐
2.查看餐袋
3.签收订单
4.删除订单
5.我要点赞
6.退出系统
1).这六个数组存储的是变化的量
1.String userNames[] = new String[4]; //保存用户姓名 2.String dishMegs[] = new String[4]; //订餐信息,包括菜名和份数,所以是个字符串类型 3.int times[] = new int[4]; //送餐时间 4.String addresses[] = new String[4]; //送餐地址 5.int status[] = new int[4]; //订单状态:0:已预定 1:已签收 6.Double sumMoney[] = new Double[4]; //订单的总金额
2).还需要一些数组来装相对固定不变的值
1.String[] dishNames={"红烧带鱼","鱼香肉丝","时令鲜蔬"}; //装菜名 2.double[] prices ={38.0,20.0,10.0}; //装菜的价格 3.int praiseNums[]=new int[3]; //装点赞数
基本框架需要先实现菜单切换:
1.当输入1-5时:会有相关的菜单选项
2.用while包裹switch来显示循环菜单。
3.设置boolean的原因是为了退出while循环
4.基本框架如下,基本框架完成了只需要再逐步完成各个功能了
boolean f=true;
while(f){
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.println("请选择:");
int choose=scanner.nextInt();
Scanner scanner=new Scanner(System.in);
System.out.println("请选择");
int choose=scanner.nextInt();
switch (choose){
case 1:
System.out.println("****我要订餐****");
break;
case 2:
System.out.println("****查看餐袋****");
break;
case 3:
System.out.println("****签收订单****");
break;
case 5:
System.out.println("****我要点赞****");
break;
case 6:
System.out.println("****退出系统****");
isExit=true;
break;
}
}
思路:
1.输入订餐人姓名,菜品编号,菜品份数,送餐时间,送餐地址
2.等用户输入完上面的数据后要重新显示一遍:菜品和份数,送餐时间和总额,这些都需要放到数组里
3.需要把用户输入的菜名和份数装在一个String数组中,这样显示的时候比较方便
分析代码:这一块主要是让用户输入信息
1.外层设置一个for循环用来给把信息挨个装进数组
2.紧接着用一个if来判断一下userName数组是否还有空余,如果有空余就进行以下的操作, isAdd这个变量是用来判断餐袋满了没,也可以用else来实现"餐袋已满"。
3.让用户依次输入信息,当输入到选择菜品前,应该展示那些固定数组中的菜品和价格。
4.存储信息时这里用的是字符串类型的变量,为了展示的时候
case 1:
System.out.println("****我要订餐****");
boolean isAdd = false;//记录是否可以订餐
for (int i = 0; i < userNames.length; i++) {
if (userNames[i] == null) {
isAdd = true;
System.out.println("请输入订餐人姓名");
String name = scanner.next();
System.out.println("序号" + "\t" + "菜名" + "\t" + "单价" + "\t" + "点赞数");
//循环菜品
for (int j = 0; j < dishNames.length; j++) {
String price = prices[j] + "元";
String priaisenum = (praiseNums[j] > 0 ? praiseNums[j] + "赞" : "0");
System.out.println((j + 1) + "\t" + dishNames[j] + "\t" + price + "\t" + priaisenum);
}
System.out.println("请选择您要点的菜品编号");
int chioceDish = scanner.nextInt();
System.out.println("请选择您要的份数");
int number = scanner.nextInt();
//把份数和菜名都存在dishMeg这个String数组中
String dishMeg = dishNames[chioceDish - 1] + "" + number + "份";
double sumPrice = number * prices[chioceDish - 1];
System.out.println("请输入送餐时间 (送餐时间是10点-20点间整点送达):");
int time = scanner.nextInt();
while (time > 20 || time < 10) {
System.out.println("对不起您输入的时间有误,请输入10点-20点间的整数");
time = scanner.nextInt();
}
System.out.println("请输入送餐地址");
String address = scanner.next();
分析代码:这一块主要是把存的用户的信息输出出去
1.把上面用户存入的姓名,菜品信息,地址,送餐时间,总价。把这些存入数组并且终止for循环
System.out.println("订餐成功!");
System.out.println("您订的是:" + dishMeg);
System.out.println("送餐时间" + time);
System.out.println("餐费:" + sumPrice);
userNames[i] = name;
dishMegs[i] = dishMeg;
addresses[i] = address;
times[i] = time;
sumMoney[i] = sumPrice;
break;
}
if (!isAdd) {
System.out.println("对不起,您的餐袋已满");
}
}
break;
查看餐袋据相当于是显示历史订单
1.查看餐袋就是把功能一存进去的值再用字符串拼接一下,取出来,这里的for循环是为了循环取出字符串中的值,用三元运算符把数值转为文字,最后把这些值拼接起来
case 2:
System.out.println("****查看餐袋****");
System.out.println("序号" + "\t" + "订餐人" + "\t" + "餐品信息" + "\t" + "送餐时间" + "\t" + "送餐地址" + "\t" + "总金额" + "\t" + "订单状态");
for (int i = 0; i < userNames.length; i++) {
if (userNames[i] != null) {
// 0为已预定,1为已完成
String state = (status[i] == 0 ? "已预定" : "已完成");
System.out.println((i + 1) + "\t" + userNames[i] + "\t" + dishMegs[i] + "\t" + times[i] + "\t" + "点" + addresses[i] + "\t" + sumMoney[i] + "\t" + state);
}
}
状态为0的订单是已预定订单,可以签收
状态为1的订单是已完成订单,已经签收过了,不能再次签收
1.boolean isSignFind = false;这个变量是为了识别是否找到订单,没找到值为false,找到了值为true,是为了应对没找到此订单这种情况,末尾有一个条件判断
2.if (userNames[i] != null && status[i] == 0 && signOrderId == i + 1)的意思是找到用户名不为空,状态为0,而且订单号等于数组序号+1的进入签收,否则显示已签收
case 3:
//0已预定,1,已完成
System.out.println("****签收订单****");
boolean isSignFind = false;//找到要签收的订单
System.out.println("请选择要签收的订单号");
int signOrderId = scanner.nextInt();
for (int i = 0; i < userNames.length; i++) {
if (userNames[i] != null && status[i] == 0 && signOrderId == i + 1) {
status[i] = 1;//将状态值设为已签收
System.out.println("订单签收完成");
isSignFind = true;
} else if (userNames[i] != null && status[i] == 1) {
System.out.println("您选择的订单已完成签收,不能再次签收");
isSignFind = true;
}
}
if (!isSignFind) {
System.out.println("您选择的订单不存在");
}
break;
这个功能的难点是:当我们删除了一个订单之后,userNames[] 、dishMegs[]、 times[]、addresses[] 、status[] 、 sumMoney[] 这六个数组的值都要往前挪一位,填补上删除的空缺,把空缺放进数组的末尾。
1完成的订单才能被删除,未完成的订单不能删
2.isDelFind变量是为了标记这个删除订单是否被找到
3.第二个for循环是为了删除数值:直接把要删除订单的上一个值覆盖掉要删除的值,然后把最后的值清空
case 4:
// 删除订单号需要其他数组的都往前挪一位
System.out.println("****删除订单****");
boolean isDelFind = false;//标记未找到的删除订单
System.out.println("请输入要删除的订单编号");
int delOrderId = scanner.nextInt();
for (int j = 0; j < userNames.length; j++) {
//当用户名不为空,状态为已完成的可以删除
if (userNames[j] != null && status[j] == 1) {
isDelFind = true;//表示已找到
// 为啥这个地方要length-1,有的地方都不用
for (int k = delOrderId - 1; k < userNames.length - 1; k++) {
userNames[k] = userNames[k + 1];
dishMegs[k] = dishMegs[k + 1];
sumMoney[k] = sumMoney[k + 1];
times[k] = times[k + 1];
status[k] = status[k + 1];
addresses[k] = addresses[k + 1];
}
// 把最后一位清空
int endIndex = userNames.length - 1;
userNames[endIndex] = null;
dishMegs[endIndex] = null;
sumMoney[endIndex] = 0.0;
times[endIndex] = 0;
status[endIndex] = 0;
addresses[endIndex] = null;
System.out.println("删除订单成功");
break;
} else if (userNames[j] != null && status[j] == 0) {
System.out.println("您选择的订单还没签收,不能删除");
isDelFind = true;
}
if (!isDelFind) {
System.out.println("您要删除的订单不存在");
}
break;
}
break;
点赞的数量是装在praiseNums[]这个数组里的,而且赞的数量只能增加
1.点赞前需要先展示菜单,第一个for循环就是为了展示菜品和数量
2.System.out.println(price);等于System.out.println(prices[j] + "元");可以换成自己喜欢的方式
3.点赞的序号-1才等于要点赞的菜品数组下标
case 5:
System.out.println("****我要点赞****");
// 显示菜单
for (int j = 0; j < dishNames.length; j++) {
String price = prices[j] + "元";
String priaisenum = (praiseNums[j] > 0 ? praiseNums[j] + "赞" : "0");
System.out.println((j + 1) + "\t" + dishNames[j] + "\t" + price + "\t" + priaisenum);
}
System.out.println("请选择您要点赞的菜品序号");
int dishPriaseID = scanner.nextInt();
praiseNums[dishPriaseID - 1] += 1;
System.out.println("点赞成功");
break;
这里结合前面的while循环,如果退出系统f会赋值为false,就不能进入系统了
boolean f = true;
while (f) {
System.out.println("欢迎使用“吃货联盟订餐系统");
System.out.println("***************************************");
System.out.println("1.我要订餐");
System.out.println("2.查看餐袋");
// 下面的代码省略
}
case 6:
System.out.println("****退出系统****");
f = false;
break;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 功能:1.我要订餐 2.查看餐袋 3.签收订单 4.删除订单 5.我要点赞 6.退出系统
Scanner scanner = new Scanner(System.in);
String userNames[] = new String[4]; //保存用户姓名
String dishMegs[] = new String[4]; //订餐信息,包括菜名和份数,所以是个字符串类型
int times[] = new int[4]; //送餐时间
String addresses[] = new String[4]; //送餐地址
int status[] = new int[4]; //订单状态:0:已预定 1:已签收
Double sumMoney[] = new Double[4]; //订单的总金额
// 这几个数组装的是固定的
String[] dishNames = {"红烧带鱼", "鱼香肉丝", "时令鲜蔬"};
double[] prices = {38.0, 20.0, 10.0};
int praiseNums[] = new int[3];
// 1.主页面
boolean f = true;
while (f) {
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.println("请选择:");
int choose = scanner.nextInt();
switch (choose) {
case 1:
System.out.println("****我要订餐****");
boolean isAdd = false;//记录是否可以订餐
for (int i = 0; i < userNames.length; i++) {
if (userNames[i] == null) {
isAdd = true;
System.out.println("请输入订餐人姓名");
String name = scanner.next();
System.out.println("序号" + "\t" + "菜名" + "\t" + "单价" + "\t" + "点赞数");
for (int j = 0; j < dishNames.length; j++) {
String price = prices[j] + "元";
String priaisenum = (praiseNums[j] > 0 ? praiseNums[j] + "赞" : "0");
System.out.println((j + 1) + "\t" + dishNames[j] + "\t" + price + "\t" + priaisenum);
}
System.out.println("请选择您要点的菜品编号");
int chioceDish = scanner.nextInt();
System.out.println("请选择您要的份数");
int number = scanner.nextInt();
//把份数和菜名都存在dishMeg这个String数组中
String dishMeg = dishNames[chioceDish - 1] + "" + number + "份";
double sumPrice = number * prices[chioceDish - 1];
System.out.println("请输入送餐时间 (送餐时间是10点-20点间整点送达):");
int time = scanner.nextInt();
while (time > 20 || time < 10) {
System.out.println("对不起您输入的时间有误,请输入10点-20点间的整数");
time = scanner.nextInt();
}
System.out.println("请输入送餐地址");
String address = scanner.next();
System.out.println("订餐成功!");
System.out.println("您订的是:" + dishMeg);
System.out.println("送餐时间" + time);
System.out.println("餐费:" + sumPrice);
// 存放数据
userNames[i] = name;
dishMegs[i] = dishMeg;
addresses[i] = address;
times[i] = time;
sumMoney[i] = sumPrice;
break;
}
if (!isAdd) {
System.out.println("对不起,您的餐袋已满");
}
}
break;
case 2:
System.out.println("****查看餐袋****");
System.out.println("序号" + "\t" + "订餐人" + "\t" + "餐品信息" + "\t" + "送餐时间" + "\t" + "送餐地址" + "\t" + "总金额" + "\t" + "订单状态");
for (int i = 0; i < userNames.length; i++) {
if (userNames[i] != null) {
// 0为已预定,1为已完成
String state = (status[i] == 0 ? "已预定" : "已完成");
System.out.println((i + 1) + "\t" + userNames[i] + "\t" + dishMegs[i] + "\t" + times[i] + "\t" + "点" + addresses[i] + "\t" + sumMoney[i] + "\t" + state);
}
}
break;
case 3:
//0已预定,1,已完成
System.out.println("****签收订单****");
boolean isSignFind = false;//找到要签收的订单
System.out.println("请选择要签收的订单号");
int signOrderId = scanner.nextInt();
for (int i = 0; i < userNames.length; i++) {
// 状态为已预定status=0的已预定的可以签收
// 状态为已预定status=1的已签收的不可以签收
if (userNames[i] != null && status[i] == 0 && signOrderId == i + 1) {
status[i] = 1;//将状态值设为已签收
System.out.println("订单签收完成");
isSignFind = true;
} else if (userNames[i] != null && status[i] == 1) {
System.out.println("您选择的订单已完成签收,不能再次签收");
isSignFind = true;
}
}
if (!isSignFind) {
System.out.println("您选择的订单不存在");
}
break;
case 4:
// 删除订单号需要其他数组的都往前挪一位
System.out.println("****删除订单****");
boolean isDelFind = false;//标记未找到的删除订单
System.out.println("请输入要删除的订单编号");
int delOrderId = scanner.nextInt();
for (int j = 0; j < userNames.length; j++) {
//当用户名不为空,状态为已完成的可以删除
if (userNames[j] != null && status[j] == 1) {
isDelFind = true;//表示已找到
for (int k = delOrderId - 1; k < userNames.length - 1; k++) {
userNames[k] = userNames[k + 1];
dishMegs[k] = dishMegs[k + 1];
sumMoney[k] = sumMoney[k + 1];
times[k] = times[k + 1];
status[k] = status[k + 1];
addresses[k] = addresses[k + 1];
}
// 把最后一位清空
int endIndex = userNames.length - 1;
userNames[endIndex] = null;
dishMegs[endIndex] = null;
sumMoney[endIndex] = 0.0;
times[endIndex] = 0;
status[endIndex] = 0;
addresses[endIndex] = null;
System.out.println("删除订单成功");
break;
} else if (userNames[j] != null && status[j] == 0) {
System.out.println("您选择的订单还没签收,不能删除");
isDelFind = true;
}
if (!isDelFind) {
System.out.println("您要删除的订单不存在");
}
break;
}
break;
case 5:
System.out.println("****我要点赞****");
// 显示菜单
for (int j = 0; j < dishNames.length; j++) {
// String price = prices[j] + "元";
String priaisenum = (praiseNums[j] > 0 ? praiseNums[j] + "赞" : "0");
System.out.println((j + 1) + "\t" + dishNames[j] + "\t" + prices[j] + "元" + "\t" + priaisenum);
}
System.out.println("请选择您要点赞的菜品序号");
int dishPriaseID = scanner.nextInt();
praiseNums[dishPriaseID - 1] += 1;
System.out.println("点赞成功");
// 第二个循环是为了展示点出的赞
for (int j = 0; j < dishNames.length; j++) {
// String price = prices[j] + "元";
String priaisenum = (praiseNums[j] > 0 ? praiseNums[j] + "赞" : "0");
System.out.println((j + 1) + "\t" + dishNames[j] + "\t" + prices[j] + "元" + "\t" + priaisenum);
}
break;
case 6:
System.out.println("****退出系统****");
f = false;
break;
}
}
}
}