需求说明
模拟订餐系统,要求有如下功能:
1、订餐
1 .1进入此流程后,弹出菜单,顾客选择菜品
1 .2菜品选好后,依次填写收货人,配送时间和配送地点等信息
1 .3填写完成后,显示订餐成功,并选择返回上级还是退出程序
2、查看订单信息及状态
2.1点击显示全部订单信息(包含订单序号、菜品种类,预定数量、总金额、配送时间、配 送地点和收货人等信息)及状态
3、确认收货
3 .1进入此流程后,提示顾客输入确认收货的订单编号
3 .2对订单编号进行校验,若订单存在且未收货,则将订单状态改为已完成
4、删除订单
4 .1进入此流程后,提示顾客输入要删除订单的编号
4 .2对订单编号进行校验,若订单存在且已收货,则将订单删除,并相应调整剩余订单编号
5、为菜品点赞
5.1进入此流程后,提示顾客输入要点赞的菜品编号
5 .2编号校验合格后,对菜品点赞,输出点赞成功,并询问是否查看全部菜品的当前点赞数量
5 .3选择查看则显示全部点赞数量
思路分析
需要处理的信息汇总:
菜品名称(String)、菜品单价(double)、点赞数量(int)
订餐种类(String)、订餐数量(int)、配送时间(int)、配送地址(String)、收货人(String)
每条订单包含以上信息,因此可将每条订单保存在一个String数组中,全部订单保存在一个二维数组中
主方法可以选择采用可以控制是否结束的死循环保持程序运行装填(while(flag),循环内可以设置flag状态,可以关闭退出)
将菜品名称(String)、菜品单价(double)、点赞数量(int)以及订单二维数组等信息作为main方法的全局变量写在最开始,通过Scanner类选择操作,使用switch结构对输入的数字进行判断,执行相应操作
订餐即为多次Scanner输入,最后将输入的信息保存在订单二维数组中
查看全部订单状态,即为打印订单二维数组
确认收货即为将订单二维数组中指定序号的字符串数组中的“已预定”修改为“已完成”
删除订单即为将订单二维数组中指定序号的字符串数组删除,并将后面的订单前移
点赞即为对应菜品名称序号的点赞数量数组元素加一
退出程序,将flag设为false即可
代码实现
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String[] dishes={"红烧肉","水煮肉","清蒸鱼","干锅鸭"};//菜品预定
double[] prizes= { 25, 30, 18, 28};//单价预定
int[] honours={ 0, 0, 0, 0};//初始点赞值
String[][] orders=new String[1024][];//保存全部订单的二维数组,将数组容量设置足够大
boolean flag=true;//标志位,判断程序是否退出
while (flag){
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("请输入您的选择:\t");
int chose=sc.nextInt();
switch (chose){
//订餐,目的为向订单数组中添加元素
case 1:
System.out.println("***我要订餐***");
System.out.println("序号\t\t菜品\t\t单价");
for (int i = 0; i < dishes.length; i++) {//打印菜品及单价
System.out.println(" "+(i+1)+"\t "+dishes[i]+"\t"+prizes[i]+"元");
}
//获得选择的餐品种类
int dishNum=0;
do {
System.out.print("请输入您要预定的餐品序号:");
dishNum=sc.nextInt();
if (dishNum>4||dishNum<1) System.out.println("输入错误,请重试");
}while (dishNum>4||dishNum<1);//数据合法检测,防止输入不存在的菜品序号
//获得餐品份数
int dishMount=0;
do {
System.out.print("请输入您要预定的份数:");
dishMount=sc.nextInt();
if (dishMount<1){
System.out.println("输入错误,请重试");
}
}while (dishMount<1);//数据合法检测,防止输入小于一份的份数
//获得订餐人信息
String eater="";
System.out.print("请输入订餐人姓名:");
eater=sc.next();
//输入配送时间
int deliveryTime=0;
do {
System.out.print("请输入配送时间:");
deliveryTime=sc.nextInt();
if (deliveryTime<8||deliveryTime>21){
System.out.println("您输入的配送时间不再商家工作时间内,请重新输入");
}
}while (deliveryTime<8||deliveryTime>21);//要求在8-21点内配送
//获得配送地址
System.out.print("请输入配送地址:");
String address=sc.next();
//订餐成功,输出提示信息,并将以上信息汇总存入订单数组
System.out.println("订餐成功,请耐心等待");
for (int i = 0; i < orders.length; i++) {
if (orders[i]==null){
orders[i]=new String[2];
orders[i][0]=" "+dishes[dishNum-1]+"\t\t"
+dishMount+"\t "+prizes[dishNum-1]*dishMount+"\t\t"
+eater+"\t\t "+deliveryTime+"点\t\t"+address;
orders[i][1]="已预定";
break;
}
}
break;
//输出全部订单信息
case 2:
System.out.println("***查看餐袋***");
System.out.println("序号\t餐品种类\t订餐数量\t总金额\t订餐人\t配送时间\t\t配送地址\t\t订单状态");
for (int i = 0; i < orders.length; i++) {
if (orders[i]==null){//过滤掉订单数组中多余的部分
break;
}
System.out.println(" "+(i+1)+orders[i][0]+"\t\t"+orders[i][1]);
}
break;
//确认收货:修改订单状态信息
case 3:
System.out.println("***确认收货***");
int confirmNum=0;
int currentNumber=0;
for (int i = 0; i < orders.length; i++) {//获取当前订单总量
if (orders[i]!=null){
currentNumber++;
}
}
do {//数据合法检测,过滤掉不存在的订单编号、已完成的订单编号
System.out.println("请输入要收货的编号");
boolean isConfirmed=false;
confirmNum=sc.nextInt();
if (confirmNum<1||confirmNum>currentNumber){
System.out.println("您要确认的订单不存在,请确认后重试");
}else {
if ("已完成".equals(orders[confirmNum-1][1])){
//防止订单全部收货时进入此页面卡死,输入一个已收货的订单序号后可以跳转到模块结束位置
System.out.println("订单已完成,无法重复确认");
}else {
isConfirmed=true;
orders[confirmNum-1][1]="已完成";
}
}
if (isConfirmed){
System.out.println("订单已确认,请您用餐");
break;
}
}while (confirmNum<1||confirmNum>currentNumber);
break;
//删除订单
case 4:
System.out.println("***删除订单***");
int deleteNum=0;//要删除的订单编号
int currentNum=0;//订单总数量
for (int i = 0; i < orders.length; i++) {
if (orders[i]!=null){
currentNum++;
}
}
do {//数据合法检测,过滤掉不存在的订单编号、未完成的订单编号
System.out.print("请输入要删除的订单编号");
deleteNum=sc.nextInt();
if (deleteNum<1||deleteNum>currentNum){
System.out.println("您要删除的订单不存在,请确认后重试");
}else if ("已预定".equals(orders[deleteNum-1][1])){
System.out.println("未完成的订单无法删除");
}else {
if (deleteNum==currentNum){
orders[deleteNum-1]=null;
System.out.println("删除成功");
break;
}else {
for (int i = deleteNum; i < orders.length; i++) {
orders[i]=orders[i+1];
if (i==currentNum){
break;
}
}
System.out.println("删除成功");
break;
}
}
}while (deleteNum<1||deleteNum>currentNum||"已完成".equals(orders[deleteNum-1][1]));
break;
//点赞
case 5:
int honourNo=0;
do {
System.out.println("请输入您要点赞的菜品编号");
honourNo=sc.nextInt();
if (honourNo>dishes.length||honourNo<1){
System.out.println("您要点赞的菜品不存在,请确认后重试");
}else {
honours[honourNo]++;
}
}while (honourNo>dishes.length||honourNo<1);
System.out.println("点赞成功");
int willLook=0;
do {
System.out.println("是否查看菜品点赞数量");
System.out.print("输入0查看 输入1不查看");
willLook=sc.nextInt();
if (willLook==0){
System.out.println("序号\t菜品\t点赞数");
for (int i = 0; i < dishes.length; i++) {
System.out.println(" "+(i+1)+dishes[i]+"\t"+honours[i]);
}
}else if (willLook==1){
}else {
System.out.println("输入错误,请重试");
}
}while (willLook!=0&&willLook!=1);
break;
//退出程序
case 6:
flag=false;
break;
default:
System.out.println("输入错误,请确认后重新输入");
}
if (chose>0&&chose<6){
do {
System.out.println("输入0返回上级:");
System.out.println("输入1结束程序:");
System.out.print("请输入您的选择:");
chose=sc.nextInt();
if (chose==0){
}else if (chose==1){
flag=false;
}else {
System.out.println("输入错误,请重试!");
}
}while(chose!=0&&chose!=1);
}else {
break;
}
}
System.out.println("感谢使用,欢迎下次光临");
System.out.println("********************");
}