收银员程序设计.docx

上传人:b****4 文档编号:4461488 上传时间:2022-12-01 格式:DOCX 页数:11 大小:86.19KB
下载 相关 举报
收银员程序设计.docx_第1页
第1页 / 共11页
收银员程序设计.docx_第2页
第2页 / 共11页
收银员程序设计.docx_第3页
第3页 / 共11页
收银员程序设计.docx_第4页
第4页 / 共11页
收银员程序设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

收银员程序设计.docx

《收银员程序设计.docx》由会员分享,可在线阅读,更多相关《收银员程序设计.docx(11页珍藏版)》请在冰豆网上搜索。

收银员程序设计.docx

收银员程序设计

 

一、课程设计目的及要求

收银员与顾客(信号量操作)

设计目的:

加深对操作系统原理的进一步认识,加强实践动手能力和程序开发能力的培养,提高分析问题解决问题的能力,培养合作精神,以巩固和加深磁盘调度的概念。

操作系统是一门工程性很强的课程,它不仅要求学生掌握操作系统的工作原理和理论知识,也要求学生的实际动手能力,以加深对所学习内容的理解,使学生熟练地掌握计算机的操作方法,使用各种软件工具,加强对课程内容的理解。

要求:

在某超市里有一个收银员,且同时最多允许有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.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1