logo资料库

银行客户排队等候系统模拟.doc

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
《数据结构》实验报告 题 目: 银行客户排队等候系统模拟 班 级: 姓 名: 学 号: 完成日期: 2012 年 4 月 12 日
1.问题描述 客户到银行办理业务,需要取号排队等候。客户分为 VIP 客户、理财客户、一般 客户三种类型。不同类型客户,取得不同的排队序号凭证,进入不同序列排队等 候。当服务窗口出现空闲时,按既定策略从三种类型客户中选取客户接受服务。 选取客户接受服务的策略如下: (1)三种类型客户的服务优先顺序从高到低依次为:VIP 客户、理财客户、一般 客户; (2)相同类型的客户采取先来先服务的原则; (3)当一般客户连续 5 次未被选中时,下一次优先选取一般客户接受服务。 用 C 语言编写程序,模拟上述操作过程。 2.需求分析 (1)输入的形式和输入值的范围:客户进行排队时输入 1、2、3 分别代表 VIP 客户、理财客户、一般客户三种类型的客户,以得到相对应的排队号;银行端每 处理完一位用户,输入 Y,使得系统重新打印当前排队队列; (2)输出的形式:输出当前所有排队用户的客户信息以及号数; (3)程序所能达到的功能:演示出较为合理的银行等候系统模拟; 3.概要设计 (1)队列的 ADT 定义: ADT Queue{ 数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n, 数据关系:R1={|ai-1 ,ai∈D, i=2,… ,n } 约定 an 端为队头,a1 端为队尾。 n≥0 } 基本操作:InitQueue(&S);初始化队列 EnQueue(&S,e);入队 DeQueue(&S,e);出队并删除队头元素; } ADT Stack (2)系统中子程序及功能要求: Int main();主函数,负责调用子函数; int InitQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); 队列初始化; int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); 元素入队;
int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr t); 删除队头元素 int panduan(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); 判断队列是否为空,且 LinkYnode 是否五次未有元素出列; int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); 将队列中元素依次打印出来; (3)主程序及各程序模块(函数)之间的层次(调用)关系。 该程序包含两个模块:主函数模块和判断模块; 模块之间的调用关系为:主程序模块  判断模块 函数之间的调用关系如下图所示: Main() Panduan() InitQueue() Paidui() DeQueue() Dayin() 4.详细设计 (1)队列链式存储结构定义: typedef struct Qnode{//定义队列的链式存储结构 int num; struct Qnode *next; }Qnode,*Queueptr; typedef struct{ Queueptr front; Queueptr rear; }LinkVnode; typedef struct{ Queueptr front;
Queueptr rear; }LinkLnode; typedef struct{ Queueptr front; Queueptr rear; }LinkYnode; (2)主函数的算法: int main () { LinkVnode Q1;LinkLnode Q2;LinkYnode Q3; int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr t); int InitQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); int panduan(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); InitQueue(Q1,Q2,Q3); paidui(Q1,Q2,Q3); while (control==0) { panduan(Q1,Q2,Q3); } return 0; } (3)判断模块: int panduan(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3) { int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr l); int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3); char operation; printf("处理完毕请输入 y 需要新客户服务请输入 n:"); scanf("%s",&operation); if (operation=='y')
{ count++; if(count>5) { DEQueue(Q1,Q2,Q3,Q3.front); //s3=s3->next; dayin(Q1,Q2,Q3); count=0; } else{ if(Q1.front!=Q1.rear) { DEQueue(Q1,Q2,Q3,Q1.front); if(Q1.rear ==l){Q1.front=Q1.rear;} } else if(Q2.front!=Q2.rear) { DEQueue(Q1,Q2,Q3,Q2.front); if(Q2.rear == l){Q2.front=Q2.rear;} } else if(Q3.front!=Q3.rear) { DEQueue(Q1,Q2,Q3,Q3.front); if(Q3.rear == l){Q3.front=Q3.rear;} count=0; //s3=s3->next; } dayin(Q1,Q2,Q3); } } else { paidui(Q1,Q2,Q3); } dayin(Q1,Q2,Q3);
return 0; } (4)队列初始化: int InitQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3) { Q1.front=Q1.rear=(Queueptr)malloc(sizeof(Qnode)); if(!Q1.front) return 0; else{ Q1.front->next=NULL; } Q2.front=Q2.rear=(Queueptr)malloc(sizeof(Qnode)); if(!Q2.front) return 0; else{ Q2.front->next=NULL; } Q3.front=Q3.rear=(Queueptr)malloc(sizeof(Qnode)); if(!Q3.front) return 0; else{ Q3.front->next=NULL; } return 1; } (5)排队函数: int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3) { int select; Queueptr p,q,r; printf("请输入用户类型,以得到服务编号\n(1 为 VIP 用户,2 为理财客户, 3 为一般客户,0 为结束程序)\n"); scanf("%d",&select); switch (select){ case 1: p=(Queueptr)malloc(sizeof(Qnode)); a++; p->num =a; p->next = NULL;
Q1.rear->next =p; Q1.rear=p; break; case 2: q=(Queueptr)malloc(sizeof(Qnode)); b++; q->num =b; q->next = NULL; Q2.rear->next =q; Q2.rear=q; break; case 3: r=(Queueptr)malloc(sizeof(Qnode)); c++; r->num =c; r->next = NULL; Q3.rear->next =r; Q3.rear=r; break; case 0: return control=1; } return 0; } (6)删除队头元素函数: int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr t) //删除 { l=t->next; t->next= l->next;
free(l); return 0; } (7)打印队列函数: int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3) //打印等待列 表 { Queueptr s; printf("当前客户等待情况:\n"); if(Q1.front==Q1.rear&&Q2.front==Q2.rear&&Q3.front==Q3.rear) { printf("无等待\n"); } else { if(Q1.front!=Q1.rear) { for(s=Q1.front;s!=Q1.rear;s=s->next){ printf("处理编号:A%d,客户类型:VIP 用户\n",s->next->num); } } if(Q2.front!=Q2.rear) { for(s=Q2.front;s!=Q2.rear;s=s->next) { printf("处理编号:B%d,客户类型:理财用户\n",s->next->num); } } if(Q3.front!=Q1.rear) { for(s=Q3.front;s->next!=NULL;s=s->next) { printf("处理编号:C%d,客户类型:一般用户\n",s->next->num); }
分享到:
收藏