Bank Service Simulation ——队列的应用

      之前上学期间的作业,但当时没有用类来封装起来,所以打算重写,结果发现自己之前要写4,5个小时,现在居然两个小时就搞定了,但还有缺点,test函数太长,算法的核心部分其实没有封装起来,跪求大神指点。

以下是代码实现:

 

//RANDOM.h



#ifndef RANDOM_H

#define RANDOM_H



 

class Random 

{

public:

   Random(bool pseudo = true);

//    Declare random-number generation methods here.

 

   int random_integer(int low, int high);

   double random_real();

   int poisson(double mean);

 

private:

   int reseed(); //  Re-randomize the seed.

   int seed,

       multiplier, add_on; //  constants for use in arithmetic operations

};



#endif



 

//RANDOM.cpp



#include <limits.h>

const int max_int = INT_MAX;

#include <math.h>

#include <time.h>

#include "Random.h"



Random::Random(bool pseudo)

/* 

 

Post: The values of seed, add_on, and multiplier 

are initialized.  The seed is initialized randomly only if

pseudo == false.

 

*/

{

   if (pseudo) seed = 1;

   else seed = time(NULL) % max_int;

   multiplier = 2743;

   add_on = 5923;

}

 

double Random::random_real()

/* 

 

Post: A random real number between 0 and 1 is returned.

 

*/

{

   double max = max_int + 1.0;

   double temp = reseed();

   if (temp < 0) temp = temp + max;

   return temp / max;

}

 

int Random::random_integer(int low, int high)

/* 

 

Post: A random integer between low and high (inclusive)

is returned.

 

*/

{

   if (low > high) return random_integer(high, low);

   else return ((int) ((high - low + 1) * random_real())) + low;

}

 

int Random::poisson(double mean)

/* 

 

Post:

A random integer, reflecting a Poisson distribution

with parameter mean, is returned.

 

*/

{

   double limit = exp(-mean);

   double product = random_real();

   int count = 0;

   while (product > limit) {

      count++;

      product *= random_real();

   }

   return count;

}

 

int Random::reseed()

/* 

 

Post:

The seed is replaced by a psuedorandom successor.

 

*/

{

   seed = seed * multiplier + add_on;

   return seed;

}



 

//Service.h



#ifndef SERVICESYSTEM_H

#define SERVICESYSTEM_H



struct Customer

{

	int num;

	int served_time;

	int wating_time;

};



class Service

{

public:

	//构造函数

	Service();

	//判断服务窗口是否处于空闲状态

	bool Is_idle() const;   

	//当前服务顾客的信息,即更新每个时刻的状态

	void Customer_Information(Customer a);

	//重载

	void Customer_Information();

	//当前处理人数的叠加

	void Customer_add();

	//窗口处理服务的总人数

	int Customer_amount() const;

	//窗口累积服务的总时间

	int Customer_Serve_time() const;

	//顾客的等待时间

	int Customer_Wait_time() const;

	//输出当前的状态

	void Service_state();

private:

	bool state;

	Customer customer; 

	int amount;

	int servicing_time;  //服务顾客的总时间累积

};



#endif

 

//Service.cpp



#include "Service.h"

#include <iostream>

using namespace std;



Service::Service()

{

	state = true;   //起初处于空闲状态

	amount = 0;

	servicing_time = 0;

}



bool Service::Is_idle() const

{

	return state;

}



void Service::Customer_add()

{

	amount++;

}



void Service::Customer_Information(Customer a)

{

	customer = a;

	Customer_add();

	state = false;

	customer.served_time--;

	servicing_time++;

	Service_state();

	if(!customer.served_time)

		state = true;

}



void Service::Customer_Information()

{

	customer.served_time--;

	servicing_time++;   //每次所服务顾客时间的减少,同时也是服务时间的累积

	Service_state();

	if(!customer.served_time)

		state = true;

}



int Service::Customer_amount() const

{

	return amount;

}



int Service::Customer_Serve_time() const

{

	return servicing_time;

}



int Service::Customer_Wait_time() const

{

	return customer.wating_time;

}

void Service::Service_state()

{

	if(state)

		cout << "处于空闲状态。" << endl;

	else

	{

		cout << "正在处理号码为" << customer.num << "的业务。" << endl;

	}

}



 

//test.cpp



#include <iostream>

#include <queue>

#include <vector>

#include <list>

#include "Random.h"

#include "Service.h"

using namespace std;

int main()

{

	Random r(true);//Sample could be repeated.

	//初建5个服务窗口,同时调用默认构造函数

	Service windows[5] = {Service(),Service(),Service(),Service(),Service()};

	int Time;

	int record = 0;

	int Total_amount = 0;

	double Total_Serve_time = 0;

	double Total_Wait_time = 0;

	queue<Customer> Queue;

	//没办法,他要求要得出顾客等待的平均时间

	list<Customer> Waiting;

	list<Customer>::iterator itr ;  //迭代器

	int i;

	cout << "********欢迎使用银行模拟排队系统********" << endl;

	cout << "*************制作人:中大黑熊*************" << endl;

	cout << "******请输入你所要模拟的时间单位数目:t=?";

	cin >> Time;

	cout << endl << "以下是每个时间单位的模拟过程:" << endl << endl;

	for(i = 1 ;i <= Time;i++)

	{

		cout << "以下是第" << i << "个时间单位的实时信息:" << endl;

		int j;

		int time_num;    //每个时间单位来排队的人数

		time_num = r.poisson(2);  //Generate a sample of Poisson distribution of mean 5.

		if(!time_num)

		{

			for(j = 0; j < 5;j++)

			{

				cout << "窗口" << j+1;

				if(windows[j].Is_idle())

				{

					if(!Queue.empty())

					{

						Customer temp = Queue.front();

						Queue.pop();

						windows[j].Customer_Information(temp);

					}

					else

					{

						windows[j].Service_state();

					}

				}

				else

				{

					windows[j].Customer_Information();

				}

			}

			cout << "目前等待的顾客人数为:" << Queue.size() << endl << endl; 

		}

		else

		{

			Customer * p = new Customer[time_num];

			for(j = 0;j < time_num;j++)

			{

				p[j].num = ++record;

				p[j].wating_time = 0;  //初始化顾客的等待时间

				p[j].served_time = r.poisson(2);  //随机模拟顾客所需要的服务时间

				//将他们入队

				Customer temp = p[j];

				Queue.push(temp);

				Waiting.push_back(temp);

			}

			delete [ ]p;  //清空动态内存,In case of the memory leak

			//接下来处理窗口

	//		cout << Queue.size() << endl;

			for(j = 0; j < 5;j++)

			{

				cout << "窗口" << j+1;

				if(windows[j].Is_idle())

				{

					if(!Queue.empty())

					{

						Customer temp = Queue.front();

						Customer wtemp = Waiting.front();

						temp.wating_time = wtemp.wating_time;

						Queue.pop();

						Waiting.pop_front();

						windows[j].Customer_Information(temp);

					}

					else

					{

						windows[j].Service_state();

					}

				}

				else

				{

					windows[j].Customer_Information();

				}

				

			}

			cout << "目前等待的顾客人数为:" << Queue.size() << endl << endl;

		}

		for(itr = Waiting.begin() ;itr != Waiting.end() ;itr++)

		{

			(*itr).wating_time++;

		}

	}

	cout << "****" << Time << "个服务时间结束,以下是统计信息:" << "****" << endl;

	for(i = 0;i < 5;i++)

	{

		cout << "窗口" << i+1 << "处理的顾客数为:" << windows[i].Customer_amount() << endl;

		Total_amount += windows[i].Customer_amount();

		Total_Serve_time += windows[i].Customer_Serve_time();

		Total_Wait_time += windows[i].Customer_Wait_time();

	}

	for(itr = Waiting.begin() ;itr != Waiting.end() ;itr++)

	{

		Total_Wait_time += (*itr).wating_time;

	}

	cout << "柜台服务的顾客总数为:" << Total_amount << endl;

	cout << "顾客服务的平均时间为:" << (double)Total_Serve_time/(double)Total_amount << endl;

	cout << "顾客等待的平均时间为:" << (double)Total_Wait_time / (double)(Total_amount + Waiting.size() ) << endl;

  return 0;

}



 

你可能感兴趣的:(service)