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

📄 typedef.h

📁 银行业务模拟系统
💻 H
字号:
//类定义文件,定义了枚举类型EVENT_TYPE,类Customer(顾客), Counter(窗口),
//Event(事件), EventList(事件表)
#ifndef TYPEDEF_H
#define TYPEDEF_H

#include <iostream>
#include "LinkedQueue.h"
#include "node.h"
using namespace std;

//////////////////////////////////////////////////////////////////////////
enum EVENT_TYPE {ARRIVAL = 0, DEPARTURE1, DEPARTURE2, DEPARTURE3, DEPARTURE4};
//////////////////////////////////////////////////////////////////////////

class Counter;

//////////////////////////////////////////////////////////////////////////
//Customer声明及定义
class Customer
{
	friend class Counter;//声明Counter为友元
public:
	Customer(){}
	Customer(int arrive, int service)
	{
		ArriveTime = arrive;
		ServiceTime = service;
	}//构造函数,以到达时间和所需服务时间初始化对象
private:
	int ArriveTime;//到达时间
	int ServiceTime;//所需服务时间
};
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
//Counter声明及定义
class Counter
{
public:
	Counter(int number);//构造函数,以窗口编号初始化对象

	//下面函数将Customer对象x插入队列,并且用out输出流输出客户到达时刻、
	//开始接受服务时刻、提供服务窗口、离开时刻
	void EnQueue(Customer& x, ostream& out);

	void Delete();//客户离开,从队列中删除,并且队列长度减1
	
	int Length() const//返回队列的当前长度(寻找最短队列时调用)
	{
		return length;
	}

	int FinishTime() const//返回完成当前队列中业务时的时刻(用于累加各用户逗留时间)
	{
		return TimeComplete;
	}

	void Output(ostream& out)//输出窗口号、总接待客户数、总服务时间、最长服务时间
	{
		out << No << "\t\t"
			<< TotalNum << "\t\t\t"
			<< TotalServiceTime / 60 << ": " << TotalServiceTime % 60 << "\t\t\t"
			<< MaxServiceTime;
	}
private:
	int No;//窗口号
	int length;//当前队列的长度
	int TotalNum;//接待客户总数
	int TotalServiceTime;//总服务时间
	int MaxServiceTime;//最长服务时间
	int TimeComplete;//完成当前队列中业务时的时刻
	LinkedQueue<Customer> customers;//客户队列
};

Counter::Counter(int number)
{
	No = number;
	length = 0;
	TotalNum = 0;
	TotalServiceTime = 0;
	MaxServiceTime = 0;
	TimeComplete = 0;
}

void Counter::EnQueue(Customer& x, std::ostream& out)
{
	out << x.ArriveTime / 60 + 8 << ": "
		<< x.ArriveTime % 60 << "\t\t"
		<< No << "\t\t" ;//输出客户到达时刻、提供服务窗口

	//输出开始接受服务时刻
	if (length == 0)
	{//此前空闲,则完成当前业务时即客户到达时刻加服务时间
		out << x.ArriveTime / 60 + 8 << ": "
			<< x.ArriveTime % 60 << "\t\t";
		TimeComplete = x.ArriveTime + x.ServiceTime;
	}
	else
	{//队列中有人,原来时刻加上该客户所需时间
		out << TimeComplete / 60 + 8 << ": "
			<< TimeComplete % 60 << "\t\t";
		TimeComplete += x.ServiceTime;
	}

	//输出该客户离开银行时间(即完成当前业务时刻)
	out << TimeComplete / 60 + 8 << ": "
		<< TimeComplete % 60 << endl;

	customers.Add(x);//加入队列
	length++;//队列长度增1
	TotalNum++;//接待客户数增1
	TotalServiceTime += x.ServiceTime;//累加客户服务时间
	if (MaxServiceTime < x.ServiceTime)
		MaxServiceTime = x.ServiceTime;//更新最长服务时间
}

void Counter::Delete()
{
	if (length == 0)
		throw OutOfBounds();

	Customer c;
	customers.Delete(c);
	length--;//队列长度减1
}
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
//Event声明及定义
class Event
{
	friend class EventList;//声明EventList为友元
public:
	Event(){}

	//构造函数,以事件发生时间及事件类型初始化对象
	Event(int EventTime, EVENT_TYPE EventType)
	{
		time = EventTime;
		type = EventType;
	}

	//返回事件发生时间
	int Time() const
	{
		return time;
	}

	//返回事件类型
	EVENT_TYPE Type() const
	{
		return type;
	}
private:
	int time;
	EVENT_TYPE type;
};
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
//EventList 声明及定义,该删除时从队首删除,但是插入时按事件事件先后排序
class EventList
{
public:
	EventList();
	~EventList();
	bool IsEmpty() const
	{
		return (first == 0);
	}
	void Insert(const Event& e);//按顺序插入
	void Delete(Event& e);
private:
	Node<Event> *first;
};

EventList::EventList()
{
	first = NULL;
}

EventList::~EventList()
{
	Node<Event> *next;
	while (first)
	{
		next = first->link;
		delete first;
		first = next;
	}
}

void EventList::Insert(const Event& e)
{
	Node<Event> *e_new = new Node<Event>;
	e_new->data = e;
	Node<Event> *current = first, *previous;

	while(current && current->data.time <= e.time)
	{
		previous = current;
		current = current->link;
	}
	if (current == first)
	{
		e_new->link = first;
		first = e_new;
	}
	else
	{
		e_new->link = current;
		previous->link = e_new;
	}
}

void EventList::Delete(Event& e)
{
	if (!first)
		throw OutOfBounds();

	e = first->data;
	Node<Event> *n = first;
	first = first->link;
	delete n;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -