您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 操作系统课设—收银员与顾客
目录1题目内容及要求............................................................................11.1题目名称.................................................................................11.2题目描述.................................................................................11.3解题思路.................................................................................11.4程序清单.................................................................................21.5提交结果框图.........................................................................52总结................................................................................................73参考文献........................................................................................711题目内容及要求1.1题目名称收银员与顾客(信号量操作)1.2题目描述编程模拟下面同步问题:在某超市里有x(shouyin)个收银员,且同时最多允许有y(guke)个顾客购物,我们可以将顾客和收银员看成是两类不同的进程,且工作流程如下图所示。为了利用PV操作正确地协调这两类进程之间的工作,设置了3个信号量xin_guke,x(shouyin)和y(guke)可由用户输入,信号量xin_guke初值等于shouyin。1.3解题思路(1)构筑收银员与顾客的队列构造两个队列用来分别存放收银员与顾客的P,V信息typedefstructLNode,typedefstructa(2)判定顾客处于哪个操作voidenque(linklist&l,charname)对顾客进行插入操作,从等待状态到付款(付款到付款完毕)chardeque(linklist&l)对顾客进行删除操作,当顾客由等待到付款时,就从等待队列里将顾客删除,当顾客从付款到等待时,就从付款队列里将顾客删除(3)对顾客进行P,V操作P操作,对信号量xin_guke进行减1操作,判断结果是否大于等于0,如果大于等于0则进入付款队列,反之继续等待。V操作,对信号量xin_guke进行加1操作,判断结果是否大于0,如果大于0,完成付款就结束,反之,从等待队列中摘下一个进程放入就绪队列中。(4)控制流程:用voidenque(linklist&l,charname),chardeque(linklist&l)这两个函数对顾客进行队列的插入和删除创建收银员与顾客:用voidsy()函数创建收银员相应的操作。用voidgk()函数创建顾客相应的操作。voidp()用来控制顾客的P操作。Voidv()用来控制顾客的V操作。收银员与顾客进程:参见图3.4收银员—顾客的完整流程图。2图1.3.1P操作流程图图1.3.2V操作流程图NYYNNY3(4)构造收银员操作当顾客付款后,收银员判断是否收到付款,判断成功后,付款成功,反之付款未成功。图1.3.3收银员流程图NY4图1.3.4主函数流程图NY21.4程序清单#includeiostream#includemalloc.husingnamespacestd;intxin_guke;//初值为收银人数,代表当前可以进入付款状态的人数intguke,shouyin;//顾客总人数,收银员总人数typedefstructLNode//结点{charname;LNode*next;}*Llist;typedefstructa//链表{LNode*front;Llistlast;}*linklist;linklistdengdai,jiuxu;voidinit(linklist&l){l=(linklist)malloc(sizeof(a));l-front=l-last=NULL;}voidenque(linklist&l,charname)//将名为name的结点插入到L链表中{Llistp=(Llist)malloc(sizeof(LNode));p-name=name;p-next=l-front;l-front=p;//coutl-front-name;}chardeque(linklist&l)//删除l链表中的结点{charname=NULL;if(l-front!=NULL){name=l-front-name;l-front=l-front-next;}//coutdelnameendl;returnname;}voidshow(linklist&l)//输出链表L的信息3{while(l-front!=NULL){coutl-front-nameendl;l-front=l-front-next;}}voidp()//在信号量上执行P操作:当有多余收银员时,进入就绪队列,{当满时,进入等待队列xin_guke--;if(xin_guke=0){if(dengdai-front!=NULL){cout顾客dengdai-front-name到就绪队列endl;enque(jiuxu,deque(dengdai));}}else{cout收银员忙,调度顾客到等待队列~~~endl;}}voidv(){xin_guke++;if(xin_guke0){if(jiuxu-front!=NULL){enque(dengdai,deque(jiuxu));}}}voidsy(){for(intj=shouyin;j0;j--)if(jiuxu-front!=NULL){coutjiuxu-front-name收钱完毕!~~endl;deque(jiuxu);guke--;}}voidgk(){4intj=guke;for(inti=j;i0;i--)p();sy();for(i=j;i0;i--)v();}intmain(){cout请输入顾客数:endl;cinguke;cout请输入收银员数:endl;cinshouyin;if(shouyin0){xin_guke=shouyin;/*guke=8;shouyin=xin_guke;*/init(dengdai);//初始化等待队列init(jiuxu);//初始化就绪队列for(inti=guke;i0;i--){enque(dengdai,(char)(i+96));//根据顾客数,将顾客插入等待队列}while(dengdai-front!=NULL||jiuxu-front!=NULL){gk();}return0;}else{cout对不起,不能没有收银员!endl;return0;}}51.5提交结果框图1.用户输入客户数,如图1.5.1图1.5.1输入顾客数2.用户输入收银员数,如图1.5.2图1.5.2输入收银员数63.运行结果,如图1.5.3图1.5.3运行结果4.当输入数据有误时,如图1.5.4图1.5.4出错时图如图所示,可以输入任意数量的顾客数和收银员数。当顾客数大于收银员数时,后面的顾客将到等待队列中等待前面的顾客付完款。当前面的顾客将款付完后,后面的顾客进入就绪队列付款,付款后进入等待队列,表示付款完毕。72总结通过这次操作系统的课程设计,我研究了收银员与顾客的问题,进一步深入了解了同步与互斥机制。比如什么是同步,什么是互斥,什么是信号量等等。课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。总体来说我认为操作系统这门学科在计算机科学当是中非常重要的。他将我们学过的编程语言联系起来,可以说是第一次利用C++语言利用windows的API与系统进行“沟通”。总而言之,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西。我想这也许就是课程设计的最终目的吧。3参考文献[1]刘振安、刘燕君著.《C++程序设计课程设计》.北京:机械工业出版社,2004[2][美]AbrahamSilberschatz,PeterBaerGalvin,GregGagne著.郑扣根译.操作系统概念(第六版).北京:高等教育出版社,2004[3]陈向群,向勇等.Windows操作系统原理(第二版).北京:机械工业出版社,2004.[4]宗大华、宗涛、陈吉人编著.《操作系统》人民邮电出版社,2011.
本文标题:操作系统课设—收银员与顾客
链接地址:https://www.777doc.com/doc-5690334 .html