理发师问题《操作系统》课程设计报告 1Word格式.docx
《理发师问题《操作系统》课程设计报告 1Word格式.docx》由会员分享,可在线阅读,更多相关《理发师问题《操作系统》课程设计报告 1Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
一个理发店由一个有N张沙发的等候室和一个放有一张理发椅的理发室组成。
没有顾客要理发时,理发师便去睡觉。
当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离开理发店;
否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发坐下等待;
如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。
在理发完成后,顾客必须付费,直到理发师收费后才能离开理发店。
试用信号量实现这一同步问题。
3.设计要求:
1.根据自己对应的课题完成以下主要工作:
(1).分析设计要求,给出解决方案,建立必要的数据结构,然后设计总体流程(包括界面)、详细设计必要的算法,并最终显示结果。
基于WINDOWS或LINUX操作系统都可以,用何种编程语言都有可以。
(2).提交设计报告,包括设计要求、设计思想流程、设计所涉及的主要数据结构、程序清单、运行结果、设计心得、参考资料等。
(3).严禁抄袭,复制设计内容,查出后相关同学设计成绩以零分处理。
(4).所提交源程序应是能够运行通过的完整程序。
(5).提交不少于5000字的课程设计报告,含系统说明,系统功能图,流程图,程序设计说明,源程序清单
2.设计过程中既要虚心接受老师的指导,又要充分发挥主观能动性、独立思考、努力钻研、勤于实践、勇于创新。
3.在设计过程中,要严格要求自己,树立严密、严谨的科学态度,必须按时、保质、保量完成任务。
要求独立完成规定的设计内容,不得弄虚作假,不准抄袭或拷贝他人的程序或其他内容。
4.不得迟到、早退、旷课。
缺课节数达两次以上者,成绩按不及格处理。
二、进度安排
第15周星期一14:
30—18:
30
星期三14:
星期四14:
第16周星期二14:
1需求分析1
1.1系统设计题目1
1.2问题具体描述1
1.3问题分析1
1.4运行环境分析1
2总体设计1
2.1简要介绍2
2.2概要设计流程图2
2.3数据结构说明2
3详细设计3
3.1详细设计流程图3
3.2C++语言定义相关的数据类型3
3.3各模块功能4
4调试与运行结果4
4.1调试4
4.2运行结果4
5心得体会6
6附录6
6.1源代码7
6.2参考文献11
7评分表12
1需求分析
1.1系统设计题目
理发店有三个理发师,有三张沙发。
顾客来了理发师正忙可以坐在沙发上。
理发师理完发可以从沙发上叫醒顾客理发。
1.2问题具体描述
所以主要由理发师,沙发和顾客组成,当顾客数为零时,理发师休息,当顾客来时,判定理发师是否空闲,如果空闲则理发师理发。
当顾客数超过理发师数时,理发师都忙碌,顾客则坐沙发休息,如果未理发的顾客数超过沙发数则顾客离开。
1.3问题分析
理发师问题是一个利用信号量进行PV操作的经典问题。
设计程序实现此问题,要使得理发师的活动与顾客的活动得到各自真实得模拟。
所执行的程序应体现:
理发师在没有顾客的时候去睡觉,有顾客则工作;
顾客在理发师工作时坐下等待,无座时离开,直至等到理发师自己理理发。
1.4运行环境分析
操作系统:
windows7\8\2000\2003\xp
运行环境:
MicrosoftVisualStudio6.0
内存:
1G
CPU:
2.0GHz
系统硬盘:
30G
2总体设计
2.1简要介绍
此程序主要完成下面各大功能
(1)友好界面
(2)实现本程序是否开始的功能。
(3)实现理发师的理发功能。
(4)设置控制程序结束的语句,可根据用户需要而结束程序
2.2概要设计流程图
图2.1概要设计流程图
2.3数据结构说明
本程序用到了数据结构中的队列,理发的顾客由随机函数产生,顾客遵从先到先理发的原则,但队列的长度限制为输入的理发店中的椅子的个数,当理发店的椅子没有空位的时候,到来的顾客主动退出加入队列。
理发师对队列中的顾客进行先到先服务的原则理发。
3详细设计
3.1详细设计流程图
图3.1详细设计流程图
3.2C++语言定义相关的数据类型
intchairs;
//普通椅子数
intcustomers=0;
//顾客数
intcount=0;
//循环中用来计量的
intwaiting=0;
//等候理发的人数
intfinish=0;
//已经理完发的人数
intwork=0;
//理发师是否在工作
intsleeping=0;
//理发师是否在打瞌睡
charopendoor;
//理发店是否开门接待顾客
charblank;
//获取空白字符
3.3各模块功能
(1)来理发的顾客是随机产生,代码如下:
#definerandom(rand()*10000)/RAND_MAX//用来产生随机数
(2)停顿时间,代码如下:
Sleep(2000);
//为一个顾客理发需要时间
printf("
理发完成。
\n"
);
work=0;
//理发完成,理发师空闲
finish++;
//理发完人数加1
4调试与运行结果
4.1调试
在开始程序是,先由程序员输入椅子数chairs,然后询问程序员是否开门营业:
若程序员输入‘y’,则开门营业;
若输入‘n’,则持续询问程序员是否营业。
在刚开门营业之后,先随机产生顾客:
若没顾客来,则理发师打瞌睡,再次进行产生顾客;
若有顾客来,则直接为顾客理发。
在为顾客理发期间,程序自动产生顾客,最多产生5个顾客。
顾客进来后,先看看理发师是否在理发,是则看看是否有空椅子,若有则坐下,无则离开。
如果理发师正空闲,则直接为顾客理发。
当理发完成之后,先判断已经为多少人理发了,如果未超过4人,则继续营业。
若已超过,则询问程序员是否继续营业。
若继续理发,则先判断是否有人等待,若有则先为等待最久的顾客理发,若没则理发师打瞌睡,程序继续回到随机产生顾客。
4.2运行结果
(1)进入程序运行界面,输入理发店等待的椅子发数目
图4.1
(2)理发师开门营业
图4.2
(3)理发师理发完成
图4.3
(4)退出程序
图4.4
5心得体会
课程设计对学生而言是其对所学课程内容掌握情况的一次自我验证,从而有着极其重要的意义。
通过课程设计能提高学生对所学知识的综合应用能力,能全面检查并掌握所学内容;
《计算机操作系统》从课程性质上讲是一门专业基础课,它的目的和任务就是训练学生对计算机操作系统的认识,让学生对计算机操作系统有更进一部的认识,进而增加其对学习和应用相关专业课的兴趣。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,将结论用于实践,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中当然遇到了问题,可以说得是困难重重,毕竟这是不可避免的,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
由于能力有限,其中文档的编写是参考书上资料,我想在以后的学习中,要更注重实践这一环节。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到种种问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
从设计过程看,在整整两个星期的日子里,做到精益求精,学到了很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
从设计结果看,设计要求完成任务,达到了预期的目的,设计、演示效果较好。
最主要是从中学到了知识。
通过这次课程设计,我学到了很多,得到了很多,不仅充分的将在书本中学到的知识运用到解决实际问题上,而且加强了自己的动手能力。
我会总结出这次课程设计的所有的成功以及失败的经验和心得,并希望老师能够批评指出存在的错误之处,期待有更多的机会让我实践理论知识。
总的来说,这次课程设计确实学到很多,不仅锻炼了我遇到问题解决问题的勇气和能力,还练就了遇到挫折不达目的不罢休的韧性,这在以后的工作与学习中将会非常重要。
6附录
6.1源代码
#include<
stdio.h>
#include<
windows.h>
voidmain()
{
请输入理发店内的普通椅子数:
scanf("
%d"
&
chairs);
blank=getchar();
理发店内总共有%d把普通椅子。
chairs);
要开门接待顾客吗?
y/n\n"
opendoor=getchar();
while(opendoor!
='
y'
)
{
对不起,尚未营业!
}
开门迎接客人!
//开门接待顾客
if(random%2)//刚开门时随机产生顾客,分有顾客和没顾客两种情况,若为真,则有顾客
刚开门就有顾客到来。
customers++;
//顾客数加1
理发师为第%d个顾客理发。
customers);
work=1;
//进入工作状态
Loop:
for(count=0;
random%2&
&
count<
=5;
count++)/*理发师为一个顾客理发的期间随机产生顾客,分有顾客和没顾客两种情况,若为真则有顾客,且最多为来了五个*/
customers++;
第%d个顾客到来了。
sleeping=0;
//设定理发师不在打瞌睡状态
if(work==1)//判断是否正为顾客理发,是则新来顾客等待,否则不用等待
{
if(waiting<
chairs)//判断是否有空椅子
{
printf("
有%d把空椅子,顾客坐下等待。
chairs-waiting);
waiting++;
}
else
printf("
没有空椅子,顾客离开。
}
work=1;
if(work==1)
Sleep(2000);
if(finish>
4)//完成为4个人理发的任务,询问理发师是否继续工作
已经为%d位顾客理发了,还有%d个顾客在等待,是否继续工作?
finish,waiting);
opendoor=getchar();
if(opendoor=='
n'
exit(0);
//继续工作则改为清醒状态
if(waiting>
0)//看看是否有人在等待理发
{
有%d位顾客等待,理发师继续为等待的顾客理发\n"
waiting);
waiting--;
//有则进入工作状态
gotoLoop;
else//无则打瞌睡
if(sleeping==0)
没有顾客来理发,理发师打瞌睡中……\n"
sleeping=1;
gotoLoop;
//继续边打瞌睡边等顾客
else//刚开门时随机产生顾客,若为假,则无顾客,理发师打瞌睡
if(sleeping==0)
sleeping=1;
}
6.2参考文献
[1]郁红英,李春强.计算机操作系统.北京:
清华大学出版社,2008
[2]孟庆昌.操作系统.北京:
电子工业出版社,2009
[3]汤子瀛,哲凤屏.计算机操作系统.北京:
[4]尤晋元,史美林等.windows操作系统原理.北京:
机械工业出版社,2001
[5]孟静.计算机操作系统原理教程.北京:
清华大学出版社,2005
[6]广树建.新编C/C++程序设计教程.广州:
华南理工出版社,2008
7评分表
计算机与通信学院课程设计评分表
课程名称:
操作系统
项目
评价
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期: