11、Java——吃货联盟订餐系统(对象+数组)

简介: 11、Java——吃货联盟订餐系统(对象+数组)

⛳️项目需求


   (1)现今已经进入网络时代,人们的日常生活已经离不开网络,如网上购物、看新闻、交友等。

   (2)“只要点点手指,就能送餐上门”,网上订餐越来越受到都市年轻人的青睐。

   (3)现要求开发一个网上订餐系统,需要实现我要订餐、查看餐袋、签收订单、删除订单、我要点赞和退出系统6个功能。

⛳️项目环境准备


   (1)开发工具:MyEclipse,JDK1.7。

   (2)开发语言:Java。

⛳️案例覆盖的技能点


   (1)理解程序基本概念——程序、变量、数据类型。

   (2)会使用顺序、选择、循环、跳转语句编写程序。

   (3)会使用数组。

   (4)了解类、对象、方法、私有变量等相关知识。


⛳️难点分析


  ❤️1、 使用数组对象保存订单信息

       (1)根据本项目的需求分析可知,每条订单的信息都包括订餐人姓名、选择菜品及份数、送餐时间、送餐地址、订单状态、总金额,并且会有多条订单信息,可以定义一个Order类,在Order类中将订单的各个信息设置为私有属性,再添加这些属性的有参构造方法以及Get/Set方法。


private String name;
  private String dishMeg;
  private int time;
  private String address;
  private int state;
  private double sumPrices;
  public Order() {
  super();
  }
  public Order(String name, String dishMeg, int time, String address,
    int state, double sumPrices) {
  super();
  this.name = name;
  this.dishMeg = dishMeg;
  this.time = time;
  this.address = address;
  this.state = state;
  this.sumPrices = sumPrices;
  }
   //添加私有变量的Get/Set方法

       (2)该系统最多接收4条订单,定义一个长度为4的Order[]数组;

                       Order[] orders = new Order[4];      

       (3)初始化两条订单信息,并存入order[]数组中;

           该系统最多接收4条订单。

               orders[0] = new Order("张三", "红烧带鱼 2份", 12, "天成路207号", 1, 76.0);

               orders[1] = new Order("李四", "鱼香肉丝 2份", 12, "天成路207号", 0, 45.0);

   ❤️2、访问订单信息

       访问Order[]数组中第i+1条订单信息可采用如下方式

       订餐人姓名:orders[i].getName()

       所选菜品信息:orders[i].getDishMeg()

       送餐时间:orders[i].getTime()

       送餐地址:orders[i].getAddress()

       订单状态:orders[i].getState()

       订单的总金额:orders[i].getSumPrices()

   ❤️3、 删除订单信息

       若Order[]数组中下标为delID的元素需删除,后面的数据则依次前移一位,即后一位的数据覆盖前一位的数据,可采用如下方式实现:


 

if (orders[i] != null) {
    if (orders[i].getState() == 0) {
    System.out.println("该订单仍在预定状态,不能删除!");
    break;
    } else {
    for (int j = i; j < orders.length - 1; j++) {
      if(orders[j + 1]!=null){
      orders[j].setName(orders[j + 1].getName());
      orders[j].setDishMeg(orders[j + 1].getDishMeg());
      orders[j].setTime(orders[j + 1].getTime());
      orders[j].setAddress(orders[j + 1].getAddress());
      orders[j].setSumPrices(orders[j + 1].getSumPrices());
      orders[j].setState(orders[j + 1].getState());
      }
      else{
      orders[j]=null;
      break;
      }
    }
    System.out.println("订单删除成功!");
    }
  }


   ❤️4、 计算订单的总金额

         // 总金额 =菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。

double caiPrices = foods[caiNum - 1].getPrice() * fenNum;
          if (caiPrices < 50) {
          caiPrices = caiPrices + 5;
               // orders[i].setSumPrices(caiPrices);
          }

⛳️项目实现思路


  ❤️1、 数据初始化

(1)创建订单类:Order类

       订单属性信息有(加private封装):订餐人姓名(name)、选择菜品信息(dishMeg)、送餐时间(time)、送餐地址(address)、订单状态(state)、总金额(sumPrices)。


(2)创建菜品类:Food类

       订单属性信息有(加private封装):菜品名称(disName)、菜品单价(price)、点赞数(praiseNum)。


(3)创建数组

   


(4)添加初始化数据

// 初始化两条订单Order信息,并存入数组中
        orders[0] = new Order("张三", "红烧带鱼 2份", 12, "天成路207号", 1, 76.0);
        orders[1] = new Order("李四", "鱼香肉丝 2份", 12, "天成路207号", 0, 45.0);
        // 供选择的菜品信息
        foods[0] = new Food("红烧带鱼", 38.0, 0);
        foods[1] = new Food("鱼香肉丝", 20.0, 0);
        foods[2] = new Food("时令鲜蔬", 10.0, 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。

         


⛳️部分代码展示

   ❤️1、订单信息:Order类(全部代码)

package cn.bdqn.demo01;
//定义一个订单类
public class Order {
  private String name;
  private String dishMeg;
  private int time;
  private String address;
  private int state;
  private double sumPrices;
  public Order() {
  super();
  }
  public Order(String name, String dishMeg, int time, String address,
    int state, double sumPrices) {
  super();
  this.name = name;
  this.dishMeg = dishMeg;
  this.time = time;
  this.address = address;
  this.state = state;
  this.sumPrices = sumPrices;
  }
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public String getDishMeg() {
  return dishMeg;
  }
  public void setDishMeg(String dishMeg) {
  this.dishMeg = dishMeg;
  }
  public int getTime() {
  return time;
  }
  public void setTime(int time) {
  this.time = time;
  }
  public String getAddress() {
  return address;
  }
  public void setAddress(String address) {
  this.address = address;
  }
  public int getState() {
  return state;
  }
  public void setState(int state) {
  this.state = state;
  }
  public double getSumPrices() {
  return sumPrices;
  }
  public void setSumPrices(double sumPrices) {
  this.sumPrices = sumPrices;
  }
}

   ❤️2、菜品:Food类(部分代码)

       逻辑部分参照吃货联盟订餐系统的逻辑改写即可

package cn.bdqn.demo01;
import java.util.Scanner;
//定义菜品类
public class Food {
  static Scanner input = new Scanner(System.in);
  private String disName;
  private double price;
  private int praiseNum;
  public Food() {
  super();
  }
  public Food(String disName, double price, int praiseNum) {
  super();
  this.disName = disName;
  this.price = price;
  this.praiseNum = praiseNum;
  }
  public String getDisName() {
  return disName;
  }
  public void setDisName(String disName) {
  this.disName = disName;
  }
  public double getPrice() {
  return price;
  }
  public void setPrice(double price) {
  this.price = price;
  }
  public int getPraiseNum() {
  return praiseNum;
  }
  public void setPraiseNum(int praiseNum) {
  this.praiseNum = praiseNum;
  }
}

   ❤️3、订餐系统:OrderSystem类(全部代码)

package cn.bdqn.demo01;
import java.util.Scanner;
public class OrderSystem {
  public static void main(String[] args) {
  Scanner input = new Scanner(System.in);
  // 初始化Order数组
  Order[] orders = new Order[4];
  // 初始化Food数组
  Food[] foods = new Food[3];
  // 初始化两条订单Order信息,并存入数组中
  orders[0] = new Order("张三", "红烧带鱼 2份", 12, "天成路207号", 1, 76.0);
  orders[1] = new Order("李四", "鱼香肉丝 2份", 12, "天成路207号", 0, 45.0);
  // 供选择的菜品信息
  foods[0] = new Food("红烧带鱼", 38.0, 0);
  foods[1] = new Food("鱼香肉丝", 20.0, 0);
  foods[2] = new Food("时令鲜蔬", 10.0, 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:
    // 我要订餐
    Food.myOrder(orders, foods);
    break;
    case 2:
    // 查看餐袋
    Food.lookOrder(orders);
    break;
    case 3:
    // 签收订单
    Food.signOrder(orders);
    break;
    case 4:
    // 删除订单
    Food.delOrder(orders);
    break;
    case 5:
    // 我要点赞
    Food.myLike(orders, foods);
    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("谢谢使用,欢迎下次光临");
  }
}



 


相关文章
|
16天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
16 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
1天前
|
存储 算法 Java
Java一分钟之-数组的创建与遍历
数组作为Java中存储和操作一组相同类型数据的基本结构,其创建和遍历是编程基础中的基础。通过不同的创建方式,可以根据实际需求灵活地初始化数组。而选择合适的遍历方法,则可以提高代码的可读性和效率。掌握这些基本技能,对于深入学习Java乃至其他编程语言的数据结构和算法都是至关重要的。
15 6
|
1天前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
7 0
深入理解java对象的访问定位
|
1天前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
6 0
深入理解java对象的内存布局
|
1天前
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
5 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
|
8天前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
|
17天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
26 10
|
22天前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
|
20天前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
|
22天前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
266 4