银行排队系统实验报告.docx
《银行排队系统实验报告.docx》由会员分享,可在线阅读,更多相关《银行排队系统实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
![银行排队系统实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/2/5dfd07ca-c026-497f-825e-687de898673c/5dfd07ca-c026-497f-825e-687de898673c1.gif)
银行排队系统实验报告
银行排队系统
一、【设计要求:
】假设有你n个窗口对外接待业务,从早晨银行开门起不断有客户进入。
客户在客户人数众多时需在选择窗口排队。
编制一个程序模拟这种排队活动,并计算一天中客户在银行逗留的平均时间。
二、【实验目的:
】将数据结构的语言、思想运用到现实生活中,学以至用,通过实验加深对数据结构知识的理解和运用,同时我们将银行排队系统转化为电脑语言时,对生活事物观察和学习也更加敏捷。
三、【实验仪器:
】海尔电脑一台。
四、【编译软件:
】MicrosoftVisualC++6.0
五、【设计思路:
】见银行排队系统导航图
六、【程序分析:
】
(一)、头函数
#include
#include
#include
#include
#include
(一)、主函数
功能:
生成系统主菜单,为进入各个界面提供通道。
主要为SWITCH开关语句进入不同的界面。
源程序:
voidmain()//主函数
{
time_tstrat,end;
floatallsum=0,average=0;
floatA[10]={0,0,0,0,0,0,0,0,0,0};
intc,x,v=0,w=0;
Initshuzu();
Initqueue();
doublesum=0;
while
(1)
{
printf("\n******************欢迎光临中国银行***************\n");
printf("\n1顾客到达\n");
printf("2顾客离开\n");
printf("3查看业务办理\n");
printf("4查看排队情况\n");
printf("5退出\n\n");
time();
printf("***************欢迎光临中国银行********************\n");
printf("请输入:
");
scanf("%d",&c);
switch(c)
{
case1:
{
system("cls");
printf("\n****************顾客到达界面*******************\n\n");
intk=0;
inta;
printf("请选择你的用户类型:
VIP用户请按1;\n普通卡用户请按其它键.\n");
printf("请输入:
");
scanf("%d",&a);
system("cls");
break;
}
case2:
{
system("cls");
printf("\n***************顾客离开界面*****************\n\n");
printf("请输入离开顾客得编号:
\n");
scanf("%d",&x);
likai(x);
mygrade();
w++;
allsum+=A[0];
getch();
system("cls");
break;
}
case3:
{
system("cls");
printf("\n******************业务查询界面**************************\n\n");
printl();
getch();
system("cls");
break;
}
case4:
{
system("cls");
printf("\n******************排队查询界面************************\n\n");
print2();
getch();
system("cls");
break;
}
case5:
return;
getch();
system("cls");
case6:
{system("cls");
printf("\n**************系统查询界面**************************\n\n");
charcool[3];
inti=0,k=0;
printf("请输入你的卡号:
");
scanf("%d",&i);
printf("请您输入五位密码:
");
while(cool[k-1]!
='')
{
cool[k]=getch();
k++;
printf("*");
}
if(i==000&&cool[0]=='1'&&cool[1]=='1'&&cool[2]=='1'&&cool[3]=='1')
{
average=allsum/w;
printf("\n至今已有%d位普通用户,%d位vip用户成功办理业务!
",w,vip1);
printf("\n普通用户业务办理总共用时%0.2f,平均用时%0.2f",allsum,average);
}
getch();
system("cls");
break;
}
default:
printf("输入有误!
请重新输入:
\n");
getch();
system("cls");
}
}
}
运行界面:
到达界面:
当客户到达时,在主菜单输入“1”进入“客户到达界面”。
此界面区分VIP客户到达和普通客户到达。
VIP:
客户在“到达界面”输入“1”,进入VIP验证,通过VIP卡号和密码验证就可以进入VIP区办理业务。
普通客户:
客户在“到达界面”输入“2”,系统即为客户分配业务号,凭此号办理业务、排队或离开。
使用函数:
vip(a);
验证VIP用户。
daoda(v);Enqueue(&Q,x);
将办理业务人员写入线性表,排队人员写入链表。
time1();
开始记录时间。
vip(a)源程序:
voidvip(intx)//vip用户认证
{
inti,a;
a=x;
charch[3];
intk=0;
switch(a)
{
case1:
{
printf("请输入你的卡号:
");
scanf("%d",&i);
printf("请您输入五位密码:
");
while(ch[k-1]!
='')
{
ch[k]=getch();
k++;
printf("*");
}
if(i==100&&ch[0]=='1'&&ch[1]=='1'&&ch[2]=='1'&&ch[3]=='1')
{
printf("\n尊敬的VIP用户您好,请您直接到VIP区办理业务!
\n");
vip1++;
}
elseif(i==200&&ch[0]=='2'&&ch[1]=='2'&&ch[2]=='2'&&ch[3]=='2')
{
printf("\n尊敬的VIP用户您好,请您直接到VIP区办理业务!
\n");
vip1++;
}
elseif(i==300&&ch[0]=='3'&&ch[1]=='3'&&ch[2]=='3'&&ch[3]=='3')
{
printf("\n尊敬的VIP用户您好,请您直接到VIP区办理业务!
\n");
vip1++;
}
elseif(i==400&&ch[0]=='4'&&ch[1]=='4'&&ch[2]=='4'&&ch[3]=='4')
{
printf("\n尊敬的VIP用户您好,请您直接到VIP区办理业务!
\n");
vip1++;
}
elseif(i==500&&ch[0]=='5'&&ch[1]=='5'&&ch[2]=='5'&&ch[3]=='5')
{
printf("\n尊敬的VIP用户您好,请您直接到VIP区办理业务!
\n");
vip1++;
}
else
printf("\n你的输入有误!
\n");
break;
}
default:
break;
}
}
daoda(v)源程序:
voiddaoda(intx)//解决顾客到达事件算法
{
inti=L.len+1;
if(L.len{L.A[i]=x;
i++;
L.len++;
}
else
Enqueue(&Q,x);
}
voidEnqueue(Linkqueue*Q,intelem)//进队算法
{
Lnode*s;
s=(Lnode*)malloc(sizeof(Lnode));
s->data=elem;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
}
time1()源程序:
time1()//时间函数
{
time_ttimep;
time(&timep);
time=difftime(end,start);
}
运行结果:
客户离开界面:
当客户完成办理业务需要离开时。
在主菜单输入“2”进入“客户离开界面”。
此界面提供服务评分。
首先输入自己的客户号,然后选择自己办理业务的柜台号,结合自己对这次服务的满意度给出评分,然后系统给出此柜台的平均分和自己办理业务过程中所需要的时间。
使用函数:
likai(x)intDlqueue(Linkqueue*Q)
离开时出队操作,便将排队的客户写到业务办理的线性表里。
mygrade()intpingfeng()
柜台报务评分。
time1()
中止时间记录,显示从开始记时到此时候的时间。
likai(x)源程序:
voidlikai(intx)//解决顾客离开事件算法
{
inti=0;
do
{
if(x>L.len)
{
printf("输入有误!
\n请重新输入:
");
scanf("%d",&x);
}
else
for(i=0;i<=L.len;i++)
{
if(i==x)
{
printf("尊敬的%d号顾客您好!
\n",x);
L.A[i]=0;
L.len--;
if(Q.front!
=Q.rear)
{
inty=Dlqueue(&Q);
L.A[i]=y;
L.len++;
}
}
}
}while(i==0);
}
intDlqueue(Linkqueue*Q)源程序:
intDlqueue(Linkqueue*Q)//出队算法
{
Lnode*t;
intx;
if(Q->front==Q->rear)
{
printf("队列为空!
\n");
exit
(1);
}
else
{
t=Q->front->next;
Q->front->next=t->next;
x=t->data;
free(t);
returnx;
}
}
mygrade()源程序:
voidmygrade()//主评分函数
{
printf("为了改善服务质量,请你对我们的服务进行评价。
谢谢!
\n");
z=guitai();
y=pingfeng();
switch(z)//柜台评分处理
{
case1:
//1号柜台评分处理
{
sum1+=y;
i1++;
ave1=sum1/i1;
printf("%d号柜台的平均满意度为%0.2f。
感谢你的评分,谢谢\n",z,ave1);
break;
}
case2:
//2号柜台评分处理
{
sum2+=y;
i2++;
ave2=sum2/i2;
printf("%d号柜台的平均满意度为%0.2f。
感谢你的评分,谢谢\n",z,ave2);
break;
}
case3:
//3号柜台评分处理
{
sum3+=y;
i3++;
ave3=sum3/i3;
printf("%d号柜台的平均满意度为%0.2f。
感谢你的评分,谢谢\n",z,ave3);
break;
}
case4:
//4号柜台评分处理
{
sum4+=y;
i4++;
ave4=sum4/i4;
printf("%d号柜台的平均满意度为%0.2f。
感谢你的评分,谢谢\n",z,ave4);
break;
}
case5:
//5号柜台评分处理
{
sum5+=y;
i5++;
ave5=sum5/i5;
printf("%d号柜台的平均满意度为%0.2f。
感谢你的评分,谢谢\n",z,ave5);
break;
}
default:
printf("你的输入有误,请重新输入!
\n");
}
getch();
}
intpingfeng()源程序:
intpingfeng()//判断输入的分数是否正确
{
inty=0;
printf("请输入你评分(1-5):
\n1分…………非常不满意;\n2分…………比较不满意;\n3分…………一般满意;\n4分…………比较满意;\n5分…………非常满意。
\n");
printf("请输入:
");
scanf("%d",&y);
if(y<1||y>5)
{
printf("你输入评分有误,请重新输入!
\n");
printf("请输入你的评分(1-5):
\n");
scanf("%d",&y);
}
else
printf("你的评分为%d.\n",y);
returny;
}
运行结果:
业务查询界面:
在主菜单输入“3”进入“业务查询界面”,在此界面可查询到正在业务办理的情况。
使用函数:
printl()
显示正在办理业务的客户。
printl()源程序:
voidprintl()//输出数组算法
{
inti;
printf("正在办理业务的顾客编号为:
\n");
for(i=1;i<=L.len;i++)
{
printf("%d",L.A[i]);
}
printf("\n");
}
运行结果:
排队查询界面:
在主菜单输入“4”,进入“排队查询界面”,此界面提供客户的排队情况、排队人数。
使用函数:
print2()
显示排队情况。
print2()源程序:
voidprint2()//输出队列算法
{
inti=0;
printf("正在等候办理业务的顾客编号为:
");
Lnode*s=Q.front->next;
while(s!
=NULL)
{
printf("%d",s->data);
s=s->next;
i++;
}
printf("\n您的前面一共有%d人在排队,请您稍候!
",i);
printf("\n");
}
运行结果:
系统查询:
因为此功能为内部工作人员使用,所以通道选项在主菜单上隐藏。
在主菜单输入“6”,进入“系统查询界面”。
通过此此界面的卡号、密码验证,就可以查询到系统开起至查询时办理业务的普通客户、VIP客户人数。
并可以显示所有普通客户办理业务的总时间,每个客户所用的平均时间。
查询系统运行的时间。
源程序:
system("cls");
printf("\n************************系统查询界面**************************\n\n");
charcool[3];
inti=0,k=0;
printf("请输入你的卡号:
");
scanf("%d",&i);
printf("请您输入五位密码:
");
while(cool[k-1]!
='')
{
cool[k]=getch();
k++;
printf("*");
}
if(i==000&&cool[0]=='1'&&cool[1]=='1'&&cool[2]=='1'&&cool[3]=='1')
{
average=allsum/w;
xi=difftime(end,start);
printf("\n至今已有%d位普通用户,%d位vip用户成功办理业务!
",w,vip1);
printf("\n普通用户业务办理总共用时%0.2f,平均用时%0.2f\n",allsum,average);
printf("系统已运行%0.2f秒!
",xi);
}
getch();
system("cls");
break;
}
运行结果:
附:
全部源代码
#include
#include
#include
#include
#include
#definen3
intvip1=0;
inty,z;
floatsum1=0,sum2=0,sum3=0,sum4=0,sum5=0;
floati1=0,i2=0,i3=0,i4=0,i5=0;
floatave1=0,ave2=0,ave3=0,ave4=0,ave5=0;
staticintN;
structList{
intA[n+1];//顾客用来办理业务的N个窗口
intlen;//表示数组中的元素个数
}L;
structLnode{//链表结点类型
intdata;
Lnode*next;
};
structLinkqueue{//链式存储的等候队列的类型定义
Lnode*front;
Lnode*rear;
}Q;
voidInitshuzu()//初始化线性的算法
{
for(inti=1;i<=n;i++)
L.A[i]=0;//元素值为0,表示编号为I的窗口当前状态为空
L.len=0;
}
voidInitqueue()//初始化队列的算法
{
Q.front=Q.rear=(Lnode*)malloc(sizeof(Lnode));
Q.front->next=NULL;
}
voidEnqueue(Linkqueue*Q,intelem)//进队算法
{
Lnode*s;
s=(Lnode*)malloc(sizeof(Lnode));
s->data=elem;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
}
intDlqueue(Linkqueue*Q)//出队算法
{
Lnode*t;
intx;
if(Q->front==Q->rear)
{
printf("队列为空!
\n");
exit
(1);
}
else
{
t=Q->front->next;
Q->front->next=t->next;
x=t->data;
free(t);
returnx;
}
}
voidprintl()//输出数组算法
{
inti;
printf("正在办理业务的顾客编号为:
\n");
for(i=1;i<=L.len;i++)
{
printf("%d",L.A[i]);
}
printf("\n");
}
voidprint2()//输出队列算法
{
inti=0;
printf("正在等候办理业务的顾客编号为:
");
Lnode*s=Q.front->next;
while(s!
=NULL)
{
printf("%d",s->data);
s=s->next;
i++;
}
printf("\n您的前面一共有%d人在排队,请您稍候!
",i);
printf("\n");
}
voiddaoda(intx)//解决顾客到达事件算法
{
inti=L.len+1;
if(L.len{L.A[i]=x;
i++;
L.len++;
}
else
Enqueue(&Q,x);
}
voidlikai(intx)//解决顾客离开事件算法
{
inti=0;
do
{
if(x>L.len)
{
printf("输入有误!
\n请重新输入:
");
scanf("%d",&x);
}
else
for(i=0;i<=L.len;i++)
{
if(i==x)
{
printf("尊敬的%d号顾客您好!
\n",x);
L.A[i]=0;
L.len--;
if(Q.front!
=Q.rear)
{
inty=Dlqueue(&Q);
L.A[i]=y;
L.len++;
}
}
}
}while(i==0);
}
intguitai()//判断输入的柜台号是否正确
{
inty=0;
printf("请输入你所办理业务的柜台号(1-3):
\n");
scanf("%d",&y);
if(y<1||y>5)
{
printf("你输入的柜台号有误,请重新输入!
\n");
printf("请输入你所办理业务的柜台号(1-3):
\n");
scanf("%d",&y);
}
else
printf("你所办理业务的柜台为%d.\n",y);
returny;
}
intpingfeng()//判断输入的分数是否正确
{
inty=0;
printf("请输入你评分(1-5):
\n1分…………非常不满意;\n2分…………比较不满意;\n3分…………一般满意;\n4分…………比较满意;\n5分…………非常满意。
\n");
printf("请输入:
");
scanf("%d",&y);
if(y<1||y>5)
{
printf("你输入评分有误,请重新输入!
\n");
printf("请输入你的评分(1-5)