⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aaa.cpp

📁 银行业务模拟系统,主要是针对数据结构和算法的设计,是数据结构的课程设计
💻 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 + -