NANCHANG UNIVERSITY
课 程 设 计 报 告
课程名称: 计算机技术综合课程设计
题 目: 银行业务模拟
学 院: 信息工程 系: 计算机科学与技术
专 业: 计算机科学与技术
班 级: 061 班
学 号: 6103106020
学生姓名: 邱雨田
时 间: 2010年1月11日至1月22日
1、 问题描述:
客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直到满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。
写一个银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。
2、 分析与设计
1. 问题分析:
本问题主要需要处理两个队列(fq,sq)和一个事件表(eq)。一个队列(fq)表示第一种业务(存款或还款),另一个队列(sq)表示第二种业务(取款或借款)。事件有两类:到达银行和离开银行。到达事件发生时随机地设置此用户的交易时间和距下一到达事件之间的时间间隔。每个客户要办理的款额也应该是随机确定的。初始时银行现存资金总额为total。开始营业后的第一个事件是客户到达,营业时间从0到closetime。Total
和closetime以及随机产生的时间和款项的上下界都是交互地从让用户从输入,作为模拟参数。要得到相关的结果:由于下班时间到而没能办理的顾客数;分别列出需要办理两种业务的顾客数;分别列出已成功办理两种业务的顾客数;分别列出两种业务的成功办理率;客户在银行内的平均逗留时间;下班时银行所剩余的资金总额。
2. 测试数据及期望结果:
1) 输入:
用户需要在程序运行开始时输入以下数据:
1 银行初始资金total(测试数据为10000)
2 银行营业时间closetime(测试数据为600)
3 客户交易时间上下界dealmaxtime和dealmintime,用于给随机数产生函数传递参数,产生一个介于这两个值之间的值。
4 客户到达时间间隔上界arrivemaxtime arrivemintime,用于给随机数产生函数传递参数,产生一个介于这两个值之间的值。
5 交易额的最大上限dealMaxMoney.用于给随机函产生函数参数,产生一个介于-dealMaxMoney和dealMaxMoney之间的值,作为顾客到银行办理业务的交易额。
2) 输出:
本程序用dos界面模拟输出整个银行业务办理及排队的结果,最后给出一下数据:
1 由于下班时间到而没能办理的顾客数
2 分别列出需要办理两种业务的顾客数
3 分别列出已成功办理两种业务的顾客数
4 分别列出两种业务的成功办理率。
5 客户在银行内的平均逗留时间
6 下班时银行所剩余的资金总额
3) 所有数据均要正确输入,并对输入合法性进行检测,如只能输入
数字,且上界必须不小于下界。
4) 预计实现结果截图:
用户打开运行程序以后会出现如下的首界面:
用户按任意键继续,则会出现如下主界面:
用户选择1开始模拟。按提示输入相应的数据设置,就能得到想要的模拟结果。退出选择0.
对用户输入要求如下:
1. 银行开始的资金总额应该大于零。
2. 银行的营业时间必须小于1440分钟(24小时)。
3. 最大到达时间间隔必须小于营业时间。
4. 最小到达时间间隔必须介于零和最大到达时间之间。
5. 最大处理时间必须小于营业时间。
6. 最小处理时间必须介于零和最大处理时间之间。
7. 最大交易额应该小于银行开始时的资金总额且小于程序设置的50000。
如果输入不符合上述要求,程序会提示用户哪里输入出错,可以再次输入。每个输入数据都有3次机会。当三次输入都错的时候,程序停止运行,按任意键退出。
现给出最小处理时间出错时的三种提示截图:
3. 模块结果及各个模块的实现方法描述:
1) 概要设计
结构体的定义如下:
struct service
{
int num; //客户号
string type; //到达或离开
int beginTime;//到达时间
int endTime;//离开时间
int money; //正数为存款,负数为取款
service* next;//指针域
};
2) 队列的抽象数据类型定义如下:
ADT Queue{
数据对象:D={ ai | ai∈ElemSet, i=1,2,...,n, n≥0 }
数据关系:R1={
|ai-1, ai∈D, i=2,...,n }
基本操作:
void init_Q(Queue &Q);
操作结果:构造空队列Q
int Q_empty(Queue Q);
初始条件:队列Q存在
操作结果:若Q为空队列,则返回TRUE,否则FALSE
int Q_length(Queue Q);
初始条件:队列Q存在
操作结果:返回队列Q的元素个数,即队列长度
int gethead_Q(Queue Q);
初始条件:队列Q存在
操作结果:返回队列Q的队头元素
void en_Q(Queue &Q,int e);
初始条件:队列Q存在
操作结果:插入元素e为Q的新的队尾元素。
void de_Q(Queue &Q,int &e);
初始条件:队列Q存在
操作结果:删除Q的队头元素。
}ADT Queue
3) 模块及相互调用关系
本程序包含3个模块:
1 主程序模块
2 队列模块--实现队列抽象数据类型
各模块相互调用关系如下:
主程序模块
队列模块
算法设计
4) 队列类型
typedef struct QNode
{
//队列节点类型
int data;
struct QNode *next;
}QNode,*PQNode;
typedef struct {
PQNode front;
//队头指针
PQNode rear;
//队尾指针
}Queue;
a) 队列的基本操作设置如下:
void init_Q(Queue &Q);
//初始化,构造空队列Q(Q.front=Q.rear)
int Q_empty(Queue Q);
//若队列Q存在
//若Q为空队列,则返回TRUE,否则FALSE
int Q_length(Queue Q);
//若队列Q存在
//返回队列Q的元素个数,即队列长度
int gethead_Q(Queue Q);
//若队列Q存在
//返回队列Q的队头元素
void en_Q(Queue &Q,int e);
//若队列Q存在
//插入元素e为Q的新的队尾元素。
void de_Q(Queue &Q,int &e);
//若队列Q存在
//删除Q的队头元素。
b) 其中操作算法:
void init_Q(Queue &Q)
{
//初始化,构造空队列Q(Q.front=Q.rear)
Q.front=Q.rear=(PQNode)malloc(sizeof(QNode));
if(!Q.front)exit(-1);
}
int Q_empty(Queue Q)
{
//若队列Q存在
//若Q为空队列,则返回TRUE,否则FALSE
if(Q.front==Q.rear)return 1;
else return 0;
}
int gethead_Q(Queue Q)
{
//若队列Q存在
//返回队列Q的队头元素
if(!Q_empty(Q))return Q.front->next->data;
else return 0;
}
int Q_length(Queue Q)
{
//若队列Q存在
//返回队列Q的元素个数,即队列长度
int count=0;
PQNode p=Q.front;
while(p!=Q.rear)
{
count++;
p=p->next;
}
return count;
}
void en_Q(Queue &Q,int e)
{
//若队列Q存在
//插入元素e为Q的新的队尾元素。
PQNode p=(PQNode)malloc(sizeof(QNode));
if(!p)exit(-1);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
void de_Q(Queue &Q,int &e)
{
//若队列Q存在
//删除Q的队头元素
PQNode p;
if(Q.front==Q.rear)return ;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
}
5) 队列扫描算法
伪码:
{
if(!empry(fq)&& fq.head->money<0)
//如果队列一不空,而且队头客户办理第二种业务
{
//1.可以办,完成离开(即银行现金足够取)
//2.不可以办,排队2等候
}
else
//存款 ,第一种业务
if(!empty(fq) && temped= searchAndDel(sq,total)))
//当交易时间到
{
//办理该业务,并开始扫描第二队列,看是否能满足
//第二队列需要
}
if(currentime==next_arrtime )
{
//当当前时间等于即将到来的顾客到来时间,初始化
//该顾客节点,并设置下一顾客到达时间
}
}
6) 其他函数算法
int rand_num(int max,int min)
//随机数生成
{
//根据传进的max和min,生成介于max和min的一个
//整数
randomize();
RandSeed=Now();
return ( random(100000) % (max - min + 1) +min );
}
3、 源代码:
//银行业务模拟系统
#include
#include
#include
#include
using namespace std;
struct service
{
int num; //客户号
string type; //到达或离开
int beginTime;//到达时间
int endTime;//离开时间
int money; //正数为存款,负数为取款
service* next;//指针域
};
struct queue
{ //队列
service* head;//队列头指针
service* rear;//队列尾指针
};
int total; //初始时银行现存资金总额
int closeTime; //营业结束时间
int arriveMaxTime; //两个到达事件之间的间隔上限
int arriveMinTime; //两个到达事件之间的间隔下限
int dealMaxTime; //客户之间交易的时间上限
int dealMinTime; //客户之间交易的时间下限
int dealMaxMoney ; //交易额上限
int ndn=0;//需要存款的人数
int nwn=0;//需要取款的人数
int sdn=0;//成功存款的人数
int swn=0;//成功取款的人数
int currentTime = 0; //当前时间
int totalTime = 0; //客户逗留总时间
int counter = 0; //客户总数
int number = 1; //初始客户序列号
bool state =1; //用于判断是否有窗口在处理
int currentTimeOfDeal = 0;
int thearriveMaxTime = 0;
queue eq; //事件队列
queue fq; //队列一
queue sq; //对列二
//初始化三个队列
service* front(queue &q)
{//返回队首元素
return q. head;
}
service* back(queue &q)
{//返回队尾元素
return q. rear;
}
void push(queue &q,int d)
{// 插入元素d为Q的新的队尾元素
service* temp = new service;
temp->money = d;
temp->next = NULL;
if(q.head==NULL)
{//队列为空,初始化
q. head = temp;
q. rear = temp;
}//if
else
{//队列不为空,插入元素d
q. rear->next = temp;
q. rear = q.rear->next;
}//else
}
void pop(queue &q)
{// 若队列不空,出对列函数
service* temp;
temp = q. head;
if(q. head->next==NULL )
q.head = q. rear =NULL;
else
q. head=q. head->next;
delete temp;
}
void arrive()
{//"到达"函数,随机产生顾客,进入队列一产生到达事件 进入事件队列
push(fq,(rand()% (2*dealMaxMoney) -dealMaxMoney)); //随机产生顾客加入第一队列
back(fq)->beginTime = currentTime;
back(fq)->num = number;
push(eq,(back(fq)->money)); //将产生事件加入事件队列
back(eq)->beginTime = currentTime;
back(eq)->type = "到达";
back(eq)->num = number;
++number;
}
void putMoney()
{ //"存款"函数
total += front(fq)->money; //更新资金总额
push(eq,front(fq)->money); //加入事件队列 离开
back(eq)->type = "离开";
back(eq)->num = front(fq)->num;
back(eq)->endTime = (front(fq)->beginTime + rand()%(dealMaxTime-dealMinTime +1)+dealMinTime);
++counter; //更新客户总数
totalTime += (back(eq)->endTime - front(fq)->beginTime); //更新逗留时间
pop(fq); //删除第一队列第一个业务
currentTimeOfDeal = back(eq)->endTime;
state =0;
}
void getMoney()
{//"取款"函数
if( (-fq.head->money) > total )
{//资金短缺 加入第二队列
push( sq,front(fq)->money );
back(sq)->beginTime = front(fq)->beginTime;
back(sq)->num = front(fq)->num;
pop(fq);
}//if
else
{
total += back(fq)->money;
push(eq,front(fq)->money); //加入事件队列 离开
back(eq)->type = "离开";
back(eq)->num = front(fq)->num;
back(eq)->endTime = (front(fq)->beginTime +rand()%(dealMaxTime-dealMinTime +1)+dealMinTime);
back(eq)->beginTime = 0;
currentTimeOfDeal = back(eq)->endTime;
++counter; //更新客户总数
totalTime += ( back(eq)->endTime - back(fq)->beginTime ); //更新逗留时间
pop(fq); //删除第一队列第一个业务
state =0;
}//else
}
service* searchAndDel(queue &q,int m)
{//"搜索"函数,在对列中寻找可处理元素
service* sign = q. head; //标记头节点
service* temp;
while(q. head!=NULL )
{
if((-(q. head->money)) next; // 首节点后移一位,返回原首节点
return temp;
}//else
}//while
else
{//队首元首不能被处理
if(q. head == q. rear){}
else
{//首节点移到队列尾部
q. rear->next = q. head;
q. rear = q. rear->next;
q. head =q. head->next;
q. rear->next = NULL;
}//else
}//else
if(q. head == sign)//队列循环一周时停止
return NULL;
}
return NULL;
}
service* temped ;
int randomTemp;
void findAndDeal()
{//"处理"函数 在对列中寻找可处理元素,对其进行处理
while( (temped= searchAndDel(sq,total))&&temped!=NULL )
{//查找可处理取款
total += temped->money; //更新资金总额
push(eq,temped->money); //加入事件队列 离开
back(eq)->type = "离开";
back(eq)->num = temped->num;
randomTemp = rand()%(dealMaxTime-dealMinTime +1)+dealMinTime;
back(eq)->endTime = currentTime + randomTemp ;
currentTimeOfDeal += randomTemp;
++counter; //更新客户总数
totalTime += ( back(eq)->endTime - temped->beginTime ); //更新逗留时间
delete temped; //删除节点
temped = NULL;
}
state = 0;
}
int main()
{
printf(" ********************************************\n");
printf(" ********************************************\n");
printf(" ********************************************\n");
printf(" *** *** 学院:信息工程学院\n");
printf(" *** ***\n");
printf(" *** ***\n");
printf(" *** *** 专业:计算机科学与技术\n");
printf(" *** ***\n");
printf(" *** ***\n");
printf(" *** 欢迎进入银行模拟系统 *** 班级:061\n");
printf(" *** ***\n");
printf(" *** ***\n");
printf(" *** *** 姓名:邱雨田\n");
printf(" *** ***\n");
printf(" *** ***\n");
printf(" *** *** 学号:6103106020\n");
printf(" ********************************************\n");
printf(" ********************************************\n");
printf(" ********************************************\n");
printf("\n");
printf("\n");
printf("\n");
printf("请按任意键继续......\n");
getch();
int i;
for(i=0;i<=14;i++)
printf("\n");
printf(" ********************************************\n");
printf(" ********************************************\n");
printf(" ********************************************\n");
printf(" *** 1.开始模拟 ***\n");
printf(" *** 0.退出 ***\n");
printf(" ********************************************\n");
printf(" ********************************************\n");
printf(" ********************************************\n");
int n,t1=0,t2=0,t3=0,t4=0,m=0;
scanf("%d",&n);
while(n==1)
{
srand(time(NULL)); //初始化随机函数
printf("请输入银行的初始存款:\n");
scanf("%d",&total);
if(total<0)
{
printf("输入错误!初始存款不能小于0!请再次输入!\n");
printf("请输入银行的初始存款:\n");
scanf("%d",&total);
if(total<0)
{
printf("输入错误!初始存款不能小于0!请最后一次输入!\n");
printf("请输入银行的初始存款:\n");
scanf("%d",&total);
if(total<0)
{
printf("三次输入都错误!请按任意键退出!\n");
getch();
printf("请按任意键退出!\n");
goto end;
}
}
}
printf("请输入银行的营业时间:\n");
scanf("%d",&closeTime);
if(closeTime>=1440)
{
printf("输入错误!一天的营业时间不能超过1440分钟(24个小时)!请再次输入!\n");
printf("请输入银行的营业时间:\n");
scanf("%d",&closeTime);
if(closeTime>=1440)
{
printf("输入错误!一天的营业时间不能超过1440分钟(24个小时)!请最后一次输入!\n");
printf("请输入银行的营业时间:\n");
scanf("%d",&closeTime);
if(closeTime>=1440)
{
printf("三次输入都错误!请按任意键退出!\n");
getch();
printf("请按任意键退出!\n");
goto end;
}
}
}
printf("请输入最大到达时间间隔:\n");
scanf("%d",&arriveMaxTime);
if(arriveMaxTime>closeTime)
{
printf("输入错误!最大到达时间间隔必须小于营业时间!请再次输入!\n");
printf("请输入最大到达时间间隔:\n");
scanf("%d",&arriveMaxTime);
if(arriveMaxTime>closeTime)
{
printf("输入错误!最大到达时间间隔必须小于营业时间!请最后一次输入!\n");
printf("请输入最大到达时间间隔:\n");
scanf("%d",&arriveMaxTime);
if(arriveMaxTime>closeTime)
{
printf("三次输入都错误!请按任意键退出!\n");
getch();
printf("请按任意键退出!\n");
goto end;
}
}
}
printf("请输入最小到达时间间隔:\n");
scanf("%d",&arriveMinTime);
if(arriveMinTime<=0 || arriveMinTime>=arriveMaxTime)
{
printf("输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请再次输入!\n");
printf("请输入最小到达时间间隔:\n");
scanf("%d",&arriveMinTime);
if(arriveMinTime<=0 || arriveMinTime>=arriveMaxTime)
{
printf("输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请最后一次输入!\n");
printf("请输入最小到达时间间隔:\n");
scanf("%d",&arriveMinTime);
if(arriveMinTime<=0 || arriveMinTime>=arriveMaxTime)
{
printf("三次输入都错误!请按任意键退出!\n");
getch();
printf("请按任意键退出!\n");
goto end;
}
}
}
printf("请输入最大的处理时间:\n");
scanf("%d",&dealMaxTime);
if(dealMaxTime>closeTime)
{
printf("输入错误!最大处理时间必须小于营业时间!请再次输入!\n");
printf("请输入最大的处理时间:\n");
scanf("%d",&dealMaxTime);
if(dealMaxTime>closeTime)
{
printf("输入错误!最大处理时间必须小于营业时间!请最后一次输入!\n");
printf("请输入最大的处理时间:\n");
scanf("%d",&dealMaxTime);
if(dealMaxTime>closeTime)
{
printf("三次输入都错误!请按任意键退出!\n");
getch();
printf("请按任意键退出!\n");
goto end;
}
}
}
printf("请输入最小的处理时间:\n");
scanf("%d",&dealMinTime);
if(dealMinTime<=0 || dealMinTime>=dealMaxTime)
{
printf("输入错误!最小处理时间必须介于零和最大处理时间之间!请再次输入!\n");
printf("请输入最小的处理时间:\n");
scanf("%d",&dealMinTime);
if(dealMinTime<=0 || dealMinTime>=dealMaxTime)
{
printf("输入错误!最小处理时间必须介于零和最大处理时间之间!请最后一次输入!\n");
printf("请输入最小的处理时间:\n");
scanf("%d",&dealMinTime);
if(dealMinTime<=0 || dealMinTime>=dealMaxTime)
{
printf("三次输入都错误!请按任意键退出!\n");
getch();
printf("请按任意键退出!\n");
goto end;
}
}
}
printf("请输入交易额的最大上限:\n");
scanf("%d",&dealMaxMoney);
if(dealMaxMoney>=total || dealMaxMoney>50000)
{
printf("输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于50000!请再次输入!\n");
printf("请输入交易额的最大上限:\n");
scanf("%d",&dealMaxMoney);
if(dealMaxMoney>=total || dealMaxMoney>50000)
{
printf("输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于50000!请最后一次输入!\n");
printf("请输入交易额的最大上限:\n");
scanf("%d",&dealMaxMoney);
if(dealMaxMoney>=total || dealMaxMoney>50000)
{
printf("三次输入都错误!请按任意键退出!\n");
getch();
printf("请按任意键退出!\n");
goto end;
}
}
}
thearriveMaxTime +=rand()%(arriveMaxTime-arriveMinTime + 1)+arriveMinTime; //首次到达时间
while(currentTime < closeTime)
{
++currentTime;
if( currentTimeOfDeal < currentTime ) currentTimeOfDeal = currentTime ;
if( currentTimeOfDeal == currentTime ) state = 1;
if( currentTime == thearriveMaxTime ) //到达事件
{
arrive();
thearriveMaxTime +=rand()%(arriveMaxTime-arriveMinTime + 1)+arriveMinTime;
}//if
if( state == 1 && fq.head!=NULL )
{
if(fq.head->money >= 0)
{
putMoney();//调用存款函数
findAndDeal();//调用搜索处理函数
ndn++;
}//if
else
{
getMoney();//调用取款函数
nwn++;
}//else
}//if
}
printf("客户序列 事件类型 时间 处理金额\n");
while( eq.head!=NULL ) //清除事件队列
{
if(eq.head->type=="离开")
{
printf("%d 离开 %d %d\n",eq.head->num, eq.head->endTime,eq.head->money);
if(eq.head->money>=0) t1++;
else t3++;
}
else
{
printf("%d 到达 %d %d\n",eq.head->num, eq.head->beginTime,eq.head->money);
if(eq.head->money>=0) t2++;
else t4++;
}
sdn=ndn-(t2-t1);
swn=nwn-(t4-t3);
pop(eq);
}
printf( "未处理客户:\n");
while( fq.head!=NULL )
{
totalTime += ( closeTime - fq.head->beginTime ); //更新结束时第一队列中未处理的客户
if(m%10!=0) printf("%d ",fq.head->num);
else { printf("\n"); printf("%d ",fq.head->num); }
++counter;
m++;
pop(fq);
}//while
if(m==0) printf("无未处理客户\n");
printf("\n");
printf("需要存款的客户人数:%d\n",ndn);
printf("需要取款的客户人数:%d\n",nwn);
printf("成功办理存款的客户人数:%d\n",sdn);
printf("成功办理取款的客户人数:%d\n",swn);
printf("存款成功办理率:%f\n",float(sdn*100/ndn));
printf("取款成功办理率:%f\n",float(swn*100/nwn));
printf("客户逗留平均时间为:%f\n",float(totalTime/counter));
printf("银行当前余额:%d\n",total);
printf("请按任意键退出!\n");
break;
}//while(n==1)
if(n==0) printf("请按任意键退出!\n");
end:getch();
return 0;
}//main()
4、
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
:
1. 调试分析:在做队列的扫描算法时,发现运行演示的效果很奇怪,经过仔细检查和阅读题目,终于发现是我的理解有误。在处理顾客的第一种业务(从银行取出一笔钱)时,我没有特殊处理,仅是和处理第二种一样,即是等到该顾客交易时间结束时才开始判断,如果不够取进入第二队列等候。但题目中有“如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第2个队等候,直至满足时才离开银行,否则业务处理完后立刻离开银行”。想想这也是符合实际。于是改算法的判断为以下算法:
伪码:
{
if(!empry(fq)&& fq.head->money<0)
//如果队列一不空,而且队头客户办理第二种业务
{
//1.可以办,完成离开(即银行现金足够取)
//2.不可以办,排队2等候
}
else
//存款 ,第一种业务
if(!empty(fq) && temped= searchAndDel(sq,total)))
//当交易时间到
{
//办理该业务,并开始扫描第二队列,看是否能满足
//第二队列需要
}
if(currentime==next_arrtime )
{
//当当前时间等于即将到来的顾客到来时间,初始化
//该顾客节点,并设置下一顾客到达时间
}
}
2. 对于怎样计算已办理顾客的人数,一直没成功,最后在主函数中调用存款,取款函数中计算,才完成。
此时可以输入相应数据:
a) 银行初始资金total(测试数据为10000)
b) 银行营业时间closetime(测试数据为600)
c) 客户交易时间上下界dealmaxtime和dealmintime
d) 客户到达时间间隔上下界arrivemaxtime和 arrivemintime
e) 交易额的上限dealmaxmoney.
f) 程序模拟结束
最后给出一下数据:
a) 由于下班时间到而没能办理的顾客数
b) 分别列出需要办理两种业务的顾客数
c) 分别列出已成功办理两种业务的顾客数
d) 分别列出两个窗口办理业务的效率
e) 客户在银行内的平均逗留时间
f) 下班时银行的剩余总额。
测试结果:
正确输入并开始模拟运行:
1 输入一般数据:
a) 银行初始资金total=10000
b) 银行营业时间closetime=600
c) 客户到达时间间隔上界arrivemaxtime=10和arrivemintime=5
d) 客户交易时间上界dealmaxtime=10和dealmintime=5
2 当到达时间之间的间隔很短,但客户的交易时间很长:
a) 银行初始资金total=10000
b) 银行营业时间closetime=600
c) 客户到达时间间隔上界arrivemaxtime=2和
arrivemintime=1
d) 客户交易时间上界dealmaxtime=100和 dealmintime=1
从上面截图可以看出,当到达时间之间的间隔很短,但客户的交易时间很长时,最后会出现很多顾客到银行下班时间还没办理的现象。两种业务的办理成功率比较低的。
3. 当到达时间之间的间隔很长,但客户的交易时间很短:
a) 银行初始资金total=10000
b) 银行营业时间closetime=600
c) 客户到达时间间隔上界arrivemaxtime=100,arrivemintime=1
d) 客户交易时间上下界dealmaxtime=2和dealmintime=1
从上面两幅截图可以看出,当到达时间之间的间隔很长,但客户的交易时间很短时,未处理客户基本上是没有的,两个窗口的办业务成功率很高。
4. 体会与心得:刚开始对课程设计很害怕,总以为自己还没有具备独立完成的实力。虽然平时那些作业系统中的题目都是自己独立完成,事后还跟舍友讨论交流。但对于课程设计还是没有多少把握。但经过自己一个多月的努力和奋斗,认真看书理解,浏览网上优异算法的程序,最终还是靠自己独立完成了。本课程设计主要用了队列和静态链表的知识,还有一些随机产生数的函数。经过这次实验,使我对栈和队列,静态链表的理解更深更广更全面!也使我摸索出了学习数据结构的方法——正确理解,多做练习!还有,这次实验让我明白了编程一定要多练才会熟悉,才能理解的正确,理解的透彻!
5、 参考文献:
[1] 吴伟民 严蔚敏主编《数据结构(C语言版)》清华大学出版社2007
[2] 谭浩强主编《C程序设计(第3版)》 清华大学出版社 2005
[3] (美)奈霍夫 著《数据结构与算法分析:C++语言描述(第2版)》 清华大学出版社 2006
[4] 殷人昆 徐孝凯 著《数据结构习题解析:用面向对象方法与C++语言描述》 清华大学出版社 2002
登录成XX
PAGE