Linux高级编程银行排队系统模拟-文档
银行排队模拟
printf("***************************************\n");
}
//获取最短队列的编号
int MinQueue()
srand((unsigned)time(NULL));//设置随机种子
Bank_Simulation();//银行模拟排队
CloseForDay();
return 0;
}
/*******************银行排队操作函数***************************************/
}
//得到用户输入银行关闭时间
printf("请输入银行运营时间(小时):");
scanf("%f",&CloseTime);
//多个空队列
for(i = 0; i < windows_num; i++)
InitQueue(&q[i]);//初始化windows_no个窗口队列
int QueueTraverse(LinkQueue *Q);//遍历队列Q
//排队主操作函数
int MinQueue();//获取最短队列的编号
void OpenForDay(); //初始化操作
void CustomerArrived();//顾客达到事件
void CustomerDepature();//顾客离开事件
if(a[i] < a[min]){
循环队列-----银行排号叫号系统模仿
循环队列-----银⾏排号叫号系统模仿运⽤知识:循环队列的顺序存储下⾯是⽂件运⾏成功的样式展⽰1 #include<stdio.h>2 #include<stdlib.h>3#define FALSE 04#define ERROR 05#define OK 16#define TRUE 17#define MAXSIZE 6 //队列的长度8 typedef int Elem;9 typedef int Status;10/*11这⾥似乎没⽤到GetHead(),QueueEmpty()这两个函数,但是我还是定义了12*/13//队列的顺序存储结构14 typedef struct15 {16 Elem data[MAXSIZE];17int front;18int rear;19 }Sq;2021int IsInit = FALSE;//这个是⽤来判断是否初始化,即主函数中⽤来要求先输⼊0(即先选上班,不然队列没有初始化);22//队列的初始化,即将队列的头尾指针都等于0;23void Init(Sq &S)24 {25 S.front = 0;26 S.rear = 0;27 IsInit = TRUE;28 }29//⼊队列,注:⼊队列时会空出⼀个数组位置,⽅便尾指针的指向,所以这也是判断队满时为什么尾指针要加130 Status EnQueue(Sq &S,Elem num)31 {32if((S.rear+1)%MAXSIZE==S.front) return ERROR;//判断是否栈满,即尾指针后移⼀位与头指针相逢,队列就满了33 S.data[S.rear] = num; //存数34 S.rear = (S.rear+1)%MAXSIZE; //队尾指针后移35return OK;36 }37//出队列38 Status DeQueue(Sq &S,Elem &e)39 {40if(S.front == S.rear) return ERROR;//判断队空,当队头指针遇到队尾指针,队空41 e = S.data[S.front]; //队头元素赋值给e42 S.front = (S.front+1)%MAXSIZE;//队头指针后移43return OK;44 }45//获得队列的长度46int getLen(Sq S)47 {48return (S.rear+MAXSIZE-S.front)%MAXSIZE;//返回队列的长度49 }50//获得队列的头元素51 Status GetHead(Sq S,Elem &e)52 {53if(S.rear == S.front)54return ERROR;55else{56 e = S.data[S.front];57return OK;58 }59 }60//判断队空61 Status QueueEmpty(Sq S)62 {63if(S.front==S.rear) return ERROR;64else65return OK;66 }67//判断队满68 Status QueueFull(Sq S)69 {70if((S.rear+1)%MAXSIZE==S.front)71return ERROR;72else73return OK;74 }75int main()76 {77 Sq S;78int n,num=0;79 Elem e;8081while(1)82 {83 printf("---------------银⾏叫号系统-----------\n");84 printf("--------------------------------------\n");85 printf("1.上班\n");86 printf("2.排号\n");87 printf("3.叫号\n");88 printf("0.下班\n");89 printf("---------------------------------------\n\n");9091 scanf("%d",&n);92switch(n)93 {94case0:if(!IsInit)95 {96 printf("要先开始上班才能下班哦!!\n\n");97break;98//为什么要有这个判断呢,因为队列要初始化,这⾥其实可以不做判断 99 }100if(!QueueEmpty(S))101 {102 printf("下班啦,可以回家了\n\n");103return0;104 }else105 {106 printf("还有业务没有完成,暂时不能下班!!\n\n");107break;108 }109case1:110 Init(S);111 num = 0;112 printf("⼀切准备就绪,开始上班\n\n");113break;114115case2:116if(!IsInit)117 {118 printf("要先开始上班,请做好⼯作准备!!\n\n");119break;120//为什么要有这个判断呢,因为队列要初始化121 }122if(QueueFull(S))123 {124//如果队列没满,就⼊队列125 EnQueue(S,++num);126 printf("当前是%d号,前⾯有%d位\n\n",num,getLen(S)-1);127break;128 }else129 {130//如果队列满了131 printf("⼈已满了!!请耐⼼等待\n\n");132break;133 }134case3:135if(!IsInit)136 {137 printf("新的⼀天开始了\n要先开始上班,请先做好准备!!\n\n");138break;139//为什么要有这个判断呢,因为队列要初始化140 }141if(DeQueue(S,e))142 {143//如果队列没空,就可以出队列144 printf("%d号业务办理成功!还有%d⼈在等待!\n\n",e,getLen(S));145break;146 }else147 {148//如果队列空了149 printf("当前没有⼈办理业务!!\n\n");150break;151 }152default :153 printf("⽆效操作请重新输⼊\n\n");154break;155156 } 157 } 158 }。
银行排队叫号系统设计实验报告(范本模板)
2011年至2012年第一学期《银行排队叫号系统设计》课程设计班级1006402指导教师涂立、李旎学生人数 3设计份数 12011年12月23日银行排队叫号系统设计报告一.设计时间2011年12月 19日——---12月23日二.设计地点湖南城市学院实验楼计算机机房三.设计目的1.进一步熟悉和掌握单片机的结构及工作原理。
2.掌握单片机的接口技术及相关外围芯片的外特性,控制方法。
3.通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,详细使用Protel软件绘制原理图的过程.4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
四.实验成员及分工五。
指导老师涂立副教授、李旎讲师.六.设计课题设计一个银行排队叫号系统。
理由: 1、系统原理容易理解,更贴近我们的生活。
2、怎个系统简洁明了,适于初学者。
3、能提高我们的综合应用能力。
七.基本思路及关键问题的解决方法用八个二极管表示客户取号的号码和营业员准备给那位客户办理业务的号码,用二进制表示,亮的二极管表示0,灭的二极管表示为1 。
开关KEY为客户取号码是所用,KEY闭合时八个二极管的亮灭顺序就是客户的号码。
开关KEY1,KEY2,KEY3,KEY4是分别在四个营业窗口,其中任意一个按下,八个二极管的亮灭会显示一个号码,此号码对应要办理业务客户的号码,与此同时蜂鸣器也会提醒客户。
八.算法及流程图算法:程序利用循环结构检测整个系统中的客户端和叫号端是否有按键被按下,如果检测到有按下的信号,首先判断按下按键的端口的类型,然后相应的计数变量加一,并把计数变量的信息以二进制的形式传送到相应的端口;如果没检测到按下信号,程序则跳入下一个循环继续检测按键信息。
表1 元件清单芯片晶振发光二级管电容电源按键蜂鸣器导线P87C52X2BN11.0592MHZLED10uf、30pf5V非自锁式1183181若干图1。
银行排队叫号系统原理图图2. 银行排队叫号系统流程图九、调试过程中出现的问题及相应解决办法1.开打keil软件,建立一个新工程单击【Project】在下拉菜单中找到【New project。
银行排队叫号系统需求分析设计文档(含5篇)
银行排队叫号系统需求分析设计文档(含5篇)第一篇:银行排队叫号系统需求分析设计文档银行排队叫号系统的分析与UML建模一、需求分析近年来,由于各行各业的信息化、智能化建设越来越普及,整个社会对各个行业的办事效率的要求也越来越高。
例如像银行办业务,在顾客办业务过程中排队现象在所难免,为了在排队时减少顾客的等待时间,为顾客办业务创造一个良好的环境,银行排队叫号系统应运而生。
银行排队系统的功能性需求包括以下内容:1、排队系统可以分为票务打印系统和窗口操作系统。
2、票务打印系统(1)显示发号机上的显示屏使用液晶显示,显示对待办业务的选择;(2)输入输入过程即通过触摸屏对业务进行选择的过程;(3)输出打印号票打印内容应该包括业务名称、排队号码、时间等;3、窗口操作系统基本包括显示屏、语言提示,叫号按钮(1)显示屏使用点阵式LED显示,显示内容应该是下一个号码以及办理业务窗口;(2)语音提示语音播报时用语音的形式通过广播或者音箱给人一提示信息。
语音提示不需要用户一直盯着提示屏或者排队情况。
选择使用语音芯片,实现的功能应该是当操作员按下按钮后,语音播放下一个办理者的票号。
(3)叫号按钮设置叫号按钮,以便于操作员控制窗口模块的显示屏及语音提示。
满足上述需求的系统主要包括以下几个小的系统模块:(1)派号功能模块。
派号功能模块主要是用于在用户进入服务大厅后,根据自己的业务需要,通过自助式触摸屏号票机领取票号;或者用户在服务大厅业务咨询台进行业务咨询后,咨询员可以为用户打印排队号票。
号票是由排队服务器根据当前情况自动生成。
(2)叫号功能模块。
工作人员可以通过座席软件键盘上的设置键对客户进行叫号;也可通过按键控制器对客户进行叫号;系统可以设置单语或双语进行语音播放;以及通过LED显示屏和其它视频显示设备显示票号。
(3)预约功能模块。
用户可以通过电话预约领取排队号;预约成功后取得预约号;系统将此预约号按预约时间插入当前的排队队列,在系统处理后进行优先呼叫;在同时间下办理业务时,可以进行预约服务,优先办理。
银行排队模拟系统实验报告
TextBox3.Text = TextBox3.Text &"G-"& waibi(c)
TextBox3.Text = TextBox3.Text & vbCrLf
c = c + 1'排在号窗口,并将其号码显示在文本框输出
测试11:
某窗口排对人数超过25人。
(二)遇到的问题和解决方法:
问题1:
当2号、3号窗口同为空时,排在1号窗口的第一为客户的编号会出现在2号、3号两个窗口中。
方法:
经分析,这是由于没有考虑两个窗口的优先级所致,于是我设置办理理财业务的2号窗口的优先级高于办理外币业务的3号窗口。当两窗口同为空时,先给2号窗口分配客户,之后,若1号窗口仍有人排队,再分配给3号窗口。
3、显示排队情况:将客户的编号、所排窗口、所在队伍位置显示在应用程序界面上,模拟排队情况。
4、刷新队伍:每位客户业务办理结束后,工作人员提醒下一位客户,当2号窗口、3号窗口业务办理结束且1号窗口仍有人在办理业务,则将在1号窗口前排队的客户分配到2号窗口、3号窗口去。分配方法是:当2、3窗口同时为空时,先分配给2号窗口,若此时仍有客户在1号窗口排队,则再分配给3号窗口。
7、Button3_Click
退出程序。
8、Timer6_Tick
2号窗口为空,且1号窗口仍有人排队,将排在1号窗口的第一位客户转到2号窗口办理业务。
1号窗口排队人数小于25人时,撤销提示信息,恢复个人业务的办理。
3个窗口均为空,退出程序。
9、Timer5_Tick
3号窗口为空,1、2号窗口均不空,将排在1号窗口的第一位客户转到3号窗口办理业务。
模拟银行排队取号系统_命令行版_代码
Win[3].IsVIP = 0;
Win[3].WindowState = WaitWin;
Win[4].IsVIP = 0;
Win[4].WindowState = WaitWin;
Win[5].IsVIP = 0;
Win[5].WindowState = Unopen;
struct VIPInformation VIPInfo; //VIP客户资料
struct WINDOWS Win[8]; //8个窗口编号0-7
int MaxSeqLen;//单队列最大允许等待长度
int MinSec;//单业务办理最短时长
int MaxSec;//单业务办理最长时长
int MinRestSec;//窗口休息最短时长
Win[i].sum = 0;
Win[i].timeSum = 0;
Win[i].appraise = 0;
Win[i].restLater = 0;
}
WinCount=3;
VIPWinCount=1;
//读取常量
fscanf(file, "%d", &MaxSeqLen);
fscanf(file, "%d", &MinSec);
printf("VIP number:%d\n",VIPInfo.num);
printf("VIP account:%d\n",VIPInfo.account);
break;
}
}
turn=turn+1;
fclose(fVIP);
}
数据结构课程设计(银行排队系统)
(贵州大学计算机科学与信息学院贡献)#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <conio.h>#include <time.h>#define n 3int vip1=0;int y,z;float sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;float i1=0,i2=0,i3=0,i4=0,i5=0;float ave1=0,ave2=0,ave3=0,ave4=0,ave5=0;struct List{int A[n+1]; //顾客用来办理业务的N个窗口int len; //表示数组中的元素个数}L;struct Lnode{ //链表结点类型int data;Lnode *next;};struct Linkqueue{ //链式存储的等候队列的类型定义Lnode *front;Lnode *rear;}Q;void Initshuzu() //初始化线性的算法{for(int i=1;i<=n;i++)L.A[i]=0; //元素值为0,表示编号为I的窗口当前状态为空L.len=0;}void Initqueue() //初始化队列的算法{Q.front=Q.rear=(Lnode *)malloc(sizeof(Lnode));Q.front->next=NULL;}void Enqueue(Linkqueue *Q,int elem) //进队算法{Lnode *s;s=(Lnode *)malloc(sizeof(Lnode));s->data=elem;s->next=NULL;Q->rear->next=s;Q->rear=s;}int Dlqueue(Linkqueue *Q) //出队算法{Lnode *t;int x;if(Q->front==Q->rear){printf("队列为空!\n");exit(1);}else{t=Q->front->next;Q->front->next=t->next;x=t->data;free(t);return x;}}void printl() //输出数组算法{int i;printf("正在办理业务的顾客编号为:一号柜台二号柜台三号柜台\n");printf(" ");for( i=1;i<=L.len;i++){printf("%d号客户",L.A[i]);}printf("\n");}void print2() //输出队列算法{ int i=0;printf("正在等候办理业务的顾客编号为:");Lnode *s=Q.front->next;while(s!=NULL){printf("%d ",s->data);s=s->next;}printf("\n您的前面一共有%d人在排队,请您稍候!",i);printf("\n");}void daoda(int x) //解决顾客到达事件算法{int i=L.len+1;if (L.len<n) //{ L.A[i]=x;i++;L.len++;}elseEnqueue(&Q,x);}void likai(int x) //解决顾客离开事件算法{int i=0;do{if(x>L.len){printf("输入有误!\n请重新输入:");scanf("%d",&x);}elsefor(i=0;i<=L.len;i++){if(i==x){printf("尊敬的%d号顾客您好!\n",x);L.A[i]=0;L.len--;if(Q.front!=Q.rear){int y=Dlqueue(&Q);L.A[i]=y;L.len++;}}}while(i==0);}int guitai( ) //判断输入的柜台号是否正确{int y=0;printf("请输入你所办理业务的柜台号(1-3):\n");scanf("%d",&y);if(y<1||y>5){printf("你输入的柜台号有误,请重新输入!\n");printf("请输入你所办理业务的柜台号(1-3):\n");scanf("%d",&y);}elseprintf(" 你所办理业务的柜台为%d.\n",y);return y;}int pingfeng( ) //判断输入的分数是否正确{int y=0;printf("请输入你评分(1-5):\n 1分…………非常不满意;\n 2分…………比较不满意;\n 3分…………一般满意;\n 4分…………比较满意;\n 5分…………非常满意。
计算机仿真大赛作品—银行排队系统
建立模型
算法设计
编程
输出界面
顾客进来
分配顾客办理业务随机 时间t 分配下一顾客达到间隔 随机时间t0
•随机时间t1[0] •随机时间t1[1] •随机时间t1[2] 。 。 。 。
•随机时间t2[0] •随机时间t2[1] 。 。
•随机时间t3[0] 。 。
•随机时间t4[0] •随机时间t4[1] 。 。 。
(一)选择主题 假设某银行有4个对外业务办理窗口,从早 晨银行开门起不断有客户进入银行,由于每 个窗口某个时刻只能接待一个客户,因此在 客户人数众多时需要在每个窗口进行排队, 对于刚进入银行的客户,如果某个窗口空闲 ,则可立即上前办理业务;否则,就排在人 数最少的队伍后面。请模拟银行一天的业务 情况并统计客户在银行的平均停留时间。
部分 代码
document.getElementById("td00").innerHTML="";
document.getElementById("td01").innerHTML=""; if(currenttime==(t0-t)*3600) end();
}
建立模型
算法设计
编程
输出界面
部分 代码
输出界面
部分 代码
body{ padding-left:0; padding-top:0; padding-bottom:0; paddingright:0; background-image:url(bj.gif); background-repeat:repeat; } #table{ padding-top:0px; padding-left:0; padding-right:0; padding-bottom:0; } #table1{ width:810px;height:800px; border:#FFF solid 4px; }
数据结构——银行排队系统模拟(C语言)
数据结构——银⾏排队系统模拟(C语⾔)程序最终⽬的:获得所有客户在银⾏营业期间停留的平均时间程序初始值:默认第⼀个⽤户到达的时间为(0,0)#include <stdio.h>#include <stdlib.h>#include <time.h>/**使⽤队列模拟银⾏排队系统,并计算客户在银⾏停留的平均时间*问题1:银⾏已到达关闭时间,但是还有客户正在窗⼝处理问题(涉及到客户离开事件)*问题2:功能还未完全测试。
*问题3:代码未优化*version1:随机数版本(使⽤随机数产⽣客户数据)*待完成版本:数组版本(version);⽂件版本(version)*/#define USE_TIME 30 //客户在银⾏停留的最⼤时间#define NEXT_TIme 5 //下⼀个客户到达的最⼤间隔时间typedef struct E_list //有序表结点{int cur_time; /*记录当前时间*/int E_type; /*记录事件类型*/struct E_list* next; /*指针域*/} E_List,*EvenList;typedef struct Q_node //队列结点{int arrive_time; /*记录客户达到时间*/int dur_time; /*记录客户在银⾏停留时间*/struct Q_node* next; /*指针域*/} Q_Node,*QueueNode;typedef struct E_queue //队列操作结构{QueueNode front; /*指向队⾸元素*/QueueNode rear; /*指向队尾元素*/int length; /*记录队列长度*/} E_queue,*Win_Queue;int totalTime; /*记录总时间*/int allcustomer; /*记录客户数量*/int closetime; /*设置关闭时间*/E_List ev; //有序表头节点E_queue e_q[4]; //窗⼝队列操作结构void enter_List(EvenList new_E) //进⼊有序表{EvenList agent = ev.next; //代理指针指向第⼀个元素EvenList pre_E =&ev; //代理指针指向头结点while(agent!=NULL && (new_E->cur_time > agent->cur_time)) //找到元素的插⼊位置{pre_E = agent;agent = agent->next;}if(agent == NULL) /*插⼊到表尾*/{pre_E->next = new_E;}else /*插⼊到⾮表尾位置*/{new_E->next = agent;pre_E->next = new_E;}agent = ev.next;while(agent!=NULL) /*进⾏表的遍历*/{printf("(%d,%d)\n",agent->cur_time,agent->E_type);agent = agent->next;}printf("\n\n");}void out_List(EvenList Event) //出有序表{/*记录待删除结点的数据后,释放该结点*/EvenList temp = ev.next;Event->cur_time = temp->cur_time;Event->E_type = temp->E_type;Event->next = NULL;ev.next = temp->next; //出有序表节点printf("%p\n",temp->next); //测试语句printf("待处理客户:(%d , %d)\n",temp->cur_time,temp->E_type); /*测试语句*/free(temp); /*释放待删除结点*/}void en_Queue(Win_Queue q, QueueNode new_node) //进⼊指定队列{/*将元素加⼊到队列末尾,并增加队列长度*/q->rear->next = new_node;q->rear = new_node;q->length++;}void DeQueue(Win_Queue q,QueueNode node) //出队列{/*记录待出队列结点的数据,释放该结点后,队列长度减⼀*/QueueNode temp = q->front->next;q->front->next = temp->next;q->length--; /*队列长度减⼀*//*存储待删除结点的数据*/node->arrive_time = temp->arrive_time;node->dur_time = temp->dur_time;node->next = NULL;}void openforday() //初始化数据{int i;EvenList temp;QueueNode temp_q;totalTime = 0; /*初始化时间记录器*/allcustomer = 0; /*初始化顾客记录器*/closetime = 5; /*初始化银⾏关闭时间*/temp = (EvenList)malloc(sizeof(E_List));if(temp == NULL){printf("memory is failure!\n");exit(1);}temp->cur_time = 0;temp->E_type = 0;temp->next = NULL;ev.next = temp; /*将第⼀个客户数据(0,0,)加⼊到事件表*/for(i=0; i<4; i++) //为每⼀个窗⼝队列设置头节点{temp_q = (QueueNode)malloc(sizeof(Q_Node));if(temp_q == NULL){printf("memory allocate is failure!\n");exit(1);}temp_q->next = NULL;e_q[i].front = temp_q;e_q[i].rear = temp_q;e_q[i].length = 0; /*初始化队列长度*/}}void Even_head(EvenList E) //得到有序表的第⼀个客户{/*获得事件表第⼀个元素的副本*/E->cur_time = ev.next->cur_time;E->E_type = ev.next->E_type;E->next = NULL;}void arrive_Event() //处理客户到达事件{/***系统产⽣两个随机数(x,y),x表⽰当前窗⼝type = 0的⽤户在银⾏的停留时间*y表⽰下⼀个客户与上⼀个客户的间隔时间。
数据结构银行业务活动的模拟-无删减范文
数据结构银行业务活动的模拟数据结构银行业务活动的模拟概述本文档旨在通过模拟银行业务活动来演示数据结构的实际应用。
我们将使用数据结构来模拟客户进入银行办理业务的过程,并展示如何使用队列和链表等数据结构来管理顾客的排队和办理。
需求分析银行作为金融机构,每天都会面临大量的客户办理各种业务,这些业务包括存款、取款、转账等。
为了提高服务质量,我们需要设计一个系统来模拟客户办理业务的过程,并按照先来先服务的原则来管理客户的排队。
设计思路我们将使用两种数据结构来实现银行业务活动的模拟:队列和链表。
队列用于管理客户的排队顺序,链表用于记录客户的业务信息。
队列队列是一种特殊的线性数据结构,遵循先进先出(FIFO)的原则。
我们将使用队列来管理客户的排队顺序。
链表链表是一种常见的数据结构,由节点(node)组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
我们将使用链表来记录客户的业务信息和维护客户之间的连接关系。
功能设计1. 添加客户:当顾客进入银行办理业务时,将其添加到排队队列中。
顾客的信息将作为节点添加到链表中。
2. 办理业务:从队列中取出排在最前面的客户,根据其业务类型进行相应的办理。
完成业务后,将该客户从队列和链表中删除。
3. 查询客户:根据客户的某些信息,例如姓名或账号,从链表中查找并显示客户的详细信息。
实现代码示例```python定义客户类class Customer:def __init__(self, name, account_number, transaction_type):= nameself.account_number = account_numberself.transaction_type = transaction_type 定义节点类class Node:def __init__(self, data):self.data = dataself.next = None定义队列类class Queue:def __init__(self):self.front = Noneself.rear = Nonedef is_empty(self):return self.front is Nonedef enqueue(self, data):new_node = Node(data)if self.is_empty():self.front = new_nodeself.rear = new_nodeelse:self.rear.next = new_node self.rear = new_nodedef dequeue(self):if self.is_empty():return Nonedata = self.front.dataself.front = self.front.next if self.front is None:self.rear = Nonereturn data定义银行类class Bank:def __init__(self):self.queue = Queue()self.customers = []def add_customer(self, name, account_number, transaction_type):customer = Customer(name, account_number, transaction_type)self.customers.append(customer)self.queue.enqueue(customer)def process_transaction(self):if not self.queue.is_empty():customer = self.queue.dequeue()处理客户的业务逻辑self.customers.remove(customer)print(f\。
c++版模拟银行窗口排队叫号系统
c++版模拟银行窗口排队叫号系统c++版模拟银行窗口排队叫号系统看了两位LZ的银行排队系统blog,感觉不错,就也产生了用C++写个排号系统,原因有二,1、对Java不太熟悉,没有看太懂。
2、练练手。
3、提高一下C++的人气。
进入主题:对于这一块的业务系统需求没有做过多的分析,只在两位LZ的基础做了小小的改动,然后用C++实现。
题目:模拟实现银行业务调度系统逻辑,具体需求如下:银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP 窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为:VIP客户:普通客户:快速客户= 1 :6 :3。
客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
修改:1、在这里为了简化程序的设计(只省了只行代码),FAST和VIP窗口只办理对应的客户,不办普通客户的业务。
2、由于对于客户的到来,也采用1S来一个的做法,但因为在console程序对于时间不太好控制,在这里只是设定了客户数,即每个1秒来一个客户,根据来的客户数控制时间。
开发环境:Linux代码:文件constances.h该文件中定义了一些常量,其中MAX_WAITING_CLIENT_NUM指的是,最多正在等待的客户数,如果客户数到达最大,后来的客户将会离开。
Linux操作系统利用信号量实现银行叫号排队系统
Linux操作系统课程设计题目:进程通信与进程同步机制实践(银行叫号排队模拟系统)所在学院:所在班级:学生姓名:学生学号:指导教师:一、题目某银行提供5个服务窗口(3个对私服务窗口,1个对公服务窗口,1个理财服务窗口)和10个供顾客等待的座位。
顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号;若没有空座位,则在门外等待或离开.取号机每次仅允许一位顾客使用,有对公、对私和理财三类号,每位顾客只能选取其中一个.当营业员空闲时,通过叫号选取一位顾客,并为其服务。
请用P、V操作写出进程的同步算法。
二、目的1、掌握基本的同步与互斥算法。
2、学习使用 Linux 中基本的同步对象,掌握相关 API 的使用方法。
3、了解 Linux 中多任务的并发执行机制,实现进程的同步与互斥。
三、实验环境Linux CentOS、Ubuntu、Fedora等Linux系统编译器GCC编程语言 C语言四、要求1、当有顾客取号的时候,不允许其他顾客取号。
2、当服务窗口满的情况下,其他人必须等待.3、当没有顾客的情况下,服务窗口必须等待。
4、打印:A、初始状态B、中间变化的状态信息C、以及最终状态信息。
五、原理及算法本程序中设计6个信号量,其中signal_A、signal_B和signal_C分别是对私、对公、理财窗口的同步信号量。
若信号量值的等于0,说明当前没有空闲空口,顾客需要等待。
另设置一个signal_seat同步信号量,记录当前的座位情况,若该信号量等于0,说明当前没有空座位,顾客需要等待。
另有一个signal_customer同步信号量用于记录当前已经取过票的总人数,用于生成票号信息。
还有一个mutex互斥信号量,用于实现各进程在对信号量进行操作时的互斥。
顾客进入银行之后,先看通过一个依据系统时间的随机数来确定自己是需要对私、对公还是理财服务(在本程序中分别对应于A类顾客,B类顾客和C类顾客),这三个类型的顾客的比例为3:1:1.然后顾客根据自己需要的服务类型,查看提供相应类型服务的窗口是否空闲,若窗口有空闲,则系统直接按照signal_customer记录的信息,生成票面信息;若窗口没有空闲,则再去查看signal_seat信号量看看是否有空座位,若有空座位,则根据signal_customer 记录的信息,生成票面信息;若没有空座位,则通过一个以系统时间为种子的随机数生成器生成一个随机数,帮助顾客确定是要继续等待还是离开,这两种情况的比例为1:1.若顾客选择离开,则相应的进程退出.当顾客取到票后,便开始查看对应类型的窗口是否有空闲,如果有空闲,则上前办理业务。
数据结构_银行排队问题
/*某银行营业厅共有6个营业窗口,设有排队系统广播叫号,该银行的业务分为公积金、银行卡、理财卡等三种。
公积金业务指定1号窗口,银行卡业务指定2、3、4号窗口,理财卡业务指定5、6号窗口。
但如果5、6号窗口全忙,而2、3、4号窗口有空闲时,理财卡业务也可以在空闲的2、3、4号窗口之一办理。
客户领号、业务完成可以作为输入信息,要求可以随时显示6个营业窗口的状态。
*/1.源程序#include<stdio.h>#include<stdlib.h>#define MAXSIZE 10;typedef struct Peo{struct Peo *next;}PeoNode;typedef struct{PeoNode *head;PeoNode *rear;int length;}LQueueBank;LQueueBank InitQueue(LQueueBank *W){W->length = 0;W->head = (PeoNode *)malloc(sizeof(PeoNode));if(W->head!=NULL){W->head->next=NULL;W->rear=W->head;}return *W;}void InLCK(LQueueBank *A, LQueueBank *B,LQueueBank *C){if(B->length < 2){B->length++;printf("办理中\n");}else if(C->length < 3){C->length++;printf("办理中\n");}else{printf("请等待\n");A->length++;A->rear = A->rear->next;}}void InGJJ(LQueueBank *A, LQueueBank *B){if(B->length < 1){B->length++;printf("办理中\n");}else{printf("请等待\n");A->length++;A->rear = A->rear->next;}}void InYHK(LQueueBank *A, LQueueBank *B){if(B->length < 3){B->length++;printf("办理中\n");}else{printf("请等待\n");A->length++;A->rear = A->rear->next;}}void Leave(LQueueBank *A, LQueueBank *B,LQueueBank *C,LQueueBank *D,LQueueBank *E,LQueueBank *F){printf("请输入离开用户所在窗口\n");int yw;scanf("%d",&yw);switch(yw){case 1:{A->rear = A->head;A->length--;if(D->length > 0) {printf("请等待办理公积金的第一位用户来窗口1办理\n");InGJJ(D,A);}break;}case 2:case 3:case 4:{B->rear = B->head->next->next;B->length--;if(E->length > 0){printf("请等待办理银行卡的第一位用户来窗口%d办理\n",yw);InYHK(E,B);}else if (F->length > 0) {printf("请等待办理理财卡的第一位用户来窗口%d办理\n",yw);InLCK(F,C,B);}break;}case 5: case 6:{C->length--; C->rear = C->head->next;if(F->length > 0) InLCK(F,C,B);printf("请等待办理理财卡的第一位用户来窗口%d办理\n",yw);break;}default: printf("输入有误,请重试!\n");}}void PRINT(LQueueBank *A, LQueueBank *B,LQueueBank *C){if(A->length == 0) printf("1号窗口空闲中\n");else printf("1号窗口忙碌中\n");if(B->length == 0) printf("2号窗口空闲中\n3号窗口空闲中\n4号窗口空闲中\n");else if(B->length == 1) printf("2号窗口忙碌中\n3号窗口空闲中\n4号窗口空闲中\n");else if(B->length == 2) printf("2号窗口忙碌中\n3号窗口忙碌中\n4号窗口空闲中\n");else if(B->length == 3) printf("2号窗口忙碌中\n3号窗口忙碌中\n4号窗口忙碌中\n");if(C->length == 0) printf("5号窗口空闲中\n6号窗口空闲中\n");else if(C->length == 1) printf("5号窗口忙碌中\n6号窗口空闲中\n");else if(C->length == 2) printf("5号窗口忙碌中\n6号窗口忙碌中\n");}void main(){LQueueBank Wait1,Wait2,Wait3,Busy1,Busy2,Busy3; //1:公积金2:银行卡3:理财卡Wait1 = InitQueue(&Wait1);Wait2 = InitQueue(&Wait2);Wait3 = InitQueue(&Wait3);Busy1 = InitQueue(&Busy1);Busy2 = InitQueue(&Busy2);Busy3 = InitQueue(&Busy3);int ch = 0;while(1){printf("----------------------------------\n");printf("1. 办理业务");printf("2. 完成离开");printf("3. 退出");printf("0. 打印当前窗口状态\n");while(1){scanf("%d",&ch);if(ch>=0&&ch<=3) break;elseprintf("\n输入有误,请重试!");}switch(ch){case 0:{PRINT(&Busy1,&Busy2,&Busy3);break;}case 1:{printf("请输入业务种类1/2/3\n");printf("1. 公积金2. 银行卡3. 理财卡\n");int yw1;scanf("%d",&yw1);switch(yw1){case 1: {InGJJ(&Wait1,&Busy1);break;}case 2: {InYHK(&Wait2,&Busy2);break;}case 3: {InLCK(&Wait3,&Busy3,&Busy2);break;}default: printf("输入有误,请重试!\n");}break;}case 2:{Leave(&Busy1,&Busy2,&Busy3,&Wait1,&Wait2,&Wait3);break;}case 3:exit(0);default: break;}}}2.运行窗口截图:。
银行客户排队等候系统模拟
《数据结构》实验报告题目:银行客户排队等候系统模拟班级:姓名:学号:完成日期: 2012/4/161.问题描述客户到银行办理业务,需要取号排队等候。
客户分为VIP客户、理财客户、一般客户三种类型。
不同类型客户,取得不同的排队序号凭证,进入不同序列排队等候。
当服务窗口出现空闲时,按既定策略从三种类型客户中选取客户接受服务。
选取客户接受服务的策略如下:(1)三种类型客户的服务优先顺序从高到低依次为:VIP客户、理财客户、一般客户;(2)相同类型的客户采取先来先服务的原则;(3)当一般客户连续5次未被选中时,下一次优先选取一般客户接受服务。
用C语言编写程序,模拟上述操作过程。
2.需求分析(1)输入的形式和输入值的范围;输入的形式:提示的一些数字,若输入错误,系统将会提示用户重新输入。
输入值的范围:不为特殊的字母等。
(2)输出的形式;输出的形式:进入银行模拟系统。
VIP客户,理财客户,一般客户的排队号码。
每个客户接受服务的时间和次序。
退出银行模拟系统。
(3)程序所能达到的功能。
不同类型客户,取得不同的排队序号凭证,进入不同序列排队等候。
当服务窗口出现空闲时,按既定策略从三种类型客户中选取客户接受服务。
3.概要设计(1)队列的ADT定义:ADT Queue {数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 }数据关系:R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,…,n }约定an 端为队尾,a1端为队首。
基本操作:InitQueue(LinkQueue &Q);初始化客户排队队列EnQueue(LinkQueue &Q,int e);客户进入排队队列DeQueue(LinkQueue &S,int e);客户进入服务队列} ADT queue(2)系统中子程序及功能int EnQueue(LinkQueue &Q, int e){//使客户进入排队队列QNode *p;p = ( QueuePtr )malloc( sizeof(QNode) );if(!p){return OVERFLOW;};p ->data = e;p ->next = NULL;Q.rear ->next = p;Q.rear = p;return OK;};int DeQueue(LinkQueue &Q, int e){// 使客户从排队队列进入服务状态QNode *p;if(Q.front == Q.rear){return OVERFLOW;};p = Q.front ->next;e = p ->data;Q.front ->next = p ->next;if(Q.rear == p){Q.rear = Q.front;}free(p);return OK;};int InitQueue(LinkQueue &Q){ //使客户排队队列初始化Q.front = Q.rear = (QueuePtr)malloc (sizeof(QNode));if(!Q.front ){return OVERFLOW;};Q.rear->data=0;Q.front ->next = NULL;return OK;};(3)主程序及各程序模块(函数)之间的层次(调用)关系。
银行排队系统模拟
银⾏排队系统模拟#include#include#include#includeusing namespace std;extern int i=0; //i是最后到的客户编号extern int x=0;const int deposit=360,draw=240,drop=130,repay=420;//存款、取款、挂失、还贷不同业务所需时间struct Data//客户资料{int StaylTime;//客户在银⾏时间int CustomerNumber;//客户编号int TransactTime;//客户所办业务时间string ServiceName;//业务名int ServiceTab;//业务标号int ArrivalTime[3];//客户到达时间,ArrivalTime[0]是秒钟,ArrivalTime[1]是分钟,ArrivalTime[2]是时钟int LeaveTime[3];//客户离开时间int WindowNumbers;//窗⼝编号};class Bank{private:int WindowTotal[4][5]; //窗⼝总数long SumTime; //所有办理完业务客户总共所⽤时间int QueueTime; //最后两个客户间隔时间int WaitTime[4]; //每个窗⼝还需等待时间int s,f,m; //分别是时、分、秒int Wind[5]; //Wind[0]是空闲窗⼝数量,Wind[1/2/3/4]存放具体窗⼝名public:Bank(); //初始化Data Client[900]; //8⼩时内最多客户⼈数void RecordTime(Bank &); //记录时间int WindowsWait(int,int); //为客户排队void RecordArrival(int,Bank &);//记录客户到达时间void OutPut(int,int ,Bank); //输出客户数据void AverageTime(int,Bank); //计算平均时间void WindowDetail(); //输出窗⼝信息int RandomTime(Bank &); //求随机时间void ClientDetail(int,int,Bank);//选择客户编号void Choose(int,int,Bank); //选择查看内容void TodaySum(int,int,Bank);//显⽰今⽇客户量void WriteText(int,Bank);//⽂件函数操作};Bank::Bank()//构造函数{s=8;//时间(⼩时)f=0;m=0;QueueTime=0; //随机间隔时间SumTime=0; //所有客户在银⾏所⽤时间之和for(int i=0;i<4;i++){WaitTime[i]=0; //每个窗⼝处理剩下业务还需要的时间for(int j=0;j<5;j++)WindowTotal[i][j]=0; //每个窗⼝处理客户数}for(i=0;i<5;i++)Wind[i]=0; //Wind[0]是空闲窗⼝数量,Wind[1/2/3/4]存放具体窗⼝名}int Bank::RandomTime(Bank &Wait){QueueTime=rand()%360; //客⼈随机到达m=m+QueueTime; //m即为当地时间while(m/60>=1) //完成时间格式{m=m-60;f++;}while(f/60>=1){f=f-60;s++;}return s;}void Bank::RecordTime(Bank &wait) //记录银⾏时间{cout<<"您到达的时间是: ";if(s<10)cout<<"0"<else cout<if(f<10)cout<<"0"<else cout<if(m<10)cout<<"0"<else cout<}void Bank::AverageTime(int x,Bank wait)//计算所有客户的平均等待时间{long aver=0;//平均时间int fen=0,miao=0;//平均时间以分、秒表⽰int j;SumTime=0;for(j=0;j{SumTime=SumTime+wait.Client[j].StaylTime;//总共时间}aver=SumTime/(x);//计算fen=aver/60;miao=aver%60;cout<<"今⽇所有客户平均等待的时间为:"<}//求空窗⼝数int Bank::WindowsWait(int x,int i)//x是办理业务的客户数,i是最后⼀位顾客的编号,wait是主函数⾥定义的对象{int a,b=1,t=0;for(a=0;a<5;a++)//初始化窗⼝空闲信息Wind[a]=0;for(a=0;a<4;a++){WaitTime[a]=WaitTime[a]-QueueTime;//特定窗⼝处理还需的时间等于上次处理所需的时间减去随机等待时间if(WaitTime[a]<=0) //如果时间为负,重新赋值{WaitTime[a]=0;Wind[0]++; //空余窗⼝数Wind[b++]=a+1; //指出特定的空闲窗⼝}}t=Wind[0];b=1;while(x<=i && t>0) //窗⼝不空{WaitTime[Wind[b]-1]=WaitTime[Wind[b]-1]+Client[x].TransactTime;//特定窗⼝处理完业务所需时间等于处理完上次业务所需时间加上此次业务时间Client[x].LeaveTime[0]=m;//客户离开时的秒钟Client[x].LeaveTime[1]=f;//客户离开时的分钟Client[x].LeaveTime[2]=s;//客户离开时的时钟Client[x].StaylTime=Client[x].LeaveTime[0]-Client[x].ArrivalTime[0]+(Client[x].LeaveTime[1]-Client[x].ArrivalTime[1])*60+ (Client[x].LeaveTime[2]-Client[x].ArrivalTime[2])*3600+Client[x].TransactTime;//客户在银⾏等待时间WindowTotal[Wind[b]-1][0]++;//特定窗⼝处理的客户数WindowTotal[Wind[b]-1][Client[x].ServiceTab]++; //特定窗⼝处理的业务数b++;x++;t--;}return x;}void Bank::RecordArrival(int i,Bank &Custerm)//客户的到达时间{int j;for(j=0;j<3;j++)//初始化客户到达时间Custerm.Client[i].ArrivalTime[j]=0;Custerm.Client[i].ArrivalTime[0]=m;//为客户到达时间赋值Custerm.Client[i].ArrivalTime[1]=f;Custerm.Client[i].ArrivalTime[2]=s;}void Bank::OutPut(int x,int i,Bank Custerm)//输出客户信息{int sec,min,hour;sec=Custerm.Client[x].LeaveTime[0]+Custerm.Client[x].TransactTime;min=Custerm.Client[x].LeaveTime[1];hour=Custerm.Client[x].LeaveTime[2];while(sec>=60){sec=sec-60;min++;}while(min>=60){min=min-60;hour++;}cout<<"以下是第"<cout<<"选择的业务:"<cout<<"选择的业务所需的时间:"<cout<<"客户到达的时间:";for(int k=2;k>0;k--){if(Custerm.Client[x].ArrivalTime[k]<10)cout<<"0"<else cout<}if(Custerm.Client[x].ArrivalTime[0]<10)cout<<"0"<else cout<cout<dl;cout<<"客户离开的时间:";if(hour<10)cout<<"0"<else cout<if(min<10)cout<<"0"<else cout<if(sec<10)cout<<"0"<else cout<cout<}void Bank::WindowDetail()//输出窗⼝办理业务的情况{int i;system("color 1a");//设置屏幕颜⾊system("mode con:cols=28 lines=9");//设置屏幕⼤⼩while(1){cout<<"请选择窗⼝(1--4),以0结束:"<cin>>i;if(i==0){system("cls");system("color 1a");//设置屏幕颜⾊system("mode con:cols=38 lines=13");//设置屏幕⼤⼩break;}if(i>=5){system("cls");cout<<"对不起,您所选择的窗⼝不存在,请重新选择!"<}else{system("cls");cout<<" "<cout<<"其中"<cout<<" 存款 "<cout<<" 取款 "<cout<<" 挂失 "<cout<<" 还贷 "<}}}void Bank::TodaySum(int x,int i,Bank Custerm)//输出客户量{system("color 1a");//设置屏幕颜⾊system("mode con:cols=38 lines=10");//设置屏幕⼤⼩cout<cout<<"其中,办理了"<}void Bank::ClientDetail(int i,int x,Bank Custerm)//选择输出的客户编号{int h;system("color 1a");//设置屏幕颜⾊system("mode con:cols=38 lines=13");//设置屏幕⼤⼩while(1){cout<<"请输⼊您需要查询的客户编号(以 0 结束):";cin>>h;if(h==0){cout<}else if(h>i){system("cls");cout<<"没有这个编号,请重新选择!"<}else if(h>x&&h{system("cls");cout<<"银⾏停业前未给该客户办理业务!"<}else {system("cls");OutPut(h-1,i,Custerm);}}}void Bank::Choose(int x,int i,Bank Custerm)//选择输出详细信息{int n;int flag=0;system("color 1a");//设置屏幕颜⾊system("mode con:cols=38 lines=13");//设置屏幕⼤⼩while(1){cout<<"▓▓▓〓〓〓〓〓〓〓〓〓〓〓〓〓▓▓▓"<cout<<"▓≡≡≡0 退出≡≡≡▓"<cout<<"▓≡≡≡1 查看今⽇银⾏客户数量≡≡≡▓"<cout<<"▓≡≡≡2 第N号窗⼝的详细信息≡≡≡▓"<cout<<"▓≡≡≡3 所有客户平均等待时间≡≡≡▓"<cout<<"▓▓▓〓〓〓〓〓〓〓〓〓〓〓〓〓▓▓▓"<cout<<"请选择: ";cin>>n;switch(n){case 0:{flag=1;break;}case 1:system("cls");TodaySum(x,i,Custerm);system("pause");system("cls");break;case 2:system("cls");WindowDetail();break;case 3:system("cls");AverageTime(x,Custerm);system("pause");system("cls");break;default:system("cls");cout<<"没有这个选项,请重新选择!"<break;}if(flag==1)break;}}void Bank::WriteText(int x,Bank Custerm)//⽂件操作{int sec,min,hour;int j=0;char ch;sec=Custerm.Client[j].LeaveTime[0]+Custerm.Client[j].TransactTime;min=Custerm.Client[j].LeaveTime[1];hour=Custerm.Client[j].LeaveTime[2];while(sec>=60){sec=sec-60;min++;}while(min>=60){min=min-60;hour++;}cout<<"是否⽣成⽂件?(y/n): ";cin>>ch;if(ch=='y'){if(x==0)cout<<"数据记录为空!"<else{ofstream outfile("银⾏业务记录.txt",ios::out);if(!outfile){cout<<"打开失败!"<exit(1);}while(j{outfile<<" * * * * * * * * * * "<outfile<<" 客户编号: "<outfile<<" 办理业务: "<outfile<<" 业务时间: "<outfile<<" 到达时间: "; if(Client[j].ArrivalTime[2]<10)outfile<<"0"<else outfile<if(Client[j].ArrivalTime[1]<10)outfile<<"0"<elseoutfile<if(Client[j].ArrivalTime[0]<10)outfile<<"0"<else outfile<outfile<<" 离开时间: ";sec=Custerm.Client[j].LeaveTime[0]+Custerm.Client[j].TransactTime;min=Custerm.Client[j].LeaveTime[1];hour=Custerm.Client[j].LeaveTime[2];while(sec>=60){sec=sec-60;min++;}while(min>=60){min=min-60;hour++;}if(hour<10)outfile<<"0"<else outfile<if(min<10)outfile<<"0"<else outfile<if(sec<10)outfile<<"0"<else outfile<j++;}outfile.close();cout<<"成功⽣成⽂件!"<}}}int main (){int ff;time_t t = time(0); //时间函数char tmp[64];int flag1=1,flag=1,flag2=1; //x排在最前⾯的客户编号,,flag1是第⼀次选项的关键标志,flag标志int s=8; //16:00之前营业,s是时钟,m是最后两位客户间隔时间int ch;Bank Custerm;string a="存款",b="取款",c="挂失",d="还贷";//业务名while(flag1){system("color 1a");//设置屏幕颜⾊system("mode con:cols=38 lines=13");//设置屏幕⼤⼩cout<cout<<" 欢迎进⼊中国银⾏排队模拟系统!"<cout<<" ┌────────────────┐"<cout<<" ││"<cout<<" ├──── 0: 退出系统────┤"<cout<<" ││"<cout<<" ├──── 1: 随机模拟────┤"<cout<<" ││"<cout<<" ├──── 2: 业务办理────┤"<cout<<" ││"<cout<<" └────────────────┘"<cout<<" 请选择: ";scanf("%d",&ch);switch(ch){case 0:exit(0);case 1:{flag=0;//选择是否使⽤系统暂停函数flag1=0;//停⽌本项选择break;}case 2:{flag1=0;break;}default:{cout<<" 没有这个选项,请重新选择!"<system("pause");break;}}system("cls");}while(s){system("color 1a");//设置屏幕颜⾊system("mode con:cols=38 lines=13");//设置屏幕⼤⼩cout<<" □□□□□□□□□□□□□□□□□□"<cout<<" ●●●欢迎光临中国银⾏●●● "<cout<<" ≡≡≡请输⼊您要办理的业务编号≡≡≡"<cout<<" ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓"<cout<<" ██████ 1:存款██████"<cout<<" ██████ 2:取款██████"<cout<<" ██████ 3:挂失██████"<cout<<" ██████ 4:还贷██████"<cout<<" ██████ 0:退出██████"<cout<<" ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓"<cout<<" □□□□□□□□□□□□□□□□□□"<if(flag==1)cin>>ff; else ff=(rand()%4+1);//随机选择4种业务switch(ff){case 1:{system("color 1a");//设置屏幕颜⾊system("mode con:cols=38 lines=15");//设置屏幕⼤⼩cout<cout<<"※※※※※※※※※※※※※※※※※※※"<strftime(tmp, sizeof(tmp), "%Y/%m/%d %A %z",localtime(&t) );//显⽰当地时间的函数(函数根据区域设置格式化本地时间/⽇期,函数的功能将时间格式化,或者说格式化⼀个时间字符串。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
业务办理中
业务办理完毕
Makefile 长这样
顾客选择离开
详细程序请见文档源码部分
(银行排队系统模拟)
第六组 成 员:关晓帆-被服务的过程; 2) 程序执行流程如下: Step1: 客户到达银行,并从取号机取号; Step2: 如果大厅中有空闲座位,则座下等待,否则,在大厅外等待; Step3: 银行职员如果发现有客户等待,则依次叫号服务,否则休息; Step4: step1-step4重复执行 3) 大厅中座椅数量为20个; 4) 服务窗口为2个; 5) “客户到来”通过命令行输入客户名字模拟; 6) 为了模拟实际情况,每个客户服务时间不小于20秒,可随机确定; 7) 程序顺序列出不同窗口服务客户的:名称,窗口号,服务时间
如何去实现?
• 1) • 2) • 3) • 4) 需一个主控进程,随时监控客户到来,并为之创建进程; 取号机应视为互斥型临界资源 座椅应视为临界资源 客户等待及被叫号应视为进程间同步过程
需要编写那些文件?
• Ubuntu系统环境下 • 一个service可执行文件 • 其中service可执行文件用于在内存中申请一个共享内存空间,并将这个内存空间与自身进 程绑定 • 一个customer可执行文件 • customer可执行文件每执行一次,就增加一个进程,即代表有一位顾客来到。通过多次执 行customer可执行文件来模拟多位顾客 • 一个deletesem可执行文件 • deletesem可执行文件用于在service进程和customer进城都执行完毕后,删除内存空间中 的信号集。 • 编写Makefile文件来快速编译源代码生成以上三个可执行文件。