项目需求
(1)现今已经进入网络时代,人们的日常生活已经离不开网络,如网上购物、看新闻、交友等。
(2)“只要点点手指,就能送餐上门”,网上订餐越来越受到都市年轻人的青睐。
(3)现要求开发一个网上订餐系统,需要实现我要订餐、查看餐袋、签收订单、删除订单、我要点赞和退出系统6个功能。
项目环境准备
(1)开发工具:MyEclipse,JDK1.7。
(2)开发语言:Java。
案例覆盖的技能点
(1)理解程序基本概念——程序、变量、数据类型。
(2)会使用顺序、选择、循环、跳转语句编写程序。
(3)会使用数组。
难点分析
1、 使用数组对象保存订单信息
(1)根据本项目的需求分析可知,每条订单的信息都包括订餐人姓名、选择菜品及份数、送餐时间、送餐地址、订单状态、总金额,并且会有多条订单信息,可以使用数组来保存多条相同的信息。
(2)定义6个数组分别保存订单的订餐人姓名、选择的菜品及份数、送餐时间、送餐地址、订单状态、总金额。
(3)各数组中下标相同的元素组成一条订单信息。
该系统最多接收4条订单。
String[] names = new String[4]; //保存订餐人姓名
String[] dishMegs = 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]; //保存订单的总金额
2、访问订单信息
访问各数组中第i+1条订单信息可采用如下方式
订餐人姓名:names[i]
所选菜品信息:dishMegs[i]
送餐时间:times[i]
送餐地址:addresses[i]
订单状态:states[i]
订单的总金额:sumPrices[i]
3、 删除订单信息
(1)若数组中下标为delID的元素需删除,后面的元素则依次前移一位,即后一位的数据覆盖前一位的数据,可采用如下方式实现:
for(int j =delId;j
names[j] = names[j+1];
dishMegs[j] = dishMegs[j+1];
times[j] = times[j+1];
addresses[j] = addresses[j+1];
states[j] = states[j+1];
sumPrices[j] = sumPrices[j+1];
}
(2)依次实现后,会将最后一个元素置为空。
4、 计算订单的总金额
(1)本项目中在,在接收到订单的菜品编号和份数之后,通过“菜品编号-1”得到该菜品单价的保存位置,再利用“单价*份数”公式计算出预定菜品的总金额。
(2)同时,按“菜品名+份数”格式,使用“+”运算符将菜品名称和预定份数用字符串保存,如“红烧带鱼2份”。
//用户点菜
System.out.println("请选择您要点的菜品编号:");
int chooseDish = input.nextInt();
System.out.println("请选择您需要的份数:");
int number = input.nextInt();
String dishMeg = dishNames[chooseDish-1]+" "+number+"份";
double sumPrice = price[chooseDish-1]*number;
(3)利用if选择结构或三元运算符“?:”判断订单的总金额是否够50元。如果订单总金额够50元,免费送餐5元;否则加收5元送餐费。
//计算送餐费
double deliCharge = (sumPrice>=50)?0:5;
项目实现思路
1、 数据初始化
(1)创建OrderingMgr类,在main()方法中定义6个数组分别存储6类订单信息:
订餐人姓名(names)、选择菜品信息(dishMegs)、送餐时间(times)、送餐地址(addresses)、订单状态(states)、总金额(sumPrices)。
(2)创建3个数组,用来存储3种菜品的名称、单价和点赞数等信息。
//供选择的菜品信息
String[] dishNames = {"红烧带鱼","鱼香肉丝","时令鲜蔬"}; //菜品名称
double[] prices = {38.0,20.0,10.0}; //菜品单价
int[] praiseNums = new int[3]; //点赞数
(3)初始化2条订单信息。
//初始化第一条订单信息
names[0] = "张晴";
dishMegs[0] = "红烧带鱼 2份";
times[0] = 12;
addresses[0] = "天成路207号";
sumPrices[0] = 76.0;
states[0] = 1;
//初始化第二条订单信息
names[1] = "张晴";
dishMegs[1] = "鱼香肉丝 2份";
times[1] = 18;
addresses[1] = "天成路207号";
sumPrices[1] = 45.0;
states[1] = 0;
2、 实现菜单切换
执行程序,输出系统主菜单。用户根据显示的主菜单,输入功能编号实现菜单的显示和菜单的切换,具体要求如下:
(1)当输入1~5时,输出相关的菜单项信息。
(2)显示“输入0返回”。输入0,则返回主菜单,否则,退出系统,终止程序的运行,输出提示信息“谢谢使用,欢迎下次光临!”。
3、 实现查看餐袋
遍历系统中已有的订单,并逐条显示输出,内容包括序号、订餐人姓名、订餐信息(菜品名和份数)、送餐时间、送餐地址、总金额、订单状态(已预订或已完成)。
4、 实现我要订餐
为用户显示系统中提供的菜品信息,获得订餐人信息,形成订单。每条订单包含如下信息。
(1)订餐人姓名:要求用户输入。
(2)选择菜品及份数:显示3个供选择菜品的序号、名称、单价、点赞数,提示用户输入要选择的菜品序号及份数。
(3)送餐时间:当天10:00~20:00间整点送餐,要求用户输入10~20的整数,输入错误,重新输入。
(4)送餐地址:要求用户输入。
(5)状态:订单的当前状态。订单有两种状态,0为已预订状态(默认状态),1为已完成(订单已签收)。
(6)总金额:订单总金额。总金额 = 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
各数组中相同下标的数据组成一条订单信息,因此向每个数组相同下标的位置各增加一条数据并保存。
5、 实现签收订单
送餐完成后,要将用户签收订单的状态由“已预订”修改为“已完成”。业务要求如下:
(1)如果订单的当前状态为:“已预订”且数组下标为用户输入的订单序号减1,就签收。
(2)如果订单的当前状态为:“已完成”且数组下标为用户输入的订单序号减1,不可签收。
控制台接收要签收的订单序号。利用for循环结构遍历全部订单,利用if选择结构判断names数组中订餐人姓名是否为null,订单状态是否为已预订且数组下标是指定订单序号减1。
如果条件成立,该订单的状态值修改为1(即已完成)。
6、 实现删除订单
我们可以删除系统中处于“已完成”状态的订单,具体要求如下:
(1)接收要删除的订单序号。
(2)如果指定订单的状态为“已完成”且数组下标值为用户输入的订单序号减1,执行删除操作。
(3)如果指定订单的状态为“已预订”且数组下标值为用户输入的订单序号减1,不能删除。
执行删除操作,其他情况给出相应提示信息。
7、 实现我要点赞
选择执行“我要点赞”菜单项。
(1)界面显示菜品序号、菜品名、单价、点赞数(如为0可不显示),提示用户输入要点赞的菜品序号。
(2)接收要点赞的菜品序号。
(3)praiseNums中对应菜品的点赞数加1。
代码展示
package cn.bdqn.demo1; import java.util.Scanner; public class DingCan { public static void main(String[] args) { // 吃货联盟订餐系统 Scanner input = new Scanner(System.in); // 订餐系统相关信息 String[] names = new String[4]; // 保存订餐人姓名 String[] dishMegs = 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]; // 保存订单的总金额 // 供选择的菜品信息 String[] dishNames = { "红烧带鱼", "鱼香肉丝", "时令鲜蔬" }; // 菜品名称 double[] prices = { 38.0, 20.0, 10.0 }; // 菜品单价 int[] praiseNums = new int[3]; // 点赞数 // 初始化第一条订单信息 names[0] = "张晴"; dishMegs[0] = "红烧带鱼 2份"; times[0] = 12; addresses[0] = "天成路207号"; sumPrices[0] = 76.0; states[0] = 1; // 初始化第二条订单信息 names[1] = "张晴"; dishMegs[1] = "鱼香肉丝 2份"; times[1] = 18; addresses[1] = "天成路207号"; sumPrices[1] = 45.0; states[1] = 0; // 默认初始值 boolean flag = true; // 循环初始值 int num = -1; 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("请选择:"); int choose = input.nextInt(); switch (choose) { case 1: // 我要订餐 // 判断数组中哪个位置为空,从此处开始插入数据,若没有位置为空,则提示“餐袋已满” int numNull = 0; for (int i = 0; i < names.length; i++) { if (names[i] == null) { System.out.println("--新增订单--"); // (1)订餐人姓名 System.out.println("请输入订餐人姓名:"); names[i] = input.next(); // (2)选择菜品及份数 System.out.println("序号\t名称\t\t单价\t点赞数"); for (int j = 0; j < dishNames.length; j++) { System.out.println((j + 1) + "\t" + dishNames[j]+ "\t\t" + prices[j] + "\t"+ praiseNums[j]); } System.out.println("请选择菜品序号:"); int caiNum = input.nextInt(); System.out.println("选择份数:"); int fenNum = input.nextInt(); dishMegs[i] = dishNames[caiNum - 1] + " " + fenNum + "份"; // (3)送餐时间 System.out.println("请选择送餐时间(10:00-20:00整点送餐):"); int time0 = input.nextInt(); while (time0 < 10 || time0 > 20) { System.out.println("输入错误,请重新输入:"); time0 = input.nextInt(); } times[i] = time0; // (4)送餐地址 System.out.println("请输入送餐地址:"); addresses[i] = input.next(); // (5)状态(新增时,订单状态均为默认状态0) states[i] = 0; // (6)总金额 = // 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。 double caiPrices = prices[caiNum - 1] * fenNum; if (caiPrices >= 50) { sumPrices[i] = caiPrices; } else { sumPrices[i] = caiPrices + 5; } break; } else { numNull = i; } } if (numNull == names.length - 1) { System.out.println("餐袋已满,请及时处理。"); } break; case 2: // 查看餐袋 System.out.println("--查看餐袋--"); System.out .println("序号\t\t订餐人\t\t餐品信息\t\t\t送餐时间\t\t送餐地址\t\t\t总金额\t\t订单状态"); for (int i = 0; i < names.length; i++) { if (names[i] != null) { String time = times[i] + "点"; String sumPrice = sumPrices[i] + "元"; String state; if (states[i] == 0) { state = "已预订"; } else { state = "已完成"; } System.out.println((i + 1) + "\t\t" + names[i] + "\t\t"+ dishMegs[i] + "\t\t" + time + "\t\t"+ addresses[i] + "\t\t" + sumPrice + "\t\t"+ state); } } break; case 3: // 签收订单 System.out.println("--签收订单--"); System.out.println("请选择需要签收的订单序号:"); int orderNum = input.nextInt(); for (int i = 0; i < names.length; i++) { if (orderNum == i + 1) { if (names[i] != null) { if (states[i] == 0) { states[i]=1; System.out.println("订单签收完成!"); } else { System.out.println("你选择的订单已完成,不能再次签收订单!"); } } } } break; case 4: // 删除订单 System.out.println("--删除订单--"); System.out.println("请选择需要删除的订单序号:"); int orderNum1 = input.nextInt(); for (int i = 0; i < names.length; i++) { if (orderNum1 == i + 1) { if (names[i] != null) { if (states[i] == 0) { System.out.println("该订单仍在预定状态,不能删除!"); } else { names[i]=null; System.out.println("订单删除成功!"); } } } if(names[i]==null){ for (int j = i; j < names.length - 1; j++) { names[j] = names[j + 1]; dishMegs[j] = dishMegs[j + 1]; times[j] = times[j + 1]; addresses[j] = addresses[j + 1]; sumPrices[j] = sumPrices[j + 1]; states[j] = states[j + 1]; } } } break; case 5: // 我要点赞 System.out.println("--我要点赞--"); System.out.println("序号\t名称\t\t单价\t点赞数"); for (int j = 0; j < dishNames.length; j++) { System.out.println((j + 1) + "\t" + dishNames[j]+ "\t\t" + prices[j] + "\t"+ praiseNums[j]); } System.out.println("请选择点赞的菜品序号:"); int caiZanNum = input.nextInt(); for (int j = 0; j < dishNames.length; j++) { if(caiZanNum==j+1){ praiseNums[j]+=1; } } System.out.println("点赞后的菜品展示:"); System.out.println("序号\t名称\t\t单价\t点赞数"); for (int j = 0; j < dishNames.length; j++) { System.out.println((j + 1) + "\t" + dishNames[j]+ "\t\t" + prices[j] + "\t"+ praiseNums[j]); } break; case 6: // 退出系统 flag=false; break; default: flag = false; break; } if (flag) { System.out.println("输入0返回:"); num = input.nextInt(); } else { break; } } while (num == 0); System.out.println("谢谢使用,欢迎下次光临"); } }
效果展示