基于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

相关文章

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.