基于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实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是