linux课程设计

2025-06-01 07:15:29

小编刚写完一课程设计,现和大家分享下

PV实现同步与互斥

一、需求分析

本程序的功能是:模拟车站售票厅内进程同步问题,售票厅任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待。每个购票者可看成一个进程。

功能的互斥与同步的实现:

1.当有乘客进入售票厅购票时,售票员不能下班(进程的互斥);

2.当没有乘客购票时,则售票员下班(进程的互斥);

3.乘客进入购票时,售票员给予售票(进程的同步)。

二、功能设计

本程序的设计思路和原理比较简单,由两个过程来实现售票员与乘客购票之间的过程。

1.售票员的操作过程

一开始时,设定当前售票厅内的人数为20,然后根据当天售票员到班情况来选择售票员上班的人数,由于过程和操作相似,故这里选择的售票员人数为0,1,2。

①当选择售票员为0时,则提示当天没有售票员上班,本售票站不进行售票操作;

②当选择的售票员为1时,则提示当天只有一个售票员上班,故每次只能对一个人进行售票操作;

③当选择的售票员为2时,则提示当天有两个售票员上班,故每次能同时对两个人进行售票操作。

2.乘客购票操作过程

①乘客先在售票厅外等候排队购票;②当提示售票厅内人数不足20人时,则按排队顺序进入售票厅内进行购票动作;③乘客购票完后则离开售票厅内。

3实现过程具体分析

①由于程序中的售票厅最大只能容纳20个人,所以,当售票厅内的人数进入超过20时,则程序会提醒用户必须减少到人数小于等于20,不然程序不执行下去;

②当进入售票厅内的人数与售票厅里原先的人数之和不足20时,会提醒用户,售票厅内还能容纳具体的人数;

③若在售票员处理完当前购票者的操作后,售票厅里人数为零;则售票员当天的售票任务结束,不再进行售票(这里只考虑这一理想情况)。

④当天如果选择的售票员上班人数为0时,则当天不进行售票操作。

三、功能实现过程

1.设置两个私有信号量:spys、ck,分别是售票员和乘客的。乘客的私有信号量初始值设为ck=0,售票员的初始值设为spys=1,以此来表示乘客的购票和售票员的售票操作的初始状态,当没有售票员时,则不能进行售票,当有乘客时,则售票员不能拒绝售票(这里排除票已售完的情况)。

1.实现流程图

2.售票员与乘客之间的过程

这里是实现P、V操作

Begin

SemaphoreSpys,ck;//设置售票员与乘客的私有信号量

Spys=1,ck=0;//初始化信号量

cobegin

intspy;//售票员人数

process售票员//售票员执行的过程

begin

switch(spy){//选择售票员人数;

Case0:gotoS0;

Case1:gotoS1;

Case2:gotoS2;

}

S0:return0;//无售票员上班,乘客无法购票;

End

S1:intP1(spys);//P操作

Hello();//自定义的一个无返回值函数

售票操作;

售票结束;

提示下一位购票者;

IntV1(ck);//V操作

排队等候进入售票大厅内;

进入厅内排队等候购票;

购票后,离开售票大厅;

GotoS1;

End

S2:intP2(spys);//P操作

Hello();//自定义的一个无返回值函数

售票操作;

售票结束;

提示下一位购票者;

IntV2(ck);//V操作

排队等候进入售票大厅内;

进入厅内排队等候购票;

购票后,离开售票大厅;

GotoS2;

End

四、程序结构

1.程序使用的头文件和宏

#include<stdio.h>

#include<stdlib.h>

#include<windows.h>

#defineMAX20//厅内最大能容纳的人数

2.程序使用的函数和全局变量

intspys=1;//售票员的私有信号量

intspy;//选择售票员的人数,最多只能有两个

intck=0;//厅内购票者私有信号量

intn=MAX;

intx;//每次进入售票厅内的人数

intP1();//定义P操作函数,一个售票员执行的过程

intP2();//定义p操作,两个售票员执行该过程

intj=0;//人多时,减少的人数

intV1();//V操作函数,一个售票窗口时购买者执行的过程

intV2();//V操作函数,两个售票窗口时购买者执行的过程

voidHello();//输出客套语句

voidIntroduce();//本售票站人员介绍

3.主函数

intmain()

{

Introduce();

printf("请输入今天上班的售票员人数:(最多2位):\n");

scanf("%d",&spy);

switch(spy){

case0:{printf("sorry!由于今天假日,所以售票员不上班,请各位乘客改乘其他交通工具!\n");break;}

case1:{printf("今天就一个窗口售票哦!请乘客们排成一队!谢谢合作!\n");P1();break;}

case2:{printf("今天有两个售票窗口啦!请乘客们按顺序排成两队!谢谢合作\n");P2();break;}

default:{printf("本站员工有限,没有多余员工哦!");break;}

}

return0;

}

4.售票员操作过程

intP1()//一个售票窗口时执行的过程

{

spys--;//p操作

if(spys==0)

{

Sleep(4000);

printf("20B506客运站欢迎各位乘客来乘坐本公司的汽车!祝你旅途愉快!\n");

Sleep(4000);

n--;

Hello();

Sleep(5000);

printf("当前购买者完成购票,请下一位购票者就绪\n");

Sleep(4000);

printf("当前售票厅内人数为%d\n",n);

ck++;//v操作

}

else

spys++;

V1();

return0;

}

5.乘客购票操作过程

intV1()//顾客的执行过程

{

ck--;//相当于p操作

if(ck==0)

{

printf("请厅外的购票者排按顺序进入购票厅内(最多能进入人数为:%d):\n",MAX-n);

scanf("%d",&x);

n=n+x;

printf("售票厅内人数为%d",n);

if(n>MAX){

printf("人数太多了,站不住脚呀!请出去一些人到售票厅外等候吧!\n");

printf("请输入出去的人数:\n");

scanf("%d",&j);

while(j>n-MAX){

printf("还可以再进来些人哦!!");

printf("请在厅外等候的乘客进入售票厅内吧:\n");

scanf("%d",&j);

}

n=n-j;

printf("售票厅内人数为%d",n);

}

if(n==0){

printf("可以下班了,售票员们,你们辛苦了\n");

return0;

}

}

//printf("\n厅内排队人数为%d,请厅外购票者们耐心等候,谢谢合作\n",n-1);

if(n>=20)

printf("已经达到最大人数,请厅外的乘客耐心等候!谢谢合作\n");

else

printf(",本售票厅内可容纳最多20人数!,还可再进入%d人。\n",MAX-n);

Sleep(4000);

spys++;//执行v操作

P1();

return0;

}

6.Hello函数

voidHello()//sayhello

{

printf("售票厅内能容纳最多的人数为20人,请乘客们按顺序在厅外等候!谢谢合作!\n");

}

voidIntroduce()

{

system("color4e");

printf("------------------------------欢迎来到20B506客运站-----------\n");

printf("-----站长:雅布珊-----\n");

printf("----------副站长:vivien----\n");

printf("--------------售票员甲:胖哥------\n");

printf("-------------------售票员乙:忠哥-----\n");

printf("----------------------------------我们的服务就是最好的承诺!\n");

printf("\n");

printf("\n");

printf("\n");

printf("\n");

printf("\n");

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
相关推荐
猜你喜欢