收银员程序设计.docx
《收银员程序设计.docx》由会员分享,可在线阅读,更多相关《收银员程序设计.docx(11页珍藏版)》请在冰豆网上搜索。
收银员程序设计
一、课程设计目的及要求
收银员与顾客(信号量操作)
设计目的:
加深对操作系统原理的进一步认识,加强实践动手能力和程序开发能力的培养,提高分析问题解决问题的能力,培养合作精神,以巩固和加深磁盘调度的概念。
操作系统是一门工程性很强的课程,它不仅要求学生掌握操作系统的工作原理和理论知识,也要求学生的实际动手能力,以加深对所学习内容的理解,使学生熟练地掌握计算机的操作方法,使用各种软件工具,加强对课程内容的理解。
要求:
在某超市里有一个收银员,且同时最多允许有n个顾客购物,我们可以将顾客和收银员看成是两类不同的进程,且工作流程如下图所示。
为了利用PV操作正确地协调这两类进程之间的工作,设置了三个信号量S1、S2和Sn,且初值分别为0、0和n。
二、相关知识
WindowsAPI:
在本实验中涉及的API有:
(1)ExitThread用于结束当前线程。
VOIDExitThread(
DWORDdwExitCode//exitcodeforthisthread
);
(2)信号量控制:
WaitForSingleObject可在指定的时间内等待指定对象为可用状态;
DWORDWaitForSingleObject(
HANDLEhHandle,//handletoobject
DWORDdwMilliseconds//time-outinterval
);
hHandle为等待的对象,也就是实现同步或者互斥的对象。
该函数一执行,相应的信号量就减去1,如果信号量小于等于0,那么他一直在循环。
(3)实现信号量互斥和同步
CreateSemaphore用于创建信号量,根据参数的不同可以利用它实现互斥和同步。
ReleaseSemaphore用于释放信号量,使用后相应的信号量加1
HANDLECreateSemaphore(
LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,//SD
LONG,lInitialCount,//initialcount
LONG,lMaximumCount,//maximumcount
LPCTSTRlpName//objectname
);
ReleaseSemaphore(
HANDLEhSemaphore,//handletosemaphore
LONGlRelseaseCount,//contincrementamount
LPLONGlpPreviousCount//previouscount
);
三、题目分析
(1)构筑收银员与顾客的队列
构造两个队列用来分别存放收银员与顾客的P,V信息
typedefstructLNode,typedefstructa
(2)判定顾客处于哪个操作
voidenque(linklist&l,charname)对顾客进行插入操作,从等待状态到付款(付款到付款完毕)
chardeque(linklist&l)对顾客进行删除操作,当顾客由等待到付款时,就从等待队列里将顾客删除,当顾客从付款到等待时,就从付款队列里将顾客删除
(3)对顾客进行P,V操作
P操作,对顾客进行减1操作,判断结果是否大于等于0,如果大于等于0则进入付款队列,反之继续等待。
V操作,对顾客进行加1操作,判断结果是否大于0,如果大于0则从付款进入等待,反之付款未成功。
图3.1P操作流程图
图3.2V操作流程图
(4)构造收银员操作
当顾客付款后,收银员判断是否收到付款,判断成功后,付款成功,反之付款未成功。
图3.3收银员流程图
图3.4主函数流程图
四、概要设计
(1)控制流程
用voidenque(linklist&l,charname),chardeque(linklist&l)这两个函数对顾客进行队列的插入和删除
(2)创建收银员与顾客
用voidsy()函数创建收银员相应的操作。
用voidgk()函数创建顾客相应的操作。
voidp()用来控制顾客的P操作。
Voidv()用来控制顾客的V操作。
(3)收银员与顾客进程
参见图3.4收银员—顾客的完整流程图。
五、代码及流程
#include
#include
usingnamespacestd;
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)
{
Llistp=(Llist)malloc(sizeof(LNode));
p->name=name;
p->next=l->front;
l->front=p;
//cout<front->name;
}
chardeque(linklist&l)
{
charname=NULL;
if(l->front!
=NULL)
{
name=l->front->name;
l->front=l->front->next;
}
//cout<<"del"<returnname;
}
voidshow(linklist&l)
{
while(l->front!
=NULL)
{
cout<front->name<l->front=l->front->next;
}
}
voidp()
{
xin_guke--;
if(xin_guke>=0)
{
if(dengdai->front!
=NULL)
{
cout<<"顾客"<front->name<<"到就绪队列"<enque(jiuxu,deque(dengdai));
}
}else{
cout<<"收银员忙,调度顾客到等待队列~~~"<}
}
voidv()
{
xin_guke++;
if(xin_guke>0)
{
if(jiuxu->front!
=NULL)
{
enque(dengdai,deque(jiuxu));
}
}
}
voidsy()
{
for(intj=shouyin;j>0;j--)
if(jiuxu->front!
=NULL)
{
cout<front->name<<"收钱完毕!
~~"<deque(jiuxu);
guke--;
}
}
voidgk()
{
intj=guke;
for(inti=j;i>0;i--)p();
sy();
for(i=j;i>0;i--)v();
}
intmain()
{
cout<<"请输入顾客数:
"<cin>>guke;
cout<<"请输入收银员数:
"<cin>>shouyin;
xin_guke=shouyin;
/*
guke=8;
shouyin=xin_guke;
*/
init(dengdai);
init(jiuxu);
for(inti=guke;i>0;i--)
{
enque(dengdai,(char)(i+97));
}
while(dengdai->front!
=NULL||jiuxu->front!
=NULL)
{
gk();
}
return0;
}
六、运行结果
图6.1输入顾客数
图6.2输入收银员数
图6.3运行结果
如图所示,可以输入任意数量的顾客数和收银员数。
当顾客数大于收银员数时,后面的顾客将到等待队列中等待前面的顾客付完款。
当前面的顾客将款付完后,后面的顾客进入就绪队列付款,付款后进入等待队列,表示付款完毕。
七、设计心得
此次操作系统的课程设计,从理论到实践,在两个星期的日子里,可以说是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
通过这次操作系统的课程设计,我研究了收银员与顾客的问题,进一步深入了解了同步与互斥机制。
比如什么是同步,什么是互斥,什么是信号量等等。
课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。
总体来说我认为操作系统这门学科在计算机科学当是中非常重要的。
他将我们学过的编程语言联系起来,可以说是第一次利用C语言利用windows的API与系统进行“沟通”。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,自身知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
比如说编语言掌握得不好,应用程序编写不太会……通过这次课程设计之后,一定把以前所学过的知识重新温故。
在此,也感谢在课程设计过程中帮我解惑的老师和同学。
总而言之,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西。
我想这也许就是课程设计的最终目的吧。
八、参考文献
[1]刘振安、刘燕君著.《C++程序设计课程设计》.北京:
机械工业出版社,2004
[2][美]AbrahamSilberschatz,PeterBaerGalvin,GregGagne著.郑扣根译.操作系统概念(第六版).北京:
高等教育出版社,2004
[3]陈向群,向勇等.Windows操作系统原理(第二版).北京:
机械工业出版社,2004.