基于java控制台界面的饮料售货机系统设计

2023-10-10 06:59

本文主要是介绍基于java控制台界面的饮料售货机系统设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

下面所有代码存在纰漏与不完善处,欢迎指导与批评。

1选题

1.选题名称 

饮料售货机系统

2.选题描述

本系统除用户管理、登录和一键注册功能外,还设计了账户余额查询、账户充值、购买、升级会员4个业务模块。

2系统功能说明

2.1 系统功能模块

系统的主要角色为用户和管理员模块。

2.2 主要模块功能说明

用户:一键注册、登录、查询账单、消费、充值、注册会员。

管理员:补全货物、查看用户名字和上次登录时间、查看购买记录。

3数据结构设计

3.1  IO流读写数据结构及其基本操作(含数据查找和排序,要求每个数据结构采用不同的排序算法)

 

 

如图所示,本系统的service.IO.getWholeText()方法使用了java.io.BufferedReader的方法,其底层算法采用字符缓冲和编码表的数据结构,以完成一次文件的数据读取。

3.2购买饮料数据结构及其基本操作(含数据查找和排序,要求每个数据结构采用不同的排序算法)

/**

     * 购买1name商品

     * @param name

     * @return int -2:余额不足 -1:缺货  1:成功  0:查无商品

     */

    public static int buy(String name) {

        for(int i=0; i<10; i++) {

            if(Storge.nameList[i].equals(name)) {

                if(Integer.parseInt(Storge.shelf[i]) <= 0) {

                    return -1;

                }

                else {

                    if(Storge.vip[User.userNo].equals("会员")) {

                        if(Double.parseDouble(Storge.balance[User.userNo]) < Double.parseDouble(Storge.priceList[i])*Storge.discount4Vip) {

                            return -2;

                        }

                        else {

                            Storge.shelf[i] = String.valueOf(Integer.parseInt(Storge.shelf[i]) - 1);

                            Storge.balance[User.userNo] = String.valueOf((Double.parseDouble(Storge.balance[userNo]) - Double.parseDouble(Storge.priceList[i])*Storge.discount4Vip));

                            return 1;

                        }

                    }

                    else {

                        if(Double.parseDouble(Storge.balance[User.userNo]) < Double.parseDouble(Storge.priceList[i])) {

                            return -2;

                        }

                        else {

                            Storge.shelf[i] = String.valueOf(Integer.parseInt(Storge.shelf[i]) - 1);

                            Storge.balance[User.userNo] = String.valueOf((Double.parseDouble(Storge.balance[userNo]) - Double.parseDouble(Storge.priceList[i])));

                            return 1;

                        }

                    }

                }

            }

        }

        return 0;

}

如上所示采用线性表结构读列表内容。

3. IO流读写数据结构的测试情况

// 测试源码

// 测试结果

4数据的文件存储

本地存储

File file = new File(bundlePath);

out_Server(nameList, measurementList, netWtList, priceList, shelf);

        out_History(history);

        out_User(user);

5业务层设计

5.1 用户一键注册及登录

public static void in_User() {

        String[] list = input(System.getProperty("user.dir") + "\\User.ini");

       

        int arr1 = 0, arr2 = 0, arr3 = 0, arr4 = 0, arr5 = 0;

        // i: user组号 j: user序号  k: list序号

        for(int i = 0, j = 0, k = 1; k<list.length && list[k]!=null; k++, j++) {

            if(!list[k].equals("   ")) {

                if(k%6==1 && k!=1) {

                    i++;

                    j=0;

                }

                user[i][j] = list[k];

            }

        }

        for(int i = 0; i < list.length; i++) {

                if(i%6 == 1) {

                    userName[arr1] = list[i];

                    arr1++;

                }

                else if(i%6 == 2) {

                    balance[arr2] = list[i];

                    arr2++;

                }

                else if(i%6 == 3) {

                    vip[arr3] = list[i];

                    arr3++;

                }

                else if(i%6 == 4) {

                    favorBeverage[arr4] = list[i];

                    arr4++;

                }

                else if(i%6 == 5) {

                    lastTime[arr5] = list[i];

                    arr5++;

                }

            }

        }

5.2查询账单

public static void in_History() {

       

        String[] list = input(System.getProperty("user.dir") + "\\History.ini");

       

        for(int i=0, j=0, k=0;k<list.length && list[k]!=null; k++) {

            if(!list[k].equals("   ") && !list[k].equals("History")) {

                history[i][j] = list[k];

                j++;

            }

            else if(list[k].equals("   ")) {

                i++;

                j=0;

            }

        }

    }

5.3消费

public static void writeDefaultBeverage() {

        // 饮料信息

        String[] defaultNameList =

        {"可口可乐汽水","百事可乐汽水","雪碧汽水","芬达橙味汽水","怡泉苏打水",

         "红牛维生素功能饮料","维他柠檬茶","维他原味豆奶","屈臣氏苏打水","果倍爽浓缩果汁"};

        String[] defaultMeasurementList = {"","","","","","","","","",""};

        String[] defaultNetWtList = {"330ml","330ml","330ml","330ml","400ml","250ml","250ml","250ml","330ml","200ml"};

        String[] defaultPriceList = {"3","3","3","3","4","5","2.5","2.5","4","3.5"};

        // 货架信息

        String[] totalShelf = {"10","12","12","8","8","6","12","16","10","10"};

        out_Server(defaultNameList,defaultMeasurementList,defaultNetWtList,defaultPriceList,totalShelf);

    }

5.* 业务逻辑模块的测试情况

public class Main {

    // 主方法

    public static void main(String[] args) {

        // 初始化

        service.Storge.initialize();

        // 运行

        run();

    }

6界面设计

if (eventName.equals("login")) {

            print("欢迎使用饮料售货机系统!请输入对应数字进行操作:\n[1] 用户登陆\n[2] 管理员登陆\n[3] 退出");

            try {

                switch (service.Present.scanInt()) {

                case 1:

                    event("userCheck");

                    break;

                case 2:

                  print("请输入管理员账号");

                  Scanner reader=new Scanner(System.in);

                  String x=reader.nextLine();

                  if(x.equals("admin")) {

                        event("adminMain");

                  }

                  else {

                      print("用户名不正确,系统自动退出");

                      event("exit");

                      break;

                  }

                case 3:

                    event("exit");

                    break;

                default:

                    print("输入错误,请重新输入!");

                    Present.threadSleep(1000);

                    event("login");

                    break;

                }

            } catch (Exception e) {

                print("输入错误,请重新输入!");

                Present.threadSleep(1000);

                event("login");

            }

        } else if (eventName.equals("userCheck")) {

            print("提示:如不存在该用户名则自动建立账号,输入\"返回\"\"return\"返回登陆界面,用户名不能存在特殊字符和空格。\n请输入用户名:");

            String name = service.Present.scanString();

            if (name.equals("返回") || name.equals("return")) {

                event("login");

            } else if (!User.matchRule(name)) {

                print("用户名不符合规范,请重新输入");

                Present.threadSleep(1000);

                event("userCheck");

            } else if (User.existName(name) == true) {

                User.userName = name;

                User.userNo = User.getNo(name);

                event("userMain");

            } else {

                print("正在为您注册新用户。");

                Present.threadSleep(100);

                User.userName = name;

                User.userNo = User.getNo(name);

                User.addUser(name);

                event("userMain");

            }

        } else if (eventName.equals("adminMain")) {

            print("欢迎您,管理员!请输入对应数字进行操作:\n[1] 补全货物\n[2] 查看所有用户详细信息\n[3] 查看购买历史记录\n[4] 返回登陆界面\n[5] 退出");

            try {

                switch (service.Present.scanInt()) {

                case 1:

                    event("fillGoods");

                    break;

                case 2:

                    event("getUser");

                    break;

                case 3:

                    event("getHistory");

                    break;

                case 4:

                    event("login");

                    break;

                case 5:

                    event("exit");

                    break;

                default:

                    print("输入错误,请重新输入!");

                    Present.threadSleep(1000);

                    event("adminMain");

                    break;

                }

            } catch (Exception e) {

                print("输入错误,请重新输入!");

                Present.threadSleep(1000);

                event("adminMain");

            }

        } else if (eventName.equals("userMain")) {

            print("欢迎您," + Storge.vip[User.userNo] + "用户" + User.userName

                    + "!请输入对应数字进行操作:\n[1] 余额查询 \n[2] 账户充值\n[3] 购买\n[4] 会员中心\n[5] 切换用户\n[6] 退出");

            try {

                switch (service.Present.scanInt()) {

                case 1:

                    event("balance");

                    break;

                case 2:

                    event("charge");

                    break;

                case 3:

                    event("buy");

                    break;

                case 4:

                    event("vip");

                    break;

                case 5:

                    event("login");

                    break;

                case 6:

                    event("exit");

                    break;

                default:

                    print("输入错误,请重新输入!");

                    Present.threadSleep(1000);

                    event("userMain");

                    break;

                }

            } catch (Exception e) {

                print("输入错误,请重新输入!");

                Present.threadSleep(1000);

                event("userMain");

            }

        } else if (eventName.equals("fillGoods")) {

            print("货架已经填充。");

            Storge.writeDefaultBeverage();

            Storge.in_Server();

            event("adminMain");

        } else if (eventName.equals("getUser")) {

            String text = "";

            String[][] list = IO.deleteArrayNull(Storge.user);

            for (int i = 0; i < list.length; i++) {

                if (list[i] == null || list[i].length == 0) {

                    break;

                }

                for (int j = 0; j < list[i].length; j++) {

                    text = text + list[i][j] + " ";

                }

                text = text + "\n";

            }

            text = text + "\n输入任意内容以返回管理员菜单。";

            print(text);

            service.Present.scanString();

            event("adminMain");

        } else if (eventName.equals("getHistory")) {

            Storge.in_History();

            String text = "";

            String[][] list = IO.deleteArrayNull(Storge.history);

            for (int i = 0; i < list.length; i++) {

                if (list[i] == null || list[i].length == 0) {

                    break;

                }

                for (int j = 0; j < list[i].length; j++) {

                    text = text + list[i][j] + " ";

                }

                text = text + "\n";

            }

            text = text + "\n输入任意内容以返回管理员菜单。";

            print(text);

            service.Present.scanString();

            event("adminMain");

        } else if (eventName.equals("balance")) {

            print("用户" + User.userName + "的余额为: " + Storge.balance[User.userNo] + " 元。\n输入任意内容以返回用户菜单。");

            service.Present.scanString();

            event("userMain");

        } else if (eventName.equals("charge")) {

            print("请输入1~1000以内的数字进行充值(单位:元):");

            try {

                double amount = service.Present.scanDouble();

                if (amount >= 1 && amount <= 1000) {

                    User.charge(amount);

                    print("充值成功!现在您的余额为: " + Storge.balance[User.userNo] + " 元。");

                    Present.threadSleep(1000);

                    event("userMain");

                } else {

                    print("充值金额超过限定额度,请重新充值。");

                    Present.threadSleep(1000);

                    event("userMain");

                }

            } catch (Exception e) {

                print("输入格式错误,请重新输入!");

                Present.threadSleep(1000);

                event("userMain");

            }

        } else if (eventName.equals("buy")) {

            String str = User.createGoodsTable() + "输入对应编号购买,输入其他任意内容返回用户菜单:";

            show(str);

            try {

                int number = service.Present.scanInt();

                if (number > 0 && number <= 10) {

                    switch (User.buy(Storge.nameList[number - 1])) {

                    case -2:

                        print("当前余额为 " + Storge.balance[User.userNo] + " 元,无法购买该商品!请充值。");

                        Present.threadSleep(2000);

                        event("buy");

                        break;

                    case -1:

                        print("购买失败。商品" + Storge.nameList[number - 1] + "已缺货,请提醒管理员补充货物。");

                        Present.threadSleep(2000);

                        event("buy");

                        break;

                    case 0:

                        print("没有该商品,请重新购买。");

                        Present.threadSleep(2000);

                        event("buy");

                        break;

                    case 1:

                        User.refreshUser();

                        User.setHistory(Storge.nameList[number - 1]);

                        Storge.out_All();

                        print("购买成功!\n“你把它喝完了,你觉得充满了决心。当前余额为 " + Storge.balance[User.userNo] + " 元。");

                        Present.threadSleep(2000);

                        event("buy");

                        break;

                    }

                } else {

                    event("userMain");

                }

            } catch (Exception e) {

                event("userMain");

            }

        } else if (eventName.equals("vip")) {

            if (Storge.vip[User.userNo].equals("会员")) {

                print("您目前已经是会员,享有" + Storge.discount4Vip + "倍原价的购买优惠!");

                Present.threadSleep(2000);

                event("userMain");

            } else {

                print("您目前是非会员,可以花费60元成为本月会员,享受" + Storge.discount4Vip + "倍原价的购买优惠!\n输入对应数字进行操作:\n[1] 成为会员 \n[2] 返回菜单");

                try {

                    switch (service.Present.scanInt()) {

                    case 1:

                        if (User.joinVip()) {

                            print("办理成功!您已经成为本月会员!现在您的余额为 " + Storge.balance[User.userNo] + " 元。");

                            Present.threadSleep(2000);

                            event("userMain");

                        } else {

                            print("办理失败!您的余额不足60元,请重新办理!");

                            Present.threadSleep(2000);

                            event("userMain");

                        }

                        break;

                    case 2:

                        event("userMain");

                        break;

                    default:

                        print("输入错误,请重新输入!");

                        Present.threadSleep(1000);

                        event("userMain");

                        break;

                    }

                } catch (Exception e) {

                    print("输入错误,请重新输入!");

                    Present.threadSleep(1000);

                    event("UserMain");

                }

            }

        } else if (eventName.equals("exit")) {

            print("欢迎再次使用!");

            Present.threadSleep(750);

            System.exit(-1);

        }

7系统各模块运行界面截图(按角色分别给出截图,使用Alt+PrtScr)

 开发心得:

通过这一做系统的过程,我们收获了很多,在此进行总结。

首先,我们了解了做系统的基本步骤。做一个系统之前,要先做好需求分析,也就是要清楚这个系统是用来做什么的,要实现哪些功能,这一点十分重要,我们做系统要让使用系统的人满意,而不是要一味地按照自己的想法去做;其次,要理清楚设计思路和大的框架,比如实现所要求的功能需要几个类,每个类里需要有什么样的数据成员和成员函数,类与类之间有什么关系等等;写代码的过程中,尤其要重视调试代码的过程,要做好一个系统需要的代码不是简单的几行,因此,应该多一个数据类调一次,多增加一个功能调一次,确保已经写完的代码没有错误。

这篇关于基于java控制台界面的饮料售货机系统设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2