硬币找零 java找零

自动售票找零多线程
昨天有人在群里说了一个多线程售票的问题,当时没怎么注意,后来没事就自己做了一下,开始还觉得应该很简单,最后昨天都没做出来,今天早上在床上突然思路开阔,起来就完成了,唉,感叹啊,有时候还真的要睡睡,这种事情在我身上都发生好几次了,每次都是睡觉起来问题就可以解决了,呵呵。。。
我模拟的是一个自动售票机,当然可能程序还又bug,但先考虑这么多吧,我假设来买票的人是还算是个理性点的啊
模拟的是一台机器,其他都是人来这台机器买票,票是5元一张,买的时候可以说买多少张,然后给钱,程序自动售票并找零。顾客交了前后首先机器有个收钱的方法,这个方法是按照一定的原则来的,他会把钱按5、10、20、50、100分开来装,但由于钱的分发很多,我就采用了一个比较简单的机器会按从大到小来分钱,比如你给他55他就会分为50和5,你给35它就会氛围20+10+5,给45就是2*20+5。这就是机器收钱分开装了。
接着就是找零了,机器也有个找零的方法,根据要找的余额来看机器里面是否有相应的钱数,有就直接找了,没有就还要等待,等另外有人来买票,有对应的钱了才可以找。比如你开始去买1张票,但你给了10元,刚开张,机器里面没有5元的票子,机器肯定找不出来,他就会让你等,如果下一个人买票时候给了5元的票子,那么机器就可以找你钱了,大致情况就是这样啦。贴一下代码吧,以后自己也可以看看,说不定哪天自己就不小心删掉了。
机器代码:
package com.&
import java.util.HashM&
import java.util.M&
public class TicketMachine {&
&&& private& int ticket = 20;&
&&& private Map&String,Integer& balance = new HashMap&String,Integer&();&
&&& public final& float TICKET_PRICE = 5.0F;&
&&& public float[] type = {5.0F , 10.0F , 20.0F , 50.0F , 100.0F};&
&&& public String[] strType={&五元& , &十元& , &二十元& , &五十元& , &一百元&};&
&&& public int getTicket(){&
&&& public void setTicket(int ticket){&
&&&&&&& this.ticket=&
&&& public Map getBalance(){&
&&&&&&& return this.&
&&& //假设给的钱都是5的倍数&
&&& public void separate(float money){&
&&&&&&& //判断money是否是5的倍数,不是就舍去个位数转成5的倍数&
&&&&&&& float temp=money/5;&
&&&&&&& money=5*&
&&&&&&& for(int i=0;i&this.type.i++){&
&&&&&&&&&&& if(money&=type[i]){&&&&&&&&& //票只卖100以内&
&&&&&&&&&&&&&&& if(money==type[i]){&
&&&&&&&&&&&&&&&&&&& this.save(this.strType[i],1);&
&&&&&&&&&&&&&&& }else{&
&&&&&&&&&&&&&&&&&&& float temp1,temp2,temp3,temp4;&
&&&&&&&&&&&&&&&&&&& if((temp1=money/50)&0){&
&&&&&&&&&&&&&&&&&&&&&&& this.save(this.strType[3],(int)temp1);&
&&&&&&&&&&&&&&&&&&&&&&& money-=50*(int)temp1;&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if((temp2=money/20)&0){&
&&&&&&&&&&&&&&&&&&&&&&& this.save(this.strType[2],(int)temp2);&
&&&&&&&&&&&&&&&&&&&&&&& money-=20*(int)temp2;&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if((temp3=money/10)&0){&
&&&&&&&&&&&&&&&&&&&&&&& this.save(this.strType[1],(int)temp3);&
&&&&&&&&&&&&&&&&&&&&&&& money-=10*(int)temp3;&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if((temp4=money/5)&0){&
&&&&&&&&&&&&&&&&&&&&&&& this.save(this.strType[0],(int)temp4);&
&&&&&&&&&&&&&&&&&&&&&&& money-=5*(int)temp4;&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&
&&&&&&& }&
&&& //向balance一张一张的存钱&
&&& public void save(String str,int add){&
&&&&&&& Integer num= (Integer) this.getBalance().get(str);&
&&&&&&& if(num==null){&
&&&&&&&&&&& num=0;&
&&&&&&& }&
&&&&&&& this.balance.put(str, num+add);&
&&& //从balance中取钱找零&
&&& //sdel是应该减掉的数,它=del*type[str的地址],del是减去的次数&
&&& //如果失败map应该要恢复原样的&
&&& public float delete(String str,int del,float sdel,Map&String,Integer& tempMap){&
&&&&&&& Integer num= tempMap.get(str);&
&&&&&&& if(num==null||num&1){&
&&&&&&&&&&&&
&&&&&&& }else{&
&&&&&&&&&&& if(num&del){&
&&&&&&&&&&&&&&& tempMap.put(str, num-del);&
&&&&&&&&&&&&&&& return 0.0F;&
&&&&&&&&&&& }else{&
&&&&&&&&&&&&&&& tempMap.put(str, 0);&
&&&&&&&&&&&&&&& int temp=0;&
&&&&&&&&&&&&&&& for(int i=0;i&this.strType.i++){&
&&&&&&&&&&&&&&&&&&& if(str.equals(strType[i])){&
&&&&&&&&&&&&&&&&&&&&&&& temp=i;&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& return this.type[temp]*(del-num);&
&&&&&&&&&&& }&
&&&&&&& }&
&&& public boolean change(float result){&
&&&&&&& //判断money是否是5的倍数,不是就舍去个位数转成5的倍数&
&&&&&&& float temp=result/5;&
&&&&&&& result=5*&
&&&&&&& //操作的map只是暂时的,如果返回的是false那么要恢复到原来的&
&&&&&&& Map&String,Integer& tempMap = new HashMap&String, Integer&();&
&&&&&&& tempMap.putAll(this.balance);&
&&&&&&& for(int i=0;i&this.type.i++){&
&&&&&&&&&&& if(result&=type[i]){&&&&&&&& //票只卖100以内&
&&&&&&&&&&&&&&& if(result==type[i]){&
&&&&&&&&&&&&&&&&&&& result-=type[i];&
&&&&&&&&&&&&&&&&&&& result+=this.delete(this.strType[i],1,type[i],tempMap);&
&&&&&&&&&&&&&&& }else{&
&&&&&&&&&&&&&&&&&&& float temp1,temp2,temp3,temp4;&
&&&&&&&&&&&&&&&&&&& if((temp1=result/50)&0){&
&&&&&&&&&&&&&&&&&&&&&&& result-=50*(int)temp1;//应该减去这么多的&
&&&&&&&&&&&&&&&&&&&&&&& result+=this.delete(this.strType[3],(int)temp1,50*(int)temp1,tempMap);//加上没有减掉的&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if((temp2=result/20)&0){&
&&&&&&&&&&&&&&&&&&&&&&& result-=20*(int)temp2;&
&&&&&&&&&&&&&&&&&&&&&&& result+=this.delete(this.strType[2],(int)temp2,20*(int)temp2,tempMap);&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if((temp3=result/10)&0){&
&&&&&&&&&&&&&&&&&&&&&&& result-=10*(int)temp3;&
&&&&&&&&&&&&&&&&&&&&&&& result+=this.delete(this.strType[1],(int)temp3,10*(int)temp3,tempMap);&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if((temp4=result/5)&0){&
&&&&&&&&&&&&&&&&&&&&&&& result-=5*(int)temp4;&
&&&&&&&&&&&&&&&&&&&&&&& result+=this.delete(this.strType[0],(int)temp4,10*(int)temp4,tempMap);&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& if(result==0.0){&
&&&&&&&&&&&&&&&&&&& this.balance=&
&&&&&&&&&&&&&&&&&&& this.balance=tempM&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }else{&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&& }&
&&&&&&&&&&&&&
&&&&&&& }&
&&& //售票&
&&& public synchronized void saleTicket(int count,float money){&
&&&&&&& float sum=count*this.TICKET_PRICE;//购买票需要总金额&
&&&&&&& float result=0.0F;//应找零&
&&&&&&& if(money&sum){&
&&&&&&&&&&& System.out.println(Thread.currentThread().getName()+&退还钱,对不起,你的金额不足买&+count+&张票&);&
&&&&&&&&&&&&
&&&&&&& }else if(count&this.getTicket()){&
&&&&&&&&&&& System.out.println(Thread.currentThread().getName()+&退还钱,对不起,今天的票只剩下&+this.getTicket()+&张了&);&
&&&&&&&&&&&&
&&&&&&& }else{&
&&&&&&&&&&& this.separate(money);&
&&&&&&&&&&& result=money-&
&&&&&&& }&
&&&&&&& if(result==0.0){&
&&&&&&&&&&& System.out.println(Thread.currentThread().getName()+&恭喜你买票成功,谢谢惠顾&);&
&&&&&&&&&&&&
&&&&&&& }else{&
&&&&&&&&&&& if(this.change(result)){&
&&&&&&&&&&&&&&& System.out.println(Thread.currentThread().getName()+&应找你&+result+&元,请收好找零,欢迎下次惠顾&);&
&&&&&&&&&&& }else{&
&&&&&&&&&&&&&&& Thread changeTask=new ChangeTask(this,result);//后台找零程序&
&&&&&&&&&&&&&&& changeTask.setDaemon(true);//设置为后台线程,需要在start之前&
&&&&&&&&&&&&&&& changeTask.start();&
&&&&&&&&&&&&&&& try {&
&&&&&&&&&&&&&&&&&&& System.out.println(Thread.currentThread().getName()+&请等待。。。&);&
&&&&&&&&&&&&&&&&&&& this.wait();//暂停等待&
&&&&&&&&&&&&&&&&&&& System.out.println(Thread.currentThread().getName()+&对不起让你久等了,现在有零钱了,应找你&+result+&元,欢迎下次惠顾&);&
&&&&&&&&&&&&&&& } catch (InterruptedException e) {&
&&&&&&&&&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&& }&
&&&&&&& }&
package com.&
import java.util.T&
public class BuyTicket extends Thread{&
&&& //售票机&
&&& private TicketM&
&&& //购票数&
&&& //买票钱&
&&& //姓名&
&&& //private S&
&&& public BuyTicket(){&
&&& public BuyTicket(TicketMachine machine, int count, float money,String name) {&
&&&&&&& super(name);&
&&&&&&& this.machine =&
&&&&&&& this.count =&
&&&&&&& this.money =&
&&&&&&& //this.name =&
&&&&&&& System.out.println(name+&:帮我买&+count+&张票&);&
&&& public void run() {&
&&&&&&& machine.saleTicket(count, money);&
&对于那些找零机器里没钱找的找零线程代码:
package com.&
public class ChangeTask extends Thread {&
&&& private TicketM&
&&& privat&
&&& public ChangeTask(TicketMachine machine,float result){&
&&&&&&& this.machine=&
&&&&&&& this.result=&
&&& @Override&
&&& public void run() {&
&&&&&&& //System.out.println(&找零任务线程运行了。。。&);&
&&&&&&& while(true){&
&&&&&&&&&&& synchronized (machine) {&
&&&&&&&&&&&&&&& if(machine.change(result)){&
&&&&&&&&&&&&&&&&&&& machine.notifyAll();&
&&&&&&&&&&&&&&&&&&& //System.out.println(&已经通知了&);&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&& }&
&&&&&&& }&
&测试代码了:
package com.&
public class Test {&
&&& public static void main(String[] args) {&
&&&&&&& TicketMachine machine=new TicketMachine();&
&&&&&&& BuyTicket buy1=new BuyTicket(machine,1,5.0F,&张三&);&
&&&&&&& BuyTicket buy2=new BuyTicket(machine,3,15.0F,&李四&);&
&&&&&&& BuyTicket buy3=new BuyTicket(machine,5,33.0F,&王五&);&
&&&&&&& BuyTicket buy4=new BuyTicket(machine,6,50.0F,&赵六&);&
&&&&&&& buy1.start();&
&&&&&&& buy2.start();&
&&&&&&& buy3.start();&
&&&&&&& buy4.start();&
作者&l555iu&
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'一个Frame添加了Panel 报错:at java.awt.Container.addImpl(Unknown Source)
[问题点数:40分]
一个Frame添加了Panel 报错:at java.awt.Container.addImpl(Unknown Source)
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
2013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。用记事本编写javaweb找零,结果闪了一下就没了。。。求大神帮忙~_javaweb吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:19,829贴子:
用记事本编写javaweb找零,结果闪了一下就没了。。。求大神帮忙~收藏
如题,求大神,下面是我的源代码。。。&html&&body&&script type=&text/javascript&&function validate(){sum = Number(document.loginForm.txt.value);document.loginForm.txt1.value=parseInt(sum/50);sum=sum%50;document.loginForm.txt2.value=parseInt(sum/20);sum=sum%20;document.loginForm.txt3.value=parseInt(sum/10);sum=sum%10;document.loginForm.txt4.value=parseInt(sum/5);sum=sum%5;document.loginForm.txt5.value=document.loginForm.submit();}&/script&欢迎进入找零系统:&form name=&loginForm&&输入找零总数:&input name=&txt& type=&text&&&BR&&input type=&button& onclick=&validate()& value=&确定&&&BR&50元:&input name=&txt1& type=&text&&&BR&20元:&input name=&txt2& type=&text&&&BR&10元:&input name=&txt3& type=&text&&&BR&5元: &input name=&txt4& type=&text&&&BR&1元: &input name=&txt5& type=&text&&&BR&&/form&&/body&&/html&
福利不只是穿多穿少,还要有迷人的微笑!
好吧,自己找出来了,多写了句document.loginForm.submit();
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或地铁自动售票机 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 16时,
&无详细内容&
代码片段(1)
1.&[代码][Java]代码&&&&
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
//请输入投币金额
System.out.println("请投币");
int amount=in.nextInt();
System.out.println(amount);
System.out.println(amount&=10);
if(amount&=10)
//打印车票
System.out.println("************");
System.out.println("*城际轨道交通*");
System.out.println("*票价: 10元
System.out.println("**");
System.out.println("************");
System.out.println("找零"+(amount-10));
//提示金额不足
System.out.println("投币金额不足");
System.out.println("请补足票价");
开源中国-程序员在线工具:
相关的代码(3331)
开源从代码分享开始
Kenneth9的其它代码汇才同飞教育_(0.1折)_汇才JavaEE代金券_百度糯米北京团购
有即将到期的糯米券笔订单未评价笔订单未付款条新的商家回复百度糯米:nuomivip
热门分类中国菜外国菜热门影片热门院线
&&14800价值0.1折折扣钱包新客最高再减20元2人已团购数&&&量
买了又买&1已售1&159已售10&18新单&18已售1&45新单&135已售15&14.2已售7&15已售1
数量/规格小计JavaEE正式课一周代金券1张14800元
每周日不可使用
09:00 - 18:00
请至少提前7天预约,请在第一期开课前预约,每个月开一个班。请用户提前咨询开课日期。
预约位逾期不保留,请准时
团购用户暂不享受店内其他优惠
每张糯米券限1人使用
每次消费最多可使用1张糯米券
课程需1次完结
课程(卡)可以转借他人一起使用
代金券不兑现、不找零,超出部分到店另付
每张糯米券限1人使用
每次消费最多可使用1张糯米券
课程需1次完结
课程(卡)可以转借他人一起使用
代金券不兑现、不找零,超出部分到店另付
看了又看&1&1580已售85&160&380新单&99&990新单&200&250新单&200&300新单&100&150新单&158&440.02已售754&19.9&200已售250&28&400已售127&0.1&60已售116&60&350新单&1&100已售70&40&480已售65&9.9&188已售58&24&240已售56&0.1&50已售56&1&550已售51&39&300已售41&1&18800已售40&2300&8800新单&66&220新单&20&200新单&39.9&380新单&620&1350新单&280&480新单&30&450新单&850&1000新单&9.9&100新单&9.9&50新单&2.99&299已售31
支付宝-特约商家
可信网站 身份验证
网站认证 Web Trust

我要回帖

更多关于 硬币找零问题 的文章

 

随机推荐