📄 aaa.cpp
字号:
#include "iostream.h"
#include "stdlib.h"
#include "time.h"
#define Counter 3 //队列数组的最大值,其中数组[0]置空
#define Max 10000000000 //设定一个用于比较的最大值
#define null 0
int CloseTime,TotalAmount0,TotalAmount; //银行的营业时间和营业总资本
int TotalTime,CustomerNum0,CustomerNum; //客户们在银行花费的累计时间和客户总数
int LargeAmount=0,DealAmount=0,UndealAmount1=0,UndealAmount2=0;//交易额的最大规模,已处理的交易额规模和队列1,队列2未处理的交易额规模
int DealCustomerNum=0,UndealCustomerNum1=0,UndealCustomerNum2=0;//已处理的客户数目和队列1,队列2未处理的客户数目
int Min=Max,Tag=0; //等候客户中要交易的最低金额和营业结束标志
struct Event //驱动事件
{
int Occurtime; //事件发生时间
int NType; //事件类型
Event *next;
};
struct QueueElem //客户信息
{
int Arrtime; //客户到达时间
int Duration; //客户交易时间
int Amount; //客户交易金额
QueueElem *next;
};
struct QueueList //交易客户队列
{
QueueElem *front; //队头
QueueElem *rear; //队尾
int Count;
};
typedef Event* EventList;
typedef QueueList* QuListArray;
void InitQuList(QueueList &Queue);
//初始化队列函数
int GetHead(QueueList Queue,QueueElem &customer);
//获得队头元素函数
void EnQueue(QueueList &Queue,QueueElem customer);
//入队列函数
void DelQueue(QueueList &Queue,QueueElem &customer);
//出队列函数
void InitEVList(EventList &EV);
//事件初始化函数
int cmp(Event a,Event b);
//事件发生时间比较函数
void OrderInsert(EventList &EV,Event &en,int(*cmp)(Event,Event));
//驱动事件按时间有序插入事件链表函数
void OpenForDay(EventList &EV,Event &en,QuListArray &q);
//营业模拟初始化函数
int EmptyQueue(QueueList &Queue);
//判断队列是否为空
void NextLeaver(EventList &EV,Event &en,QuListArray &q);
//确定下一个驱动事件函数
void CustomerArrived(EventList &EV,Event &en,QuListArray &q);
//客户到达事件处理函数
void Min_amount(QueueList Q);
//获得等候队列中的客户的最低交易额
int EmptyEV(EventList &EV);
//判断有序链表是否为空
void DelFirstEV(EventList &EV,Event &en);
//取出并删除事件链表中的第一个结点
void CustomerDeparture(EventList &EV,Event &en,QuListArray &q);
//客户离开事件处理函数
void Leave(QuListArray &q);
//营业时间结束后全部客户出队列函数
int PrintMainScreen();
//输出主界面窗口
void PrintMoodScreen();
//输出业务模拟窗口
int Output();
//输出业务模拟结果窗口
void main()
{
loopa:
if(PrintMainScreen()==1)
{
loopb: PrintMoodScreen();
int i;
Event en;
EventList EV;
QueueList q[Counter];
QuListArray QuPoint;
QuPoint=q;
LargeAmount=0,DealAmount=0,UndealAmount1=0,UndealAmount2=0;
DealCustomerNum=0,UndealCustomerNum1=0,UndealCustomerNum2=0;
Min=Max,Tag=0;
OpenForDay(EV,en,QuPoint);
while(!EmptyEV(EV))
{
DelFirstEV(EV,en);
if(en.NType==0)
{
CustomerArrived(EV,en,QuPoint);
}
else
{
CustomerDeparture(EV,en,QuPoint);
}
}
Leave(QuPoint);
i=Output();
if(i==1)goto loopa;
if(i==2)goto loopb;
}
}
void InitQuList(QueueList &Queue)
{
Queue.front=new QueueElem;
Queue.front->Arrtime=0;
Queue.front->Duration=0;
Queue.front->Amount=0;
Queue.rear=Queue.front;
Queue.front->next=null;
Queue.Count=0;
}
int GetHead(QueueList Queue,QueueElem &customer)
{
if(Queue.Count==0)return 0;
customer=*Queue.front->next;
customer.next=null;
return 1;
}
void EnQueue(QueueList &Queue,QueueElem customer)
{
QueueElem *P=new QueueElem;
*P=customer;
Queue.rear->next=P;
Queue.rear=P;
Queue.rear->next=null;
Queue.Count++;
}
void DelQueue(QueueList &Queue,QueueElem &customer)
{
if(Queue.front!=Queue.rear)
{
QueueElem *P=Queue.front->next;
Queue.front->next=P->next;
if(Queue.rear==P)
{
Queue.rear=Queue.front;
}
customer=*P;
delete P;
Queue.Count--;
}
}
void InitEVList(EventList &EV)
{
EV=new Event;
EV->NType=0;
EV->Occurtime=0;
EV->next=null;
}
int cmp(Event a,Event b)
{
if(a.Occurtime>b.Occurtime) return 1;
else if(a.Occurtime<b.Occurtime) return -1;
else if(a.Occurtime==b.Occurtime) return 0;
}
void OrderInsert(EventList &EV,Event &en,int(*cmp)(Event,Event))
{
Event *P,*Q;
Event *Temp=new Event;
*Temp=en;
P=Q=EV;
P=P->next;
if(P!=null)
{
while(P!=null)
{
if(cmp(*P,en)==-1)
{
P=P->next;
Q=Q->next;
}
else if(cmp(*P,en)==1)
{
Temp->next=P;
Q->next=Temp;
return;
}
else if(cmp(*P,en)==0)
{
do
{
P=P->next;
Q=Q->next;
}while(P&&!(cmp(*Q,*P)==-1));
Temp->next=P;
Q->next=Temp; //
return;
}
}
Q->next=Temp;
Temp->next=P;
return;
}
else
{
Q->next=Temp;
Temp->next=null;
return;
}
}
void OpenForDay(EventList &EV,Event &en,QuListArray &q)
{
Event *temp;
temp=new Event;
temp->NType=0;
temp->Occurtime=0;
temp->next=null;
en=*temp;
InitEVList(EV);
OrderInsert(EV,en,cmp);
for(int i=1;i<Counter;++i)InitQuList(q[i]);
TotalTime=0;
CustomerNum=0;
}
int EmptyQueue(QueueList &Queue)
{
if(Queue.Count==0) return 1;
else return 0;
}
void NextLeaver(EventList &EV,Event &en,QuListArray &q)
{
QueueElem customer;
if(Min<=TotalAmount)
{
GetHead(q[2],customer);
while(customer.Amount+TotalAmount<0)
{
DelQueue(q[2],customer);
EnQueue(q[2],customer);
GetHead(q[2],customer);
}
if(en.Occurtime+customer.Duration>=CloseTime)
{
Tag++;
Event temp={CloseTime,2,null};
OrderInsert(EV,temp,cmp);
}
else
{
Event temp={en.Occurtime+customer.Duration,2,null};
OrderInsert(EV,temp,cmp);
}
}
else
{
if(GetHead(q[1],customer))//
{
while(!EmptyQueue(q[1])&&customer.Amount<0&&customer.Amount+TotalAmount<0)
{
DelQueue(q[1],customer);
EnQueue(q[2],customer);
Min=Min<-customer.Amount?Min:-customer.Amount;
GetHead(q[1],customer);
}
if(!EmptyQueue(q[1]))
{
if(en.Occurtime+customer.Duration>=CloseTime)
{
Tag++;
Event temp={CloseTime,1,null};
OrderInsert(EV,temp,cmp);
}
else
{
Event temp={en.Occurtime+customer.Duration,1,null};
OrderInsert(EV,temp,cmp);
}
}
}
}
}
void CustomerArrived(EventList &EV,Event &en,QuListArray &q)
{
int intertime,durtime,amount,t,a,b;
srand(time(NULL));
intertime=1+rand()%30; //下个客户到达的时间间隔,不大于30分钟
dur:
durtime=1+rand()%30;//客户办理业务所要时间,不大于30分钟
if(intertime==durtime)goto dur;
a=rand()%2;
b=1+rand()%1000;
amount=a*b+(a-1)*b; //客户的存取金额,不大于1000元
t=en.Occurtime+intertime;
Event Temp={t,0,null};
if(t<CloseTime)
{
CustomerNum++;
OrderInsert(EV,Temp,cmp);
}
QueueElem customer={en.Occurtime,durtime,amount,null};
EnQueue(q[1],customer);
if(amount>0) //
{
LargeAmount+=amount;
}
else LargeAmount-=amount;
if(q[1].Count==1)NextLeaver(EV,en,q);
}
void Min_amount(QueueList Q)
{
Min=Max;
if(Q.Count==0)return;
int i;
QueueElem customer;
for(i=1;i<=Q.Count;i++)
{
DelQueue(Q,customer);
Min=Min<-customer.Amount?Min:-customer.Amount;
EnQueue(Q,customer);
}
}
int EmptyEV(EventList &EV)
{
if(EV->next==null)return 1;
else return 0;
}
void DelFirstEV(EventList &EV,Event &en)//调用前要先判断是否为空,否则会出错。
{
Event *temp;
temp=EV->next;
EV->next=temp->next;
en=*temp;
delete temp;
}
void CustomerDeparture(EventList &EV,Event &en,QuListArray &q)
{
int i=en.NType;
QueueElem customer;
DelQueue(q[i],customer);
TotalTime+=en.Occurtime-customer.Arrtime;
TotalAmount+=customer.Amount;
if(customer.Amount>0)
{
DealAmount+=customer.Amount;
}
else DealAmount-=customer.Amount;//
DealCustomerNum++;
if(Tag==0)
{
if(i==2)Min_amount(q[i]);
NextLeaver(EV,en,q);
}
}
void Leave(QuListArray &q)
{
int i;
QueueElem customer;
for(i=1;i<Counter;i++)
{
while(!EmptyQueue(q[i]))
{
DelQueue(q[i],customer);
TotalTime+=CloseTime-customer.Arrtime;
if(i==1)
{
UndealCustomerNum1++;
if(customer.Amount>0)
{
UndealAmount1+=customer.Amount;
}
else UndealAmount1-=customer.Amount;
}
if(i==2)
{
UndealCustomerNum2++;
if(customer.Amount>0)
{
UndealAmount2+=customer.Amount;
}
else UndealAmount2-=customer.Amount;
}
}
}
}
int PrintMainScreen()
{
int i,choose1;
system("cls");
cout<<endl<<endl;
for(i=1;i<=80;i++)cout<<"*";
cout<<" 欢迎进入主窗口界面!"<<endl<<endl<<endl;
cout<<" 题目: 银行业务模拟"<<endl<<endl<<endl;
cout<<" 班级: 计算机科学与技术2班"<<endl<<endl<<endl;
cout<<" 姓名: 丘 锋 伟" <<endl<<endl<<endl;
cout<<" 学号: 2003040140224"<<endl<<endl<<endl;
cout<<" 完成日期: 2005.06.26"<<endl;
cout<<endl;
for(i=1;i<=80;i++)cout<<"*";
cout<<"请选择如下操作:"<<endl<<endl;
cout<<"1: 进入银行业务的事件驱动模拟系统"<<endl;
cout<<"0: 退出程序"<<endl;
cin>>choose1;
return choose1;
}
void PrintMoodScreen()
{
int i;
system("cls");
cout<<endl<<endl;
for(i=1;i<=80;i++)cout<<"*";
cout<<endl;
cout<<"欢迎进入银行业务的事件驱动模拟系统."<<endl<<endl<<endl;
cout<<"模拟系统说明:"<<endl<<endl;
cout<<" 银行营业初拥有资本为:TotalAmount(元),营业时间为:CloseTime(分钟),"<<endl<<endl;
cout<<" 这两个模拟参数由测试用户设定.客户业务分为两种.第一种是申请从银行"<<endl<<endl;
cout<<" 得到一笔资金,即取款或贷款. 第二种是向银行投入一笔资金,即存款或还"<<endl<<endl;
cout<<" 款.银行有两个服务窗口,相应地有两个队列.客户到达银行先排第一个队."<<endl<<endl;
cout<<" 处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而"<<endl<<endl;
cout<<" 得不到满足时,则立刻排入第二个队等候,直至满足时才离开银行; 否则业"<<endl<<endl;
cout<<" 务处理完后立刻离开银行.每接待完一个第一种业务的客户,则顺序检查和"<<endl<<endl;
cout<<" 处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满"<<endl<<endl;
cout<<" 足者重新排到第二个队列的队尾.在此检查过程中,一旦银行资金总额少于"<<endl<<endl;
cout<<" 或等于刚才第一个队列中最后一个客户(第二种业务)被接待前的数额, 或"<<endl<<endl;
cout<<" 者本次已将第二个队列检查或处理了一遍就停止检查,转而继续接待第一"<<endl<<endl;
cout<<" 个队列的客户. 任何时刻都只开一个窗口.假设检查不需要时间. 营业时"<<endl<<endl;
cout<<" 间结束时所有客户立即离开银行."<<endl<<endl;
for(i=1;i<=80;i++)cout<<"*";
cout<<"下面进行银行业务模拟:"<<endl<<endl;
cout<<"请输入模拟参数:"<<endl<<endl;
cout<<"银行营业开始时拥有的可用资本(元): TotalAmount=";
cin>>TotalAmount;
TotalAmount0=TotalAmount;
cout<<endl;
cout<<"银行连续营业时间(8小时为480分钟): CloseTime=";
cin>>CloseTime;
cout<<endl;
return;
}
int Output()
{
int i,choose2,AveriTime,ShallTime;
system("cls");
cout<<endl<<endl;
for(i=1;i<=80;i++)cout<<"*";
cout<<"银行业务的事件驱动模拟结束,模拟结果如下:"<<endl<<endl;
cout<<" 01.银行连续营业的总时间(分钟): CloseTime="<<CloseTime<<endl<<endl;
cout<<" 02.银行最初拥有的可用资本(元): TotalAmount="<<TotalAmount0<<endl;
cout<<" 03.营业结束时银行资本余额(元): RestAmount="<<TotalAmount<<endl<<endl;
cout<<" 04.客户要求交易的资金总额(元): LargeAmount="<<LargeAmount<<endl;
cout<<" 05.与客户实现交易的总金额(元): DealAmount="<<DealAmount<<endl;
cout<<" 06.银行与客户交易的资金满足率: ";
if(100*DealAmount/LargeAmount==0)cout<<"小于1%"<<endl<<endl;
else cout<<100*DealAmount/LargeAmount<<"%"<<endl<<endl;
CustomerNum0=CustomerNum+1;
cout<<" 07.营业时间内到达的客户数量为: CustomerNum="<<CustomerNum0<<endl;
cout<<" 08.与银行实现交易的客户数量为: DealCustomerNum="<<DealCustomerNum<<endl;
if(CustomerNum0==0)CustomerNum0++;
cout<<" 09.银行营业时间内客户满足率为: ";
if(100*DealCustomerNum/CustomerNum0==0)cout<<"小于1%"<<endl<<endl;
else cout<<100*DealCustomerNum/CustomerNum0<<"%"<<endl<<endl;
cout<<" 10.营业结束时第一队客户数量为: UndealCustomerNum1="<<UndealCustomerNum1<<endl;
cout<<" 11.这些客户要求交易金额为(元): UndealAmount1="<<UndealAmount1<<endl<<endl;
cout<<" 12.营业结束时时第二队客户数为: UndealCustomerNum2="<<UndealCustomerNum2<<endl;
cout<<" 13.这些客户要求交易金额为(元): UndealAmount2="<<UndealAmount2<<endl<<endl;
cout<<" 14.客户逗留的平均时间为(分钟): AveriTime=";
CustomerNum0=CustomerNum+1;
if(CustomerNum0==0)
{
AveriTime=CustomerNum0;
cout<<AveriTime<<endl;
}
else
{
AveriTime=TotalTime/CustomerNum0;
cout<<AveriTime<<endl;
}
cout<<" 15.客户分享服务平均时间(分钟): ShallTime=";
if(AveriTime<CloseTime/CustomerNum0)
{
ShallTime=AveriTime;
cout<<ShallTime<<endl;
}
else
{
if(CustomerNum0==0)
{
ShallTime=CustomerNum0;
cout<<ShallTime<<endl;
}
else
{
ShallTime=CloseTime/CustomerNum0;
cout<<ShallTime<<endl;
}
}
cout<<" 16.营业期间客户平均时间利用率: ";
if(ShallTime==0||AveriTime==0)cout<<"0%"<<endl;
else if(100*ShallTime/AveriTime==0)cout<<"小于1%"<<endl;
else cout<<100*ShallTime/AveriTime<<"%"<<endl;
cout<<endl;
for(i=1;i<=80;i++)cout<<"*";
cout<<"请输入操作种类:"<<endl;
cout<<"1 返回主窗口界面"<<endl;
cout<<"2 返回银行业务的事件驱动模拟系统"<<endl;
cout<<"0 退出程序"<<endl;
cin>>choose2;
return choose2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -