溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

java如何實(shí)現(xiàn)自動(dòng)售貨機(jī)

發(fā)布時(shí)間:2022-01-24 09:17:49 來(lái)源:億速云 閱讀:359 作者:kk 欄目:開(kāi)發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)java如何實(shí)現(xiàn)自動(dòng)售貨機(jī),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。

要求:

簡(jiǎn)易售貨機(jī)

流程:

【投幣】—>【顯示貨物清單】—>【選擇一個(gè)商品編號(hào)購(gòu)買(mǎi)】—>【提示出貨】—>【找錢(qián)】

功能要求:

1. 使用mysql數(shù)據(jù)庫(kù),將所有貨物存儲(chǔ)在數(shù)據(jù)庫(kù)中(貨物應(yīng)至少具有編號(hào)、名稱(chēng)、數(shù)量、價(jià)格等基本信息,可自行增加其他屬性以完善程序)。
2. 要有友好的客戶(hù)提示,例如:請(qǐng)輸入購(gòu)買(mǎi)商品的編號(hào)。
3. 清單要求包含每種商品的剩余數(shù)量。
4. 出貨后,可以選擇【找錢(qián)】,也可以選擇【繼續(xù)購(gòu)買(mǎi)】,而不直接找錢(qián)

以下為解題思路及答案(略過(guò)數(shù)據(jù)庫(kù)建表操作):

1、首先要先將JDBC鏈接包加入路徑,這一步在之前的博客中已經(jīng)講過(guò),這里就直接略過(guò)了。然后就是在代碼中將驅(qū)動(dòng)器打開(kāi):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {

    //定義JDBC包導(dǎo)入路徑
    private String dbDriver = "com.mysql.jdbc.Driver";
    //連接要操作的數(shù)據(jù)庫(kù)
    private String url = "jdbc:mysql://localhost:3306/database";
    //數(shù)據(jù)庫(kù)用戶(hù)名
    private String user = "root";
    //數(shù)據(jù)庫(kù)密碼
    private String password = "123456";

    /**打開(kāi)JDBC驅(qū)動(dòng)器
     * 如果打開(kāi)不成功,要拋出異常
     * @return
     * @throws Exception
     */
    public Connection getDBConn() throws Exception{

        try {
            Class.forName(dbDriver);
            return DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            throw new ClassNotFoundException("數(shù)據(jù)庫(kù)驅(qū)動(dòng)不存在?。?quot;);
        } catch (SQLException e) {
            throw new SQLException("數(shù)據(jù)庫(kù)連接異常!");
        }
    }

    /**
     * 關(guān)閉Connection,
     * 如果關(guān)閉不成功要拋出異常
     */
    public void close(Connection conn){

        try {
            if(conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /**
     * 關(guān)閉Statement,
     * 如果關(guān)閉不成功要拋出異常
     */
    public void close(Statement stat){

        try {
            if(stat != null){
                stat.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /**
     * 關(guān)閉ResultSet,
     * 如果關(guān)閉不成功要拋出異常
     */
    public void close(ResultSet rs){

        try {
            if(rs != null){
                rs.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

2、操作完JDBC之后,新建一個(gè)類(lèi),用來(lái)定義自動(dòng)售貨機(jī)具有的各個(gè)屬性及方法:

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 {

    //實(shí)例化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;  

    //投入金錢(qián)
    public void slot(double money){
        this.money = money;
    }

    //顯示當(dāng)前商品的信息
    public void displayAllGoods(){

        //結(jié)果集封裝
        ArrayList<String[]> rsList = new ArrayList<String[]>(); 

        String[] strTemp = null;


        //sql顯示操作
        String sql = "SELECT `Code`, `Name`, Number, Price FROM goods";

        try {
            //驅(qū)動(dòng)器加載
            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{
            //關(guān)閉連接
            dbu.close(rs);
            dbu.close(stat);
            dbu.close(conn);
        }
    }

    //進(jìn)行購(gòu)買(mǎi)
    public void buyByCode(){

        System.out.println("請(qǐng)輸入您想購(gòu)買(mǎi)的商品編號(hào):");
        int code = scanner.nextInt();

        //如果購(gòu)買(mǎi)成功,則商品數(shù)量減一,該商品銷(xiāo)售所得金額增加自身價(jià)格
        String sql = "update Goods set Number = Number - 1, Gain = Gain + Price where Code = " + code;

        try {
            //驅(qū)動(dòng)器加載
            conn = dbu.getDBConn();

            //手動(dòng)提交
            //conn.setAutoCommit(false);

            stat = conn.createStatement();
            //操作影響行數(shù)
            int affectedRows = stat.executeUpdate(sql);

            //檢查余額是否足夠
            if(checkMoney(code, stat, this.money)){

                if(affectedRows > 0){
                    System.out.println("購(gòu)買(mǎi)成功!");

                    //操作成功則手動(dòng)提交
                    //conn.commit();

                    //后續(xù)操作:找零或繼續(xù)購(gòu)買(mǎi)
                    this.proceed();
                }
            }else{
                System.out.println("金額不足!");

                //回到驅(qū)動(dòng)器加載的位置
                //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);
        }
    }

    //檢查投入金額是否足夠購(gòu)買(mǎi)商品
    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()){
                //對(duì)余額進(jìn)行更改
                SimpleVendingMachine.balance = money - rs.getDouble("Price");

                if(SimpleVendingMachine.balance >= 0){
                    return true;
                }else{
                    return false; 
                }
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }

    //定義后續(xù)操作
    public void proceed(){
        System.out.println("請(qǐng)選擇找零(0)或繼續(xù)購(gòu)買(mǎi)(1):");
        int n = scanner.nextInt();

        switch(n){
            case 0:
                System.out.println("剩余零錢(qián):" + SimpleVendingMachine.balance + "已退回!");
                break;
            case 1:
                this.money = SimpleVendingMachine.balance;
                buyByCode();
                break;
        }
    }
}

3 . 之后定義售貨機(jī)服務(wù)菜單,讓用戶(hù)進(jìn)行投幣、購(gòu)買(mǎi)及后續(xù)操作:

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("---------------------------");

        //投入金額準(zhǔn)備購(gòu)買(mǎi)商品
        System.out.println("請(qǐng)輸入您要投入的金額:");
        svm.slot(scanner.nextDouble());

        svm.buyByCode();

    }

}

4、最后就是在主方法中將SVMService 實(shí)例化并進(jìn)行調(diào)用:

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

Java的優(yōu)點(diǎn)是什么

1. 簡(jiǎn)單,只需理解基本的概念,就可以編寫(xiě)適合于各種情況的應(yīng)用程序;2. 面向?qū)ο螅?. 分布性,Java是面向網(wǎng)絡(luò)的語(yǔ)言;4. 魯棒性,java提供自動(dòng)垃圾收集來(lái)進(jìn)行內(nèi)存管理,防止程序員在管理內(nèi)存時(shí)容易產(chǎn)生的錯(cuò)誤。;5. 安全性,用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須防止病毒的入侵。6. 體系結(jié)構(gòu)中立,只要安裝了Java運(yùn)行時(shí)系統(tǒng),就可在任意處理器上運(yùn)行。7. 可移植性,Java可以方便地移植到網(wǎng)絡(luò)上的不同機(jī)器。8.解釋執(zhí)行,Java解釋器直接對(duì)Java字節(jié)碼進(jìn)行解釋執(zhí)行。

以上就是java如何實(shí)現(xiàn)自動(dòng)售貨機(jī),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI