📄 typedef.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 + -