您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页银行业务模拟课程设计

银行业务模拟课程设计

来源:爱玩科技网


课程名称: 计算机技术综合课程设计 题 目: 银行业务模拟

学 院: 信息工程 系: * 专 业: *

班 级: 0* 学 号: * 学生姓名: * 时 间: *

一、 问题描述:

客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直到满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。

写一个银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。

二、 分析与设计

1. 问题分析:

本问题主要需要处理两个队列(fq,sq)和一个事件表(eq)。一个队列(fq)表示第一种业务(存款或还款),另一个队列(sq)表示第二种业务(取款或借款)。事件有两类:到达银行和离开银行。到达事件发生时随机地设置此用户的

交易时间和距下一到达事件之间的时间间隔。每个客户要办理的款额也应该是随机确定的。初始时银行现存资金总额为total。开始营业后的第一个事件是客户到达,营业时间从0到closetime。Total 和closetime以及随机产生的时间和款项的上下界都是交互地从让用户从输入,作为模拟参数。要得到相关的结果:由于下班时间到而没能办理的顾客数;分别列出需要办理两种业务的顾客数;分别列出已成功办理两种业务的顾客数;分别列出两种业务的成功办理率;客户在银行内的平均逗留时间;下班时银行所剩余的资金总额。

2. 测试数据及期望结果:

1) 输入:

用户需要在程序运行开始时输入以下数据: ① 银行初始资金total(测试数据为10000) ② 银行营业时间closetime(测试数据为600)

③ 客户交易时间上下界dealmaxtime和dealmintime,用于给随机数产生函数传递参数,产生一个介于这两个值之间的值。

④ 客户到达时间间隔上界arrivemaxtime arrivemintime,用于给随机数产生函数传递参数,产生一个介于这两个值之间的值。

⑤ 交易额的最大上限dealMaxMoney.用于给随机函产生函数参数,产生一个介于-dealMaxMoney和dealMaxMoney之间的值,作为顾客到银行办理业务的交易额。

2) 输出:

本程序用dos界面模拟输出整个银行业务办理及排队的结果,最后给出一下数据:

① 由于下班时间到而没能办理的顾客数 ② 分别列出需要办理两种业务的顾客数 ③ 分别列出已成功办理两种业务的顾客数 ④ 分别列出两种业务的成功办理率。 ⑤ 客户在银行内的平均逗留时间 ⑥ 下班时银行所剩余的资金总额

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个模块: ① 主程序模块

② 队列模块--实现队列抽象数据类型 各模块相互调用关系如下:

主程序模块

队列模块

算法设计 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 ); }

//当当前时间等于即将到来的顾客到来时间,初始化//该顾客节点,并设置下一顾客到达时间

三、 源代码:

//银行业务模拟系统 #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)) if(q. head==q.rear) {

temp = q. head;

q. head = q. rear = NULL; return temp; }//if else

{//队首元素出列

temp = q. head;

q. head = q. head->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\while(n==1) {

srand(time(NULL)); //初始化随机函数 printf(\"请输入银行的初始存款:\\n\"); scanf(\"%d\

if(total<0)

姓学号:

{

printf(\"输入错误!初始存款不能小于0!请再次输入!\\n\"); printf(\"请输入银行的初始存款:\\n\"); scanf(\"%d\ if(total<0) {

printf(\"输入错误!初始存款不能小于0!请最后一次输入!\\n\"); printf(\"请输入银行的初始存款:\\n\"); scanf(\"%d\ if(total<0) {

printf(\"三次输入都错误!请按任意键退出!\\n\"); getch();

printf(\"请按任意键退出!\\n\"); goto end; } }

}

printf(\"请输入银行的营业时间:\\n\"); scanf(\"%d\

if(closeTime>=1440) {

printf(\"输入错误!一天的营业时间不能超过1440分钟(24个小时)!请再次输入!\\n\");

printf(\"请输入银行的营业时间:\\n\"); scanf(\"%d\if(closeTime>=1440) {

printf(\"输入错误!一天的营业时间不能超过1440分钟(24个小时)!请最后一次输入!\\n\");

printf(\"请输入银行的营业时间:\\n\"); scanf(\"%d\

if(closeTime>=1440) {

printf(\"三次输入都错误!请按任意键退出!\\n\"); getch();

printf(\"请按任意键退出!\\n\"); goto end; } } }

printf(\"请输入最大到达时间间隔:\\n\"); scanf(\"%d\

if(arriveMaxTime>closeTime)

{

printf(\"输入错误!最大到达时间间隔必须小于营业时间!请再次输入!\\n\");

printf(\"请输入最大到达时间间隔:\\n\"); scanf(\"%d\if(arriveMaxTime>closeTime) {

printf(\"输入错误!最大到达时间间隔必须小于营业时间!请最后一次输入!\\n\");

printf(\"请输入最大到达时间间隔:\\n\"); scanf(\"%d\if(arriveMaxTime>closeTime) {

printf(\"三次输入都错误!请按任意键退出!\\n\"); getch();

printf(\"请按任意键退出!\\n\"); goto end; } }

}

printf(\"请输入最小到达时间间隔:\\n\"); scanf(\"%d\

if(arriveMinTime<=0 || arriveMinTime>=arriveMaxTime) {

printf(\"输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请再次输入!\\n\");

printf(\"请输入最小到达时间间隔:\\n\"); scanf(\"%d\

if(arriveMinTime<=0 || arriveMinTime>=arriveMaxTime) {

printf(\"输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请最后一次输入!\\n\");

printf(\"请输入最小到达时间间隔:\\n\"); scanf(\"%d\

if(arriveMinTime<=0 || arriveMinTime>=arriveMaxTime) {

printf(\"三次输入都错误!请按任意键退出!\\n\"); getch();

printf(\"请按任意键退出!\\n\"); goto end; } } }

printf(\"请输入最大的处理时间:\\n\");

scanf(\"%d\

if(dealMaxTime>closeTime) {

printf(\"输入错误!最大处理时间必须小于营业时间!请再次输入!\\n\"); printf(\"请输入最大的处理时间:\\n\"); scanf(\"%d\if(dealMaxTime>closeTime) {

printf(\"输入错误!最大处理时间必须小于营业时间!请最后一次输入!\\n\");

printf(\"请输入最大的处理时间:\\n\"); scanf(\"%d\if(dealMaxTime>closeTime) {

printf(\"三次输入都错误!请按任意键退出!\\n\"); getch();

printf(\"请按任意键退出!\\n\"); goto end; } } }

printf(\"请输入最小的处理时间:\\n\"); scanf(\"%d\

if(dealMinTime<=0 || dealMinTime>=dealMaxTime) {

printf(\"输入错误!最小处理时间必须介于零和最大处理时间之间!请再次输入!\\n\");

printf(\"请输入最小的处理时间:\\n\"); scanf(\"%d\

if(dealMinTime<=0 || dealMinTime>=dealMaxTime) {

printf(\"输入错误!最小处理时间必须介于零和最大处理时间之间!请最后一次输入!\\n\");

printf(\"请输入最小的处理时间:\\n\"); scanf(\"%d\

if(dealMinTime<=0 || dealMinTime>=dealMaxTime) {

printf(\"三次输入都错误!请按任意键退出!\\n\"); getch();

printf(\"请按任意键退出!\\n\"); goto end; } } }

printf(\"请输入交易额的最大上限:\\n\"); scanf(\"%d\

if(dealMaxMoney>=total || dealMaxMoney>50000) {

printf(\"输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于50000!请再次输入!\\n\"); printf(\"请输入交易额的最大上限:\\n\"); scanf(\"%d\

if(dealMaxMoney>=total || dealMaxMoney>50000) {

printf(\"输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于50000!请最后一次输入!\\n\"); printf(\"请输入交易额的最大上限:\\n\"); scanf(\"%d\

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->endTime,eq.head->money); if(eq.head->money>=0) t1++; else t3++; } else {

printf(\"%d 到达 %d %d\\n\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 \

else { printf(\"\\n\"); printf(\"%d \ } ++counter; m++; pop(fq); }//while

if(m==0) printf(\"无未处理客户\\n\"); printf(\"\\n\");

printf(\"需要存款的客户人数:%d\\n\

printf(\"需要取款的客户人数:%d\\n\printf(\"成功办理存款的客户人数:%d\\n\printf(\"成功办理取款的客户人数:%d\\n\printf(\"存款成功办理率:%f\\n\printf(\"取款成功办理率:%f\\n\

printf(\"客户逗留平均时间为:%f\\n\printf(\"银行当前余额:%d\\n\printf(\"请按任意键退出!\\n\"); break;

}//while(n==1)

if(n==0) printf(\"请按任意键退出!\\n\"); end:getch(); return 0; }//main()

四、 总结:

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) 下班时银行的剩余总额。 测试结果:

正确输入并开始模拟运行: ① 输入一般数据:

a) 银行初始资金total=10000 b) 银行营业时间closetime=600

c) 客户到达时间间隔上界arrivemaxtime=10和arrivemintime=5 d) 客户交易时间上界dealmaxtime=10和dealmintime=5

② a) b) c) d)

当到达时间之间的间隔很短,但客户的交易时间很长: 银行初始资金total=10000 银行营业时间closetime=600

客户到达时间间隔上界arrivemaxtime=2和 arrivemintime=1 客户交易时间上界dealmaxtime=100和 dealmintime=1

从上面截图可以看出,当到达时间之间的间隔很短,但客户的交易时间很长时,最后会出现很多顾客到银行下班时间还没办理的现象。两种业务的办理成功率比较低的。

3. 当到达时间之间的间隔很长,但客户的交易时间很短: a) 银行初始资金total=10000 b) 银行营业时间closetime=600

c) 客户到达时间间隔上界arrivemaxtime=100,arrivemintime=1 d) 客户交易时间上下界dealmaxtime=2和dealmintime=1

从上面两幅截图可以看出,当到达时间之间的间隔很长,但客户的交易时间很短时,未处理客户基本上是没有的,两个窗口的办业务成功率很高。

4. 体会与心得:刚开始对课程设计很害怕,总以为自己还没有具备完成的

实力。虽然平时那些作业系统中的题目都是自己完成,事后还跟舍友讨论交流。但对于课程设计还是没有多少把握。但经过自己一个多月的努力和奋斗,认真看书理解,浏览网上优异算法的程序,最终还是靠自己完成了。本课程设计主要用了队列和静态链表的知识,还有一些随机产生数的函数。经过这次实验,使我对栈和队列,静态链表的理解更深更广更全面!也使我摸索出了学习数据结构的方法——正确理解,多做练习!还有,这次实验让我明白了编程一定要多练才会熟悉,才能理解的正确,理解的透彻!

五、 参考文献:

[1] 吴伟民 严蔚敏主编《数据结构(C语言版)》清华大学出版社2007 [2] 谭浩强主编《C程序设计(第3版)》 清华大学出版社 2005

[3] (美)奈霍夫 著《数据结构与算法分析:C++语言描述(第2版)》 清华大学出版

登录成XX

社 2006

[4] 殷人昆 徐孝凯 著《数据结构习题解析:用面向对象方法与C++语言描述》 清华大学出版社 2002

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务