欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现自动售货机

程序员文章站 2022-06-24 16:10:08
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<string[]> rslist = new arraylist<string[]>(); 

        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 售货机