攻坚实验三银行业务队列简单模拟.docx
《攻坚实验三银行业务队列简单模拟.docx》由会员分享,可在线阅读,更多相关《攻坚实验三银行业务队列简单模拟.docx(9页珍藏版)》请在冰点文库上搜索。
![攻坚实验三银行业务队列简单模拟.docx](https://file1.bingdoc.com/fileroot1/2023-7/11/1efcb7f0-1e13-4410-a2d7-bdc1a2b0920e/1efcb7f0-1e13-4410-a2d7-bdc1a2b0920e1.gif)
攻坚实验三银行业务队列简单模拟
攻坚实验三 银行业务队列简单模拟
一、实验目的
熟练掌握队列的基本操作,理解队列的应用。
二、实验内容
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍---即当A窗口处理完2个顾客时,B窗口处理完一个顾客。
给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。
假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
三、实验要求
1.输入说明:
输入为一行正整数,其中第1个数字N(N<=1000)为顾客总数,后面跟着N位顾客的编号。
编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。
数字间以空格分隔。
2.输出说明:
按业务处理完成的顺序输出顾客的编号。
数字间以空格分隔,但最后一个编号后不能有多余的空格。
3.测试用例:
序号
输入
输出
说明
1
821394111315
13291141315
正常测试,A窗口人多
2
821394111216
13291141216
正常测试,B窗口人多
3
16
6
最小N
4
1000个顾客的随机序列
略
最大N
四、实验分析
(1)问题分析
首先需要针对A和B业务设计两个循环队列,分别处理两类业务请求;然后根据输入序列整数的奇偶性将各个整数分配到这两个队列中。
另外,需要设计针对两个队列处理过程的流程,这是一个循环。
在循环中,先从A队列中输出两个元素,然后再从B队列中输出一个元素。
当发现某一个队列中的元素为空时,输出另一个队列中的所有元素。
(2)实现要点
采用统一的循环队列函数处理两个队列的操作:
注意对队列满、空情况的判断。
五、主要仪器及耗材
计算机及VC6软件
六、实验参考代码
七、实验注意事项
1.应分析源程序,并注意运行结果是否为预期结果。
2.注意大小写及英文字符(ASCII码)
八、思考题
1.本题只是个简单的模拟,实际银行的业务处理会更加复杂,队列的使用是很有必要的。
对于本题,可以再进一步思考以下问题:
(1)本题的顾客请求序列是程序运行时输入的,能不能使用C语言提供的随机函数(rand(),srand()等)生成符合某种要求的随机序列进行顾客请求的随机模拟?
(2)如果将A队列和B队列的处理速度比NA:
NB(本题NA=2,NB=1)作为变量在程序运行时作为参数输入,该如何修改代码?
#include
#definemaxsize1000
#defineERROR-1
typedefstruct
{
intcustomer[maxsize];
intrear;
intfront;
}Queue;
voidinitqueue(Queue*ptrQ)//初始化空队列
{
ptrQ->rear=ptrQ->front=0;
}
intIsemptyQ(Queue*ptrQ,inte)//判断队列是否为空
{
{
intflag;
if(ptrQ->front==ptrQ->rear)
flag=1;
else
flag=0;
returnflag;
}
ptrQ->rear=(ptrQ->rear+1)%maxsize;
ptrQ->customer[ptrQ->rear]=e;
}
voidaddQ(Queue*ptrQ,inte)//将元素e插入到队列ptrQ中
{
if((ptrQ->rear+1)%maxsize==ptrQ->front)
{
printf("队列满!
");
return;
}
ptrQ->rear=(ptrQ->rear+1)%maxsize;
ptrQ->customer[ptrQ->rear]=e;
}
intdeleteQ(Queue*ptrQ)//从队列中删除队头并返回
{
if(ptrQ->front==ptrQ->rear)
{
printf("队列空!
");
returnERROR;
}
else
{
ptrQ->front=(ptrQ->front+1)%maxsize;
returnptrQ->customer[ptrQ->front];
}
}
intmain()
{
intN,i,cur,flag;
QueueA,B;
//初始化两个队列
initqueue(&A);
initqueue(&B);
scanf("%d",&N);
for(i=0;i{
scanf("%d",&cur);
if(cur%2)
addQ(&A,cur);
else
addQ(&B,cur);
}
flag=0;//标记第1个顾客尚未输出
while(!
IsemptyQ(&A,int())&&!
IsemptyQ(&B,int()))
{
if(!
flag)//第一个顾客输出后无空格
{
printf("%d",deleteQ(&A));
flag=1;
}
else
printf("%d",deleteQ(&A));
if(!
IsemptyQ(&A,int())) printf("%d",deleteQ(&A));
printf("%d",deleteQ(&B));
}
while(!
IsemptyQ(&A,int()))//A队列不空,B队列空
{
if(!
flag)//第一个顾客输出后无空格
{
printf("%d",deleteQ(&A));
flag=1;
}
else
printf("%d",deleteQ(&A));
}
while(!
IsemptyQ(&B,int()))//B队列不空,A队列空
{
if(!
flag)//第一个顾客输出后无空格
{
printf("%d",deleteQ(&B));
flag=1;
}
else
printf("%d",deleteQ(&B));
}
printf("\n");
return0;
}