学习jav的第十六天,吃货联盟订餐系统

一、前言

  • 诶,不知不觉就两天过去了,昨天没有发布是因为一直在做这个系统,说实话,自己的基础水平还是不够稳定,既然花了两天时间才能写出来,期间也遇到了不少难题,但是都是通过百度的方法解决了!
  • 聊一下这个系统吧,为了满足广大用户的不出户做的外卖订单系统,说白了就是书上的那个案例,要做的其实挺多的,而且书上的bug也是一大堆,我也懒得去缝缝补补了,比如非法输入的等等问题!

二、实现思路

  1. 首先创建了一个数组类,用来存放数组的!
  2. 然后创建了一个输出类,用于客户在前台输出的!
  3. 再然后是创建了一个功能类,用于实现多个功能
  • 关于数组类,我用到了继承关系,并没有用到对象,extends关键词,因为我在第一天的时候,那时候的思路是每个功能存放在不同的类中,后来用了半天的时间,去想怎么通过类对象之间,去控制数组类中的元素,但是我发现,一旦切换了方法,对象那边就会重新刷新里面的元素,说白了就是清零,回归默认,所以最终放弃了这个念头,也可能是我的水平不够,无法完成类之间的数组调配。
  • 输出类,完全就是实例化了功能类的主页面的方法,直接调用的是功能类中的首页类!
  • 功能类,里面也是最复杂的,原本不想复杂的,但是不得不复杂了,里边包含有了几个方法
  1. 初始化方法ces();
  2. 首页方法Menu();
  3. 订餐的功能one();
  4. 查看订单的功能Bag2();
  5. 签收订单的功能 Sigo3();
  6. 删除订单的功能Del4();
  7. 给菜品点赞的功能Fab5();
  • 下面,我就来上代码演示一下,欢迎大神多多指导!小白很多不懂的地方!

三、实现代码

1、数组类ArrayData

public class ArrayData {
    //数据主题,一组订单的信息,最多4组!
    int[] Xuhaos = {1,2,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]; //保存订单的总金额

    //供选择的菜品信息!
    String[] dishNames = {"红烧鱼肉","宫保鸡丁","梅菜扣肉","糖醋排骨","空心菜","红烧猪蹄"};
    double[] prices = {30,20,25,40,20,50};  //价格
    int[] praiseName = new int[6];  //点赞数

}

2、输出类Output

public class Output {
    public static void main(String[] args) {
        //输出主页面菜单
        Homepage homepage = new Homepage();  //实例化主类
        homepage.Menu();
    }
}

3、功能类Homepage

package com.actual.foodie;

import java.util.Scanner;

public class Homepage extends ArrayData {  //这是继承了父类的属性,也就是可以随意的调用以及修改父类的属性值!关键字是extends
    Scanner scanner = new Scanner(System.in);

    // 创建一个初始化数组方法
    public void ces() {
        //初始化一条信息

        names[0] = "李小帅";
        dishMegs[0] = "红烧猪蹄 2份";
        times[0] = 10;
        addresses[0] = "广西南宁西乡塘区101号";
        states[0] = 0;
        sumPrices[0] = 100;

        names[1] = "李二帅";
        dishMegs[1] = "红烧猪蹄 2份";
        times[1] = 10;
        addresses[1] = "广西南宁西乡塘区101号";
        states[1] = 1;
        sumPrices[1] = 10;

    }

    //输出菜单,首页方法
    public void Menu() {
        ces();  //给父类的数组进行初始化以及设置默认值
        int sum = -1;  //用来判断用户输入的是否为0,为0则退出
        boolean IsExit = false;     //默认是false
        do {   //展示首页信息
            System.out.println("\t\t\t\t欢迎使用“吃货联盟订餐系统”");
            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 input = scanner.nextInt();  //这里提供选择内容
            switch (input) {
                case 1:
                    System.out.println("----------------------1、我要订餐----------------------");
                    one();  //跳转功能1,订餐
                    break;
                case 2:
                    System.out.println("----------------------2、查看福袋----------------------");
                    Bag2();  //跳转功能2,查看
                    break;
                case 3:
                    System.out.println("----------------------3、签收订单----------------------");
                    Sigo3();  //跳转功能3,签收
                    break;
                case 4:
                    System.out.println("----------------------4、删除订单----------------------");
                    Del4();  //跳转功能4,删除
                    break;
                case 5:
                    System.out.println("----------------------5、我要点赞----------------------");
                    Fab5();  //跳转功能5 ,点赞
                    break;
                case 6:
                    IsExit = true;  //输入6退出
                    break;
                default:
                    IsExit = true;  //输入其他默认退出
                    break;
            }
            if (!IsExit) {  //如果为真
                System.out.println("输入0返回!");
                sum = scanner.nextInt();  //获取用户输入
            } else {
                break;
            }
        } while (sum == 0);  //条件是输入0回到首页就行循环

    }

    //1、我要点餐

        boolean isAdd = false;  //判断是否可以订餐,默认否

        public void one() {  //创建一个无参构造
            Scanner Sone = new Scanner(System.in);  //创建扫描器
            for (int i = 0; i < names.length; i++) { //如果i的长度小于数组长度,则自增

                if (names[i] == null) { //如果数组中nemes的第i个下标,等于空值
                    boolean isAdd = true;  //则可以进行订餐
                    System.out.println("请输入订餐人姓名:");
                    String Sname = Sone.nextLine();//读取客户输入的姓名
                    //显示 菜单信息
                    System.out.println("序号\t\t" + "菜名\t\t\t" + "单价\t\t\t" + "点赞数\t");
                    for (int j = 0; j < dishNames.length; j++) { //遍历菜品信息
                        String prices2 = prices[j] + "元";   //在每个初始价格后面+元字
                        String Dian = (praiseName[j]) > 0 ? praiseName[j] + "赞" : "0";  //在每个初始点赞数加上三元运算符
                            //输出菜品信息
                        System.out.println((j + 1) + "\t\t" + dishNames[j] + "\t\t" + prices2 + "\t\t" +
                                Dian);
                    }
                    System.out.println("请输入您要点的菜品编号:");
                    int number = Sone.nextInt();   //菜品的编号
                    System.out.println("请输入您要点的份数:");
                    int quantity = Sone.nextInt();   //点菜的份数
                    String NumQuan = dishNames[number - 1] + quantity + "份";  //结合菜品+数量
                    double money = prices[number - 1] * quantity;  //获取商品的价格
                    double Frei = money >= 50 ? 0 : 5;       //如果总价格大于或者等于50,则Frei为0,否则等于5元派送费!
                    double sum = money + Frei;   //总价格
                    System.out.println("商家采取整点配餐方法,请输入您的整点配送时间(10~20内):");
                    int time = Sone.nextInt();  //用户输入的配送时间
                    while (time < 10 || time > 20) {   //不断循环判断,如果不等于10 - 20,会一直提示错误
                        System.out.println("您输入的时间有误!请输入10~20之间的整数!");
                        time = Sone.nextInt();   //  提示输入配送时间,获取用户输入的值!
                    }

                    System.out.println("请输入您的配送地址:");
                    String add2 = Sone.next(); //用户输入的送餐地址
                    while (add2 == null) {  //如果地址为空,则无限循环!
                        System.out.println("您输入的字符有误,请重新输入!");
                        add2 = Sone.nextLine();  //返回获取地址

                    }
                    System.out.println("-----------------------等待支付------------------------");
                    System.out.println("订餐成功!");
                    System.out.println("您订购的是:" + NumQuan);
                    System.out.println("您的派送地址是:" + add2);
                    System.out.println("您的配送时间是:" + time + "点整");
                    System.out.println("您的餐费是:" + money + "\t您的派送费是:" + Frei + "元" + "\t总共:" + sum + "元");


                    //添加数据到数组中!
                    Xuhaos[i] = i + 1;
                    names[i] = Sname;
                    dishMegs[i] = NumQuan;
                    times[i] = time;
                    addresses[i] = add2;
                    sumPrices[i] = sum;
                    break;
                }
                if (i == names.length - 1) {  //如果i等于names-1的长度,则提示满了,不能继续购买,也就是3,长度为3所以不会溢出,长度4那下标就到5了
                    System.out.println("目前订单已爆满哦,您已无法继续下单哦!");
                }
            }

    }


    //2、查看福袋
    public void Bag2() {
            //输出订单信息
        System.out.println("序号" + "\t\t" + "订餐人" + "\t\t" + "商品信息" + "\t\t" + "送餐时间" +
                "\t\t" + "送餐地址" + "\t\t\t" + "总金额" + "\t\t" + "订单状态");
        for (int i = 0; i < names.length; i++) {  //如果i小于name的长度,则循环
            if (names[i] != null) {  //遍历条件,如果names数组的i,不等于空
                String state = (states[i] != 0) ? "已完成" : "已预订";  //则订单状态,0等于已完成,1等于已预订
                String time = times[i] + "点"; //送餐时间
                String monay = sumPrices[i] + "元";  //价格
                System.out.println((Xuhaos[i]) + "\t\t" + names[i] + "\t\t" + dishMegs[i]
                        + "\t" + time + "\t" + addresses[i] + "\t" + monay + "\t\t" + state);
            }
        }

    }

    //3、签收订单

    public void Sigo3() {
        boolean a = false;  //初始a等于false
        Bag2();   //显示所有订单信息,调用方法Bag2
        System.out.println("请输入您需要签收的订单序号:");
        int Xuhao = scanner.nextInt();  //输入序号
        for (int i = 0; i < names.length; i++) {  //遍历数组
            if (Xuhao <= names.length && Xuhao > 0) {  //如果输入的序号小于或者等于数组的程度 以及 序号大于0才执行以下
                if (states[Xuhao - 1] != 1) {     //如果订单状态 用户输入的序号-1的数组下标,如2则1,不等于1(1表示已预订)
                    System.out.println("您确认需要签收吗?y/n");
                    String yes = scanner.next();  //确认签收
                    if (yes.equals("y")) {
                        states[Xuhao - 1] = 1;  //输入后客户输入的序号-1则等于已确认签收    如果是序号5,则找到下标为4的序号!
                        System.out.println("您已签收完毕!");
                        break;
                    } else {
                        if (yes.equals("n")) {  //输入n取消签收
                            System.out.println("已取消签收");
                            break;
                        }
                    }
                } else {  //如果选择的序号的订单状态为1  则提示已经签收完成!
                    System.out.println("您的订单已签收完成,无需再次签收!");
                    break;
                }

            }
        }

    }


    //4、删除订单

    public void Del4() {
        Bag2();   //遍历所有的订单信息
        System.out.println("请输入您需要删除的订单序号:");
        int delete = scanner.nextInt(); //获取用户输入的序号
        for (int i = delete - 1; i < states.length; i++) { // i等于输入的序号减1,如果是序号2,那下标就是1!
            if (states[i] == 0) {  //判断当前循环states数组的i是否为0,如果是0,无法删除,需要签收!
                System.out.println("-----------------------------------签收明细------------------------------------");
                System.out.println("当前状态为已预订,无法删除,请先签收订单再删除!");
                Sigo3();  //返回到签收方法
                break;
            }
            //如果不等于0,那执行以下代码 j = 输入的数目减1,j如果小于4-3的长度,那就是长度3!
            for (int j = delete - 1; j < Xuhaos.length - 1; j++) {
                Xuhaos[j] = Xuhaos[j + 1];   //当前长度的数组下标+1,如果是下标为2的,则将这个数值代替到下标为1的位置!
                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];
            }
            int[] X = {1, 2, 3, 4};  //这里是重新给序号赋值了,想了半天没想到更替序号的办法,所以只能赋值了!
            Xuhaos = X;
            int Qing = Xuhaos.length - 1;  //这里是将数组元素的最后一个下标清空数值!
            Xuhaos[Qing] = 0;
            names[Qing] = null;
            dishMegs[Qing] = null;
            times[Qing] = 0;
            addresses[Qing] = null;
            states[Qing] = 0;
            sumPrices[Qing] = 0;
            System.out.println("删除完毕!");  //提示删除完毕
            return;
        }
    }
        //5、点赞系统
    public void Fab5() {
        //显示 菜单信息
        System.out.println("序号\t\t" + "菜名\t\t\t" + "单价\t\t\t" + "点赞数\t");
        for (int j = 0; j < dishNames.length; j++) {
            String prices2 = prices[j] + "元";
            String Dian = (praiseName[j]) > 0 ? praiseName[j] + "赞" : "0";
            System.out.println((j + 1) + "\t\t" + dishNames[j] + "\t\t" + prices2 + "\t\t" +
                    Dian);
        }
        for (int i = 0; i < dishNames.length+1; i++) {  //这里是菜品的长度+1,也就是为7!防止内存溢出
            System.out.println("请输入您要点赞的菜品序号:");
            int Zan = scanner.nextInt();
            if (Zan==0||Zan>6){  //不允许用户输入0或者大于6的数值
                System.out.println("输入有误!请重新输入!");
                Fab5();
                break;
            }
            for (int x = 0; x < dishNames.length+1; x++) {  //这里也是进行了+1的操作,防止内存溢出
                if (Zan == x){  //如果用户输入的数 等于x
                    //这里x-1是因为取值的是内存!所以需要减一才能匹配输入的数值
                    System.out.println("您要点赞的序号是:"+x+"号菜品,菜品是:"+dishNames[x-1]);
                    System.out.println("请输入您要点赞的数量:");
                    int noe = scanner.nextInt(); //点赞的数量
                    //这里采用的noe是用户输入的,后面的是当前数组中的赞
                   praiseName[x-1] = noe+praiseName[x-1]; //数据存放到数组中

                    System.out.println("点赞成功!感谢您的使用!继续点赞请按1,返回主页请按2");
                    //这里判断是否继续!
                    int Jx = scanner.nextInt();
                    switch (Jx){
                        case 1 :
                            Fab5();
                            break;
                        case 2:
                            Menu();
                            break;
                    }
                }
            }
        }

    }
}

四、总结

  • 1、其实说白了,这个代码的bug很多,不过比书上的好一点,我自己都懒得缝缝补补,自己加几个if判断就可以了,因为来看到目前这段话的,也肯定是不会抛出异常的,只能说避免bug,要彻底解决,还需要点时间!
  • 2、 通过这次实战,也让我明白了自己的基础知识有多不稳定,连数组的删除那一段都是挺勉强的,让我最无解的还是不同类调用对象的数组时如何做到同时改动,这个还是等后面学习才能慢慢理解了!
  • 3、代码使用了继承,因为我怕使用对象出现的问题可能会多点,而且代码量也会增多,当然这里也还没使用封装,安全性还是低了点(其实是我运用不熟练)!
  • 4、 有一个地方需要注意,就是继承父类的时候,子类跟父类的属性一定要一致,比如子类使用了static修饰符,那就无法继承父类的属性了,父类的也同理!包括同类中的方法也是,如果使用了static静态修饰符,那么就无法方法非静态的方法了!
  • 5、再需要注意的便是注意数组的内存溢出问题!然后就没有其他的了,好好加油吧!!! 相信自己,能自己手打,就自己手打!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值