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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 实现FTP整站上传的批处理代码