设银行有四个服务窗口,一个等待队列, 每个窗口均可以办理存款、取款、挂失、还贷等业务,每种业务所需的服务时间不同,客户到达银行后,先到打号机上打号,号票上包括到达时间、编号和需要办理的业务,然后在银行内等候, 当任一服务窗口空闲时,处理等候客户中排在最前面的客户的业务。写一个上述银行业务的模拟系统,通过模拟方法求出客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。
基本要求:每个客户到达银行的时间和需要办理的业务随机产生,输出一天客户在银行的平均逗留时间和每个窗口每天办理的客户数和每种业务数。
/*
大连民族大学
计算机科学与工程学院
软件工程
尹旭阳 版权所有,如需引用,望告知
*/
#include <iostream>
#include <windows.h>
#include <time.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Frame
{
public:
int hour;
int minu_start;
int minu_end = 0;
//四个业务分别办理的数量
int ic1 = 0;
int ic2 = 0;
int ic3 = 0;
int ic4 = 0;
Frame()
{
}
Frame(int x)
{
hour = x;
}
void show()
{
printf("\t\t\t\t\t办理业务总数量:%d\n",ic1+ic2+ic3+ic4);
printf("\t\t\t\t\t存款:%d\n",ic1);
printf("\t\t\t\t\t取款:%d\n",ic2);
printf("\t\t\t\t\t挂失:%d\n",ic3);
printf("\t\t\t\t\t还贷:%d\n",ic4);
}
};
class person
{
public:
int number; //客户所获得的编码
int business; //客户所要办理的业务
int hour;
int minute; //客户的到达时间
int hours;
int minutes; //客户的离开时间
int business_time;
int jud; //这两个是在后面的判断里用到,可以看不懂
};
struct Node
{
person data; //数据域
Node* next; //指针域
};//template<typename T>
class LinkQueue
{
public:
LinkQueue(); //构造函数
~LinkQueue(); //析构函数
void EnQueue(person Person); //入队操作
person DeQueue(); //出队操作
int count = -1;
private:
Node *front, *rear; //队头和队尾指针
};//构造函数,只申请一个头结点
LinkQueue::LinkQueue()
{
Node *s = NULL;
s = new Node;
s->next = NULL;
front = rear = s;
}//析构函数
LinkQueue::~LinkQueue()
{
Node *p = front;
while(front != NULL)
{
front = front->next;
delete p;
p = front;
}
}//入队操作
void LinkQueue::EnQueue(person Person)
{
Node *s = NULL;
s = new Node;
s->data = Person;
count++;
s->next = NULL;
rear->next = s;
rear = s;
}//出队操作
person LinkQueue::DeQueue()
{
person pe;
Node *p = NULL;
if(rear == front) throw "下溢";
p = front->next;
pe = p->data;
front->next = p->next;
delete p;
count--;
return pe;
}class enroll
{
private:
int m;
int n;
int flag;
public:
enroll(person p[],LinkQueue &q,int open_time,int close_time)
{
int yxy;
int i = 1;
p[0].hour = open_time;
p[0].minute = 0;
m = open_time;
n = close_time;
int count2 = 0;
srand((unsigned int)time(NULL));
do
{
count2++;
printf("\t\t\t\t第%d个客户来到银行\n",i);
cout << "\t\t\t\t到达时间:" << endl;
p[i].number = rand()%9000 + 1000;
cout << "\t\t\t\t 小时:";
do
{
int ret1 = rand()%(n - m + 1) + m;
if(ret1 < p[i-1].hour || ret1 - p[i-1].hour > 1)
{
flag = 0;
}
else if(count2 <= 4 && ret1 > p[i-1].hour)
{
flag = 0;
}
else
{
cout << ret1 << endl;
p[i].hour = ret1;
flag = 1;
if(ret1 > p[i-1].hour)
{
count2 = 0;
}
}
}while(flag == 0);
cout << "\t\t\t\t 分钟: ";
do
{
int ret2 = rand()%60 + 0;
if(p[i].hour == p[i-1].hour && ret2 < p[i-1].minute)
{
flag = 0;
}
else
{
cout << ret2 << endl;
p[i].minute = ret2;
flag = 1;
}
}while(flag == 0);
cout << "\t\t\t\t您的编号为:" << p[i].number << endl;
cout << "\t\t\t\t请选择业务类型: 1.存款 2.取款 3.挂失 4.还贷" << endl;
int ret3 = rand()%4 + 1;
cout << "\t\t\t\t" << ret3 << endl;
p[i].business = ret3;
q.EnQueue(p[i]);
cout << "\t\t\t\t选择成功" << endl;
cout << endl;
cout << endl;
if(p[i].business == 1)
{
p[i].business_time = 20;
}
else if(p[i].business == 2)
{
p[i].business_time = 25;
}
else if(p[i].business == 3)
{
p[i].business_time = 30;
}
else
{
p[i].business_time = 35;
}
if(p[i].minute + p[i].business_time >= 60)
{
p[i].jud = p[i].hour + 1;
}
else
{
p[i].jud = p[i].hour;
}
if(p[i].jud >= close_time)
{
yxy = 1;
}
else
{
yxy = 0;
}
Sleep(500);
i++;
}while(yxy == 0);
}
};
class coti //每个窗口都有人时,进入该函数
{
public:
int co;
coti(Frame &F1,Frame &F2,Frame &F3,Frame &F4,person &m,int dep_time,int wd_time,int rtlo_time,int repay_time)
{
Frame min;
min.hour = 24;
min.minu_end = 59;
min.minu_start = 59;
if((F1.hour < min.hour)||(F1.hour == min.hour && F1.minu_end < min.minu_end))
{
min = F1;
co = 1;
}
if((F2.hour < min.hour)||(F2.hour == min.hour && F2.minu_end < min.minu_end))
{
min = F2;
co = 2;
}
if((F3.hour < min.hour)||(F3.hour == min.hour && F3.minu_end < min.minu_end))
{
min = F3;
co = 3;
}
if((F4.hour < min.hour)||(F4.hour == min.hour && F4.minu_end < min.minu_end))
{
min = F4;
co = 4;
}
switch(co)
{
case 1:
F1.minu_start = F1.minu_end;
if(F1.minu_start >= 60)
{
F1.hour++;
F1.minu_start = F1.minu_start - 60;
}
switch(m.business)
{
case 1:
F1.minu_end = F1.minu_start + dep_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic1++;
m.hours = F1.hour;
m.minutes = F1.minu_end;
break;
case 2:
F1.minu_end = F1.minu_start + wd_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic2++;
m.hours = F1.hour;
m.minutes = F1.minu_end;
break;
case 3:
F1.minu_end = F1.minu_start + rtlo_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic3++;
m.hours = F1.hour;
m.minutes = F1.minu_end;
break;
case 4:
F1.minu_end = F1.minu_start + repay_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic4++;
m.hours = F1.hour;
m.minutes = F1.minu_end;
break;
default:
cout << "错误" << endl;
break;
}
break;
case 2:
F2.minu_start = F2.minu_end;
if(F2.minu_start >= 60)
{
F2.hour++;
F2.minu_start = F2.minu_start - 60;
}
switch(m.business)
{
case 1:
F2.minu_end = F2.minu_start + dep_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic1++;
m.hours = F2.hour;
m.minutes = F2.minu_end;
break;
case 2:
F2.minu_end = F2.minu_start + wd_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic2++;
m.hours = F2.hour;
m.minutes = F2.minu_end;
break;
case 3:
F2.minu_end = F2.minu_start + rtlo_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic3++;
m.hours = F2.hour;
m.minutes = F2.minu_end;
break;
case 4:
F2.minu_end = F2.minu_start + repay_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic4++;
m.hours = F2.hour;
m.minutes = F2.minu_end;
break;
default:
cout << "错误" << endl;
break;
}
break;
case 3:
F3.minu_start = F3.minu_end;
if(F3.minu_start >= 60)
{
F3.hour++;
F3.minu_start = F3.minu_start - 60;
}
switch(m.business)
{
case 1:
F3.minu_end = F3.minu_start + dep_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
F3.ic1++;
m.hours = F3.hour;
m.minutes = F3.minu_end;
break;
case 2:
F3.minu_end = F3.minu_start + wd_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
F3.ic2++;
m.hours = F3.hour;
m.minutes = F3.minu_end;
break;
case 3:
F3.minu_end = F3.minu_start + rtlo_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
F3.ic3++;
m.hours = F3.hour;
m.minutes = F3.minu_end;
break;
case 4:
F3.minu_end = F3.minu_start + repay_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
F3.ic4++;
m.hours = F3.hour;
m.minutes = F3.minu_end;
break;
default:
cout << "错误" << endl;
break;
}
break;
case 4:
F4.minu_start = F4.minu_end;
if(F4.minu_start >= 60)
{
F4.hour++;
F4.minu_start = F4.minu_start - 60;
}
switch(m.business)
{
case 1:
F4.minu_end = F4.minu_start + dep_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic1++;
m.hours = F4.hour;
m.minutes = F4.minu_end;
break;
case 2:
F4.minu_end = F4.minu_start + wd_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic2++;
m.hours = F4.hour;
m.minutes = F4.minu_end;
break;
case 3:
F4.minu_end = F4.minu_start + rtlo_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic3++;
m.hours = F4.hour;
m.minutes = F4.minu_end;
break;
case 4:
F4.minu_end = F4.minu_start + repay_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic4++;
m.hours = F4.hour;
m.minutes = F4.minu_end;
break;
default:
cout << "错误" << endl;
break;
}
break;
default:
break;
}
}
};/*这里讲一下下面两个类的主要思路:首先出队一个客户,用该客户的到达时间依次和四个窗口的结束时间(初始化为银行的工作时间)作比较,如果比他晚,则进入该窗口,比较停止,否则继续比较。如果四个窗口都在工作中,则选出四个窗口中结束时间最早的窗口,将该窗口的结束时间重置为原本的结束时间加上该客户办理业务的时间(注:每个窗口给客户办理业务之后,客户的离开时间即可确定,同时,该窗口的该次结束时间也可重置)*/
class cotis
{
private:
int flag = 0;
double sum_time = 0;
public:
cotis(LinkQueue &Q,Frame &F1,Frame &F2,Frame &F3,Frame &F4,int dep_time,int wd_time,int rtlo_time,int repay_time)
{
while(Q.count != -1)
{
person ps;
flag++;
ps = Q.DeQueue();
if((ps.hour > F1.hour)||(ps.hour == F1.hour && ps.minute > F1.minu_end))
{
switch(ps.business)
{
case 1:
F1.hour = ps.hour;
F1.minu_start = ps.minute;
F1.minu_end = F1.minu_start + dep_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic1++;
ps.hours = F1.hour;
ps.minutes = F1.minu_end;
break;
case 2:
F1.hour = ps.hour;
F1.minu_start = ps.minute;
F1.minu_end = F1.minu_start + wd_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic2++;
ps.hours = F1.hour;
ps.minutes = F1.minu_end;
break;
case 3:
F1.hour = ps.hour;
F1.minu_start = ps.minute;
F1.minu_end = F1.minu_start + rtlo_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic3++;
ps.hours = F1.hour;
ps.minutes = F1.minu_end;
break;
case 4:
F1.hour = ps.hour;
F1.minu_start = ps.minute;
F1.minu_end = F1.minu_start + repay_time;
if(F1.minu_end >= 60)
{
F1.hour++;
F1.minu_end = F1.minu_end - 60;
}
F1.ic4++;
ps.hours = F1.hour;
ps.minutes = F1.minu_end;
break;
default:
cout << "错误" << endl;
break;
}
}
else if((ps.hour > F2.hour)||(ps.hour == F2.hour && ps.minute > F2.minu_end))
{
switch(ps.business)
{
case 1:
F2.hour = ps.hour;
F2.minu_start = ps.minute;
F2.minu_end = F2.minu_start + dep_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic1++;
ps.hours = F2.hour;
ps.minutes = F2.minu_end;
break;
case 2:
F2.hour = ps.hour;
F2.minu_start = ps.minute;
F2.minu_end = F2.minu_start + wd_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic2++;
ps.hours = F2.hour;
ps.minutes = F2.minu_end;
break;
case 3:
F2.hour = ps.hour;
F2.minu_start = ps.minute;
F2.minu_end = F2.minu_start + rtlo_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic3++;
ps.hours = F2.hour;
ps.minutes = F2.minu_end;
break;
case 4:
F2.hour = ps.hour;
F2.minu_start = ps.minute;
F2.minu_end = F2.minu_start + repay_time;
if(F2.minu_end >= 60)
{
F2.hour++;
F2.minu_end = F2.minu_end - 60;
}
F2.ic4++;
ps.hours = F2.hour;
ps.minutes = F2.minu_end;
break;
default:
cout << "错误" << endl;
break;
}
}
else if((ps.hour > F3.hour)||(ps.hour == F3.hour && ps.minute > F3.minu_end))
{
switch(ps.business)
{
case 1:
F3.hour = ps.hour;
F3.minu_start = ps.minute;
F3.minu_end = F3.minu_start + dep_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
F3.ic1++;
ps.hours = F3.hour;
ps.minutes = F3.minu_end;
continue;
case 2:
F3.hour = ps.hour;
F3.minu_start = ps.minute;
F3.minu_end = F3.minu_start + wd_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
F3.ic2++;
ps.hours = F3.hour;
ps.minutes = F3.minu_end;
continue;
case 3:
F3.hour = ps.hour;
F3.minu_start = ps.minute;
F3.minu_end = F3.minu_start + rtlo_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
F3.ic3++;
ps.hours = F3.hour;
ps.minutes = F3.minu_end;
break;
case 4:
F3.hour = ps.hour;
F3.minu_start = ps.minute;
F3.minu_end = F3.minu_start + repay_time;
if(F3.minu_end >= 60)
{
F3.hour++;
F3.minu_end = F3.minu_end - 60;
}
ps.hours = F3.hour;
ps.minutes = F3.minu_end;
F3.ic4++;
break;
default:
cout << "错误" << endl;
break;
}
}
else if((ps.hour > F4.hour)||(ps.hour == F4.hour && ps.minute > F4.minu_end))
{
switch(ps.business)
{
case 1:
F4.hour = ps.hour;
F4.minu_start = ps.minute;
F4.minu_end = F4.minu_start + dep_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic1++;
ps.hours = F4.hour;
ps.minutes = F4.minu_end;
break;
case 2:
F4.hour = ps.hour;
F4.minu_start = ps.minute;
F4.minu_end = F4.minu_start + wd_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic2++;
ps.hours = F4.hour;
ps.minutes = F4.minu_end;
break;
case 3:
F4.hour = ps.hour;
F4.minu_start = ps.minute;
F4.minu_end = F4.minu_start + rtlo_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic3++;
ps.hours = F4.hour;
ps.minutes = F4.minu_end;
break;
case 4:
F4.hour = ps.hour;
F4.minu_start = ps.minute;
F4.minu_end = F4.minu_start + repay_time;
if(F4.minu_end >= 60)
{
F4.hour++;
F4.minu_end = F4.minu_end - 60;
}
F4.ic4++;
ps.hours = F4.hour;
ps.minutes = F4.minu_end;
break;
default:
cout << "错误" << endl;
break;
}
}
else
{
coti ct(F1,F2,F3,F4,ps,dep_time,wd_time,rtlo_time,repay_time);
}
if(ps.hour == ps.hours)
{
sum_time = sum_time + (ps.minutes - ps.minute);
}
else if(ps.hours > ps.hour)
{
sum_time = sum_time + ((ps.hours - ps.hour) * 60 + (ps.minutes - ps.minute));
}
else
{
cout << "发生了什么" << endl;
}
}
}
int getFlag()
{
return this->flag;
}
double getSum()
{
return this->sum_time;
}
};class display
{
public:
display(int &open_time,int &close_time)
{
printf("\n");
cout << "\t\t\t\t 请您设置银行的上班时间 " << endl;
printf( "\t\t\t\t ");
int flag;
do
{
cin >> open_time;
if(open_time <= 6 || open_time >= 10)
{
cout << "\t 您在开玩笑么,请重新输入:";
flag = 0;
}
else
{
flag = 1;
}
}while(flag == 0);
cout << "\t\t\t\t 请您设置银行的下班时间 " << endl;
printf( "\t\t\t\t ");
do
{
cin >> close_time;
if(close_time <= 0 || close_time >= 24)
{
cout << "\t 您在开玩笑么,请重新输入:";
flag = 0;
}
else if(close_time <= open_time)
{
cout << "\t 您在开玩笑么,请重新输入:";
flag = 0;
}
else
{
flag = 1;
}
}while(flag == 0);
cout << "\t\t\t\t 设置成功" << endl;
}
display(Frame &F1,Frame &F2,Frame &F3,Frame &F4)
{
printf("\t\t\t\t\*************************\n");
printf("\t\t\t\t第一个窗口:\n");
F1.show();
printf("\t\t\t\t第二个窗口:\n");
F2.show();
printf("\t\t\t\t第三个窗口:\n");
F3.show();
printf("\t\t\t\t第四个窗口:\n");
F4.show();
printf("\n");
}
display()
{
printf("\t\t\t\t----------------------------------\n");
printf( "\t\t\t\t| |\n");
cout << "\t\t\t\t| 这是一个银行业务模拟系统 |" << endl;
printf( "\t\t\t\t| |\n");
printf("\t\t\t\t----------------------------------\n");
Sleep(1000);
printf( "\t\t\t\t| |\n");
printf( "\t\t\t\t| 欢迎来到中国银行 |\n");
printf( "\t\t\t\t| |\n");
printf( "\t\t\t\t---------------------------------\n");
}
};
int main(int argc, char** argv) {
const int MaxSize = 100;
double average_time;
int open_time;
int close_time;
const int dep_time = 20; //存款花费的时间
const int wd_time = 25; //取款花费的时间
const int rtlo_time = 30; //挂失花费的时间
const int repay_time = 35; //还贷花费的时间
LinkQueue Q;
display();
display dis(open_time,close_time);
Sleep(2000);
system("cls");
person pers[MaxSize];
enroll e(pers,Q,open_time,close_time);
Frame F1(open_time),F2(open_time),F3(open_time),F4(open_time);
cotis cts(Q,F1,F2,F3,F4,dep_time,wd_time,rtlo_time,repay_time);
average_time = cts.getSum()/cts.getFlag();
Sleep(2000);
display disp(F1,F2,F3,F4);
cout << "\t\t\t\t平均逗留时间:" << average_time << "分钟" <<endl;
return 0;
}