10、Java——吃货联盟订餐系统(基础知识)

简介: 10、Java——吃货联盟订餐系统(基础知识)

项目需求


   (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("谢谢使用,欢迎下次光临");
  }
}


效果展示



 1.gif


1.gif


相关文章
|
4月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
37 1
|
4月前
|
小程序 Java 关系型数据库
基于Java微信小程序校园订餐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java微信小程序校园订餐系统设计和实现(源码+LW+调试文档+讲解等)
|
5月前
|
Java 调度 开发者
Java中的多线程编程:基础知识与实践
【5月更文挑战第29天】 在现代软件开发中,多线程编程是一个不可忽视的领域。特别是在Java这种广泛使用的编程语言中,掌握多线程的概念和技术对于开发高效、响应迅速的应用程序至关重要。本文将深入探讨Java多线程的核心概念、实现机制以及常见问题的解决方案。我们将从基础出发,逐步揭示如何通过多线程提升程序性能,并且讨论并发编程中的挑战和解决策略。文章的目的是为开发者提供一个清晰的多线程编程指南,帮助他们在实际项目中有效地应用这些知识。
34 3
|
5月前
|
Java 开发者
Java中的多线程编程:基础知识与实践
【5月更文挑战第26天】 在现代计算机科学中,多线程编程是一个复杂且强大的概念。Java作为一种广泛使用的编程语言,其对多线程的支持使得开发者能够创建出更为复杂、高效和响应迅速的应用程序。本文将深入探讨Java中的多线程编程,从基础概念到实际编程技巧,为读者提供全面的理解和实践指导。
|
5月前
|
监控 IDE Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第30天】 在现代软件开发中,多线程编程是提高应用程序性能和响应能力的关键。特别是在Java这样的多平台、多用途的编程语言中,掌握多线程技术至关重要。本文旨在为读者提供有关Java多线程编程的全面介绍,从基本概念到高级应用技巧,帮助初学者和有经验的开发者理解并有效使用多线程。文章不仅涉及基础理论,还包括代码示例和最佳实践,确保读者能够将知识应用于实际项目中。
|
5月前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第28天】 在现代计算机科学中,多线程编程是一个重要的概念,它允许程序同时执行多个任务。在Java中,多线程编程是通过创建并管理线程来实现的。本文将介绍Java中多线程编程的基础知识,包括线程的概念、创建和控制线程的方法,以及线程同步和通信的相关技术。通过阅读本文,读者将对Java中的多线程编程有一个全面的了解,并能在实际编程中应用这些知识。
|
5月前
|
安全 Java 数据安全/隐私保护
Java中的多线程编程:基础知识与实践
【5月更文挑战第24天】 在现代软件开发中,多线程编程是提升应用性能和响应速度的关键技术之一。Java 作为一种广泛使用的编程语言,其内置的多线程功能为开发者提供了强大的并发处理能力。本文将深入探讨 Java 多线程的基础概念、实现机制以及在实际开发中的应用。我们将从线程的创建和管理出发,逐步讲解同步机制、死锁问题以及如何利用高级并发工具有效地构建稳定、高效的多线程应用。通过理论结合实例的方式,旨在帮助读者掌握 Java 多线程编程的核心技能,并在实际项目中灵活运用。
|
5月前
|
安全 Java
Java基础知识面试总结(全面,实时更新)
Java基础知识面试总结(全面,实时更新)
|
5月前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第19天】多线程编程是Java中的一个重要概念,它允许程序员在同一时间执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动和管理,以及如何通过多线程提高程序的性能和响应性。
|
5月前
|
Java
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结