一生朋友一生情,一生有你才会赢;千山万水总是情,点个关注行不行!
1、系统需求说明
概要:现今已进入网络时代,网上购物、看新闻、交友等人们的日常生活已离不开网络。“只要点点手指,就能送餐上门”,网上定餐越来越受到都市年轻人的青睐 现要求开发一个网上订餐系统,其具体功能如下:
1.1、我要订餐
完成用户订餐,每条订单包含如下信息:
1.1.1、订餐人姓名:要求用户
1.1.2、输入选择菜品及份数:显示三个菜单序号、名称、单价、点赞数,提示用户输入要选择的菜品序号及份数
1.1.3、送餐时间:要求当天10到20点间整点送餐,要求用户输入10~20的整数,输入错误,重复输入。
1.1.4、送餐地址:要求用户输入
1.1.5、状态:两种状态:0:已预定(默认状态) 1、已完成(订单已签收)
1.1.6、总金额:总金额 = 菜品单价*份数-送餐费
(送餐费:当单笔订单金额达到50元时,免送餐费,否则,需交纳6元送餐费)
1.1.7、订餐成功后,显示订单信息。
1.2、查看订单
遍历显示已有订单
内容包括:序号、订餐人姓名、订餐信息(菜品名和份数)、送餐时间、送餐地址、状态(已预定或已完成)、总金额
1.3、签收订单
将订单中状态改为已完成
1.4、删除订单
用户输入订单序号,如该序号订单为已完成状态,可以删除,其它情况给出相应提示信息
1.5、我要点赞
显示菜品序号、菜品名、单价、点赞数,提示用户输入要点赞的菜品序号完成对菜品的点赞。
1.6、退出系统
退出整个系统,显示“谢谢使用,欢迎下次光临”。
1.7、菜单切换
用户可根据显示的主菜单,输入功能编号执行相应的功能,当输入1~5时,执行相应功能
3、思路与代码编写
第一阶段:分析数据主体(重难点)
第二阶段:分析并完成整体框架(重难点)
第三阶段:分析并完成退出功能
第四阶段:分析并完成订餐功能
第五阶段:分析并完成查看餐袋功能
第六阶段:分析并完成签收订单功能
第七阶段:分析并完成删除功能(重难点)
第八阶段:分析总完成我要点赞功能
2.1、分析数据主体
我要订餐 查看餐袋 删除订单 签收订单
声明多个数组,用来保存基本信息,包括:订餐人、所定餐品信息、送餐时间、送餐地址、订单状态、总金额等
我要点赞(餐品)
再声明一组固定的数组,用来保存餐品、餐品单价和点赞数等。
// 数据主题:一组订单信息(一条订单需要的内容,用不同的数组装起来)
String[] names = new String[4];// 订餐人名称数组:用来存放订餐人的姓名
String[] foodInformations = new String[4];// 所选菜品名数组:用来存放订餐人定的餐品信息,通过菜品名拼接份数的形式显示
int[] times = new int[4];// 送餐日期数组:存放订单配送时间
String[] addresses = new String[4];// 送餐地址数组:存放订单配送地址
int[] states = new int[4]; // 订单状态数组: 0:已预定 1:已完成
double[] sumPrices = new double[4];// 订单总金额组: 存放每笔订单的总金额
// 初始化第一条订单信息
names[0] = "陈斌";
foodInformations[0] = "红烧带鱼 2份";// "菜品名+份数"的形式显示
times[0] = 3;
addresses[0] = "北大青鸟";
sumPrices[0] = 76.0;
states[0] = 1;
// 初始化第二条订单信息
names[1] = "程少聪";
foodInformations[1] = "鱼香肉丝 2份";// "菜品名+份数"的形式显示
times[1] = 10;
addresses[1] = "北大青鸟";
sumPrices[1] = 20.0;
states[1] = 0;
// 数据主题:菜单信息
String[] foodNames = { "红烧带鱼", "鱼香肉丝", "红烧鸡腿" };
double[] prices = { 38.0, 6.0, 10.0 };
int[] dianZans = new int[3];
2.2、整体框架
使用循环(do-while)作为最外圈的大循环
循环操作:
显示主菜单
提示用户输入功能编号,并且能执行相应功能
提示输入0返回
循环条件:用户输入0
使用switch循环作为内侧的分支循环
可以根据用户输入功能编号,执行相应功能
Scanner sc = new Scanner(System.in);
int num = 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 serialNumber = sc.nextInt();
switch(serialNumber)
case 1://我要订餐
break;
case 2://查看餐带
break;
case 3://签收订单
break;
case 4://删除订单
break;
case 5://我要点赞
break;
case 6://退出系统
default://其他操作
break;
} while (num == 0);
System.out.println("感谢您的使用,欢迎下次光临!!");
2.3、退出系统
2.3.1、当显示主菜单之后,用户输入6或者1~6之外的数据
2.3.2、执行完相应功能后,提示输入0返回时
if (serialNumber < 1 || serialNumber > 5) {
break;
} else {
System.out.print("输入0返回:");
num = sc.nextInt();
}
2.4、我要订餐
2.4.1、查找插入位置
找要插入的位置,循环遍历订餐人第一个为空的位置
如果找到了,则此位置就是要插入的数据位置
如果没找到,则显示餐袋已满。
2.4.2、执行添加数据操作
a、显示所有可供选择的餐品信息
用户结语选择的餐品编号和份数
b、输入订餐人姓名
c、输入送餐时间(10~20点之间整点送餐)
当输入的信息有误时,重复输入
d、输入送餐地址
e、计算总金额
餐品总金额=餐品单价*份数
送餐费:餐品总金额达到50元时,免6元餐费
2.4.3、显示订单信息
所定餐品信息
订餐人
送餐时间
送餐地址
总金额
2.4.4、保存订单信息
// 1.我要订餐
System.out.println("*******我要订餐*******");
// 需要找到要插入的位置
for (int i = 0; i < names.length; i++) {
// 如果找到空的位置则记录下来
if (names[i] == null) {
isAdd = true;// 记录已找到的一个空位置
// 执行插入操作
// 显示菜单信息
System.out.println("菜单信息:");
System.out.println("序号\t菜品名\t价格\t点赞数");
for (int j = 0; j < 3; j++) {
System.out.println((j + 1) + "\t" + foodNames[j]
+ "\t" + prices[j] + "\t" + dianZans[j]);
}
// 点餐信息
System.out.print("请输入您需要点的菜品序号:");
int foodSerialNum = sc.nextInt();
System.out.print("您点该菜品需要点份数为:");
int foodNum = sc.nextInt();
String foodInformation = foodNames[foodSerialNum - 1]
+ " " + foodNum + "份";
// 点餐人姓名
System.out.print("请输入订餐人的姓名:");
String name = sc.next();
// 送餐时间
int time = 0;
while (true) {
System.out.print("请选择配送时间(10~20点间的整数):");
time = sc.nextInt();
if (time > 20 || time < 10) {
System.out.println("请输入10~20点间的整数!");
} else {
break;
}
}
// 送餐地址
System.out.print("请输入送餐地址:");
String address = sc.next();
// 全部信息输出一遍
System.out.println("订单成功");
System.out.println("您点的菜品是:" + foodInformation);
System.out.println("订餐人姓名为:" + name);
System.out.println("送餐时间为:" + time + "点");
System.out.println("送餐地址为:" + address);
double sumPrice = prices[foodSerialNum - 1] * foodNum;
if (sumPrice < 50) {
System.out.print("菜品价格为:" + sumPrice + " 配送费:6元"
+ " 总金额为:" + (sumPrice + 6) + "元");
sumPrice += 6;
} else {
System.out.print("总金额为:" + (sumPrice) + "元");
}
// 保存数据
names[i] = name;
foodInformations[i] = foodInformation;
times[i] = time;
addresses[i] = address;
states[i] = 0;
sumPrices[i] = sumPrice;
break;
}
}
// 如果没有找到为空的位置,则提示信息
if (!isAdd) {
System.out.println("对不起,您的餐袋已满!");
}
2.5、查看餐袋
显示每条订单信息(遍历数组)
序号 所订餐品信息 订餐人姓名 送餐时间 送餐地址 状态(已预订0 已完成1) 总金额
// 2.查看餐袋
System.out.println("*******查看餐袋*******");
System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t\t送餐地址\t总金额\t订单状态");
for (int j = 0; j < names.length; j++) {
String state = states[j] == 0 ? "已预定" : "已完成";
if (names[j] != null) {
System.out.println((j + 1) + "\t" + names[j] + "\t"
+ foodInformations[j] + "\t" + times[j]
+ "点\t\t" + addresses[j] + "\t" + sumPrices[j]
+ "元\t" + state);
}
}
2.6、签收订单
要求用户输入一个签收的订单序号
查找这条订单(循环遍历)
a、找到,状态是已完成(已经签收完毕):提示不能再次签收
b、找到,状态是已预约(没有完成签收):可以签收
c、没找到:提示信息没有找到
// 3.签收订单
// 订单序号
System.out.println("*******签收订单*******");
System.out.print("请输入您需要签收的订单:");
int orderNum = sc.nextInt();
if (states[orderNum - 1] == 0) {
states[orderNum - 1] = 1;
System.out.println("您已签收成功");
} else {
System.out.println("该订单已签收");
}
3.7、删除订单
a、输入要删除的订单序号(从1开始)
b、循环查找这条订单
找到此订单,已签收:执行删除操作
找到此订单,且未签收:提示信息
未找到订单:提示信息
c、删除操作(循环移位)
从要删除的元素后面一个开始,到数组最后一个元素依次向前移动一位,且最后一位清空
// 4.删除订单
System.out.println("*******删除订单*******");
System.out.print("请输入您要删除的订单序号");
int dalOrder = sc.nextInt();
// 判断该订单是否存在以及状态如何
if (names[dalOrder - 1] != null && states[dalOrder - 1] == 1) {
System.out.println("删除成功");
// 执行删除操作
for (int j = dalOrder - 1; j < names.length - 1; j++) {
names[j] = names[j + 1];
foodInformations[j] = foodInformations[j + 1];
times[j] = times[j + 1];
addresses[j] = addresses[j + 1];
sumPrices[j] = sumPrices[j + 1];
states[j] = states[j + 1];
}
// 当第四行存在时,单独删除第四行,清空最后一行
if (names[names.length - 1] != null) {
names[names.length - 1] = null;
foodInformations[names.length - 1] = null;
times[names.length - 1] = 0;
addresses[names.length - 1] = null;
sumPrices[names.length - 1] = 0.0;
}
} else if (names[dalOrder - 1] != null
&& states[dalOrder - 1] == 0) {
System.out.println("该订单还未签收,不能删除");
} else {
System.out.println("未找到该订单");
}
3.8、点赞
a、显示供点赞的餐品列表
b、输入要点赞的餐品序号
c、该序号的餐品点赞数加1
d、显示
// 5.我要点赞
System.out.println("*******我要点赞*******");
// 输出菜品信息
System.out.println("菜单信息:");
System.out.println("序号\t菜品名\t价格\t点赞数");
for (int j = 0; j < 3; j++) {
System.out.println((j + 1) + "\t" + foodNames[j] + "\t"
+ prices[j] + "\t" + dianZans[j]);
}
// 点赞的菜品序号(死循环判断)
while (true) {
System.out.print("请输入您需要点赞的菜品序号:");
int serialNum = sc.nextInt();
// 判断序号是否存在
if (serialNum < 4 & serialNum > 0) {
dianZans[serialNum - 1]++;
System.out.println("点赞成功");
break;
} else {
System.out.println("您输入的菜品序号不存在,请重新输入1~3之间的整数");
}
}
3.9、简单总结
本项目为最简单的Java初期项目,可以提升我们对原来知识点的运用,同时累计我们的项目经验
4、完整代码
// 数据主题:一组订单信息(一条订单需要的内容,用不同的数组装起来)
String[] names = new String[4];// 订餐人名称数组:用来存放订餐人的姓名
String[] foodInformations = new String[4];// 所选菜品名数组:用来存放订餐人定的餐品信息,通过菜品名拼接份数的形式显示
int[] times = new int[4];// 送餐日期数组:存放订单配送时间
String[] addresses = new String[4];// 送餐地址数组:存放订单配送地址
int[] states = new int[4]; // 订单状态数组: 0:已预定 1:已完成
double[] sumPrices = new double[4];// 订单总金额组: 存放每笔订单的总金额
// 初始化第一条订单信息
names[0] = "陈斌";
foodInformations[0] = "红烧带鱼 2份";// "菜品名+份数"的形式显示
times[0] = 3;
addresses[0] = "北大青鸟";
sumPrices[0] = 76.0;
states[0] = 1;
// 初始化第二条订单信息
names[1] = "程少聪";
foodInformations[1] = "鱼香肉丝 2份";// "菜品名+份数"的形式显示
times[1] = 10;
addresses[1] = "北大青鸟";
sumPrices[1] = 20.0;
states[1] = 0;
// 数据主题:菜单信息
String[] foodNames = { "红烧带鱼", "鱼香肉丝", "红烧鸡腿" };
double[] prices = { 38.0, 6.0, 10.0 };
int[] dianZans = new int[3];
// 输入的数字
Scanner sc = new Scanner(System.in);
int choose;
System.out.println("欢迎使用吃货订单系统");
a: do {
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("请选择您的操作 :");
choose = sc.nextInt();
boolean isAdd = false; // 当为true时,记录找到一个为空的位置,可以插入
switch (choose) {
case 1:
// 1.我要订餐
System.out.println("*******我要订餐*******");
// 需要找到要插入的位置
for (int i = 0; i < names.length; i++) {
// 如果找到空的位置则记录下来
if (names[i] == null) {
isAdd = true;// 记录已找到的一个空位置
// 执行插入操作
// 显示菜单信息
System.out.println("菜单信息:");
System.out.println("序号\t菜品名\t价格\t点赞数");
for (int j = 0; j < 3; j++) {
System.out.println((j + 1) + "\t" + foodNames[j]
+ "\t" + prices[j] + "\t" + dianZans[j]);
}
// 点餐信息
System.out.print("请输入您需要点的菜品序号:");
int foodSerialNum = sc.nextInt();
System.out.print("您点该菜品需要点份数为:");
int foodNum = sc.nextInt();
String foodInformation = foodNames[foodSerialNum - 1]
+ " " + foodNum + "份";
// 点餐人姓名
System.out.print("请输入订餐人的姓名:");
String name = sc.next();
// 送餐时间
int time = 0;
while (true) {
System.out.print("请选择配送时间(10~20点间的整数):");
time = sc.nextInt();
if (time > 20 || time < 10) {
System.out.println("请输入10~20点间的整数!");
} else {
break;
}
}
// 送餐地址
System.out.print("请输入送餐地址:");
String address = sc.next();
// 全部信息输出一遍
System.out.println("订单成功");
System.out.println("您点的菜品是:" + foodInformation);
System.out.println("订餐人姓名为:" + name);
System.out.println("送餐时间为:" + time + "点");
System.out.println("送餐地址为:" + address);
double sumPrice = prices[foodSerialNum - 1] * foodNum;
if (sumPrice < 50) {
System.out.print("菜品价格为:" + sumPrice + " 配送费:6元"
+ " 总金额为:" + (sumPrice + 6) + "元");
sumPrice += 6;
} else {
System.out.print("总金额为:" + (sumPrice) + "元");
}
// 保存数据
names[i] = name;
foodInformations[i] = foodInformation;
times[i] = time;
addresses[i] = address;
states[i] = 0;
sumPrices[i] = sumPrice;
break;
}
}
// 如果没有找到为空的位置,则提示信息
if (!isAdd) {
System.out.println("对不起,您的餐袋已满!");
}
break;
case 2:
// 2.查看餐袋
System.out.println("*******查看餐袋*******");
System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t\t送餐地址\t总金额\t订单状态");
for (int j = 0; j < names.length; j++) {
String state = states[j] == 0 ? "已预定" : "已完成";
if (names[j] != null) {
System.out.println((j + 1) + "\t" + names[j] + "\t"
+ foodInformations[j] + "\t" + times[j]
+ "点\t\t" + addresses[j] + "\t" + sumPrices[j]
+ "元\t" + state);
}
}
break;
case 3:
// 3.签收订单
// 订单序号
System.out.println("*******签收订单*******");
System.out.print("请输入您需要签收的订单:");
int orderNum = sc.nextInt();
if (states[orderNum - 1] == 0) {
states[orderNum - 1] = 1;
System.out.println("您已签收成功");
} else {
System.out.println("该订单已签收");
}
break;
case 4:
// 4.删除订单
System.out.println("*******删除订单*******");
System.out.print("请输入您要删除的订单序号");
int dalOrder = sc.nextInt();
// 判断该订单是否存在以及状态如何
if (names[dalOrder - 1] != null && states[dalOrder - 1] == 1) {
System.out.println("删除成功");
// 执行删除操作
for (int j = dalOrder - 1; j < names.length - 1; j++) {
names[j] = names[j + 1];
foodInformations[j] = foodInformations[j + 1];
times[j] = times[j + 1];
addresses[j] = addresses[j + 1];
sumPrices[j] = sumPrices[j + 1];
states[j] = states[j + 1];
}
// 当第四行存在时,单独删除第四行,清空最后一行
if (names[names.length - 1] != null) {
names[names.length - 1] = null;
foodInformations[names.length - 1] = null;
times[names.length - 1] = 0;
addresses[names.length - 1] = null;
sumPrices[names.length - 1] = 0.0;
}
} else if (names[dalOrder - 1] != null
&& states[dalOrder - 1] == 0) {
System.out.println("该订单还未签收,不能删除");
} else {
System.out.println("未找到该订单");
}
break;
case 5:
// 5.我要点赞
System.out.println("*******我要点赞*******");
// 输出菜品信息
System.out.println("菜单信息:");
System.out.println("序号\t菜品名\t价格\t点赞数");
for (int j = 0; j < 3; j++) {
System.out.println((j + 1) + "\t" + foodNames[j] + "\t"
+ prices[j] + "\t" + dianZans[j]);
}
// 点赞的菜品序号(死循环判断)
while (true) {
System.out.print("请输入您需要点赞的菜品序号:");
int serialNum = sc.nextInt();
// 判断序号是否存在
if (serialNum < 4 & serialNum > 0) {
dianZans[serialNum - 1]++;
System.out.println("点赞成功");
break;
} else {
System.out.println("您输入的菜品序号不存在,请重新输入1~3之间的整数");
}
}
break;
case 6:
// 6.退出系统
System.out.println("退出系统");
break a;//结束do-while循环
default:
System.out.println("退出系统");
break a;//结束do-while循环
}
// 输入0返回(输入1~5时有返回)
System.out.println();
System.out.print("输入0返回菜单:");
choose = sc.nextInt();
} while (choose == 0);
System.out.println("谢谢使用,欢迎下次光临");