数据结构课程设计报告
学院: 专业: 学生: 学号:XX
XX
XX
XX
一. 问题描述
题目内容:银行业务模拟
基本要求:设某银行有N个窗口,可同时为N位顾客办理业务。当顾客进门时,若有窗口空闲,则可立刻办理业务,否则需要依次排队等候。一旦有顾客业务办理完毕,派在队头的顾客便可开始办理业务。若银行每天连续营业T小时,求一天内顾客在银行内的平均逗留时间,顾客排队等候办理业务的队列长度平均值,营业时间到点后仍需完成服务的收尾工作时间。
测试数据:服务窗口数目N及营业时间有拥护设定,第一个顾客进门的时刻为0,之后每个顾客的进门时刻在前一个顾客进门时设定。即在进门事件发生时随即产生两个随机数(durtime,intertime),durtime为进门顾客办理业务所需的服务时间(简称办理时间);intertime为下一个顾客将到达的时间间隔(简称时间间隔)。R为由随机数发生器产生的随机数,顾客办理时间和顾客之间的时间间隔不妨假设与R有关,可以由下式确定:
durtime=15+RP intertime=2+R
确定的方法与实际越吻合,模拟的结果越接近现实的情况。
二. 需求分析
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
#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 < r->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;