极易上手的银行模拟业务C++实现

本文介绍了使用C++实现的银行模拟业务程序,包括事件驱动的框架设计、链表和堆栈队列数据结构的选择,以及模拟器初始化、事件表和客户队列功能函数的实现。程序关注客户到达、离开事件的处理,计算平均逗留时间。
摘要由CSDN通过智能技术生成

目录

1.程序设计思路

1.框架构想

2.数据结构的选择

2.相应功能的函数实现及程序所需变量

1.模拟器初始化函数

2.事件表相应功能函数实现

3.客户队列相应功能函数实现

4.客户到达事件函数实现

5.客户离开事件函数实现

6.全局变量的设置和宏定义说明

7.模拟器函数实现

3.源程序代码


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;
}

  上述的功能函数都是链表中较为基础的一些操作,比较容易看懂,只有插入函数接口使用了默认变量值需要注意一下。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值