java实现自动售货机
自动售货机主要实现两大功能:售卖和管理。
一、对于售卖,购买者只要可以看见有什么卖,卖多少钱就可以。
先给售货机一个初始的商品列表。在储存商品时我用的是链表写的,方便遍历。
public void initProduct(){
product a=new product();
a.setID(1);
a.setName("可乐");
a.setPrice(4.00);
a.setNumber(5);
product b=new product();
b.setID(2);
b.setName("雪碧");
b.setPrice(3.00);
b.setNumber(5);
product c=new product();
c.setID(3);
c.setName("旺仔牛奶");
c.setPrice(5.00);
c.setNumber(5);
product d=new product();
d.setID(4);
d.setName("娃哈哈");
d.setPrice(4.00);
d.setNumber(5);
product e=new product();
e.setID(5);
e.setName("摩卡咖啡");
e.setPrice(7.00);
e.setNumber(5);
product f=new product();
f.setID(6);
f.setName("矿泉水");
f.setPrice(2.00);
f.setNumber(5);
q.data=a;
q.next=null;
head=q;
Node p=new Node();
p.data=b;
p.next=null;
q.next=p;
q=p;
Node t=new Node();
t.data=c;
t.next=null;
q.next=t;
q=t;
Node y=new Node();
y.data=d;
y.next=null;
q.next=y;
q=y;
Node u=new Node();
u.data=e;
u.next=null;
q.next=u;
q=u;
Node i=new Node();
i.data=f;
i.next=null;
q.next=i;
q=i;
}
public void showProduct(){
initProduct();
q=head;
while(q!=null){
System.out.println("编号为"+q.data.getID()+q.data.getName()+":"+q.data.getPrice()+"元/瓶");
q=q.next;
}
}
然后购买者首先是要看到这个列表,再输入自己想买的商品和数量,然后投币,找零,拿到商品就可以。
public void BuyProduct() throws ChargeExcept{
showProduct();
System.out.println("请输入你要购买的商品编号:");
int ID=scanner.nextInt();
System.out.println("请输入你要购买的数量:");
int count=scanner.nextInt();
double price=0;
q=head;
while(q!=null){
if(q.data.getID()==ID){
price=q.data.getPrice();
break;
}
q=q.next;
}
double require=count*price;
System.out.println("你需要支付:"+require+"元");
System.out.println("请投币:");
sumMonNum=scanner.nextDouble();
PutChange(sumMonNum);
splitChange(sumMonNum-require);
Oprationafter();
}
这里的PutChange()就是把顾客投的钱放到售货机系统里,splitChange()就是找零;
public void PutChange(double money){
if (money < 0) {
System.out.println("money is invalid, money=" + money);
return;
}
double[] prices = {100, 50, 20, 10, 5, 1,0.5};
int[] outmoney = new int[prices.length];
double change = money;
int count = 0;
for (int i = 0; i < prices.length; i++) {
count = 0;
while (change - prices[i] >= 0) {
change = change - prices[i];
count++;
}
inventory[i]=inventory[i]+count;
outmoney[i] = count;
}
}
public void splitChange(double money) throws ChargeExcept {
if (money < 0) {
System.out.println("money is invalid, money=" + money);
return;
}
int flag=0;
double[] prices = {100, 50, 20, 10, 5, 1,0.5};
int[] outmoney = new int[prices.length];
double change = money;
Charge c=new Charge();
int count = 0;
for (int i = 0; i < prices.length; i++) {
count = 0;
while (change - prices[i] >= 0) {
change = change - prices[i];
count++;
}
try{
c.change(inventory[i],count);
}
catch(ChargeExcept e){
System.out.println(e.warnMess());
flag=1;
break;
}
if(flag!=1){
inventory[i]=inventory[i]-count;
outmoney[i] = count;
}
}
if(flag!=1){
System.out.println("找你" + money + "元,请关注出钱口!");
for (int num = 0; num < prices.length; num++) {
System.out.print(outmoney[num] + "张" + prices[num] + "元 \n");
}
System.out.println("您的商品将要出货!!!");
}
}
这里用了自定义异常类来处理售货机不够零钱的现象。
二、对于管理,主要是三种:上架(更新商品)、下架(删除商品)、货币管理(取钱、放钱)。这里的货币管理就简单化了,直接输入现在有的货币,不管他是放进去还是取出来。
public void PutAway() throws ChargeExcept{
System.out.println("已有货物-------1");
System.out.println("商品上新-------2");
int operationNum=scanner.nextInt();
switch(operationNum){
case 1:{
AlreadyExist();
}
case 2:{
Newproduct();
}
}
}
private void Newproduct() throws ChargeExcept {
Node p=new Node();
product a=new product();
System.out.println("请输入新商品编号:");
int ID=scanner.nextInt();
a.setID(ID);
System.out.println("请输入新商品价格:");
Double newprice=scanner.nextDouble();
a.setPrice(newprice);
System.out.println("请输入新商品库存:");
int newnum=scanner.nextInt();
a.setNumber(newnum);
p.data=a;
p.next=null;
q=head;
while(q!=null){
q=q.next;
}
q.next=p;
System.out.println("已完成,正在退出...");
Oprationfirst();
}
public void AlreadyExist() throws ChargeExcept{
q=head;
while(q!=null){
System.out.println("编号为"+q.data.getID()+q.data.getName()+":"+q.data.getPrice()+"元/瓶"+"库存:"+q.data.getNumber());
q=q.next;
}
System.out.println("请输入你要更新的商品:");
int ID=scanner.nextInt();
q=head;
while(q!=null){
if(q.data.getID()==ID){
manage=q;
break;
}
q=q.next;
}
while(true){
System.out.println("更新价格-------1");
System.out.println("更新库存-------2");
System.out.println("退出-------3");
int operationNum=scanner.nextInt();
switch(operationNum){
case 1:{
System.out.println("请输入新价格");
Double newprice=scanner.nextDouble();
manage.data.setPrice(newprice);
}
case 2:{
System.out.println("请输入现有库存");
int newnum=scanner.nextInt();
manage.data.setNumber(newnum);
}
case 3:{
Oprationfirst();
}
}
q=head;
while(q!=null){
if(q.data.getID()==ID){
q=manage;
break;
}
q=q.next;
}
}
}
public void TakeDown(){
q=head;
while(q!=null){
System.out.println("编号为"+q.data.getID()+q.data.getName()+":"+q.data.getPrice()+"元/瓶"+"库存:"+q.data.getNumber());
q=q.next;
}
System.out.println("请输入你要下架的商品:");
int ID=scanner.nextInt();
q=head;
manage=head;
while(q!=null){
if(q.data.getID()==ID){
manage.next=q.next;
break;
}
manage=q;
q=q.next;
}
System.out.println("下架成功!");
}
public void MoneyManage(){
System.out.println("查询自动贩卖机零钱库存:"+"五角:"+inventory[6]+"张"+"一元:"+inventory[5]+"张"+"五元:"+inventory[4]+"张"+"十元:"+inventory[3]+"张"+"二十元:"+inventory[2]+"张"+"五十元:"+inventory[1]+"张"+"一百:"+inventory[0]+"张");
while(true){
System.out.println("选择补充金额的面额");
int operationNum=scanner.nextInt();
switch(operationNum){
case 100:{
System.out.println("输入现有数量");
int n=scanner.nextInt();
inventory[0]=n;
}
case 50:{
System.out.println("输入现有数量");
int n=scanner.nextInt();
inventory[1]=n;
}
case 20:{
System.out.println("输入现有数量");
int n=scanner.nextInt();
inventory[2]=n;
}
case 10:{
System.out.println("输入现有数量");
int n=scanner.nextInt();
inventory[3]=n;
}
case 5:{
System.out.println("输入现有数量");
int n=scanner.nextInt();
inventory[4]=n;
}
case 1:{
System.out.println("输入现有数量");
int n=scanner.nextInt();
inventory[5]=n;
}
}
}
}
最后就是选择问题,都是用swich来做的,差不多实现页面跳转吧。这些都是核心的部分,至于一些类的定义还是比较好处理的。