现今已进入网络时代,人们的日常生活已离不开网络,如网上购物、看新闻、交友等。“只要点点手指,就能送餐上门”,网上订餐越来越受到都是年轻人的青睐。先要求开发一个网上订餐系统,需要实现我要订餐、查看餐袋、签收订单、删除订单、我要点赞和退出系统6个功能。项目运行结果如下所示:
欢迎使用“吃货联盟订餐系统”
***************************************************、
1、我要订餐
2、查看餐袋
3、签收订单
4、删除订单
5、我要点赞
6、退出系统
****************************************************、
完成“吃货联盟订餐系统”,对于开发环境的要求如下:
开发工具:MyEclipse,JDK(我用的是IDEA和JDK1.8.0_241)
开发语言:java
程序基本概念:程序、变量、数据类型
流程控制:顺序、选择、循环、跳转语句
数组
第一阶段:分析数据主体(重难点)
第二阶段:分析并完成整体框架(重难点)
第三阶段:分析并完成退出功能
第四阶段:分析并完成订餐功能
第五阶段:分析并完成查看餐袋功能
第六阶段:分析并完成签收订单功能
第七阶段:分析并完成删除功能(重难点)
第八阶段:分析总完成我要点赞功能
根据本项目的需求分析可知,每条订单的信息都包括订餐人姓名、选择菜名及份数、送餐时间、送餐地址、订单状态、总金额,并且会有多条订单信息,可以使用数组来保存多条相同类型的信息。定义6个分组分别保存订单的订餐人姓名、选择的菜品及份数、送餐时间、送餐地址、订单状态、总金额,各数组中下标相同的元素组成一条订单信息。
访问各数组中第i+1条订单信息可采用如下方式:
订餐人姓名:name[i];
所选菜品信息:dishMegs[i];
送餐时间:time[i];
送餐地址:addresses[i];
订单状态:states[i];
订单的总金额:sumPrices[i];
若数组中下标为delld的元素虚删除,后面的元素则依次前移一位,即后一位的数据覆盖前一位的数据。
本项目中,在接收到订单的菜品编号和份数之后,通过“菜品编号-1”得到该菜品单价的保存位置,再利用“单价*份数”公式计算出预定菜品的总金额。同时,按“菜品名+份数”格式,使用“+”运算符将菜品名称和预定份数用字符串保存。
(1)创建OrderingMgr类,在main()方法定义6个数组分别存储6类订单信息:订单人姓名(name)、选择菜品信息(dishMegs)、送餐时间(times)、送餐地址(addresses)、订单状态(states)、总金额(sumPrice)。
(2)创建3个数组,用来存储3中菜品的名称、单价和点赞数等信息。
执行程序,输出系统主菜单。用户根据显示的主菜单,输入功能编号实现菜单的显示和菜单切换。
(1)当输入1~5时,输出相关的菜单项信息。
(2)显示“输入0返回:”。输入0,则返回主菜单;否则,退出系统,终止程序的运行,输出提示信息“谢谢使用,欢迎下次光临!”。
遍历系统中已有的订单,并逐条显示输出,内容包括序号、订餐人姓名、订餐信息(菜品名和份数)、送餐时间、送餐地址、总金额、订单状态(已预订或已完成)。
为用户显示系统中提供的菜品信息,获得订餐人信息,形成订单。每条订单包含如下信息:
(1)订餐人姓名:要求用户输入。
(2)选择菜品及份数:显示3个公选择菜品的序号、名称、单价、点赞数,提示用户输入要选择的菜品序号及份数。
(3)送餐时间:当天10:00-20:00件整点送餐,要求用户输入10~20商务整数,输入有误,重新输入。
(4)送餐地址:要求用户输入。
(5)状态:订单的当前状态。订单有两种状态,0为已预订(默认状态),1为已完成(订单已签收)。
(6)总金额:订单总金额。总金额=菜品单价*份数+送餐费。其中,当单订单单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
送餐完成后,要将用户签收订单的状态由“已预订”修改为“已完成”。业务要求如下:
(1)如果订单的当前状态为:“已预订”且数组下标为用户输入的订单序号减1,就签收。(2)如果订单的当前的状态为“已完成”且数组下标为用户输入的订单序号间1,不可签收。
控制台接收要签收的订单序号。利用for循环结构遍历全部订单,利用if选择结构判断names数组中订餐人姓名是否为null,订单状态是否为已预定且数组下标是指定订单序号减1.如果条件成立,该订单的状态值修改为1(即已完成)。
我们可以删除系统中处于“已完成”状态的订单,具体要求如下:
(1)接收要删除的订单序号。
(2)如果指定订单的状态为“已完成”且数组下标值为用户输入的订单序号减1,执行删除操作。
(3)如果指定订单的状态为“已预订”且数组下标值为用户输入的订单序号减1,不能删除。
执行删除操作,其他情况给出相应提示信息。
分步实现以下功能:
(1)查找订单序号相符、订单名称不为空,且状态为“已完成”的订单。
(2)执行删除该序号订单的操作,即后一位元素覆盖前一位元素,最后一位清空。
(3)如果指定订单的状态是“已预订”,则不允许删除。
选择执行“我要点赞”菜单项,界面显示菜品序号、菜品名、单价、点赞数,提示用户输入要点赞的菜品序号。
import java.util.Scanner;
public class Chihuo {
public static void main(String[] args) {
final double NO_SEND_MONEY = 80;
String[] dishes = {"东坡肉", "地锅鸡", "水煮鱼", "佛跳墙"};
double[] prices = {45, 38, 28, 99};
int[] like = {11, 22, 33, 44};
int choseNum;
String[][] bills = new String[1024][];
String name = null;
int pcs = 0;//份数
int time = 0;
String address = null;
String status = null;
Scanner sc = new Scanner(System.in);
int chose = 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.println("请选择:");
chose = sc.nextInt();
switch (chose) {
case 1:
System.out.println("****我要订餐****");
System.out.print("请输入订餐人姓名:");
name = sc.next();
System.out.println("序号\t菜品\t单价");
for (int i = 0; i < dishes.length; i++) {
System.out.println(i + 1 + "\t" + dishes[i] + "\t" + prices[i] + "元");
}
do {
System.out.print("请选择您要点的菜品编号:");
choseNum = sc.nextInt();
if (choseNum > 0 && choseNum <= dishes.length) {
break;
} else {
System.out.println("您的输入有误,重新输入!");
}
} while (true);
do {
System.out.print("请选择您需要的份数");
pcs = sc.nextInt();
if (pcs > 0) break;
System.out.println("份数不能小于0,重新输入!");
} while (true);
do {
System.out.print("请输入送餐的时间(10点至20点整点送餐):");
time = sc.nextInt();
if (time >= 10 && time <= 20) break;
System.out.println("输入有误,重新输入!");
} while (true);
System.out.print("请输入送餐地址:");
address = sc.next();
System.out.print("订餐成功!");
System.out.print("您订的是:" + dishes[choseNum - 1]);
System.out.print("送餐时间:" + time + "点");
double dishPrice = prices[choseNum - 1] * pcs;
int sendMoney = 0;
if (dishPrice < NO_SEND_MONEY) {
sendMoney = 6;
}
double totalPrice = dishPrice + sendMoney;
System.out.print("餐费:" + dishPrice + "元,送餐费" + sendMoney + "元,总计" + totalPrice + "元");
//插入订单,遍历订单,如果为空,则插入
for (int i = 0; i < bills.length; i++) {
if (bills[i] == null) {
bills[i] = new String[7];
bills[i][0] = name;
bills[i][1] = dishes[choseNum - 1] + " " + pcs + "份";
bills[i][2] = time + "点";
bills[i][3] = address;
bills[i][4] = totalPrice + "元";
bills[i][5] = "已预订";
break;
}
}
System.out.print("输入0返回");
chose = sc.nextInt();
break;
case 2:
System.out.println("****查看餐袋****");
System.out.println("序号\t订餐人\t餐品信息\t送餐时间\t送餐地址\t总金额\t订单状态");
for (int i = 0; i < bills.length; i++) {
if (bills[i] == null) {
break;
}
System.out.println(i + 1 + "\t" + bills[i][0] + "\t" + bills[i][1] + "\t" + bills[i][2] + "\t" + bills
[i][3] + "\t" + bills[i][4] + "\t" + bills[i][5]);
}
System.out.print("输入0返回");
chose = sc.nextInt();
break;
case 3:
System.out.println("****签收订单****");
if (bills[0] == null) {
System.out.println("订单为空,不可签收!");
System.out.print("输入0返回:");
chose = sc.nextInt();
break;
}
System.out.println("序号\t订餐人\t餐品信息\t总金额\t订单状态");
int i = 0;
for (; i < bills.length; i++) {
if (bills[i] == null) {
break;
}
System.out.println(i + 1 + "\t" + bills[i][0] + "\t" + bills[i][1] + "\t" + bills[i][4] + "\t" + bills[i][5]);
}
int signNum;
do {
System.out.println("请选择要签收的订单编号:");
signNum = sc.nextInt();
if (signNum > 0 && signNum <= i) break;
System.out.println("订单不存在,重新输入!!");
} while (true);
if (bills[signNum - 1][5].equals("已完成"))
System.out.println("订单已经完成签收,不需要重复签收");
else
bills[signNum - 1][5] = "已完成";
System.out.print("输入0返回:");
chose = sc.nextInt();
break;
case 4:
System.out.println("****删除订单****");
if (bills[0] == null) {
System.out.println("订单为空,不可删除!");
System.out.print("输入0返回:");
chose = sc.nextInt();
break;
}
System.out.println("序号\t订餐人\t餐品信息\t总金额\t订单状态");
int k = 0;
for (; k < bills.length; k++) {
if (bills[k] == null) {
break;
}
System.out.println(k + 1 + "\t" + bills[k][0] + "\t" + bills[k][1] + "\t" + bills[k][4] + "\t" + bills[k][5]);
}
int delNum;
do {
System.out.println("请选择要删除的订单编号:");
delNum = sc.nextInt();
if (bills[0] == null) break;
{
}
if (delNum > 0 && delNum <= k) break;
System.out.println("订单不存在,重新输入!!");
} while (true);
//未完成的订单不能删除
//删除订单需要考虑选择的订单删除后,后面的订单需要前移
if (!bills[delNum - 1][5].equals("已完成"))
System.out.println("未完成的订单不能删除!");
else {
for (int s = delNum - 1; bills[s] != null; s++) {
if (delNum == bills.length) {
bills[delNum - 1] = null;
} else {
bills[s] = bills[s + 1];
}
}
System.out.println("删除完成!");
}
System.out.print("输入0返回");
chose = sc.nextInt();
break;
case 5:
System.out.println("****我要点赞****");
System.out.println("序号\t菜品\t\t单价\t点赞数");
for (int j = 0; j < dishes.length; j++) {
System.out.println(j + 1 + "\t" + dishes[j] + "\t" + prices[j] + "元" + "\t" + like[j]);
}
int likeNum;
do {
System.out.println("请选择要点赞的菜品:");
likeNum = sc.nextInt();
if (likeNum > 0 && likeNum <= like.length) break;
System.out.println("没有这个菜品,请重新输入!");
} while (true);
like[likeNum - 1]++;
System.out.println("谢谢点赞");
System.out.print("输入0返回");
chose = sc.nextInt();
break;
}
} while (chose == 0);
System.out.println("谢谢使用,欢迎下次光临!");
}
}