目录
1.程序设计思路
1.框架构想
由于本程序的设计意图在于实现银行的业务模拟,主要功能在于实现两个功能:
1.客户到达银行且在某个办事窗口队列排队和办理事务。
2.某个窗口队列的客户完成事务办理,记录逗留时间。
最后在银行工作一天时间内记录所有客户的逗留时间并计算出客户平均逗留时间。故程序的整体框架为开始银行模拟器并进行初始化,然后提取发生时间最近的事件并判断事件类型来执行上述1、2两种功能。
2.数据结构的选择
本程序需要存储的元素有事件和客户队列两种,由于事件需要经常进行插入操作,故选用链表来实现,而客户队列则选用堆栈队列的方式实现,达到操作方便的目的。实现代码如下图所示:
struct event
{ //定义事件结构体
int occurtime; //事件的发生时间
int Ntype; //事件类型
};
struct customer //定义客户结构体
{
int ArrivalTime; //记录客户到达时间
int Duration; //记录客户办理业务时间
int label;
};
struct eventlist //定义事件链表
{
event ev;
eventlist* next;
};
struct customerqueue //定义队列结构体
{
customer* base; //队列基地址
int rear; //队列尾地址
int length;
};
2.相应功能的函数实现及程序所需变量
1.模拟器初始化函数
需要将事件表、客户队列初始化,并且清空TotalTime、CustomNum两个计数器,且插入第一个即将发生的事件。
void OpenForDay() //银行模拟器初始化
{
TotalTime = CustomerNum = 0; //将两个计数器清零
Init_eventlist(); //事件表初始化
en.occurtime = 0, en.Ntype = 0;
Insert_List(); //在事件链表中选择合适位置插入
Init_customer_queue(); //客户队列初始化
}
2.事件表相应功能函数实现
事件表所需要的插入、初始化、删除等操作函数实现:
void Init_eventlist() //初始化事件表
{
ev_list = (eventlist*)malloc(sizeof(eventlist));
ev_list->next = nullptr;
}
void Insert_List(event q = en) //将事件插入事件表
{
eventlist* p = ev_list->next, *prior = ev_list;
eventlist* temp = (eventlist*)malloc(sizeof(eventlist));
while (p != nullptr)
{
if (cmp(q, p->ev) < 0) //利用比较函数来判断相应事件发生的时间,将当前事件插入到对应的位置
{
temp->ev = q;
prior->next = temp;
temp->next = p;
break;
}
else
{
p = p->next;
prior = prior->next;
}
}
if (p == nullptr) //事件表为空则直接插入
{
temp->ev = q;
prior->next = temp;
temp->next = nullptr;
}
}
int cmp(event a, event b) //比较两个事件发生时间的先后顺序
{
if (a.occurtime > b.occurtime)
return 1;
else return -1;
}
eventlist* DelFirst_List() //删除事件表头元素节点且获得事件信息
{
eventlist* p = ev_list->next;
ev_list->next = ev_list->next->next;
return p;
}
void GetItem_List(eventlist* p) //将节点p中的值赋给en
{
en.occurtime = p->ev.occurtime;
en.Ntype = p->ev.Ntype;
}
上述的功能函数都是链表中较为基础的一些操作,比较容易看懂,只有插入函数接口使用了默认变量值需要注意一下。