案例超市收银系统

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

目录退出目录第1页共#页案例十六超市收银系统本案例知识要点格式化输出结构体的使用类的设计和使用类指针的使用函数重载向量的使用虚函数目录退出目录第2页共#页一、案例需求案例描述•模拟“美特好”超市收款过程,根据货物清单,选定所购货物种类和数量,实现收银结账。案例效果图•案例效果如图所示。目录退出目录第3页共#页超市收银系统案例效果图1目录退出目录第4页共#页超市收银系统案例效果图2目录退出目录第5页共#页功能说明•显示超市库存商品信息。•显示购物流程提示信息。•实现收款过程,反复输入所购各种商品的索引号和购买数量,直到输入商品索引号“1”,结束购物流程。•实现收银,根据顾客所交现金,自动找零。目录退出目录第6页共#页二、案例分析在本案例中,超市收银系统应具备四大基本功能:商品管理、货架管理、购物篮管理和收银管理。货架管理实现库中某种商品的入库、出库、查询及显示等功能。需要建立一个货架类,通过调用相应的函数来实现。每种商品有单价、条形码、商品名称等属性。商品管理类实现了设置、获取商品信息、复制商品信息等功能。购物篮管理就是一个小型的货架管理,可以用货架类来实现。收银管理实现商品的结账、找零等任务。需要建立一个收银台类,通过调用相应的函数来实现。目录退出目录第7页共#页其中,需要注意以下一些问题:•从货架拿货时,应该将商品拿一部分出去,通过将商品“复制”一份出去来实现。•“货架”上有形形色色的商品,因此,这个类需要向量这个容器来容纳这些商品。向量中仅存储商品对象是不够的,因为商品没有量的概念,到底容器中包含多少件此类商品还需要用另外一个变量来表示,通过把商品对象和商品数量集成到一个结构体中来实现。•如何构建购物篮对象?仔细想一下,“购物篮”就是一个小型的货架,因此可以用“货架”类模拟一个购物篮。目录退出目录第8页共#页三、案例设计1.类的设计根据上述的设计思想,设计了“商品类”、“货架类”和“收银台类”3个类,这3个类的声明部分在文件“counter.h”中实现,3个类的成员函数的实现部分在文件“counter.cpp”中完成。其中商品类(CGoods类)负责完成商品信息的存储、获取、复制等任务;货架类(CStore类)负责完成库中商品的入库、出库、查询及显示等任务;收银台类(CCounter类)负责完成商品的结账、找零等任务。另外在counter.h文件中还定义了一个表示货架商品对象的结构SStoreElement,它有两个成员,一个是商品对象的指针,一个是此类商品的数量。货架中的每个商品都是这个结构类型的。目录退出目录第9页共#页目录退出目录第10页共#页CGoods类结构图+CGoods(iniIndex:int,instrName:string,indUnitPrice:double)+~CGoods()+GetName():string+GetIndex():int+GetUnitPrice():double+SetUnitPrice(indUnitPrice:double)+*Clone():CGoods-m_iIndex:int-m_strName:string-m_dUnitPrice:doubleCGoods目录退出目录第11页共#页目录退出目录第12页共#页目录退出目录第13页共#页结构体tagStoreElement的结构+*pGoods:CGoods+iNum:int结构tagStoreElement目录退出目录第14页共#页(3)CStore类(货架类)的设计CStore类的结构如图所示。+CStore()()+virtual~CStore()()+AddGoods(in*pGoods:CGoods,iniNum:int):bool+QueryGoods(in&strName:string):int+QueryGoods(iniIndex:int):int+DeleteGoods(in&strName:string,iniNum:int):int+DeleteGoods(iniIndex:int,iniNum:int):int+DeleteAllGoods()+*GetAllGoods():vectorpStoreElement+GetGoods(iniIndex:int):pStoreElement+GetGoods(in&strName:string):pStoreElement+Print()()-m_vStore:vectorpStoreElementCStoreCStore类的结构目录退出目录第15页共#页目录退出目录第16页共#页目录退出目录第17页共#页目录退出目录第18页共#页目录退出目录第19页共#页(4)CCounter类(收银台类)的设计CCounter类的结构如图所示。+CCounter(in*pBasket:CStore)+virtual~CCounter()+Bill():double+Count(indCash:double):double+GetCash():double-*m_pBasket:CStore-m_dCash:doubleCCounterCCounter类的结构目录退出目录第20页共#页目录退出目录第21页共#页目录退出目录第22页共#页目录退出目录第23页共#页2.主程序设计开始显示超市所有商品的信息输入欲购买商品的索引号输入欲购买商品的数量继续购买商品吗?去收银台结账结束NY(1)函数设计CStore*PrepareStore()该函数用于最初“进货”,即向货架中存入一批商品,包括这些商品的商品索引、商品名称、数量及单价,即创建一个商店。返回值:CStore*pStore为Cstore类的指针,代表一个货架。voidusage()该函数用于为用户显示操作提示,即告诉“客人”超市购物的购物流程。返回值:无。目录退出目录第24页共#页(2)主函数设计在main()函数中,首先分别对3个类定义一个超市、一个购物篮和一个收银台对象,然后定义了一个顾客交钱的变量,并初始化为0。利用上诉类的其他成员函数来实现购物过程。具体流程如图所示。目录退出目录第25页共#页主程序调用流程图目录退出目录第26页共#页四、案例实现目录退出目录第27页共#页目录退出目录第28页共#页目录退出目录第29页共#页目录退出目录第30页共#页目录退出目录第31页共#页目录退出目录第32页共#页目录退出目录第33页共#页目录退出目录第34页共#页目录退出目录第35页共#页目录退出目录第36页共#页目录退出目录第37页共#页目录退出目录第38页共#页目录退出目录第39页共#页目录退出目录第40页共#页目录退出目录第41页共#页目录退出目录第42页共#页目录退出目录第43页共#页目录退出目录第44页共#页目录退出目录第45页共#页目录退出目录第46页共#页目录退出目录第47页共#页目录退出目录第48页共#页目录退出目录第49页共#页目录退出目录第50页共#页目录退出目录第51页共#页目录退出目录第52页共#页目录退出目录第53页共#页目录退出目录第54页共#页目录退出目录第55页共#页目录退出目录第56页共#页目录退出目录第57页共#页目录退出目录第58页共#页目录退出目录第59页共#页目录退出目录第60页共#页目录退出目录第61页共#页目录退出目录第62页共#页目录退出目录第63页共#页目录退出目录第64页共#页目录退出目录第65页共#页目录退出目录第66页共#页五、案例总结与提高案例总结•在本案例中,比较关键的一步是分析出超市货架这个类,有些读者可能会将“顾客”抽象为一个类,然后将购物篮放到顾客这个类中。这是不正确的,因为无法在顾客类中处理购买货物和清理货物的逻辑。实际上,在整个收银系统设计中,顾客并没有真正地参与进来,收银台处理的只是一个又一个的购物篮。顾客真正参与的部分是在main函数中,通过交互,顾客可以购买商品,可以结账等。•另外一个难点是CGoods中的Clone()函数,为了从货架(超市)中选购一件商品,用户需要从CStore类中复制一件商品出来,而CStore类中存储的是各种商品的向量,因此,需要让商品类(CGoods)具有自我复制的功能,而在复制的过程中,商品的数量应该设为零,至于选购多少可以让用户调用CGoods类中的成员函数SetNum(intiNum)来确定。目录退出目录第67页共#页案例提高这个案例只是简单地模拟了一个顾客去超市购物的过程,可以提高的地方还有很多。•本案例为了简单起见,只是处理了一个购物篮,也就是说整个超市只有一个顾客。这不是一个对真实场景的模拟,真正的场景应该是有多个顾客,可能会同时去收银台结账,因此收银台处理的应该是一个购物篮队列,应该单独创建一个线程来追加这个队列,然后由收银台分别为每个购物篮结账,结完一个删除一个。•对于超市的店主来说,还应该有一个交互的界面,可以让店主来完成更改货物的单价、追加货物等操作。

1 / 67
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功