利用java基础,实现如图所示的功能
案例涉及要点:
# 程序基本概念
变量
数据类型
# 流程控制
顺序
选择
循环
跳转语句
# 数组
1、实现步骤分布:
第一阶段:分析数据主体(重难点)
第二阶段:分析并完成整体框架(重难点)
第三阶段:分析并完成退出功能
第四阶段:分析并完成订餐功能
第五阶段:分析并完成查看餐袋功能
第六阶段:分析并完成签收订单功能
第七阶段:分析并完成删除功能(重难点)
第八阶段:分析总完成我要点赞功能
2、系统概述
"只要动动手指,就能送餐上门",网上定餐深受现代人青睐,现开发一个网上订餐系统,功能如下
# 我要订餐
# 查看餐袋
# 签收订单
# 删除订单
# 我要点赞
# 退出系统
3、实现菜单切换
# 需求说明
编写程序入口,实现菜单显示和切换
# 思路分析
使用循环控制菜单显示,
0退出循环
使用switch语句实现菜单切换
# 难点提示
使用标识变量来控制循环退出
菜单切换代码展示(省略主函数):
// 定义是否返回主菜单变量
int returnMenu = -1;
// 定义是否退出订餐系统变量
boolean exitFlag = false;
Scanner input = new Scanner(System.in);
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 chooseNum = input.nextInt();
switch(chooseNum){
case 1:
System.out.println("++++++ 我要订餐 ++++++\n");
break;
case 2:
System.out.println("++++++ 查看餐袋 ++++++\n");
break;
case 3:
System.out.println("++++++ 签收订单 ++++++\n");
break;
case 4:
System.out.println("++++++ 删除订单 ++++++\n");
break;
case 5:
System.out.println("++++++ 我要点赞 ++++++\n");
break;
case 6:
System.out.println("++++++ 退出系统 ++++++\n");
break;
default:
System.out.println("输入序号非法\n");
exitFlag = true;
break;
}
// 判断是否需要退出系统,当选择了退出系统或者输入序号非法,会自动退出
if (exitFlag) {
break;
}
// 提示输入0返回主菜单
System.out.print("输入0,返回主菜单:");
returnMenu = input.nextInt();
}while (returnMenu == 0);
System.out.println("谢谢使用,欢迎下次光临!");
input.close();
实现我要订餐代码展示(放入case 1中):
System.out.println("++++++ 我要订餐 ++++++\n");
// 循环遍历订餐订单数组,找可以存放订餐订单的位置,就是第一个为null的位置
for (int i = 0; i < orderNameStrings.length; i++) {
//如果当前下标对应的数据为null,说明下标位置所在的位置可以使用
if(null == orderNameStrings[i]){
isFullFalg = false;
//提示输入订餐人姓名
System.out.println("输入订餐人姓名");
String orderName = input.next();
//展示订单菜品列表数据
System.out.println("序号\t菜品\t单价\t点赞数");
for (int j = 0; j < foodNameStrings.length; j++) {
System.out.println(j+1+"\t"
+foodNameStrings[j]+"\t"
+foodPrices[j]+"\t"
+foodZan[j]+"\t");
}
//提示输入订单菜品序号
System.out.println("输入订单菜品序号");
int foodIndex = input.nextInt();
//确保输入菜品序号有效
while (foodIndex < 1 || foodIndex>foodNameStrings.length) {
System.out.println("输入有误,重新输入");
foodIndex = input.nextInt();
}
//提示输入订单菜品份数
System.out.println("输入订单菜品份数:");
int foodCount = input.nextInt();
//提示输入订单配送时间
System.out.println("输入订单配送时间(10-20点整点送餐):");
int orderTime = input.nextInt();
//确保输入配送时间有效
while (orderTime < 10 || orderTime>20) {
System.out.println("输入有误,重新输入");
orderTime = input.nextInt();
}
//提示输入订单配送地址
System.out.println("输入订单配送地址:");
String orderAddress = input.next();
//计算订餐总价:菜品的单价*订餐份数+配送费(满六十免配送费,不满六十,加五元配送费)
//计算订餐总价
double orderPrice = foodPrices[foodIndex - 1] * foodCount;
//计算订餐配送费
double songPrice = orderPrice>=60?0.0:5.0;
// 拼接订餐详情
String ordeInFoString = foodNameStrings[foodIndex - 1];
//保存订餐完整信息
orderNameStrings[i] = orderName;
orderDetailStrings[i] = orderDetailStrings[foodIndex]+foodCount+"份";
orderTimes[i] = orderTime;
orderAddrs[i] = orderAddress;
orderPrices[i] = orderPrice+songPrice;
orderStates[i] = 0;
//提示订餐成功
System.out.println("------------------");
System.out.println("订餐成功!!!");
System.out.println("您顶的是:"+ordeInFoString);
System.out.println("送餐时间:"+orderTime+"点");
System.out.println("餐费:"+orderPrice+"元,送餐费:"+songPrice+",总计"+orderPrices[i]);
System.out.println("");
System.out.println("------------------");
//订餐成功后,立刻结束,否则,当前存放订餐订单位置及后续位置都是空,会导致继续订单,直到订满订餐订单数组
break;
}
}
// 如果循环结束,餐袋是否已满,
if(isFullFalg){
System.out.println("餐袋已满,请联系管理员");
}
实现查看餐袋:
// 先输出订餐订单标题头
System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t送餐地址\t总金额\t订单状态");
//循环遍历订餐订单数据,查询订餐订单数据
//由于订餐订单被拆分成6个长度统一的数组,只需要选择使用其中一个 数据作为循环条件即可
for (int i = 0; i < orderNameStrings.length; i++) {
//订单都是按照下标书序存储的,只要订单人姓名为null,说明后续都是空的,没有订餐信息,结束循环
if (null == orderNameStrings[i]) {
//结束循环
break;
}
//输出餐袋中已存的订餐订单数据
System.out.println(i+1+"\t"
+ orderNameStrings[i]+"\t"
+ orderDetailStrings[i]+"\t"
+ orderTimes[i]+"\t"
+ orderAddrs[i]+"\t"
+ orderPrices[i]+"\t"
+ (orderStates[i] == 0?"已预订":"已完成"));
}
实现签收订单:
//定义已有订单数量
int signOrderCount = 0;
//展示当前餐袋中,所有的订餐订单的概要信息
System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t送餐地址\t总金额\t订单状态");
for (int i = 0; i < orderNameStrings.length; i++) {
if(null == orderNameStrings[i]){
break;
}
signOrderCount++;
System.out.println(i+1+"\t"
+orderNameStrings[i]+"\t"
+orderDetailStrings[i]+"\t"
+(orderStates[i]==0?"已预订":"已完成"));
}
if (signOrderCount==0) {
System.out.println("暂无数据,请反回");
}
//提示输入签收订单序号
System.out.println("请输入签收订单序号:");
int signOrderIndex = input.nextInt();
while(signOrderIndex<1||signOrderCount<signOrderIndex){
System.out.println("输入错误重新输入");
signOrderIndex = input.nextInt();
}
//执行签收订单,只是已预订的订单才可以执行签收,已完成订单,不能重复签收
if(orderStates[signOrderIndex - 1]==0){
orderStates[signOrderIndex - 1] = 1;
System.out.println("成功签收");
}
实现删除订单:
// 定义已有订餐订单数量
int delOrderCount = 0;
// 删除订单,展示当前餐袋中,所有的订餐订单的概要信息
System.out.println("序号\t订餐人\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.print("输入的删除订单序号,不存在,请重新输入:");
delOrderIndex = 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("序号为:" + delOrderIndex + " 的订餐订单,删除成功!!!\n");
} else {
System.out.println("序号为:" + delOrderIndex + " 的订餐订单,已预订,不允许删除,请先签收订单!!!\n");
}
实现我要点赞:
// 展示点赞菜品列表数据
System.out.println("序号\t菜名\t单价\t点赞数");
for (int j = 0; j < foodNames.length; j++) {
System.out.println(j + 1 + "\t"
+ foodNames[j] + "\t"
+ foodPrices[j] + "\t"
+ foodZans[j]);
}
// 提示输入点赞菜品序号
System.out.print("请输入点赞菜品序号:");
int zanFoodIndex = input.nextInt();
// 确保输入的菜品序号有效,如果输入序号非法,要重新输入,防止下标越界
while(zanFoodIndex < 1 || zanFoodIndex > foodNames.length){
System.out.print("输入菜品序号非法,请重新输入:");
zanFoodIndex = input.nextInt();
}
// 执行点赞,直接根据选择的菜品序号,给保存菜品点赞数数组中对应值+1
foodZans[zanFoodIndex - 1]++;
System.out.println("给" + foodNames[zanFoodIndex - 1] + "菜品,点赞成功!!!\n");
最终完整代码展示:
import java.util.Scanner;
public class FoodieMgr {
public static void main(String[] args) {
// 吃货联盟订餐系统基本实现
// 系统输入对象
Scanner input = new Scanner(System.in);
// 定义是否返回主菜单变量
int returnMenu = -1;
// 定义是否退出订餐系统变量
boolean exitFlag = false;
// 初始化吃货订餐系统的菜品数据
// 由于菜品数据类型不统一,但是数组存储的相同数据类型的一组数据,可以将菜品数据拆分成三个数组,借助数组相同下标,是同一个菜品数据
// 菜品名称数组
String[] foodNames = {"红烧鳜鱼", "酸汤肥牛", "宫保鸡丁"};
// 菜品价格数组
double[] foodPrices = {69.0, 59.0, 49.0};
// 菜品点赞数数组
int[] foodZans = {1, 1, 1};
// 初始化吃货订餐系统的订餐订单数据
// 由于订餐订单数据类型不统一,存储方式和菜品一致,拆分为多个数组,借助数组相同下标,是同一个订餐订单数据
// 订餐人
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] = "红烧鳜鱼 1份";
orderTimes[0] = 10;
orderAddrs[0] = "南海归墟";
orderStates[0] = 1;
orderPrices[0] = 69.0;
orderNames[1] = "王胖子";
orderDetails[1] = "酸汤肥牛 1份";
orderTimes[1] = 11;
orderAddrs[1] = "南海归墟";
orderStates[1] = 0;
orderPrices[1] = 64.0;
orderNames[2] = "雪莉杨";
orderDetails[2] = "宫保鸡丁 2份";
orderTimes[2] = 12;
orderAddrs[2] = "南海归墟";
orderStates[2] = 1;
orderPrices[2] = 98.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 chooseNum = input.nextInt();
// 根据用户选择的菜单序号,执行对应的菜单功能
switch (chooseNum) {
case 1:
System.out.println("++++++ 我要订餐 ++++++\n");
// 定义餐袋中的订单是否已经订满标识变量,如果餐袋满,不允许继续订餐的
// 默认餐袋中订单已满,如果订餐可以找到订餐订单位置,将标识变量改为false,没满
boolean isFullFlag = true;
// 循环遍历订单订单数组,找可以存放订单订单的位置,就是第一个为null的位置
for (int i = 0; i < orderNames.length; i++) {
// 如果当前下标对应的订餐人姓名为null,代表此下标位置所有的数组都没有存放订餐订单数据,可以使用
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 < foodNames.length; j++) {
System.out.println(j + 1 + "\t"
+ foodNames[j] + "\t"
+ foodPrices[j] + "\t"+ foodZans[j]);
}
// 提示输入订餐菜品序号
System.out.print("请输入订餐菜品序号:");
int foodIndex = input.nextInt();
// 确保输入的菜品序号有效,如果输入序号非法,要重新输入,防止下标越界
while(foodIndex < 1 || foodIndex > foodNames.length){
System.out.print("输入菜品序号非法,请重新输入:");
foodIndex = input.nextInt();
}
// 提示输入订餐菜品份数
System.out.print("请输入订餐菜品份数:");
int foodCount = input.nextInt();
// 提示输入订餐配送时间
System.out.print("请输入送餐时间(系统送餐时间:10-20点整点送餐):");
int orderTime = input.nextInt();
// 确保输入的送餐时间有效,如果输入时间非法,要重新输入
while(orderTime < 10 || orderTime > 20){
System.out.print("超出系统送餐时间范围,请重新输入:");
orderTime = input.nextInt();
}
// 提示输入送餐地址
System.out.print("请输入订餐送餐地址:");
String orderAddr = input.next();
// 计算订餐总价:订餐菜品总价(选择菜品的单价 * 订餐份数) + 配送费(满60,免配送费,如果不足60,加5元配送费)
// 计算订餐菜品总价
double foodMoney = foodPrices[foodIndex - 1] * foodCount;
// 计算订餐配送费
double songMoney = foodMoney >= 60 ? 0.0 : 5.0;
// 拼接订餐详情
String orderDetail = foodNames[foodIndex - 1] + " " + foodCount + "份";
// 保存订餐订单完整信息
orderNames[i] = orderName;
orderDetails[i] = orderDetail;
orderTimes[i] = orderTime;
orderAddrs[i] = orderAddr;
orderPrices[i] = foodMoney + songMoney;
orderStates[i] = 0; // 可以不设置,默认就是0
// 提示订餐成功
System.out.println("-----------------------------------");
System.out.println("订餐成功!!!");
System.out.println("您订的是:" + orderDetail);
System.out.println("送餐时间:" + orderTime + "点");
System.out.println("餐费:" + foodMoney + "元,送餐费:" + songMoney + ",总计:" + orderPrices[i] + "元。");
System.out.println("-----------------------------------");
// 订餐成功后,立刻结束循环,否则,当前存放订餐订单位置及后续位置都是空,会导致继续订餐,直到订满订餐订单数组
break;
}
}
// 如果循环结束,餐袋订单是否已满标识变量值仍然为true,代表订餐失败,餐袋已满,无法继续
if (isFullFlag) {
System.out.println("系统餐袋已满,无法继续订餐,请联系系统管理员!!!\n");
}
break;
case 2:
System.out.println("++++++ 查看餐袋 ++++++\n");
// 输出订单订单标题头
System.out.println("序号\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("++++++ 签收订单 ++++++\n");
// 定义已有订餐订单数量
int signOrderCount = 0;
// 签收订单,展示当前餐袋中,所有的订餐订单的概要信息
System.out.println("序号\t订餐人\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.print("输入的签收订单序号,不存在,请重新输入:");
signOrderIndex = input.nextInt();
}
// 执行签收订单,只有是已预订的订单才可以执行签收,已完成订单,不能重复签收
if (orderStates[signOrderIndex - 1] == 0) {
// 将已预订的订单状态改为:已完成状态
orderStates[signOrderIndex - 1] = 1;
// 提示签收成功
System.out.println("序号为:" + signOrderIndex + " 的订餐订单,签收成功!!!\n");
} else {
System.out.println("序号为:" + signOrderIndex + " 的订餐订单,已完成,不能重复签收!!!\n");
}
break;
case 4:
System.out.println("++++++ 删除订单 ++++++\n");
// 定义已有订餐订单数量
int delOrderCount = 0;
// 删除订单,展示当前餐袋中,所有的订餐订单的概要信息
System.out.println("序号\t订餐人\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.print("输入的删除订单序号,不存在,请重新输入:");
delOrderIndex = 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("序号为:" + delOrderIndex + " 的订餐订单,删除成功!!!\n");
} else {
System.out.println("序号为:" + delOrderIndex + " 的订餐订单,已预订,不允许删除,请先签收订单!!!\n");
}
break;
case 5:
System.out.println("++++++ 我要点赞 ++++++\n");
// 展示点赞菜品列表数据
System.out.println("序号\t菜名\t单价\t点赞数");
for (int j = 0; j < foodNames.length; j++) {
System.out.println(j + 1 + "\t"
+ foodNames[j] + "\t"
+ foodPrices[j] + "\t"
+ foodZans[j]);
}
// 提示输入点赞菜品序号
System.out.print("请输入点赞菜品序号:");
int zanFoodIndex = input.nextInt();
// 确保输入的菜品序号有效,如果输入序号非法,要重新输入,防止下标越界
while(zanFoodIndex < 1 || zanFoodIndex > foodNames.length){
System.out.print("输入菜品序号非法,请重新输入:");
zanFoodIndex = input.nextInt();
}
// 执行点赞,直接根据选择的菜品序号,给保存菜品点赞数数组中对应值+1
foodZans[zanFoodIndex - 1]++;
System.out.println("给" + foodNames[zanFoodIndex - 1] + "菜品,点赞成功!!!\n");
break;
case 6:
System.out.println("++++++ 退出系统 ++++++\n");
exitFlag = true;
break;
default:
System.out.println("输入序号非法\n");
exitFlag = true;
break;
}
// 判断是否需要退出系统,当选择了退出系统或者输入序号非法,会自动退出
if (exitFlag) {
break;
}
// 提示输入0返回主菜单
System.out.print("输入0,返回主菜单:");
returnMenu = input.nextInt();
} while (returnMenu == 0);
System.out.println("谢谢使用,欢迎下次光临!");
input.close();
}
}
标签:总结,java,订单,System,案例,订餐,println,输入,out
From: https://www.cnblogs.com/hhy-Boom-Boom-Boom/p/javaBase_08-summary.html