银行排队模拟(队列)
银行排队模拟程序
队列类Queue
#ifndef QUEUE_H
#define QUEUE_H
struct Record //顾客结构体
{
int ArrivedTime; //顾客到达时间
int CostTime; //顾客办理时间
int Num; //顾客编号
};
const int QueueSize=10;
class Queue
{
public:
Queue(); //构造函数
virtual ~Queue(); //析构函数
void addFirst(int x,int y,int z); //入队
int popLast(); //出队
int Getqueue1(); //获取队头元素的到达时间
int Getqueue2(); //获取队头元素的办理时间
int Getqueue3(); //获取队头元素的编号
bool Empty(){
if(front==rear) return true;
else return false;
}
Record data[QueueSize];
int front,rear;
};
#endif
#include "Queue.h"
#include<stdio.h>
#include<stdlib.h>
Queue::Queue()
{
//ctor
int data=(int)malloc(2*sizeof(QueueSize));
front=rear=QueueSize-1;
}
Queue::~Queue()
{
//dtor
delete []data;
}
void Queue::addFirst(int x,int y,int z)
{
if((rear+1)%QueueSize==front) throw"иорГ";
rear=(rear+1)%QueueSize;
data[rear].ArrivedTime=x;
data[rear].CostTime=y;
data[rear].Num=z;
}
int Queue::popLast()
{
if(rear==front) throw"обрГ";
front=(front+1)%QueueSize;
return 0;
}
int Queue::Getqueue1()
{
if(rear==front) throw"обрГ";
int i=(front+1)%QueueSize;
return data[i].ArrivedTime;
}
int Queue::Getqueue2()
{
if(rear==front) throw"обрГ";
int i=(front+1)%QueueSize;
return data[i].CostTime;
}
int Queue::Getqueue3()
{
if(rear==front) throw"обрГ";
int i=(front+1)%QueueSize;
return data[i].Num;
}
#ifndef MODELQUEUE_H
#define MODELQUEUE_H
#include <Queue.h>
struct bankWindow //银行窗口结构体
{
int Runningtime; //银行窗口的已办公时间
int number; //银行窗口号
int needtime; //银行窗口顾客所需办理时间
bool V; //银行窗口顾客类型(普通和VIP)
};
class Modelqueue : public Queue
{
public:
Modelqueue(); //构造函数
virtual ~Modelqueue(); //析构函数
void Modelbank(); //模拟函数
};
#endif // MODELQUEUE_H
模拟排队类Modelqueue
#include "Modelqueue.h"
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
Modelqueue::Modelqueue()
{
//ctor
}
Modelqueue::~Modelqueue()
{
//dtor
}
void Modelqueue::Modelbank()
{
int time=0,f=0,r=30;
//int Window[4];
Queue Vipc;
Queue comc;
int flag;//1为VIP,0为普通
Record customer;
int winnum;
cout <<"窗口数量:";
cin>>winnum;
struct bankWindow b[winnum];
int n;
cout<<"顾客数量:";
cin>>n;
cout << "------模拟开始------" << endl<<"初始化用户:"<<endl<<"是否VIP | 到达时间 | 办公时间 | 编号"<<endl;
//cout<<n<<endl;
while(n--)
{
scanf("%d %d %d %d",&flag,&customer.ArrivedTime,&customer.CostTime,&customer.Num);
if(flag==1) Vipc.addFirst(customer.ArrivedTime,customer.CostTime,customer.Num);
else comc.addFirst(customer.ArrivedTime,customer.CostTime,customer.Num);
}
Sleep(1000);
system("cls");
cout<<endl<<endl;
for(int win=0;win<winnum;win++)
{
if(Vipc.Getqueue1()==time)
{
cout<<" VIP客户, 编号为:"<<Vipc.Getqueue3()<<" 请进入 "<<win<<"号窗口服务"<<endl<<endl;
b[win].number = Vipc.Getqueue3();
b[win].needtime = Vipc.Getqueue2();
b[win].Runningtime = 1;
b[win].V=true;
Vipc.popLast();
}
else if(comc.Getqueue1()==time)
{
cout<<" 普通客户, 编号为:"<<comc.Getqueue3()<<" 请进入 "<<win<<"号窗口服务"<<endl<<endl;
b[win].number = comc.Getqueue3();
b[win].needtime = comc.Getqueue2();
b[win].Runningtime = 1;
b[win].V=false;
comc.popLast();
}
else b[win].Runningtime=0;
}
while(1)
{
Sleep(2000);
system("cls");
cout<<endl<<endl<<"-当前模拟时间:"<<time<<"-分钟-"<<endl<<endl;
cout<<"窗口 "<<" 窗口状态 "<<" 客户类型 "<<" 客户编号 "<<endl<<"------------------------------------------------"<<endl<<endl;
for(int i=0;i<winnum;i++)
{
if(time==0)
{
cout<<"窗口"<<i<<": -等待服务- "<<endl<<endl;
}
else if(time!=0&&b[i].Runningtime!=0)
{
cout<<"窗口"<<i<<": -正在服务- ";
if(b[i].V==true) cout<<" VIP "<<b[i].number<< endl<<endl;
else cout<<" 普通 "<<b[i].number<<endl<<endl;
}
else cout<<"窗口"<<i<<": -等待服务- "<<endl<<endl;
if(b[i].Runningtime==b[i].needtime+1)
{
b[i].Runningtime=0;
}
else if(b[i].Runningtime==0)
{
if(Vipc.Empty()==false&&Vipc.Getqueue1()<time+1)
{
b[i].number = Vipc.Getqueue3();
b[i].needtime = Vipc.Getqueue2();
b[i].Runningtime +=1;
b[i].V=true;
Vipc.popLast();
}
else if(comc.Empty()==false&&comc.Getqueue1()<time+1)
{
b[i].number = comc.Getqueue3();
b[i].needtime = comc.Getqueue2();
b[i].Runningtime += 1;
b[i].V=false;
comc.popLast();
}//if(time==6) cout<<Vipc.Empty()<<endl;
//else time=19;
}
else
{
b[i].Runningtime++;
}
}
time++;
if(Vipc.Empty()==true&&comc.Empty()==true&&f==0)
{
r=time+7;
f=1;
}
if(time==r) break;
}
Sleep(3000);
system("cls");
int g=10;
while(g--)
{
if(g==9) cout<<endl<<endl<<"哈哈,服务结束啦,银行下班啦"<<endl;
for(int i=0;i<100-g*10;i++)
{
cout<<" ";
}
cout<<"谢谢观看"<<endl;
}
}
主函数
#include <iostream>
#include<stdio.h>
#include<queue>
#include<stdlib.h>
#include<time.h>
#include "Modelqueue.h"
using namespace std;
/*
样例
4
10
0 0 5 1001
0 0 4 1002
1 0 5 1003
0 1 4 1004
1 1 6 1005
0 1 7 1006
0 2 4 1007
1 4 5 1008
0 5 5 1009
1 5 4 1010
*/
int main()
{
Modelqueue bank;
bank.Modelbank();
return 0;
}