基于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实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与