Linux高级编程银行排队系统模拟-文档
- 格式:ppt
- 大小:693.50 KB
- 文档页数:8
循环队列-----银⾏排号叫号系统模仿运⽤知识:循环队列的顺序存储下⾯是⽂件运⾏成功的样式展⽰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篇)第一篇:银行排队叫号系统需求分析设计文档银行排队叫号系统的分析与UML建模一、需求分析近年来,由于各行各业的信息化、智能化建设越来越普及,整个社会对各个行业的办事效率的要求也越来越高。
例如像银行办业务,在顾客办业务过程中排队现象在所难免,为了在排队时减少顾客的等待时间,为顾客办业务创造一个良好的环境,银行排队叫号系统应运而生。
银行排队系统的功能性需求包括以下内容:1、排队系统可以分为票务打印系统和窗口操作系统。
2、票务打印系统(1)显示发号机上的显示屏使用液晶显示,显示对待办业务的选择;(2)输入输入过程即通过触摸屏对业务进行选择的过程;(3)输出打印号票打印内容应该包括业务名称、排队号码、时间等;3、窗口操作系统基本包括显示屏、语言提示,叫号按钮(1)显示屏使用点阵式LED显示,显示内容应该是下一个号码以及办理业务窗口;(2)语音提示语音播报时用语音的形式通过广播或者音箱给人一提示信息。
语音提示不需要用户一直盯着提示屏或者排队情况。
选择使用语音芯片,实现的功能应该是当操作员按下按钮后,语音播放下一个办理者的票号。
(3)叫号按钮设置叫号按钮,以便于操作员控制窗口模块的显示屏及语音提示。
满足上述需求的系统主要包括以下几个小的系统模块:(1)派号功能模块。
派号功能模块主要是用于在用户进入服务大厅后,根据自己的业务需要,通过自助式触摸屏号票机领取票号;或者用户在服务大厅业务咨询台进行业务咨询后,咨询员可以为用户打印排队号票。
号票是由排队服务器根据当前情况自动生成。
(2)叫号功能模块。
工作人员可以通过座席软件键盘上的设置键对客户进行叫号;也可通过按键控制器对客户进行叫号;系统可以设置单语或双语进行语音播放;以及通过LED显示屏和其它视频显示设备显示票号。
(3)预约功能模块。
用户可以通过电话预约领取排队号;预约成功后取得预约号;系统将此预约号按预约时间插入当前的排队队列,在系统处理后进行优先呼叫;在同时间下办理业务时,可以进行预约服务,优先办理。
(贵州大学计算机科学与信息学院贡献)#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分…………非常满意。
数据结构——银⾏排队系统模拟(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\。