千家信息网

java如何实现自动售货机

发表于:2024-09-30 作者:千家信息网编辑
千家信息网最后更新 2024年09月30日,本篇文章给大家分享的是有关java如何实现自动售货机,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。要求:简易售货机流程:【投币】—>【显
千家信息网最后更新 2024年09月30日java如何实现自动售货机

本篇文章给大家分享的是有关java如何实现自动售货机,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

要求:

简易售货机

流程:

【投币】—>【显示货物清单】—>【选择一个商品编号购买】—>【提示出货】—>【找钱】

功能要求:

1. 使用mysql数据库,将所有货物存储在数据库中(货物应至少具有编号、名称、数量、价格等基本信息,可自行增加其他属性以完善程序)。
2. 要有友好的客户提示,例如:请输入购买商品的编号。
3. 清单要求包含每种商品的剩余数量。
4. 出货后,可以选择【找钱】,也可以选择【继续购买】,而不直接找钱

以下为解题思路及答案(略过数据库建表操作):

1、首先要先将JDBC链接包加入路径,这一步在之前的博客中已经讲过,这里就直接略过了。然后就是在代码中将驱动器打开:

import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class DBUtil {    //定义JDBC包导入路径    private String dbDriver = "com.mysql.jdbc.Driver";    //连接要操作的数据库    private String url = "jdbc:mysql://localhost:3306/database";    //数据库用户名    private String user = "root";    //数据库密码    private String password = "123456";    /**打开JDBC驱动器     * 如果打开不成功,要抛出异常     * @return     * @throws Exception     */    public Connection getDBConn() throws Exception{        try {            Class.forName(dbDriver);            return DriverManager.getConnection(url, user, password);        } catch (ClassNotFoundException e) {            throw new ClassNotFoundException("数据库驱动不存在!!");        } catch (SQLException e) {            throw new SQLException("数据库连接异常!");        }    }    /**     * 关闭Connection,     * 如果关闭不成功要抛出异常     */    public void close(Connection conn){        try {            if(conn != null){                conn.close();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    /**     * 关闭Statement,     * 如果关闭不成功要抛出异常     */    public void close(Statement stat){        try {            if(stat != null){                stat.close();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    /**     * 关闭ResultSet,     * 如果关闭不成功要抛出异常     */    public void close(ResultSet rs){        try {            if(rs != null){                rs.close();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

2、操作完JDBC之后,新建一个类,用来定义自动售货机具有的各个属性及方法:

import java.sql.Connection;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.Scanner;public class SimpleVendingMachine {    //实例化JDBC连接和输入方法    DBUtil dbu = new DBUtil();    Scanner scanner = new Scanner(System.in);    //定义Connection,Statement和ResultSet    Connection conn = null;    Statement stat = null;    ResultSet rs = null;    //定义投入的金币和余额    private double money;    private static double balance = 0;      //投入金钱    public void slot(double money){        this.money = money;    }    //显示当前商品的信息    public void displayAllGoods(){        //结果集封装        ArrayList rsList = new ArrayList();         String[] strTemp = null;        //sql显示操作        String sql = "SELECT `Code`, `Name`, Number, Price FROM goods";        try {            //驱动器加载            conn = dbu.getDBConn();            stat = conn.createStatement();            rs = stat.executeQuery(sql);            ResultSetMetaData rsmd = rs.getMetaData();            int columnCount = rsmd.getColumnCount();            String[] columnNames = new String[columnCount];            for(int i = 0 ; i < columnNames.length ; i++){                columnNames[i] = rsmd.getColumnName(i + 1);            }            rsList.add(columnNames);            //遍历赋值            while(rs.next()){                strTemp = new String[columnCount];                for(int i = 0 ; i < columnNames.length ; i ++){                    strTemp[i] = rs.getString(columnNames[i]);                }                rsList.add(strTemp);                }            //遍历输出            for(String[] datas : rsList){                for(String data : datas){                    System.out.print(data + "\t");                }                System.out.println();            }        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            //关闭连接            dbu.close(rs);            dbu.close(stat);            dbu.close(conn);        }    }    //进行购买    public void buyByCode(){        System.out.println("请输入您想购买的商品编号:");        int code = scanner.nextInt();        //如果购买成功,则商品数量减一,该商品销售所得金额增加自身价格        String sql = "update Goods set Number = Number - 1, Gain = Gain + Price where Code = " + code;        try {            //驱动器加载            conn = dbu.getDBConn();            //手动提交            //conn.setAutoCommit(false);            stat = conn.createStatement();            //操作影响行数            int affectedRows = stat.executeUpdate(sql);            //检查余额是否足够            if(checkMoney(code, stat, this.money)){                if(affectedRows > 0){                    System.out.println("购买成功!");                    //操作成功则手动提交                    //conn.commit();                    //后续操作:找零或继续购买                    this.proceed();                }            }else{                System.out.println("金额不足!");                //回到驱动器加载的位置                //conn.rollback();            }        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            dbu.close(rs);            dbu.close(stat);            dbu.close(conn);        }    }    //检查投入金额是否足够购买商品    public boolean checkMoney(int code, Statement stat, double money){        ResultSet rs = null;        try {            rs = stat.executeQuery("select Price from goods where Code  = " + code);            while(rs.next()){                //对余额进行更改                SimpleVendingMachine.balance = money - rs.getDouble("Price");                if(SimpleVendingMachine.balance >= 0){                    return true;                }else{                    return false;                 }            }        } catch (SQLException e) {            e.printStackTrace();        }        return false;    }    //定义后续操作    public void proceed(){        System.out.println("请选择找零(0)或继续购买(1):");        int n = scanner.nextInt();        switch(n){            case 0:                System.out.println("剩余零钱:" + SimpleVendingMachine.balance + "已退回!");                break;            case 1:                this.money = SimpleVendingMachine.balance;                buyByCode();                break;        }    }}

3 . 之后定义售货机服务菜单,让用户进行投币、购买及后续操作:

import java.util.Scanner;public class SVMService {    SimpleVendingMachine svm = new SimpleVendingMachine();    Scanner scanner = new Scanner(System.in);    public void service(){        //显示所有商品        svm.displayAllGoods();        System.out.println("---------------------------");        //投入金额准备购买商品        System.out.println("请输入您要投入的金额:");        svm.slot(scanner.nextDouble());        svm.buyByCode();    }}

4、最后就是在主方法中将SVMService 实例化并进行调用:

public class Demo {    public static void main(String[] args) {        SVMService svms = new SVMService();        svms.service();    }}

Java的优点是什么

1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面向网络的语言;4. 鲁棒性,java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。;5. 安全性,用于网络、分布环境下的Java必须防止病毒的入侵。6. 体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7. 可移植性,Java可以方便地移植到网络上的不同机器。8.解释执行,Java解释器直接对Java字节码进行解释执行。

以上就是java如何实现自动售货机,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0