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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,