银行预约排队系统(数据结构问题) PPT
- 格式:ppt
- 大小:629.50 KB
- 文档页数:25
课程设计任务书课程名称:课程设计1(数据结构)设计题目:银行排队叫号系统1.问题描述:目前,在以银行营业大厅为代表的窗口行业,大量客户的拥挤排队已成为了这些企事业单位改善服务品质、提升营业形象的主要障碍。
排队(叫号)系统的使用将成为改变这种状况的有力手段。
排队系统完全模拟了人群排队全过程,通过取票进队、排队等待、叫号服务等功能,代替了人们站队的辛苦,把顾客排队等待的烦恼变成一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。
排队叫号软件的具体操作流程为:●顾客取服务序号。
当顾客抵达服务大厅时,前往放置在入口处旁的取号机,并按一下其上的相应服务按钮,取号机会自动打印出一张服务单。
单上显示服务号及该服务号前面正在等待服务的人数。
●银行职员呼叫顾客,顾客的服务号就会按顺序的显示在显示屏上。
当一位顾客办事完毕后,柜台银行职员只需按呼叫器相应键,即可自动呼叫下一位顾客。
2. 功能要求:1)使用数组或链表以及C#接口和范型技术实现通用的队列功能;2)编写算法,利用队列模拟银行排队系统;3)利用多窗口分别模拟顾客取服务号、银行窗口服务顾客。
3.界面要求:用户界面设计不做统一规定,但应做到界面友好,易于操作。
4. 技术要求:要求利用面向对象的方法以及队列数据结构来完成系统的设计;在设计的过程中,建立清晰的类层次;在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制来实现系统功能。
5.创新要求在基本要求达到后,可以进行创新设计(包括界面、功能、数据结构)。
6. 课程设计时间:1周(18课时)7. 课程设计的考核方式及评分方法1)考核方式⏹课程设计结束时,在机房当场验收。
⏹教师提供测试数据,检查运行结果是否正确。
⏹回答教师提出的问题。
⏹学生提交课程设计文档(A4纸打印)2)评分方法上机检查及答辩: 书面报告: 学习态度= 6 : 3 : 1,没有通过上机检查的其成绩直接记录不及格。
(贵州大学计算机科学与信息学院贡献)#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表⽰下⼀个客户与上⼀个客户的间隔时间。
宁波大红鹰学院信息工程学院课程设计报告项目名称:银行排队系统项目组长:白钰琦项目成员:项鸿伟、徐海域、徐程凯班级名称:10计科1专业名称:计算机科学与技术完成时间:2012年11月27日信息工程学院制目录一、系统总体描述.................................................... - 1 -二、模块设计(包括文档设计、项目流程设计)........................... - 1 -三、程序设计(界面设计、后台详细设计)............................... - 3 -四、设计总结......................................................... - 7 -五、设计总结........................................................ - 16 -1、完成情况..................................................... - 16 -2、心得体会..................................................... - 16 -一、系统总体描述银行排队系统是利用现代网络通信技术和计算机信息管理技术来代替传统排队的系统,从本质上改善传统排队管理所存在的拥挤、嘈杂、混乱现象,避免各种不必要的纠纷。
通过使用排队系统,由传统的客户站立排队改变为取票进队、排队等待、叫好服务,由传统物理的多个队列变为一个逻辑队列,使“先来先服务”的思想得到更好地贯彻。
本系统可以实现银行排队的主要业务活动。
本系统分为以下6个功能模块:(1)顾客到达。
分为VIP客户和普通客户进行排队拿号,普通客户进入逻辑队列。
(2)顾客离开。
顾客离开时将客户从队列中删除,并提供让客户对银行窗口职员评价的平台。
随着银行业务量的快速发展,银行柜台业务承受的压力越来越大,排队等待现象屡见不鲜,银行排长队现象成为困扰银行和用户的难题。
为了解决这一难题,目前大部分银行的营业厅都使用了取号系统来改善银行窗口排长队的现象,提高银行的服务效率。
本文设计并实现了银行取号模拟系统,模拟取号的整个过程,实现了取号、排队、服务、及管理等功能。
系统能够记录用户及工作人员的相关信息,管理员通过对用户及工作人员信息的统计和分析,可以进一步优化银行营业厅的排队问题,提高银行业务办理效率。
本文首先对取号系统的研究背景、现状、意义等进行了描述;然后通过数据流图、用例图等对系统进行需求分析,确定系统的功能;在确定功能的基础上,进行系统设计,设计出系统的总体结构和后台数据库;最后,基于java语言实现整个系统,并对系统进行了测试,保证了系统的稳定性和可靠性。
关键词:银行;排队;取号系统;模拟;用例图目录摘要............................................................................................................................................. 错误!未定义书签。
目录 (2)第1章前言 (3)1.1应用背景 (3)1.2设计目标及内容 (3)1.3可行性分析 (4)1.3.1 经济可行性 (4)1.3.2 技术可行性 (4)第2章系统分析 (5)2.1系统功能 (5)2.2系统功能要求 (5)2.2.1 概述 (5)2.2.2 开发意图 (5)2.2.3 应用目标 (5)2.2.4 运行环境 (6)2.3业务流程分析 (6)第3章系统设计....................................................................................................................... 错误!未定义书签。
数据结构_银行排队问题在我们的日常生活中,去银行办理业务时排队是一个常见的场景。
想象一下,当你走进银行大厅,看到人们或坐或站,等待着被叫号,这背后其实隐藏着一系列关于数据结构和算法的问题。
银行排队系统的目的很简单,就是要尽可能高效地为客户服务,同时确保公平和秩序。
为了实现这个目标,银行需要合理地组织和管理客户的等待队列。
首先,让我们来思考一下最简单的排队方式——线性队列。
在这种情况下,客户按照到达的先后顺序排成一条直线。
新到达的客户排在队尾,而服务窗口从队首开始依次为客户服务。
这种方式直观易懂,实现起来也相对简单。
但它存在一些明显的缺点。
比如,如果排在前面的客户办理业务的时间很长,后面的客户就只能长时间等待,这可能会导致客户的不满和抱怨。
为了解决这个问题,一种常见的改进方法是使用优先级队列。
比如,对于一些重要的客户或者紧急业务,可以给予更高的优先级,让他们能够优先得到服务。
但这也带来了新的问题,如何确定优先级的标准?如果标准不公平或者不透明,可能会引发其他客户的争议。
另外,还有一种常见的数据结构——循环队列。
在循环队列中,当队尾到达队列的末尾时,会重新回到队列的开头,形成一个环形结构。
这种方式可以有效地利用存储空间,但在银行排队的场景中,可能会导致一些混乱,因为客户可能不太容易理解这种复杂的排队逻辑。
除了上述的数据结构,银行还需要考虑如何动态地调整排队策略。
例如,在业务高峰期,可能需要增加服务窗口,以加快处理速度;而在业务低谷期,则可以适当减少服务窗口,以节约资源。
这就需要一种能够灵活调整的排队机制。
在实际的银行排队系统中,还需要考虑客户的分类。
比如,有的客户只是来咨询业务,有的客户需要办理复杂的金融交易,还有的客户可能是来办理存款或取款等简单业务。
将客户进行合理的分类,可以让服务更加有针对性,提高整体的服务效率。
为了更好地管理排队系统,银行通常会采用一些信息化的手段。
例如,通过叫号系统,客户可以在等待的过程中自由活动,而不必一直站在队列中。
/*某银行营业厅共有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.运行窗口截图:。