第十七周--课程设计

问题及代码:

/*
版权所有 (C)DWW
文件名称:银行业务的模拟系统.cpp
内容摘要:银行排队办理业务
作者:杜文文
完成日期:2015 年12月 25日
*/

<pre name="code" class="cpp">#include <iostream>
#include <queue>//队列的头文件
#include <stdlib.h>//C语言标准的包含库头文件
#include <stdio.h>
#include <time.h>
#include <ctime>
#include "windows.h"//WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。

using namespace std;

int AverageTime;//平均时间
/*
***************************************************************

功能描述:输出主要界面
输入参数:无
输出参数:标题 时间 单位时间 当前时间
其他说明:服务时间为0-100

***************************************************************

*/
void  DisplayWindows(int presenttime,int servingtime, int waittime)//现在的时间;服务的时间;等待的时间
{
	cout<<"************银行业务的模拟系统*************"<<endl;
	cout<<"                                                   "<<endl;
	cout<<"***********银行服务时间0--"<<servingtime<<"************"<<endl;
	cout<<"                                                   "<<endl;
	cout<<"**该系统每隔"<<waittime<<"单位个时间显示窗口信息****"<<endl;
	cout<<"                                                   "<<endl;
	cout<<"当前时间为"<<presenttime<<""<<endl;
}
/*
***************************************************************

功能描述:顾客信息
输入参数:无
输出参数:顾客服务的时间
          顾客等待的时间
		  顾客进去的时间
其他说明:id从0开始

***************************************************************

*/
class Customer//顾客信息
{
public:
	Customer()
	{
		ServTime=0;
		enterTime=0;
		startTime=0;
		cID=0;
		endTime=0;
	}
	void Reset()
	{
		ServTime=0;
		enterTime=0;
		startTime=0;
		cID=0;
		endTime=0;
	}
	Customer(const Customer& anthercustomer)//复制构造函数
	{
		enterTime=anthercustomer.enterTime;
		startTime=anthercustomer.startTime;
		servDurance=anthercustomer.servDurance;
		ServTime=anthercustomer.ServTime;
		cID=anthercustomer.cID;
		endTime=anthercustomer.endTime;
	}
	void SetServTime(int serT)
	{
		ServTime=serT;
	}
	int GetID()
	{
		return cID;
	}
	int GetEndTime()
	{
		return endTime;
	}
	int GetStartTime()
	{
		return startTime;
	}
	int GetSerDurance()//顾客等待时间
	{
		return (startTime-enterTime);
	}
	int GetServTime()
	{
		return ServTime;
	}
	void SetEnterTime(int enterT)
	{
		enterTime=enterT;
	}
	void SetEndTime(int endT)
	{
		endTime=endT;
	}
	void SetID(int ID)
	{
		cID=ID;
	}
	void SetSartTime(int startT)
	{
		startTime=startT;
	}
private:
	int enterTime,startTime,ServTime,servDurance,cID,endTime;
};
/*
***************************************************************

功能描述:银行信息
输入参数:无
输出参数:顾客及等待时间
其他说明:id依次增加

***************************************************************

*/
class Bank
{
public:
	void ResetBank()
	{
		while(!servingcustomer.empty())
			servingcustomer.pop();
		while(!waitingcustomer.empty())
			waitingcustomer.pop();
	}
	bool Assign(Customer customer)//判断服务窗口有没有完成服务
	{
		if(customer.GetEndTime()-customer.GetStartTime()==customer.GetServTime())
			return true;
		else
			return false;
	}
	void DisplayWaitingTime(queue<Customer> quecus)
	{
		AverageTime=0;
		cout<<"顾客及等待时间:"<<endl;
		while(!quecus.empty())
		{
			cout<<"顾客"<<quecus.front().GetID()<<": "<<quecus.front().GetSerDurance()<<"  ";
			AverageTime+=quecus.front().GetSerDurance();
			quecus.pop();
		}
		cout<<endl;
	}
	queue<Customer> GetCustomerQueue(queue<Customer> queuec)
	{
		queue<Customer> temp;
		while(!queuec.empty())
		{
			temp.push(queuec.front());
			queuec.pop();

		}
		return temp;
	}
	queue<Customer> servingcustomer;
	queue<Customer> waitingcustomer;
};
/*
***************************************************************

功能描述:主函数
输入参数:无
输出参数:判断窗口1-5的完成情况
其他说明:单位时间是5

***************************************************************

*/
int main()
{
	Bank Bank1;
	Bank1.ResetBank();
	queue<Customer> CustomerTrack;
	queue<Customer> CustomerTrack2;
	Customer serv1,serv2,serv3,serv4,serv5;
	int num[5]={0};
	srand((unsigned) time(0));//播种子
	const int TimeSlot=100;//假设服务时间段为0-100
	const int WaitTime=10;//单位时间为10
	const int ServTime=7;//服务时间为1-7
	const int UnitTimePeo=10;//单位时间进来的人数为0-9
	const int StopEnterTime=80;//为了保证所有顾客能完成服务,顾客进入的时间为0-80
	int PresentTime=0;//初始化当前时间为0
	int PerTime=10;//每隔5秒显示一次窗口信息
	int NumberOfCustomer=0;
	int TimeOfServing=0;
	int IDtrack=0;
	while(PresentTime<TimeSlot)
	{
		Customer tempCustomer;
		NumberOfCustomer=rand()%UnitTimePeo;
		for(int j=0; j<NumberOfCustomer;j++)
		{
			tempCustomer.SetID(++IDtrack);
			TimeOfServing=1+rand()%ServTime;
			tempCustomer.SetServTime(TimeOfServing);
			tempCustomer.SetEnterTime(PresentTime);
			Bank1.waitingcustomer.push(tempCustomer);
		}
		int nnn=0;
		for(int t=0;t<WaitTime+nnn;t++)
		{
			if(Bank1.Assign(serv1))//窗口1完成
			{
				if(serv1.GetID()!=0)
					CustomerTrack.push(serv1);
				serv1.Reset();
				if(!Bank1.waitingcustomer.empty())
				{
					serv1=Bank1.waitingcustomer.front();
					serv1.SetSartTime(PresentTime);
					serv1.SetEndTime(PresentTime);
					Bank1.waitingcustomer.pop();
					Bank1.servingcustomer.push(serv1);
					num[0]++;
				}
			}
			else
			{
				serv1.SetEndTime(PresentTime);
			}
			if(Bank1.Assign(serv2))//窗口2完成
			{
				if(serv2.GetID()!=0)
					CustomerTrack.push(serv2);
				serv2.Reset();
				if(!Bank1.waitingcustomer.empty())
				{
					serv2=Bank1.waitingcustomer.front();
					serv2.SetSartTime(PresentTime);
					serv2.SetEndTime(PresentTime);
					Bank1.waitingcustomer.pop();
					Bank1.servingcustomer.push(serv2);
					num[1]++;
				}
			}
			else
			{
				serv2.SetEndTime(PresentTime);
			}
			if(Bank1.Assign(serv3))//窗口3完成
			{
				if(serv3.GetID()!=0)
					CustomerTrack.push(serv3);
				serv3.Reset();
				if(!Bank1.waitingcustomer.empty())
				{
					serv3=Bank1.waitingcustomer.front();
					serv3.SetSartTime(PresentTime);
					serv3.SetEndTime(PresentTime);
					Bank1.waitingcustomer.pop();
					Bank1.servingcustomer.push(serv3);
					num[2]++;
				}
			}
			else
			{
				serv3.SetEndTime(PresentTime);
			}
			if(Bank1.Assign(serv4))//窗口4完成
			{
				if(serv4.GetID()!=0)
					CustomerTrack.push(serv4);
				serv4.Reset();
				if(!Bank1.waitingcustomer.empty())
				{
					serv4=Bank1.waitingcustomer.front();
					serv4.SetSartTime(PresentTime);
					serv4.SetEndTime(PresentTime);
					Bank1.waitingcustomer.pop();
					Bank1.servingcustomer.push(serv4);
					num[3]++;
				}
			}
			else
			{
				serv4.SetEndTime(PresentTime);
			}
			if(Bank1.Assign(serv5))//窗口5完成
			{
				if(serv5.GetID()!=0)
					CustomerTrack.push(serv5);
				serv5.Reset();
				if(!Bank1.waitingcustomer.empty())
				{
					serv5=Bank1.waitingcustomer.front();
					serv5.SetSartTime(PresentTime);
					serv5.SetEndTime(PresentTime);
					Bank1.waitingcustomer.pop();
					Bank1.servingcustomer.push(serv5);
					num[4]++;
				}
			}
			else
			{
				serv5.SetEndTime(PresentTime);
			}
			if(PresentTime%PerTime==0)
			{
				CustomerTrack2=Bank1.GetCustomerQueue(Bank1.servingcustomer);
				system("cls");
				DisplayWindows(PresentTime,TimeSlot,PerTime);
				/*显示窗口1-5的服务ID*/
				cout<<endl;
				cout<<"**当前时间窗口服务的顾客的ID,0为没有顾客**"<<endl;
				cout<<"窗口1的ID:"<<serv1.GetID()<<"  ";
				cout<<"窗口2的ID:"<<serv2.GetID()<<"  ";
				cout<<"窗口3的ID:"<<serv3.GetID()<<"  ";
				cout<<"窗口4的ID:"<<serv4.GetID()<<"  ";
				cout<<"窗口5的ID:"<<serv5.GetID()<<endl;
				/*显示正在等待的顾客的数量*/
				cout<<"正在等待的顾客的数量:"<<Bank1.waitingcustomer.size()<<endl;
				cout<<endl;
				Bank1.DisplayWaitingTime(CustomerTrack2);
				Sleep(2000);
			}
			PresentTime++;
			if(PresentTime==80)
				nnn=20;
		}
	}
	int TotalNum=0;
	for(int rr=0;rr<5;rr++)
	{
		cout<<"窗口"<<rr+1<<"服务顾客数量:"<<num[rr]<<endl;
		TotalNum+=num[rr];
	}
	cout<<"顾客平均等待时间为:"<<static_cast<double>(AverageTime)/static_cast<double>(TotalNum)<<endl;
	system("pause");
	return 0;
}


 运行结果: 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值