Java【吃货联盟】实战案例

2023-10-29 15:40
文章标签 java 实战 案例 联盟 吃货

本文主要是介绍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返回主页面//验证用户是否输入了0while(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){//找到了该订单,状态为调为trueisSignFind = 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){//将判断状态为设置为trueisDelFind = 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{//点赞数+1praiseSums[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){//找到空余,将判断状态为设置为trueisAdd = 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共同对编写的代码进行调试,尽可能在编写代码时就考虑全面,少出错。

这篇关于Java【吃货联盟】实战案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301637

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、