资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
自动售货机仿真实验报告一、 问题描述 有一种自动售货机VM,可售三种商品:可乐(每听$0.25),咖啡(每听$0.30),餐巾纸(每包$0.05)。每种商品的示意图形下方都有一个按钮。一台VM中最多能够容纳NC听可乐、NF听咖啡、NT包餐巾纸。 顾客使用VM购买商品时,先从投币口投入硬币(共有三种硬币:$0.05;$0.10;$0.25),在投入的硬币总值达到或超过其欲购商品之价格后,再按下对应商品的按钮,VM即从出货口自动吐出一件商品,并从找币口找零。 如果顾客在其投入的硬币总值没有达到其欲购商品之价格时就按下了对应商品的按钮,或者最近一次投币30秒后既不继续投币,也不按下商品按钮,VM均从找币口吐出与该顾客已投入的硬币总值等值的硬币,但不吐出商品。 如果顾客欲购之商品已经售完,则在顾客按下该商品的按钮后,VM从找币口吐出与该顾客已投入的硬币总值等值的硬币。 当某种商品还剩NL听/包时,VM即自动发出短信,将VM的代号和缺货的商品名称通知管理人员。管理人员将在时间TM后收到短信,再用时间TS到达VM,并使VM的所有商品存货都达到最大容纳量,取走VM中的硬币,并留有找零的硬币:$0.05、$0.10、$0.25分别留C5、C10、C25枚。须仿真的活动及开发结果的行为特征 1、开始仿真时,应随机产生VM中三种商品的存货量(不能超过其最大容纳量)和VM中三种硬币的数量(分别不小于C5、C10、C25枚)。 2、仿真中,应随机产生前来购物的顾客,随机产生其欲购买的商品种类,随机产生顾客的投币行为(包括描述的行为),按问题域概述给出的要求进行VM自动售货活动的仿真。 3、NC、NF、NT、NL、C5、C10、C25的值应在运行仿真程序时用命令行给出,或者在开始仿真时从界面输入。 4、实时显示各种商品的当前存货量。 5、出现情况时,应显示所发的短信内容,并随机决定TM和TS的值。在管理人员到达VM之前,应照常进行顾客购物的仿真。管理人员加货和取款的持续时间可忽略不计。 6、仿真开始后,应自动记销售流水帐。该流水帐的每一行对应着一次售货,记录着所售出的商品名称和售出时间。 7、仿真结束时,应自动产生销售报表。该报表应给出本次模拟过程中:每种商品的销售总量与价值合计;所有售出商品的价值总计;每种商品的库存量;模拟开始、结束时各自的库存金额;管理人员每次加货的时间、各商品加货量、取走的硬币总额。二、 程序设计过程1. 从实际问题中抽象类 仿真过程关注的事物有:VM,商品(Goods),顾客(Customer),管理员(Administrator)。 程序设计过程中考虑过以下问题: 管理员类建立的必要性。若不设计管理员类,而是在VM类中设两变量TS,TM,VM自动计时,到时间后自动加货,可实现同样输出。从程序外观上看管理员类的建立与否没有影响。而考虑到自动加货并不是VM的本身属性,而是通过与管理员通信完成的,故建立管理员类。在VM中建立响应管理员加货的方法,而管理员的内部实现也正是调用了VM的此方法。 商品基类建立的必要性。曾考虑过将Goods类设计为虚基类,提供所有商品的共有接口,再从这个虚基类派生处各具体商品,最后运用多态性原理设计实现细节。考虑到这个问题中各商品所不同的地方只是商品名,价格等数据成员不同,类内部方法完全相同。且此程序中一个Goods对象代表一组同种商品,即找不到一个个单独的商品。在电梯程序中每个乘客有不同的属性:起始与终止楼层,而这正是程序关系的特征,故建立了一个个具体的乘客对象。此问题中我们关系的只是商品的数量,故没有一个个单独的商品对象。2. 三个类之间的关系Goods投币按按钮补充货物发送请求包含若干出货找零CustomerVMAdministrator3. 程序的主框架初始化结束打印报表(未达结束条件时循环)检查是否需要新建顾客对象检查是否需要通知管理员顾客执行一次操作VM执行一次操作管理员执行一次操作此程序中关键是要处理各对象之间的通信。采用以下方法解决: VM与顾客之间的通信:顾客有两种操作,即投币与按按钮。在VM中建立响应这两种操作的函数,顾客类中的两种操作内部实质是调用VM中的响应函数。只需向顾客的操作函数中传递一VM的指针即可实现两者之间的通信。 VM与管理员的通信:因VM管理员之间的通信存在时间差,即VM发出的信息需经TM后才能传递到管理员,故中方法不再适用。采用一全局变量(CallAdmTimeLeft)来记录信息还需多长时间才能到达管理员,其值为-1表示VM为发出请求或上一个请求已被处理,值为0则通知管理员。这样便可通过主函数完成消息的传递。4. 类的设计1) Pbulic,h中声明定义了各类共享的一些数据类型及运行时需要的一些参数。类型:enum CoinFIVE=5,TEN=10,TWFIVE=25:硬币的种类typedef unsigned int ID:VM编号的类型typedef int PRICE:价格,现金的类型,单位为美分typedef int TIME:时间的类型运行时所需的参数,集中放置方便修改const int COINKINDS:硬币种类数目const int COINMAX:产生顾客时,其拥有的硬币数目的最大值const int WAITTIME:顾客两次操作间最长时间间隔const int CREATEMAX:一次交易结束后产生下一顾客的最大间隔时间const int TMMAX:TM的最大值const int TSMAX=5:TS的最大值const int THEID:VM的编号const int RUNTIME:运行的最大时间2) 商品(Goods)类的设计变量/函数 成员作用私有string name标示商品名称PRICE price标示商品价格int maxNum售货机中该商品的最大容量int leftNum记录售货机中该商品的剩余量int allSold记录该商品的销售量Goods(const Goods&)防止按值传递const Goods& operator=(const Goods&)防止按值传递公有Goods(string ,PRICE ,int ,int )构造函数getName()返回商品名称getPrice()返回商品价格getLeftNum()返回剩余数量getAllSold()返回销售量setMax()将商品数量冲至最大值sellOne()销售一件商品时应执行的操作3) 顾客(Customer)类的设计变量/函数 成员作用私有string goodsWanted标示所需商品vector money投币顺序,建立对象时初始化PRICE alreadyInsert已投的金额,用于与商品价格比较,判断是否按按钮PRICE moneyLeft记录当前剩余金额int timeleft记录产生下一投币动作或按按钮动作还剩的时间Customer(const Customer&)防止按值传递const Customer& operator=(const Customer&)防止按值传递setTimeLeft()设置产生下一投币动作或按按钮动作还剩的时间setMoneyLeft()及时更新moneyLeft公有Customer(vector)构造函数insert(VM*)处理投币行为pressButton(VM*)处理按按钮行为oneSecondPast(VM* )程序每运行一秒顾客的更新,返回是否交易结束Insert函数和pressButton函数的实现主要是调用VM的相应相应函数。onSecondPast函数实现如下:timeLeft0?返回true返回falseYN投币按按钮NY钱没投完&没有投够?timeLeft为零?YtimeLeft-4) 管理员(Administrator)类的设计变量/函数 成员作用私有TIME timeLeft到达VM剩余的时间,值为-1表示还未收到信息,空闲VM* pVM目标VM公有Administrator()构造函数onCall(VM* theVM)收到请求时的操作setMax()为VM补充货物oneSecondPast()程序每运行一秒管理员的更新5)VM类的设计变量/函数 成员作用私有ID id编号vector allGoods商品容器TIME tradeTimeLeft用于判断顾客是否在WAITTIME内无任何动作bool haveSend标示是否已发送信息,防止重复发送PRICE tempPayment记录当前顾客已投的金额int ensure用于记录收支,从而判断售货机是否算错帐vector moneyContainer当前VM的的硬币,三个分量分别存储三种硬币的数目sendMessage(vector,bool& )发送缺货消息examine(bool&)检查是否需要通知管理员VM(const VM&)防止按值传递const VM& operator=(const VM&)防止按值传递getMoneyLeft() 返回VM中剩余现金caculate(int ,vector& )计算找零,返回三种硬币各需找几枚change(vector&)找零公有VM()默认构造函数VM(ID.)构造函数getGoodsPrice(string)根据商品名寻找其价格onSetMax()响应管理员的加货行为onInsert(Coin)响应顾客的投币行为onPressButton(string,PRICE)响应顾客的按按钮行为StoragePrint(int)打印存货量,向屏幕及输出文件输出StoragePrint()打印存货量,向报表输出moneyPrint()打印库存金额,向报表输出workDayOver()仿真结束时完成报表oneSecondPast(bool& )程序每运行一秒VM的更新onPressButton函数的实现:按钮被按下无此商品或此商品已售完?YN支付金额足够?退还已投币N退还已投币退还已投币NY售出商品,找零Y能够找零?workDayOver中判断VM是否算错帐的实现:通过ensure判断下式是否成立:初始金额+售出货物价值-结束时剩余金额-管理员取走的=0若成立,则没有算错帐。三、 输入输出的设计按要求,NL,C
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号