基于UML的饮料自动售货机系统设计.docx
《基于UML的饮料自动售货机系统设计.docx》由会员分享,可在线阅读,更多相关《基于UML的饮料自动售货机系统设计.docx(16页珍藏版)》请在冰豆网上搜索。
![基于UML的饮料自动售货机系统设计.docx](https://file1.bdocx.com/fileroot1/2023-1/31/6f8e6200-67ed-4a5a-ae4a-20ce6462c0c0/6f8e6200-67ed-4a5a-ae4a-20ce6462c0c01.gif)
基于UML的饮料自动售货机系统设计
基于UML的饮料自动售货机系统设计
1.问题描述
1.1关于自动售货机
自动售货机像磁卡电话、银行柜员机一样,以方便、新颖、文明、昼夜服务等特点,成为发达国家不可缺少的便民配套设施。
如今的自动售货机可以为顾客提供多种服务。
顾客可以根据自己的需要选择商品并投入钱币,售货机接收钱币,售出商品。
1.2饮料自动售货机的设计
该设计模拟自动售货机的工作原理和方式,完成出售商品、接收钱币、找零钱等功能。
与系统交涉的人有两类:
送货员和顾客。
送货员在每周固定时间查看售货机中的饮料数量和钱币数量情况,并根据计划适当添加饮料、钱币或取走适当的钱币。
同时,送货员也可以根据需要增加饮料的种类,或修改饮料的价格。
顾客根据需要选择饮料,投入钱币,并等待售货机的响应。
售货机(所设计的系统)所做的响应:
如果售货机中没有该种饮料,则退回顾客所投钱币,交易失败。
否则,如果售货机中有该种饮料,则判断顾客所投钱币是否足够,如果不够,则提示顾客交易失败,并退回钱币。
如果顾客所投的钱币刚好够(不需要找零钱),则售出饮料,交易结束。
如果需要找零钱,则判断是否有适当的零钱可以找,如果有,则售出饮料,找出零钱,交易结束。
否则,退回钱币,交易失败。
当然,实际生活中的售货机可能有更加强大的功能和更完善的处理,这里只模拟一个售货机系统,所以只实现其核心原理,并练习和提高分析问题能力和编程能力。
2.用例模型及分析类图的描述;
2.1系统功能模块划分
图1:
模块划分
2.2系统用例模型描述
系统涉及的角色有:
顾客和送货员。
系统用例模型如下图:
图2:
用例图
2.3类分析
系统中涉及的类有Person类,主要实现viewPrice这个功能.Customer和Sender继承这个类,并且各自实现一定的功能,Drink类和Money类各有自己的属性,并可以通过一些操作将自己的信息显示出来.
3.设计类图、核心用例的顺序图与状态图、组件图等的描述;
3.1类图
图3:
类图
3.2核心用例的顺序图
图4:
“注册新的送货员”时序图
时序图分析:
送货员输入新的用户名和密码,并确定。
对话框控件接收输入,并将信息传到售货机系统,请求生成新的数据记录。
系统检查该用户名是否有效。
如果无效,则拒绝生成新的送货员。
如果有效,则在数据库中添加一条新的记录,成功的生成一个送货员的用户名和密码。
图5:
“查看价格”时序图
时序图分析:
顾客或送货员请求查看饮料的价格。
对话框控件接收输入,并请求售货机系统查询该价格信息。
系统在数据库中浏览并通过饮料名称查出该饮料的价格,返回给对话框界面。
图6:
顾客”购买饮料”顺序图
时序图分析:
界面接收顾客的输入(包括饮料名称和钱币类型数量),并传递给售货机系统。
系统访问数据库查看该种饮料是否已经卖完,如果已卖完,则提示并退回钱币。
否则,在数据库中查询该种饮料的价格,并判断顾客所投钱币是否够买该饮料。
如果足够,则计算需要找的零钱,并在数据库中查询是否有足够的零钱。
如果没有适合的零钱,则提示并退回顾客所投钱币。
如果有适合的零钱,则通知数据库更新饮料和钱币信息,并且售出饮料,找零。
图7:
送货员“登陆”时序图
时序图分析:
送货员输入用户名和密码登陆系统。
UI界面将其传递给售货机系统,系统查询数据库中的送货员信息,并验证该用户名和密码是否正确,如果错误,提示用户。
否则,将送货员专区界面显示给送货员。
图8:
“添加饮料”时序图
时序图分析:
UI界面接收送货员输入要添加的饮料类型和数量,并传递给售货机系统,系统生成一条新的数据记录,并通知数据库修改该饮料的数量信息。
修改成功之后,向界面返回现在的饮料信息。
图9:
“查看饮料”时序图
时序图分析:
UI界面接受送货员点击“查看饮料”按钮,并将接收的消息传递给售货机系统,系统查询数据库中的饮料信息,并将其显示出来。
图10:
“取走钱币”时序图
时序图分析:
UI界面接收送货员输入的钱币类型和数量,并传递给售货机系统。
系统访问数据库,查看是否可以取走该数量的该种钱币,如果不可以,则拒绝取走钱币,并通知UI界面提示送货员。
否则,通知数据库修改钱币信息,并返回给界面修改后的新信息。
3.3状态图
图11:
状态图
4.信息代码设计、数据库设计、输入设计、输出设计的描述
4.1信息代码设计
(1)设计用MicrosoftVisualC++基于对话框的AppWizard实现。
(2)首先创建“欢迎”对话框,即初始界面。
再根据用户身份分为顾客和送货员,这样分别创建两个“专区”。
(3)“顾客专区”为新建的对话框改造,所以需要创建一个类,称为classCCustomer,并且添加相应的控件。
顾客可以每次选择一种饮料,所以用单选按钮实现,而在投入钱币时,这里模拟用输入方式说明顾客投入的钱币面值和数量。
当顾客确定输入以后,系统调用数据库中的信息判断是否有顾客所选饮料,并计算顾客投入钱币是否足够,是否需要找零等问题。
之后,系统会弹出一个提示框提示顾客现在的交易情况——这里分3种情况:
没有该种饮料并提示选择另一种、有该种饮料但没有适合的零钱并退回钱币、交易成功。
(4)送货员需要通过“登陆”对话框验证身份后才能进入“送货员专区”。
登陆的用户名和密码分别为wumei,0000.而“送货员专区”也是新建的对话框,所以创建一个classCSell类,并添加控件。
送货员可以添加任意种饮料任意瓶,所以用复选框选择所要添加饮料品种,并用编辑框输入添加数量。
确定之后,数据添加到数据库中,通过“查看饮料”可以查看现在的饮料信息。
同时,送货员可以选择“放置钱币”或“取走钱币”来放置或取走钱币,这里也用复选框和编辑框来实现操作的钱币面值和数量。
确定并“查看钱币”可以看到现在的钱币状况。
4.2数据库设计
图12:
E-R图
数据库描述:
钱币有面值和数量两种属性,其中,面值是主属性。
送货员有用户名和密码两种属性,其中用户名是主属性,当添加新的送货员时,如果用户名已经存在,则会出错。
饮料有类型、数量和价格三种属性。
其中类型是主属性。
数据库中按名称存储各种饮料若干。
送货员可以放置或取走若干钱币,也可以添加饮料。
4.3输入、输出设计
(1)创建数据库之后,先初始化,将钱币和饮料的数量都置成0,并且设置默认的饮料价格。
而送货员信息表中,先注册一个用户名为wumei,密码为0000的送货员。
(2)输入设计。
送货员登陆时设计2种情况:
输入正确的登陆信息和错误的登陆信息。
而在添加饮料输入饮料数量时,设计输入为正确的数字和错误的其他符号。
在放置/取走钱币时,设计取走小于已有数量的钱币和大于已有数量的钱币。
在送货员添加新的送货员时,设计添加的用户名为与已有用户名相同和相异两种。
对于顾客,在购买饮料时设计选择一种已卖完的饮料和一种未完的饮料。
投入钱币时,设计投入小于饮料价格的、等于饮料价格的和大于饮料价格的钱币。
(3)预期的输出。
每种正确的输入,系统都能正确响应,或能顺利进入下一个界面,或能成功修改数据库,或能显示新的信息,或能提示操作成功。
5.用户界面设计和处理过程的设计的描述;
5.1用户界面设计:
图13:
系统的欢迎界面
界面描述:
用户选择任意一种身份,并确定,则会进入到相应的操作界面。
图14:
送货员登陆界面
界面描述:
送货员输入自己的用户名和密码,登陆成功之后则进入到送货员专区进行相应的操作。
图15:
送货员功能区
界面描述:
第一组中,送货员可以选择饮料,并可在右边的编辑框中输入饮料数量。
第二组中,送货员先要选择对钱币的具体操作类型,然后选中钱币面值,输入钱币数量,则可以完成对钱币的操作。
而第三组和第四组主要用来响应“查看按钮”和“查看钱币”,显示数据库中现存的饮料和钱币信息。
第五组中,送货员可以输入用户名和密码,进行添加新的送货员。
图16:
顾客功能区
界面描述:
顾客每次可以选中一种饮料,并投入钱币。
模拟投入钱币是用编辑框让顾客输入投入该种钱币的数量。
5.2用户界面设计说明
(1)在“选择身份”时当选择“顾客”这个单选按钮,并确定,则会进入到“顾客专区”,如果选择“送货员”,则会弹出一个登陆对话框.,让送货员输入用户名和密码,验证信息,并作出相应的回应.
(2)当送货员要向系统添加饮料或放置、取走钱币时,需要首先登陆。
输入用户名和密码,验证通过才可以继续下一步的操作。
这里开始设置了一个送货员,当他登陆成功之后可以在“添加送货员”中再添加其他的送货员。
(3)送货员可以添加饮料,用复选按钮选择要添加的饮料类型,并且可以在后面的编辑框中输入添加饮料的数量。
确定之后,首先验证输入是否合法。
如果是合法的输入,即可生效。
同时,送货员可以通过选择放置钱币或取走钱币并设置数量来添加或减少售货机中的钱币。
(4)当送货员点击“查看饮料”时,在上面的列表框中会显示现有的饮料信息,包括名称,数量和价格。
而“查看钱币”按钮则能让售货机中的钱币类型和数目显示在下面的列表框中。
(5)顾客可以选择一种饮料,并选择投入的钱币类型和数目,系统判断是否有该种饮料,所投钱币是否足够,是否有适当的零钱等,从而完成售货。
(6)由于顾客投钱币有很多种方法,并且找零钱也有很多种组合,设计起来比较麻烦,所以这里只列举了几种投币和找零的方法。
(当然,如果现实中的售货机没有该种功能,则可以设计成只能投入1元或0.5元的硬币若干,系统判断所投钱币是否等于饮料价格,若不相等,则拒绝售出饮料,并退回钱币)假设顾客购买“百事可乐“,并投入10元,那么需要找零6.5元。
所以如果有5元*1+1元*1+0.5元*1这种组合,或者1元*6+0.5元*1组合,则都是可以购买成功的。
这里假设其他组合为“不适当”。
同样,如果投入5元,那么需要找零1.5元。
如果有1元*1+0.5元*1这种组合或者0.5元*3组合,则都是可以购买成功的。
购买其他品种饮料都是如此。
(3)假设顾客在投入10元(或5元)之后,不会再投入其他面值的钱币。
(因为购买饮料的界面设计成单选,顾客每次只买一种饮料,所需投钱币小于5元)
6.软件的测试方法和测试结果。
6.1初始化
先初始化数据库中的数据,设置饮料有四种类型,每种价格固定,并且数量都为0。
设置钱币的四种类型,并且每种数量也都为0.
6.2添加饮料、钱币
首先送货员向售货机中添加饮料和钱币,假设添加的饮料数量分别为:
5,2,4,0.放置的钱币数量分别为:
0,2,5,8.
图17:
添加饮料和钱币
6.3购买饮料
现在顾客可以购买饮料了。
(1)假设顾客A购买“百事可乐”,并且投币10元。
图18:
购买成功
购买成功。
现在可以查看系统中的饮料和钱币信息(当然是用送货员的身份查看):
可以看到,“百事可乐”的数量已经减少为4,而钱币的数量也有相应的变化。
图19:
查看饮料、钱币信息
(2)假设顾客B购买“可口可乐”,并投币1元*2.可知,投入的钱币不够。
系统弹出一个对话框提示顾客所投钱币不够。
图20:
投币不够
这时可以查看现有饮料和现有钱币,可以发现,数据并没有被修改。
(3)假设顾客C购买“雪碧”,并投币5元。
用送货员的身份可以看到,现在售货机中没有“雪碧”这种饮料了,所以会提示用户选择另外一种饮料。
图21:
无饮料
(4)送货员注册新的送货员信息。
用初始的用户名和密码登陆的送货员向系统添加新的送货员,用户名为“software”,密码为0504.则添加成功。
以后即可用该用户名和密码登陆。
图22:
添加送货员
(5)注册新的送货员信息时,仍然用software这个用户名。
可知添加不能成功。
这里会出现提示:
图23:
添加同名送货员
7.设计的特点、不足、收获与体会。
7.1设计的特点与不足
将自动售货机用程序模拟,完成了其基本功能,如添加饮料、放置钱币、取走钱币和购买饮料。
而且设计中可以流通面值大于饮料价格的钱币(如10元、5元的钱币),这样设计比较适合以后售货机的发展趋势,即可以找零。
送货员可以查看已有饮料和钱币信息,这样可以知道一周之内各种饮料的售出情况,从而可以适当调整各种饮料的供应量,以追求最大化的利润。
在需要找零时,系统自动浏览数据库中的钱币信息,计算各种可能的组合,判断是否可以找零,并进行提示成功或失败。
在送货员取走钱币时,判断是否可以有足够的钱币可以取。
送货员可以添加信息生成新的送货员,以使其他人可以成为该售货机的送货员来操作。
不足之处在于设计有些简单,饮料价格被设置为固定的,不能修改。
当然,这在一定时期内是可以的,如果饮料价格有变动,还需要修改数据库,操作不太安全。
这还需要改进。
7.2收获与体会
通过对饮料自动售货机系统的设计与实现,从最开始搜集需求、系统分析、详细设计再到实现,对软件开发的整个过程有了更清晰的认识和了解。
通过运用RationalRose来对系统整体和模块部分进行设计,对UML统一建模语言有了更深的理解。
在实现阶段,用VC创建用户界面,并通过ADO连接数据库SQLServer,对编程语言的运用更加熟练,对数据库的操作也有了进一步的提高。
在整个过程中,还有同学对我的帮助,这使得我更快更好的完成了这次的系统设计与实现。
当然,还有在程序验收阶段,老师给我的指导和建议,也对我有很大的帮助。
8.参考文献
(1)王少锋.面向对象技术UML教程.清华大学出版社
(2)王志学.Rose对象建模方法与技术.机械工业出版社