Java【吃货联盟】实战案例

目录

1.项目分析

1.1 项目主要内容

1.2​​​​​​ 项目的功能需求及效果图

2.涉及到的Java语法点

3.不同模块的详细介绍

3.1 整体的构造思路       

3.2 数据的初始化   

3.3 主页面的功能

3.4 “退出系统”功能

3.5 “查看订单”功能

3.6 “签收订单”功能

3.7 “删除订单”功能

3.8 “我要点赞”功能

3.9 “我要订餐”功能

4.总结   


1.项目分析

1.1 项目主要内容

        【吃货联盟】是具有一个点餐以及管理订单功能的系统,主要包括主页面,订餐页面,查看订单页面,签收页面,删除订单页面以及点赞页面。主要采用用户根据提示输入对应的信息与程序进行交互。

1.2​​​​​​ 项目的功能需求及效果图

1.2.1 主页面的展示

        用户输入序号可以进入对应的功能模块,并且当每个功能模块结束后都会显示“输入0返回主页面:”,提示用户输入0后返回主页面。

        效果图:

1.2.2 “我要订餐”功能

        用户在主页面选择1进入点餐页面,通过提示进行订餐,注意菜品序号的正确输入和送餐时间的正确输入,当订单已满时,提示用户需要删除已完成的订单后才能继续订餐。

        效果图:

 

1.2.3 “查看订单”功能

        用户在主页面选择2进入订单详情页面,可以查看到订单序号,订餐人,餐品信息,送餐时间等信息。

        效果图:

 

1.2.4 “签收订单”功能

        用户在主页面选择3进入签收订单页面,在这个页面用户也可以查看到订单信息,并提示输入需要签收订单序号,注意用户无法签收已完成的订单,如果输入序号不正确,会提示错误。

        效果图:

 

 

 

1.2.5 “删除订单”功能

        用户在主页面输入4后进入删除订单页面,用户只能删除已完成的订单,删除状态为“已预定”的订单或订单序号有误则会有相应的提示。

        效果图:

 

 

1.2.6 “我要点赞”功能

        用户在主页面输入5进入“我要点赞”功能,该功能会展示菜单以及菜单的点赞数,用户输入菜品序号后会给相应菜品的点赞数+1,添加一个菜品序号的验证功能。

        效果图:

1.2.7 ​​​​​​​“退出系统”功能

        主页面输入6后显示“欢迎下次光临!”并退出程序。

        效果图:

2.涉及到的Java语法点

(1)变量类型的掌握以及变量的定义

        注意变量类型的选择和状态位的设置

(2)运算符的运用

        主要是对与逻辑运算符的逻辑判断的掌握

(3)选择结构

        switch语句,if单分支,双分支,多分支以及嵌套if语句

(4)循环结构

        包括while循环和for循环

(5)数组的创建和更改

        一维数组的定义,初始化以及对数组内元素的赋值

3.不同模块的详细介绍

3.1 整体的构造思路       

        首先需要定义要使用的变量,数组,并对其进行初始化,并且为了便于测试,添加两个已有的订单并赋予它们不同的订单状态。
        功能主体采用while死循环的方式实现,通过判断用户是否退出来执行break语句结束程序,每次循环时展示主页面并将判断变量进行复位,然后用户输入功能序号进入不同的功能模块,之后进入下一次循环直到用户选择退出系统。
        每个功能模块完成后都要进行测试确保正确,点餐功能相对来说复杂些,放在最后去实现。

3.2 ​​​​​​​数据的初始化   

        数据初始化时,先分析所有功能模块所需要的基本数据,如果后续编写代码时需要新增一些变量,也应当写在代码的上方,便于查看和修改。
        变量的名称尽量使用简明易懂的方式编写,并遵循一定的规范。
        为了方便测试,用户的订单上限设置为4,菜品设置为3种。

3.2.1 ​​​​​​​数组部分的初始化

//数组部分的初始化
Scanner scanner = new Scanner(System.in);//先导入Scanner,创建scanner变量用于接受用户输入信息
//1.订单详情
String[] usrNames = new String[4];//存放用户的名字
String[] orderMegs = new String[4];//存放订餐的菜品名称及份数
int[] deliverTimes = new int[4];//存放配送的时间
String[] adderesses = new String[4];//存放送餐地址
double[] sumPrices = new double[4];//存放订单总金额
boolean[] orderStates = new boolean[4];//存放订单的状态,false表示已预定,true表示已完成签收
//2.菜单详情
String[] dishNames = new String[3];//存放菜名
double[] dishPrices = new double[3];//存放菜品单价
int[] praiseSums = new int[3];//存放菜品的点赞总数
dishNames[0] = "红烧带鱼";
dishNames[1] = "鱼香肉丝";
dishNames[2] = "时令鲜蔬";
dishPrices[0] = 38;
dishPrices[1] = 20;
dishPrices[2] = 10;

3.2.2 单个变量的初始化

//单个变量部分的初始化
int choose;//用于判断用户选择的功能模块
int isZero;//用于判断用户是否输入0返回主菜单
boolean isExit = false;//用于判断用户是否退出系统,默认为false
boolean isSignFind;//用于判断“签收”功能中是否找到了相应序号订单
boolean isDelFind;//用于判断“删除”功能中是否找到了相应序号订单
boolean isAdd;//用于判断“点餐”功能中是否成功添加了订单

3.3.3 ​​​​​​​添加的两个测试订单

//添加两个测试订单
//第一个订单
usrNames[0] = "张晴";
orderMegs[0] = "红烧带鱼 2份";
deliverTimes[0] = 12;
addresses[0] = "北京";
orderStates[0] = true;
sumPrices[0] = 76;
//第二个订单
usrNames[1] = "张晴";
orderMegs[1] = "鱼香肉丝 2份";
deliverTimes[1] = 18;
addresses[1] = "北京";
orderStates[1] = false;
sumPrices[1] = 40;

3.3 主页面的功能

3.3.1 展示主页面

//主体采用while死循环方式
while(true){
    //每次进入循环显示主页面
    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("******************************************");
    //三个判断状态的复位
    isSignFind = false;
    isDelFind = false;
    isAdd = false;
    //提示用户输入要执行的功能模块
    System.out.print("请选择:");
    choose = scanner.nextInt();
}

3.3.2 进入功能模块,并返回主页面的功能

//进入功能模块使用switch语句实现
switch (choose){
    //choose为1时进入点餐功能
    case 1:
        System.out.println("-----------------我要订餐-----------------");
        break;
    //choose为2时进入查看订单功能
    case 2:
        System.out.println("-----------------查看订单-----------------");
        break;
    //choose为3时进入签收功能
    case 3:
        System.out.println("-----------------签收订单-----------------");
        break;
    //choose为4时进入删除订单功能
    case 4:
        System.out.println("-----------------删除订单-----------------");
        break;
    //choose为5时进入点赞功能
    case 5:
        System.out.println("-----------------我要点赞-----------------");
        break;
    //choose为6时进入退出系统功能
    case 6:
        System.out.println("欢迎下次光临!");
}
//结束功能模块后需要判断用户是否想退出
if(isExit){
    //判断用户想退出,执行break语句并退出循环主体
    break;
}else{
    //判断用户没有选择退出,提示用户输入0返回主页面
    //验证用户是否输入了0
    while(isZero!=0){
        System.out.print("请输入0返回主页面:");
        isZero = scanner.nextInt();
    }
}

3.4 “退出系统”功能

//choose为6时进入退出系统功能
case 6:
    System.out.println("欢迎下次光临!");
    isExit = true;//将判断是否退出系统的状态为设置为true

3.5 “查看订单”功能

//choose为2时进入查看订单功能
case 2:
    System.out.println("-----------------查看订单-----------------");
    System.out.println("序号\t订餐人\t餐品信息\t\t\t送餐时间\t\t送餐地址\t\t总金额\t订单状态");
    for (int i = 0; i < usrNames.length; i++) {
        if(usrNames[i]!=null){
            System.out.println(" "+(i+1)+"\t"+usrNames[i]+
            "\t\t"+orderMegs[i]+"\t\t"+deliverTimes[i]+"点\t\t\t"+
            addresses[i]+"\t\t\t"+sumPrices[i]+"\t"+
            //使用三目运算符显示状态对应的文字
            (orderStates[i]?"已完成":"已预定"));
        }
    }
    break;

3.6 “签收订单”功能

//choose为3时进入签收功能
case 3:
    System.out.println("-----------------签收订单-----------------");
    //先展示订单信息
    //...
    //该部分代码与“查看订单”功能代码一样,省略
    //提示用户选择需要签收的订单
    System.out.print("请选择要签收的订单序号:");
    int signOrderId = scanner.nextInt();
    //使用for循环寻找用户选择的订单
    for (int i = 0; i < usrNames.length ; i++) {
        //只有状态为“已预定”状态的订单才能签收,否则提示“不能再次签收”
        //使用嵌套if语句,先寻找是否存在该订单,在判断其状态
        if(usrNames[i] != null && signOrderId == i+1){
            //找到了该订单,状态为调为true
            isSignFind = true;
            if(orderStates[i]){
                //状态为已签收时,提示错误
                System.out.println("您选择的订单已经完成签收,不能再次签收!");
            }else {
                //状态为已预定时,提示签收成功,并将状态进行更改
                orderStates[i] = true;
                System.out.println("订单签收成功!");
            }
        }
    }
    //未找到订单,提示错误
    if(!isSignFind){
        System.out.println("您选择的订单不存在!");
    }
    break;

3.7 “删除订单”功能

//choose为4时进入删除订单功能
case 4:
    System.out.println("-----------------删除订单-----------------");
    //先展示订单信息(省略)
    //提示用户输入需要删除订单的序号
System.out.print("请输入要删除的订单序号:");
    int delId = scanner.nextInt();
    for (int i = 0; i < usrNames.length; i++) {
        //用户无法删除已预定状态的订单
        //同样先寻找用户选择的订单,再判断状态
        if(usrNames[i] != null && delId == i+1){
            //将判断状态为设置为true
            isDelFind = true;
            if(orderStates[i]){
                //如果状态为已完成则需要将删除订单序号后的所有订单向前移动一位
                for (int j = delId-1; j < usrNames.length-1; j++) {
                    usrNames[j] = usrNames[j+1];
                    orderMegs[j] = orderMegs[j+1];
                    deliverTimes[j] = deliverTimes[j+1];
                    addresses[j] = addresses[j+1];
                    orderStates[j] = orderStates[j+1];
                    sumPrices[j] = sumPrices[j+1];
                }
                //移位后需要将最后一位清空,防止订单已满,最后一位的订单信息无法清空的情况
                int endIndex = usrNames.length-1;
                usrNames[endIndex] = null;
                orderMegs[endIndex] = null;
                deliverTimes[endIndex] = 0;
                addresses[endIndex] = null;
                orderStates[endIndex] = false;
                sumPrices[endIndex] = 0;
                //删除完毕
                System.out.println("删除订单成功!");
            }else{
                System.out.println("无法删除未签收的订单");
            }
            //如果找到该订单,操作后执行break语句退出循环
            break;
        }
    }
    if(!isDelFind) {
        System.out.println("您选择的订单不存在!");
    }
    break;

3.8​​​​​​​ “我要点赞”功能

//choose为5时进入点赞功能
case 5:
    System.out.println("-----------------我要点赞-----------------");
    //菜单页面展示
    System.out.println("序号\t\t菜名\t\t\t单价\t\t点赞数");
    for (int i = 0; i < dishNames.length; i++) {
        System.out.println(" "+(i+1)+"\t\t"+dishNames[i]+"\t\t"+dishPrices[i]+"\t "+praiseSums[i]);
    }
    //提示用户输入需要点赞的菜品序号
    System.out.print("请输入您要点赞的菜品序号:");
    int praiseId = scanner.nextInt() - 1;
    //判断序号是否在范围内
    if(praiseId < 0 || praiseId >= dishNames.length){
        System.out.println("菜品序号不存在!");
    }else{
        //点赞数+1
        praiseSums[praiseId]++;
    }
    break;

3.9 “我要订餐”功能

3.9.1 整体框架

//choose为1时进入点餐功能
case 1:
    System.out.println("-----------------我要订餐-----------------");
    //利用for循环加if语句判断是否有空余的订单位置并选中该位置
    for (int i = 0; i < usrNames.length; i++) {
        if(usrNames[i] == null){
            //找到空余,将判断状态为设置为true
            isAdd = true;
            //...
            //订餐操作
            //...
            //订餐完成后用break语句退出循环
            break;
        }
    }
    if(!isAdd){
        System.out.println("您的订单已满,请删除已完成订单后再继续订餐!");
    }
    break;

3.9.2 订餐操作代码

System.out.print("请输入订餐人姓名:");
usrNames[i] = scanner.next();
for (int j = 0; j < dishNames.length; j++) {
System.out.println((j+1)+"\t\t"+dishNames[j]+"\t\t"+dishPrices[j]+"\t "+praiseSums[j]);
}
System.out.print("输入您要点餐的菜品序号:");
int dishId = scanner.nextInt()-1;
//对菜品序号的验证
while(dishId >= dishNames.length){
    System.out.print("您输入的菜品序号有误,请重新输入:");
    dishId = scanner.nextInt()-1;
}
System.out.print("输入您要点的份数:");
int NUM = scanner.nextInt();
orderMegs[i] = dishNames[dishId]+" "+NUM+"份";
//计算菜品总价
double sum = dishPrices[dishId]*NUM;
//使用三目运算符判断当菜品价格大于50时需要6元配送费
int deliverPrice = (sum>50)?6:0;
//订单总价
sumPrices[i] = sum + deliverPrice;
System.out.print("请输入送餐时间(10点到20点整):");
deliverTimes[i] = scanner.nextInt();
//对送餐时间的验证
while(deliverTimes[i] < 10 || deliverTimes[i] > 20){
    System.out.print("请输入正确的送餐时间:");
    deliverTimes[i] = scanner.nextInt();
}
System.out.print("请输入送餐地址:");
addresses[i] = scanner.next();
System.out.println("订餐成功");
System.out.println("您订的是:"+orderMegs[i]);
System.out.println("送餐时间是:"+deliverTimes[i]);
System.out.println("餐费:"+sum+"元,送餐费:"+deliverPrice+"元,总计:"+sumPrices[i]+"元。");

4.总结   

        这是接触到的第一个较复杂的项目实战案例,运用到了之前所学的几乎所有知识,了解了做项目的流程以及分析的思路,把握“先分析,再写代码”的思想。

收获:
        在设置变量名称的时候具有一定的规范,需要特别注意;在测试程序时,应当考虑到所有情况,以确认程序的绝对正确性;在编写代码时,要从整体入手,先搭建好框架,然后分模块完成并测试,最后再整体测试,不能写完一大段再一起测试;灵活应用debug工具能快速找到错误出现在什么位置。

感想:
        在实现验证功能时,以目前学习到的技术还无法严密地进行控制,依然还有很多知识点需要掌握;目前还是java学习的入门阶段,要打好基础,多思考更多的可能性,多从逻辑上严谨地判断代码是否合格,让逻辑思维和debug共同对编写的代码进行调试,尽可能在编写代码时就考虑全面,少出错。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值