1.问题的定义即分析
银行叫号系统中大概能分成两个对象:一个为来的顾客,一个为银行本身
顾客(Customer)里面需要包含有数据:
【1】每个顾客都应该有一个标签以用来区分,因此需要一个ID(cID)
【2】问题中有求等待的时间,而有关等待时间的两个变量即为进入银行的时间以及接受服务的时间(enterTime和startTime)
【3】由于题目中说明顾客的服务时间不是固定的,因此每个顾客的服务时间又有区别,所以需要有一个变量来进行表示(serTime)
【4】顾客接受服务完后离开的时间(endTime)
综上:Customer中所需要的私有成员有(cID,enterTime,startTime,serTime,endTime)
而Customer的成员函数其实只是对以上数据进行输入输出,所以有成员函数有:
一系列的Set函数,一系列的Get函数,以及构造函数,复制函数,=的重载函数以及Reset函数
银行(bank)里面需要包含的数据:
银行中的人有两种状态,一是等待,二是接受服务,而这等待状态遵循先到先得的原则,因此,采用队列这种结构来表示这些状态比较合适,已经接受过服务的要反复输入输出,用容易遍历的数据类型vector
【1】处于等待状态的人(waiting)
【2】处于服务状态或已经接受过服务的人(serving)
由于经常要对waiting以及serving进行操作,所以不考虑将其作为私有成员(省去了Set以及Get函数)
考虑一下所含有的成员函数:Reset函数(保证银行是空的),Display函数(对已经接受过服务的以及正在服务的顾客进行展示),Assign()(断某个窗口是否是空的利用每次都改变的endTime - startTime == 随机生成的serTime判断
添加功能函数:查看最大等待时间以及其对应的人数的函数Maxwaiting
2.类与算法设计
类设计:
class Customer
{
private:
int enterTime; //进入银行的时间
int startTime; //开始服务的时间
int cID; //顾客的编号
int endTime; //顾客停止服务的时间
int serTime; //顾客服务从开始到结束服务所需要的时间(随机的)
public:
Customer(); //默认构造函数
Customer(const Customer &new;_customer); //复制函数
Customer &operator;=(const Customer&old;_customer); //=重载函数
void Reset(); //重置,将所有数据归零
int GetServDurance(); //返回等待时间
int GetEndTime(); //返回离开银行的时间
int GetSerTime(); //返回接受服务的时间
int GetStartTime();//返回开始接受服务的时间
int GetID(); //返回ID
void SetEnterTime(int new_enter);
void SetStartTime(int new_start);
void SetEndTime(int new_end);
void SetID(int new_ID);
void SetSerTime(int new_sertime);
};
class Bank
{
public:
vector<Customer> serving; //在服务窗口接受过服务的人
queue<Customer> waiting; //在银行内等待的人
bool Assign(Customer customer); //判断第i个窗口的顾客是否服务完成
void Display(); //将在等待的人或者是已经接受了服务的人展示到屏幕上
void MaxWaiting();
void Reset();
};
算法设计
随机数的产生:
【1】由于需要对过程进行模拟,所以需要一整套的模拟系统,包括产生随机人数,随机服务时间等等
【2】事实上,银行对服务窗口的更新是按照一定的时间(即每隔几秒刷新一次),同样的人也是类似,因此需要几个单位时间已确定进行这些随机事件发生的间隔
几个变量如下:
const int UnitTime = 10;//单位时间为10
const int ServTime = 5;//服务时间为5-10
const int UnitTimePeo = 5;//单位时间进来的人数为5-10;
const int StopEnterTime = TimeSlot - 2 * UnitTime;//为了保证所有顾客能完成服务,顾客进入的时间为0-80
const int PerTime = 5;//每隔5秒显示一次窗口信息
int TimeOfServing = 0;//随机生成的服务时间(5-10)
int Number = 0; //随机生成的人数(5-10)
通过这些变量以及srand((unsigned)time(0)),rand()即可产生一系列的随机数以便进行模拟
过程的模拟
每当产生一系列随机的人,就将他们放进waiting的队列中去,接着遍历各个窗口,若窗口为空,则先来的人可以去那个窗口(即push到serving,pop掉waiting),若不为空,则改变结束时间,之后Present + 1
显示内容:剩余的时间,各窗口的情况,以及已经接受了服务的人的等待时间
注意:该程序为每五刷新一次,每十随机进入一些人