数据构造课程设计报告---银行业务模拟 - 数据构造课程设计报告 学院: 专业: 学生: 学号:XX XX XX XX一. 问题描绘 题目内容:银行业务模拟 根本要求:设某银行有N个窗口,可同时为N位顾客办理业务当顾客进门时,假设有窗口空闲,那么可立即办理业务,否那么需要依次排队等候一旦有顾客业务办理完毕,派在队头的顾客便可开场办理业务假设银行每天连续营业T小时,求一天内顾客在银行内的平均逗留时间,顾客排队等候办理业务的队列长度平均值,营业时间到点后仍需完成效劳的收尾工作时间 测试数据:效劳窗口数目N及营业时间有拥护设定,第一个顾客进门的时刻为0,之后每个顾客的进门时刻在前一个顾客进门时设定即在进门事件发生时随即产生两个随机数〔durtime,intertime〕,durtime为进门顾客办理业务所需的效劳时间〔简称办理时间〕;intertime为下一个顾客将到达的时间间隔〔简称时间间隔〕R为由随机数发生器产生的随机数,顾客办理时间和顾客之间的时间间隔不妨假设与R有关,可以由下式确定: durtime=15+RP intertime=2+R 确定的方法与实际越吻合,模拟的结果越接近现实的情况。
二. 需求分析^p 1. 程序模拟银行排队现象当给定窗口数及营业时间后,由随机数确定顾客办理业务及进门间隔时间,可求出一天内顾客在银行平均逗留时间,平均对长及关门后收尾工作的时间 2. 本程序由用户读入的数据仅为窗口数及营业时间,营业的时间以分钟计,窗口数及关门时间均为整型,且均大于等于1 3. 运行本程序后,得到结果为顾客数、平均等候时间、平均队长和收尾工作的时间仿真程序运行后屏幕输出结果应包括如下各项的模拟结果数据: Number of customer: CustomerNum Average time: Totaltime/CustomerNum Average queuelength: Totallength/CustomerNum Addition time: t-CloseTime 三. 程序模块 本程序包括4个模块: 主程序模块; 实现队抽象数据类型的队模块; 实现链表抽象数据类型的链表模块; 事项银行事件抽象数据类型的银行事件模块。
各模块之间的调用关系如下图 主程序模块 银行事件模块 队列模块 链表模块 函数调用关系图: main CustomerArrived OpenForday CustomerDeparture EnQueue OrderInsert DeQueue QueueEmpty OrderInsert MakeNode MakeNode InitQueue OrderInsert InitList 四. 程序 #include #include #include #include #define MONEY 5000 //个人业务值,交易额上限 #define OK 1 //分开事件1:办理存款 #define ERROR 0 #define OVERFLOW -2 typedef int status; typedef struct{//队列1元素 int arrivetime; //到达时间 int OccurTime; //事件发生时间 int NType; //事件类型,0表示到达事件,1表示分开事件。
同时用1表示存款,2表示取款 int duration; //办理业务时间 long int money;//交易金额 }Event,ElemType1; typedef struct{ //队列2元素 int arrivetime; //到达时间 int duration; //办理业务时间 long int money; //交易金额 }wait,ElemType2; typedef struct QNode1{//队列1结点类型 ElemType1 data; struct QNode1 *next; }QNode1,*Queue1; typedef struct QNode2{ //队列2结点类型 ElemType2 data; struct QNode2 *next; }QNode2,*Queue2; typedef struct{//链队列类型 Queue1 front; //队头 Queue1 rear; //队尾 }LinkQueue1; typedef struct{ //链队列类型 Queue2 front; //队头 Queue2 rear; //队尾 }LinkQueue2; //全局变量 long int total_money; //银行现存资金总额 int total_time; //客户逗留总时间 int use_time;//每个顾客所用时间 int money;//每个顾客办理的款数 int closetime;//银行营业时间 int INTERTIME; //下一用户到达的时间间隔 int DURATION; //办理业务所需时间 int number; //办理业务的次序 int time1; //系统如今时间 LinkQueue1 Q1; LinkQueue2 Q2; Event en; //事件 wait en1; //列表2元素 //初始化队列1 status InitQueue1 { Q1.front=Q1.rear=(Queue1)malloc(sizeof(QNode1)); if(!Q1.front)exit(OVERFLOW); Q1.front->next=NULL; return OK; }//初始化队列2 status InitQueue2 { Q2.front=Q2.rear=(Queue2)malloc(sizeof(QNode2)); if(!Q2.front)exit(OVERFLOW); Q2.front->next=NULL; return OK; } //销毁队列1 status destroyqueue1 { while(Q1.front) { Q1.rear=Q1.front->next; free(Q1.front); Q1.front=Q1.rear; } return OK; } //销毁队列2 status destroyqueue2 { while(Q2.front) { Q2.rear=Q2.front->next; free(Q2.front); Q2.front=Q2.rear; } return OK; } //队列1入队列 status EnQueue1 { Queue1 p,r,r1; p=(Queue1)malloc(sizeof(QNode1)); if(!p)exit(OVERFLOW); p->data.arrivetime=en.arrivetime; p->data.OccurTime=en.OccurTime; p->data.NType=en.NType; p->data.duration=en.duration; p->data.money=en.money; r=Q1.front->next; while(r) { if(p->data.arrivetime data.arrivetime) { if(r==Q1.front->next) {p->next=r; Q1.front->next=p; } else{r1->next=p; p->next=r; } } r1=r;r=r->next; } if(!r) { if(Q1.front->next==NULL) { Q1.front->next=p; Q1.rear=p; Q1.rear->next=NULL; } else{ p->next=NULL; Q1.rear->next=p; Q1.rear=p; } } return OK; } //队列2入队列 status EnQueue2 { Queue2 p; p=(Queue2)malloc(sizeof(QNode2)); if(!p)exit(OVERFLOW); p->data.arrivetime=en1.arrivetime; p->data.duration=en1.duration; p->data.money=en1.money; p->next=NULL; Q2.rear->next=p; Q2.rear=p; 第 7 页 共 7 页。