Java基础——吃货联盟订餐系统

文章目录

  • 吃货联盟订餐系统
    • 覆盖技能点
      • 程序基本概念
      • 流程控制
      • 数组
    • 系统概述
    • 阶段划分
      • 用例1:实现菜单切换
        • 需求说明
        • 思路分析:
        • 难点提示
      • 用例2:数据初始化
        • 需求说明
      • 用例3:实现查看餐袋功能
        • 需求说明
        • 思路分析
        • 难点提示
      • 用例4:实现我要订餐功能
        • 需求说明
        • 思路分析
        • 难点提示
      • 用例5:实现签收订单功能
        • 需求说明
        • 思路分析
        • 难点提示
      • 用例6:实现删除订单功能
        • 需求说明
        • 思路分析
        • 难点提示
      • 用例7:实现我要点赞功能
        • 需求说明
        • 思路分析
    • 总代码
    • 项目总结
        • 理解需求
        • 重难点突破
        • 注意细节
        • 掌握调试技巧

吃货联盟订餐系统

刚刚学完java基础入门,主要学习Java基本环境搭建,定义变量、选择结构,循环结构、数组等。本阶段结束尝试接触此次吃货联盟订餐系统,第一次敲这么长的代码,后面多见识见识应该就好了,多加努力啊!

吃货联盟订餐系统包含的功能:我要订餐、查看餐袋、签收订单、删除订单、我要点赞、退出系统

覆盖技能点

程序基本概念

  • 变量
  • 数据类型

流程控制

  • 顺序
  • 选择
  • 循环
  • 跳转语句

数组

系统概述

“只要动动手指,就能送餐上门”,网上定餐深受现代人青睐,现开发一个网上订餐系统,功能如下
我要订餐
查看餐袋
签收订单
删除订单
我要点赞
退出系统

阶段划分

第一阶段:分析数据主体(重难点)
第二阶段:分析并完成整体框架(重难点)
第三阶段:分析并完成退出功能
第四阶段:分析并完成订餐功能
第五阶段:分析并完成查看餐袋功能
第六阶段:分析并完成签收订单功能
第七阶段:分析并完成删除功能(重难点)
第八阶段:分析总完成我要点赞功能

用例1:实现菜单切换

需求说明

  • 编写程序入口,实现菜单显示和切换

Java基础——吃货联盟订餐系统_第1张图片

思路分析:

  • 使用循环控制菜单显示, 0退出循环
  • 使用switch语句实现菜单切换

难点提示

  • 使用标识变量来控制循环退出
		// 系统输入对象
		Scanner input = new Scanner(System.in);
		int num = -1;
		// 定义是否退出订餐系统变量
		boolean isExit = false;
		// 循环展示吃货订餐系统主菜单,可以选择菜单,并循环切换
		// 系统输入对象
		Scanner input = new Scanner(System.in);
		int num = -1;
		
		// 定义是否退出订餐系统变量
		boolean isExit = false;
		
		// 循环展示吃货订餐系统主菜单,可以选择菜单,并循环切换
		
		do {
			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 choose = input.nextInt();
			
			switch (choose) {
			case 1:
				System.out.println("***我要订餐***");
				break;
			case 2:
				System.out.println("***查看餐袋***");
				break;
			case 3:
				System.out.println("***签收订单***");
				break;
			case 4:
				System.out.println("***删除订单***");
				break;
			case 5:
				System.out.println("***我要点赞***");
				break;
			case 6:
				isExit = true;
				break;

			default:
				System.out.println("输入非法!");
				isExit = true;
				break;
			}
			if (!isExit) {
				System.out.print("输入0返回:");
				num = input.nextInt();
			}else {
				break;
			}
			
		} while (num == 0);
		System.out.println("谢谢使用,欢迎下次光临!");

用例2:数据初始化

需求说明

初始化菜品信息
Java基础——吃货联盟订餐系统_第2张图片
初始化订单信息
Java基础——吃货联盟订餐系统_第3张图片

实现:

		// 初始化订餐系统的菜品数据
		// 由于菜品数据类型不统一,但是数组存储的相同数据类型的一组数据,可以将菜品数据拆分成三个数组,借助数组相同下标,是同一个菜品数据
		// 菜品名称数组
		String[] dishNames = {"红烧带鱼","鱼香肉丝","时令鲜蔬"};
		
		// 菜品价格数组
		double[] dishPrices = {38.0,20.0,10.0};
		
		// 菜品点赞数数组
		int[] dishPraises = {0,0,0};
		
		// 初始化吃货订餐系统的订餐订单数据
		// 订餐人
		String[] orderNames = new String[5];
		
		// 订餐详情
		String[] orderDetails = new String[5];
		
		//配送时间
		int[] orderTimes = new int[5];
		
		//配送地址
		String[] orderAddrs = new String[5];
		
		// 订单状态
		int[] orderStates = new int[5];
		
		//订单总价
		double[] orderPrices = new double[5];
		
		// 初始化订餐订单数据,方便查看餐袋
		orderNames[0] = "张晴";
		orderDetails[0] = "红烧带鱼 2份";
		orderTimes[0] = 12;
		orderAddrs[0] = "天成路207号";
		orderStates[0] = 1;
		orderPrices[0] = 76.0;
		
		orderNames[1] = "张晴";
		orderDetails[1] = "鱼香肉丝 2份";
		orderTimes[1] = 18;
		orderAddrs[1] = "天成路207号";
		orderStates[1] = 0;
		orderPrices[1] = 45.0;

用例3:实现查看餐袋功能

Java基础——吃货联盟订餐系统_第4张图片

需求说明

  • 遍历系统中已有的订单,并逐条显示输出

思路分析

  • 使用订餐人数组长度控制循环次数
  • 对输出数据进行处理

难点提示

  • 仅遍历订餐人信息不为空的记录,需判断

实现:

case 2:
				System.out.println("***查看餐袋***");
				// 输出订单标题头
				System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t送餐地址\t\t总金额\t订单状态");
				// 循环遍历订单数组,查询已定餐的订单数据
				// 由于订餐订单被拆分为6个长度统一的数据,只需要选择使用其中一个数组作为循环条件即可
				for (int i = 0; i < orderNames.length; i++) {
					// 订餐订单都是按照下标顺序存储的,只要订单人姓名为null,说明后续都是空的(没有订单信息),结束循环
					if (null == orderNames[i]) {
						break;
					}
					// 输出餐袋中已存的订单数据
					System.out.println(i + 1 + "\t" 
							+ orderNames[i] + "\t"
							+ orderDetails[i] + "\t"
							+ orderTimes[i] + "\t"
							+ orderAddrs[i] + "\t"
							+ orderPrices[i] + "\t"
							+ (orderStates[i] == 0? "已预定" : "已完成"));
				}
				
				break;

用例4:实现我要订餐功能

Java基础——吃货联盟订餐系统_第5张图片

需求说明

  • 增加订单信息,实现我要订餐

思路分析

完成功能要求:

  • 定位新增位置
  • 接收订餐信息
  • 计算订单总金额
  • 计算送餐费

难点提示

确定新增位置:第一个name为null的位置

case 1:
				System.out.println("***我要订餐***");
				// 定义餐袋中的订单是否已经订满的标识变量,如果餐袋满了,不允许继续订餐
				// 默认餐袋中订单已满,如果订餐可以找到订单位置,标识变量改为false,没满为true
				boolean isFullFlag = false;
				
				// 循环遍历订餐订单数组,找可以存放订餐订单的位置,就是第一个为null的位置
				for (int i = 0; i < orderNames.length; i++) {
					if (null == orderNames[i]) {
						
						// 餐袋没有订满,可以继续订餐,修改标识为false
						isFullFlag = false;
						
						// 提示输入订餐人的姓名
						System.out.print("请输入订餐人姓名:");
						String orderName = input.next();
						
						// 展示订餐菜品数据
						System.out.println("序号\t菜名\t单价\t点赞数");
						for (int j = 0; j < dishNames.length; j++) {
							System.out.println(j + 1 + "\t"
									+ dishNames[j] + "\t"
									+ dishPrices[j] + "\t"
									+ dishPraises[j]);
						}
						
						// 提示输入订餐菜品序号
						System.out.print("请选择您要点的菜品编号:");
						int dishIndex = input.nextInt();
						
						// 确保输入的菜品序号有效,如果输入序号非法,要重新输入,防止下标越界
						while (dishIndex < 0 || dishIndex > dishNames.length) {
							System.out.println("输入菜品序号非法,请重新输入:");
							dishIndex = input.nextInt();
							
						}
						
						// 提示输入订餐菜品份数
						System.out.print("请选择您需要的份数:");
						int dishCount = input.nextInt();
						
						// 提示输入送餐时间
						System.out.print("请输入送餐时间(送餐时间:10点至20点间整点送餐):");
						int orderTime = input.nextInt();
						
						// 确保输入的送餐时间有效,如果输入时间非法,要重新输入,防止下标越界
						while (orderTime < 10 || orderTime >20) {
							System.out.println("超出系统送餐时间范围,请重新输入:");
							orderTime = input.nextInt();
							
						}
						
						// 提示输入送餐地址
						System.out.print("请输入送餐地址:");
						String orderAddr = input.next();
						
						// 计算订餐总价:选择菜品单价 * 订单份数 + 配送费(满60,免配送费,如果不足60,加5元)
						// 计算订餐菜品的总价
						double dishAllPrice = dishPrices[dishIndex - 1] * dishCount;
						
						// 计算配送费
						double exPrice = dishAllPrice > 60 ? 0.0 : 5.0;
						
						// 拼接订餐详情
						String orderDetail = dishNames[dishIndex - 1] + " " + dishCount + "份";
						
						// 保存订餐订单完整信息
						orderNames[i] = orderName;
						orderDetails[i] = orderDetail;
						orderTimes[i] = orderTime;
						orderAddrs[i] = orderAddr;
						orderPrices[i] = dishAllPrice + exPrice;
						orderStates[i] = 0; // 可以不设置,默认为0
						
						// 提示订餐成功
						System.out.println("-----------------------");
						System.out.println("订餐成功!");
						System.out.println("您订的是:" + orderDetail);
						System.out.println("送餐时间:" + orderTime + "点");
						System.out.println("餐费:" + dishAllPrice + "元,送餐费:" + exPrice + ",总计:" + orderPrices[i] + "元");
						System.out.println("-----------------------");
						
						// 订餐成功后,立刻结束循环,否则继续订餐,直到订满订餐订单数组
						break;
					}
				}
				
				// 如果循环结束,餐袋订单是否已满标识变量值仍然为true,代表订餐失败,餐袋已满,无法继续
				if (isFullFlag) {
					System.out.println("系统餐袋已满,无法继续订餐,请联系系统管理员!!!");
				}
				break;

用例5:实现签收订单功能

Java基础——吃货联盟订餐系统_第6张图片

需求说明

送餐后,将用户签收订单状态修改为“已完成"

思路分析

  • 接收要签收的订单号
  • for循环结构遍历全部订单
  • if选择结构判断订单状态

难点提示

判断条件

  • 订餐人姓名是否为null,订单状态是否为已预定,且数组下标是指定订单序号减1
  • 对于未找到的订单序号:不执行签收,要给出提示
case 3:
				System.out.println("***签收订单***");
				
				// 定义已有订单的数量
				int signOrderCount = 0;
				
				// 签收订单,展示当前餐袋中所有的订餐订单的概要信息
				System.out.println("序号\t订餐人\t餐品信息\t订单状态");
				for (int i = 0; i < orderNames.length; i++) {
					if (null == orderNames[i]) {
						// 结束循环
						break;
					}
					
					// 输出餐袋中已存的订单数据
					System.out.println(i + 1 + "\t" 
							+ orderNames[i] + "\t"
							+ orderDetails[i] + "\t"
							+ (orderStates[i] == 0? "已预定" : "已完成"));
					
					// 已有订餐订单数量+1
					signOrderCount ++;
					
				}
				
				// 补充:当餐袋订餐数据为空,无法执行签收操作,需要直接结束
				if (signOrderCount == 0) {
					// 提示暂无订餐订单数据,直接结束删除操作
					System.out.println("\t暂无订餐数据,无需签收!\n");
					break;
				}
				
				// 提示输入签收订单序号
				System.out.print("请选择要签收的订单序号:");
				int signOrderIndex = input.nextInt();
				
				// 如果输入的签收订单序号不存在,重新输入
				while (signOrderIndex < 1 || signOrderIndex > signOrderCount) {
					System.out.println("签收订单序号不存在,请重新输入:");
					signOrderIndex = input.nextInt();
					
				}
				
				// 执行签收订单,只有是已预定的订单才可以执行签收,已完成订单,不能重复签收
				if (orderStates[signOrderIndex - 1] == 0) {
					// 将已预定的订单状态改为:已完成状态
					orderStates[signOrderIndex - 1] = 1;
					// 提示签收成功
					System.out.println("订单签收成功!");
				}else {
					System.out.println("订单已完成,无法重复签收!");
				}
				
				break;

用例6:实现删除订单功能

Java基础——吃货联盟订餐系统_第7张图片

需求说明

  • 按照输入的订单号,判断其状态
  • 删除“已完成”状态的订单

思路分析

  • 接收要删除的订单号
  • 遍历全部订单查找要删除的订单
  • 将该订单后数据依次前移一位,最后一个不为空元素置空

难点提示

  • 不允许删除“已预订”状态的订单
case 4:
				System.out.println("***删除订单***");
				
				// 定义已有订单的数量
				int delOrderCount = 0;
				
				// 删除订单,展示当前餐袋中所有的订餐订单的概要信息
				System.out.println("序号\t订餐人\t餐品信息\t订单状态");
				for (int i = 0; i < orderNames.length; i++) {
					if (null == orderNames[i]) {
						// 结束循环
						break;
					}
					// 输出餐袋中已存的订单数据
					System.out.println(i + 1 + "\t" 
							+ orderNames[i] + "\t"
							+ orderDetails[i] + "\t"
							+ (orderStates[i] == 0? "已预定" : "已完成"));
			
				// 已有订餐订单数量+1
					delOrderCount ++;
				}
				
				// 补充:当餐袋订餐数据为空,无法执行删除操作,需要直接结束
				if (delOrderCount == 0) {
					// 提示暂无订餐订单数据,直接结束删除操作
					System.out.println("\t暂无订餐数据,无需删除!\n");
					break;
				}
				
				// 提示输入删除订单序号
				System.out.print("请输入要删除得到订单序号:");
				int delOrderIndex = input.nextInt();
				
				// 如果输入的删除订单序号不存在,重新输入
				while (delOrderIndex < 1 || delOrderIndex > delOrderCount) {
					System.out.println("删除订单序号不存在,请重新输入:");
					signOrderIndex = input.nextInt();
					
				}
				
				// 执行删除订单,只有已完成订单才能删除,如果订单状态是已预定,不能删除
				if (orderStates[delOrderIndex - 1] == 1) {
					// 订单是已完成,可以执行删除操作,直接将后面的订单数据依次覆盖前面的订单
					for (int i = delOrderIndex - 1; i < delOrderCount - 1; i++) {
						orderNames[i] = orderNames[i+1];
						orderDetails[i] = orderDetails[i+1];
						orderTimes[i] = orderTimes[i+1];
						orderAddrs[i] = orderAddrs[i+1];
						orderPrices[i] = orderPrices[i+1];
						orderStates[i] = orderStates[i+1]; 
					}
					
					// 将最后一个重复的已存在订单置空
					orderNames[delOrderCount - 1] = null;
					orderDetails[delOrderCount - 1] = null;
					orderTimes[delOrderCount - 1] = 0;
					orderAddrs[delOrderCount - 1] = null;
					orderPrices[delOrderCount - 1] = 0.0;
					orderStates[delOrderCount - 1] = 0;
					
					// 提示订单删除成功
					System.out.println("订单删除成功!");
				}else {
					System.out.println("您选择的订单未签收,不能删除!");
				}
				
				break;

用例7:实现我要点赞功能

Java基础——吃货联盟订餐系统_第8张图片

需求说明

  • 显示菜品序号、菜品名、单价、点赞数
  • 提示用户输入要点赞的菜品序号

思路分析

  • 输出全部订单信息
  • 接收要点赞的菜品序号
  • 为对应菜品的点赞数加1
case 5:
				System.out.println("***我要点赞***");
				
				// 展示点赞菜品列表数据
				System.out.println("序号\t菜名\t单价\t点赞数");
				for (int i = 0; i < dishNames.length; i++) {
					System.out.println(i + 1 + "\t"
							+ dishNames[i] + "\t"
							+ dishNames[i] + "\t"
							+ dishPraises[i]);
				}
				
				// 提示输入点赞菜品序号
				System.out.print("请选择你要点赞的菜品序号:");
				int praiseDishIndex = input.nextInt();
				
				// 如果输入点赞序号不存在,重新输入
				while (praiseDishIndex < 1 || praiseDishIndex > dishNames.length) {
					System.out.println("需要点赞菜品序号不存在,请重新输入:");
					praiseDishIndex = input.nextInt();
				}
				
				// 执行点赞,直接根据选择的菜品序号,给保存菜品点赞数数组中对应值+1
				dishPraises[praiseDishIndex - 1] ++;
				System.out.println("点赞成功!");
				
				break;

总代码

import java.util.Scanner;

public class FoodieMgr {

	public static void main(String[] args) {
		// 吃货联盟
		// 系统输入对象
		Scanner input = new Scanner(System.in);
		int num = -1;
		
		// 定义是否退出订餐系统变量
		boolean isExit = false;
		
		// 初始化订餐系统的菜品数据
		// 由于菜品数据类型不统一,但是数组存储的相同数据类型的一组数据,可以将菜品数据拆分成三个数组,借助数组相同下标,是同一个菜品数据
		// 菜品名称数组
		String[] dishNames = {"红烧带鱼","鱼香肉丝","时令鲜蔬"};
		
		// 菜品价格数组
		double[] dishPrices = {38.0,20.0,10.0};
		
		// 菜品点赞数数组
		int[] dishPraises = {0,0,0};
		
		// 初始化吃货订餐系统的订餐订单数据
		// 订餐人
		String[] orderNames = new String[5];
		
		// 订餐详情
		String[] orderDetails = new String[5];
		
		//配送时间
		int[] orderTimes = new int[5];
		
		//配送地址
		String[] orderAddrs = new String[5];
		
		// 订单状态
		int[] orderStates = new int[5];
		
		//订单总价
		double[] orderPrices = new double[5];
		
		// 初始化订餐订单数据,方便查看餐袋
		orderNames[0] = "张晴";
		orderDetails[0] = "红烧带鱼 2份";
		orderTimes[0] = 12;
		orderAddrs[0] = "天成路207号";
		orderStates[0] = 1;
		orderPrices[0] = 76.0;
		
		orderNames[1] = "张晴";
		orderDetails[1] = "鱼香肉丝 2份";
		orderTimes[1] = 18;
		orderAddrs[1] = "天成路207号";
		orderStates[1] = 0;
		orderPrices[1] = 45.0;
		
		
		// 循环展示吃货订餐系统主菜单,可以选择菜单,并循环切换
		
		do {
			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 choose = input.nextInt();
			
			switch (choose) {
			case 1:
				System.out.println("***我要订餐***");
				// 定义餐袋中的订单是否已经订满的标识变量,如果餐袋满了,不允许继续订餐
				// 默认餐袋中订单已满,如果订餐可以找到订单位置,标识变量改为false,没满为true
				boolean isFullFlag = false;
				
				// 循环遍历订餐订单数组,找可以存放订餐订单的位置,就是第一个为null的位置
				for (int i = 0; i < orderNames.length; i++) {
					if (null == orderNames[i]) {
						
						// 餐袋没有订满,可以继续订餐,修改标识为false
						isFullFlag = false;
						
						// 提示输入订餐人的姓名
						System.out.print("请输入订餐人姓名:");
						String orderName = input.next();
						
						// 展示订餐菜品数据
						System.out.println("序号\t菜名\t单价\t点赞数");
						for (int j = 0; j < dishNames.length; j++) {
							System.out.println(j + 1 + "\t"
									+ dishNames[j] + "\t"
									+ dishPrices[j] + "\t"
									+ dishPraises[j]);
						}
						
						// 提示输入订餐菜品序号
						System.out.print("请选择您要点的菜品编号:");
						int dishIndex = input.nextInt();
						
						// 确保输入的菜品序号有效,如果输入序号非法,要重新输入,防止下标越界
						while (dishIndex < 0 || dishIndex > dishNames.length) {
							System.out.println("输入菜品序号非法,请重新输入:");
							dishIndex = input.nextInt();
							
						}
						
						// 提示输入订餐菜品份数
						System.out.print("请选择您需要的份数:");
						int dishCount = input.nextInt();
						
						// 提示输入送餐时间
						System.out.print("请输入送餐时间(送餐时间:10点至20点间整点送餐):");
						int orderTime = input.nextInt();
						
						// 确保输入的送餐时间有效,如果输入时间非法,要重新输入,防止下标越界
						while (orderTime < 10 || orderTime >20) {
							System.out.println("超出系统送餐时间范围,请重新输入:");
							orderTime = input.nextInt();
							
						}
						
						// 提示输入送餐地址
						System.out.print("请输入送餐地址:");
						String orderAddr = input.next();
						
						// 计算订餐总价:选择菜品单价 * 订单份数 + 配送费(满60,免配送费,如果不足60,加5元)
						// 计算订餐菜品的总价
						double dishAllPrice = dishPrices[dishIndex - 1] * dishCount;
						
						// 计算配送费
						double exPrice = dishAllPrice > 60 ? 0.0 : 5.0;
						
						// 拼接订餐详情
						String orderDetail = dishNames[dishIndex - 1] + " " + dishCount + "份";
						
						// 保存订餐订单完整信息
						orderNames[i] = orderName;
						orderDetails[i] = orderDetail;
						orderTimes[i] = orderTime;
						orderAddrs[i] = orderAddr;
						orderPrices[i] = dishAllPrice + exPrice;
						orderStates[i] = 0; // 可以不设置,默认为0
						
						// 提示订餐成功
						System.out.println("-----------------------");
						System.out.println("订餐成功!");
						System.out.println("您订的是:" + orderDetail);
						System.out.println("送餐时间:" + orderTime + "点");
						System.out.println("餐费:" + dishAllPrice + "元,送餐费:" + exPrice + ",总计:" + orderPrices[i] + "元");
						System.out.println("-----------------------");
						
						// 订餐成功后,立刻结束循环,否则继续订餐,直到订满订餐订单数组
						break;
					}
				}
				
				// 如果循环结束,餐袋订单是否已满标识变量值仍然为true,代表订餐失败,餐袋已满,无法继续
				if (isFullFlag) {
					System.out.println("系统餐袋已满,无法继续订餐,请联系系统管理员!");
				}
				break;
				
			case 2:
				System.out.println("***查看餐袋***");
				// 输出订单标题头
				System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t送餐地址\t\t总金额\t订单状态");
				// 循环遍历订单数组,查询已定餐的订单数据
				// 由于订餐订单被拆分为6个长度统一的数据,只需要选择使用其中一个数组作为循环条件即可
				for (int i = 0; i < orderNames.length; i++) {
					// 订餐订单都是按照下标顺序存储的,只要订单人姓名为null,说明后续都是空的(没有订单信息),结束循环
					if (null == orderNames[i]) {
						break;
					}
					// 输出餐袋中已存的订单数据
					System.out.println(i + 1 + "\t" 
							+ orderNames[i] + "\t"
							+ orderDetails[i] + "\t"
							+ orderTimes[i] + "\t"
							+ orderAddrs[i] + "\t"
							+ orderPrices[i] + "\t"
							+ (orderStates[i] == 0? "已预定" : "已完成"));
				}
				
				break;
				
			case 3:
				System.out.println("***签收订单***");
				
				// 定义已有订单的数量
				int signOrderCount = 0;
				
				// 签收订单,展示当前餐袋中所有的订餐订单的概要信息
				System.out.println("序号\t订餐人\t餐品信息\t订单状态");
				for (int i = 0; i < orderNames.length; i++) {
					if (null == orderNames[i]) {
						// 结束循环
						break;
					}
					
					// 输出餐袋中已存的订单数据
					System.out.println(i + 1 + "\t" 
							+ orderNames[i] + "\t"
							+ orderDetails[i] + "\t"
							+ (orderStates[i] == 0? "已预定" : "已完成"));
					
					// 已有订餐订单数量+1
					signOrderCount ++;
					
				}
				
				// 补充:当餐袋订餐数据为空,无法执行签收操作,需要直接结束
				if (signOrderCount == 0) {
					// 提示暂无订餐订单数据,直接结束删除操作
					System.out.println("\t暂无订餐数据,无需签收!\n");
					break;
				}
				
				// 提示输入签收订单序号
				System.out.print("请选择要签收的订单序号:");
				int signOrderIndex = input.nextInt();
				
				// 如果输入的签收订单序号不存在,重新输入
				while (signOrderIndex < 1 || signOrderIndex > signOrderCount) {
					System.out.println("签收订单序号不存在,请重新输入:");
					signOrderIndex = input.nextInt();
					
				}
				
				// 执行签收订单,只有是已预定的订单才可以执行签收,已完成订单,不能重复签收
				if (orderStates[signOrderIndex - 1] == 0) {
					// 将已预定的订单状态改为:已完成状态
					orderStates[signOrderIndex - 1] = 1;
					// 提示签收成功
					System.out.println("订单签收成功!");
				}else {
					System.out.println("订单已完成,无法重复签收!");
				}
				
				break;
				
			case 4:
				System.out.println("***删除订单***");
				
				// 定义已有订单的数量
				int delOrderCount = 0;
				
				// 删除订单,展示当前餐袋中所有的订餐订单的概要信息
				System.out.println("序号\t订餐人\t餐品信息\t订单状态");
				for (int i = 0; i < orderNames.length; i++) {
					if (null == orderNames[i]) {
						// 结束循环
						break;
					}
					// 输出餐袋中已存的订单数据
					System.out.println(i + 1 + "\t" 
							+ orderNames[i] + "\t"
							+ orderDetails[i] + "\t"
							+ (orderStates[i] == 0? "已预定" : "已完成"));
			
				// 已有订餐订单数量+1
					delOrderCount ++;
				}
				
				// 补充:当餐袋订餐数据为空,无法执行删除操作,需要直接结束
				if (delOrderCount == 0) {
					// 提示暂无订餐订单数据,直接结束删除操作
					System.out.println("\t暂无订餐数据,无需删除!\n");
					break;
				}
				
				// 提示输入删除订单序号
				System.out.print("请输入要删除得到订单序号:");
				int delOrderIndex = input.nextInt();
				
				// 如果输入的删除订单序号不存在,重新输入
				while (delOrderIndex < 1 || delOrderIndex > delOrderCount) {
					System.out.println("删除订单序号不存在,请重新输入:");
					signOrderIndex = input.nextInt();
					
				}
				
				// 执行删除订单,只有已完成订单才能删除,如果订单状态是已预定,不能删除
				if (orderStates[delOrderIndex - 1] == 1) {
					// 订单是已完成,可以执行删除操作,直接将后面的订单数据依次覆盖前面的订单
					for (int i = delOrderIndex - 1; i < delOrderCount - 1; i++) {
						orderNames[i] = orderNames[i+1];
						orderDetails[i] = orderDetails[i+1];
						orderTimes[i] = orderTimes[i+1];
						orderAddrs[i] = orderAddrs[i+1];
						orderPrices[i] = orderPrices[i+1];
						orderStates[i] = orderStates[i+1]; 
					}
					
					// 将最后一个重复的已存在订单置空
					orderNames[delOrderCount - 1] = null;
					orderDetails[delOrderCount - 1] = null;
					orderTimes[delOrderCount - 1] = 0;
					orderAddrs[delOrderCount - 1] = null;
					orderPrices[delOrderCount - 1] = 0.0;
					orderStates[delOrderCount - 1] = 0;
					
					// 提示订单删除成功
					System.out.println("订单删除成功!");
				}else {
					System.out.println("您选择的订单未签收,不能删除!");
				}
				
				break;
				
			case 5:
				System.out.println("***我要点赞***");
				
				// 展示点赞菜品列表数据
				System.out.println("序号\t菜名\t单价\t点赞数");
				for (int i = 0; i < dishNames.length; i++) {
					System.out.println(i + 1 + "\t"
							+ dishNames[i] + "\t"
							+ dishNames[i] + "\t"
							+ dishPraises[i]);
				}
				
				// 提示输入点赞菜品序号
				System.out.print("请选择你要点赞的菜品序号:");
				int praiseDishIndex = input.nextInt();
				
				// 如果输入点赞序号不存在,重新输入
				while (praiseDishIndex < 1 || praiseDishIndex > dishNames.length) {
					System.out.println("需要点赞菜品序号不存在,请重新输入:");
					praiseDishIndex = input.nextInt();
				}
				
				// 执行点赞,直接根据选择的菜品序号,给保存菜品点赞数数组中对应值+1
				dishPraises[praiseDishIndex - 1] ++;
				System.out.println("点赞成功!");
				
				break;
				
			case 6:
				isExit = true;
				break;

			default:
				System.out.println("输入非法!");
				isExit = true;
				break;
			}
			if (!isExit) {
				System.out.print("输入0返回:");
				num = input.nextInt();
			}else {
				break;
			}
			
		} while (num == 0);
		System.out.println("谢谢使用,欢迎下次光临!");
	}

}

项目总结

对于刚总体学习完Java基础的同学们是个很好巩固知识点的练习,通过此次练习总结以下

理解需求

重难点突破

  • 数据主体
  • 整体框架
  • 删除功能

注意细节

  • 标识位、跳转语句、数组的操作

掌握调试技巧

你可能感兴趣的:(Java基础,java)