华东交通大学数据结构课程设计银行模拟系统.docx

上传人:b****0 文档编号:18393439 上传时间:2023-08-16 格式:DOCX 页数:23 大小:185.96KB
下载 相关 举报
华东交通大学数据结构课程设计银行模拟系统.docx_第1页
第1页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第2页
第2页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第3页
第3页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第4页
第4页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第5页
第5页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第6页
第6页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第7页
第7页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第8页
第8页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第9页
第9页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第10页
第10页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第11页
第11页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第12页
第12页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第13页
第13页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第14页
第14页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第15页
第15页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第16页
第16页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第17页
第17页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第18页
第18页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第19页
第19页 / 共23页
华东交通大学数据结构课程设计银行模拟系统.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

华东交通大学数据结构课程设计银行模拟系统.docx

《华东交通大学数据结构课程设计银行模拟系统.docx》由会员分享,可在线阅读,更多相关《华东交通大学数据结构课程设计银行模拟系统.docx(23页珍藏版)》请在冰点文库上搜索。

华东交通大学数据结构课程设计银行模拟系统.docx

华东交通大学数据结构课程设计银行模拟系统

课程设计(论文)任务书

软件 学院  XXXX 专业 201XX-X 班

一、课程设计(论文)题目 数据结构课程设计 

二、课程设计(论文)工作自20XX年12月XX日起至20XX年12月XX日止。

三、课程设计(论文)地点:

XXXX实训中心

四、课程设计(论文)内容要求:

1.本课程设计的目的

(1)使学生熟练掌握抽象数据类型的组织和定义;

(2)使学生熟练掌握数据类型的定义和实现;

(3)培养学生组织和分析数据的能力;

(4)培养学生分析和应用基于不同数据结构的算法的能力;

(5)提高学生的科技论文写作能力。

2.基本要求:

每位同学在以下题目中任选一题(在方框中打勾),独立完成课程设计:

□稀疏矩阵运算:

实现稀疏矩阵的输入、输出、加减乘的运算。

□关键路径:

求出完成整项工程至少需要多少时间以及整项工程中的关键活动。

(1)能够输入并存储一个描述工程的AOE网;

(1)对输入的AOE网,应判断其是否能够顺利进行;

(2)若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及每一个关键活动

所依附的两个顶点、最早发生时间、最迟发生时间。

□银行业务模拟:

参见《数据结构》教材P68。

3.课程设计论文编写要求

(1)要按照书稿的规格打印誊写课设报告;

(2)报告分为封面、任务书(本文档)、正文、课程设计体会和参考文献四部分;

学生签名:

年月日

 

课程设计(论文)评审意见

(1)题目分析(20分):

优( )、良( )、中( )、一般( )、差( );

(2)流程分析 (30分):

优( )、良( )、中( )、一般( )、差( );

(3)数据定义 (30分):

优( )、良( )、中( )、一般( )、差( );

(4)代码编写 (10分):

优( )、良( )、中( )、一般( )、差( );

(5)创新能力 (10分):

优( )、良( )、中( )、一般( )、差( );

(6)格式规范性、设计态度及考勤是否降等级:

是( )、否( )

评阅人:

   职称:

讲师

年月日

正文

一、数据结构定义

1.抽象数据类型

本设计中用到的数据结构ADT定义如下:

ADTQueue{

数据对象:

D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}

数据关系:

R1={|ai-1,ai∈D,i=2,...,n}

基本操作:

voidinit_Q(Queue&Q);

操作结果:

构造空队列Q

intQ_empty(QueueQ);

初始条件:

队列Q存在

操作结果:

若Q为空队列,则返回TRUE,否则FALSE

intQ_length(QueueQ);

初始条件:

队列Q存在

操作结果:

返回队列Q的元素个数,即队列长度

intgethead_Q(QueueQ);

初始条件:

队列Q存在

操作结果:

返回队列Q的队头元素

voiden_Q(Queue&Q,inte);

初始条件:

队列Q存在

操作结果:

插入元素e为Q的新的队尾元素。

voidde_Q(Queue&Q,int&e);

初始条件:

队列Q存在

操作结果:

删除Q的队头元素。

}ADTQueue

 

2.存储结构定义

数据存储结构的C语言定义如下:

typedefintStatus;

//-----------------银行排队模拟

//事件和事件表

typedefstructQCuEvent

{

intOccurTime;

intNType;

structQCuEvent*next;

}QCuEvent,*EventList;

//窗口前队列元素

typedefstructQCuElem

{

intArrivalTime;

intDuration;

structQCuElem*next;

}QCuElem,*QEptr;

//窗口指针

typedefstruct{

QEptrfront;

QEptrrear;

}QCustomerp,*QCupp;

3.基本操作

数据结构的基本操作实现如下:

//基本操作函数

StatusOrderInser(EventList&ev,QCuEventen);//按时间顺序插入事件到事件表

intQLength(QCustomerpqn);//求窗口队列长度

intMinCuQueue(QCuppq);//求队最短的窗口

StatusDelFirstEvent(EventList&ev);//删除事件表中的第一个事件

StatusInitCuQueue(QCustomerp&qn);//初始化窗口队列

StatusEnCuQueue(QCustomerp&qn,QEptrQ);//进入队列

StatusDeCuQueue(QCustomerp&qn,QCuElem&Q);//删除队列中的元素

StatusGetQHead(QCustomerpqn,QCuElem&Q);//获得队列中的第一个元素

StatusDestoryQueue(QCustomerpqn);//销毁队列

voidPtint_QStatus(QCustomerpQCu[]);//打印队列长度

voidBank_SimulationFunc();

voidtest(charstr[]);

二、解题过程

1.问题分解

该问题主要应实现以下功能:

1).实现数据的输入;

2).各个窗口数据的访问和输出;

3)当前窗口的人员分布情况动态显示。

4)存储结构:

队列存储结构

5)实现了模拟银行的程序设计,并且包含每一个客户离开时间及统计,以及

窗口排队的可视化模拟.运行测试通过.

6)测试数据:

要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。

进行程序测试,以保证程序的稳定。

2.模块结构

系统主要由2个模块组成,分别是:

1 主程序模块

2 队列模块--实现队列抽象数据类型

模块之间的结构如下:

各模块相互调用关系如下:

主程序模块

 

队列模块

 

3.解题思路

各模块的实现步骤为

(1).实现步骤

首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;

其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;

再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;

最后,编写主函数对每个实现进行按需调用,实现操作。

(2).流程图

 

 

 

图-1事件流程图

 

图-2主函数流程图

三、实现

代码及注释

#defineOK1

#defineTRUE1

#defineFALSE0

#defineERROR0

#defineINFEASIBLE-1

#defineOVERFLOW-2

typedefintStatus;

//-----------------银行排队模拟

//事件和事件表

typedefstructQCuEvent

{

intOccurTime;

intNType;

structQCuEvent*next;

}QCuEvent,*EventList;

//窗口前队列元素

typedefstructQCuElem

{

intArrivalTime;

intDuration;

structQCuElem*next;

}QCuElem,*QEptr;

//窗口指针

typedefstruct{

QEptrfront;

QEptrrear;

}QCustomerp,*QCupp;

//主要操作函数

StatusOpenForDay(EventList&ev,QCuEventen,QCupp&q);//开门

StatusCustomerArrived(EventList&ev,QCupp&q,QCuEventen);//顾客到达

StatusCustomerDeparture(EventList&ev,QCupp&q,QCuEventen);//顾客离开

voidCloseForDay();

//基本操作函数

StatusOrderInser(EventList&ev,QCuEventen);//按时间顺序插入事件到事件表

intQLength(QCustomerpqn);//求窗口队列长度

intMinCuQueue(QCuppq);//求队最短的窗口

StatusDelFirstEvent(EventList&ev);//删除事件表中的第一个事件

StatusInitCuQueue(QCustomerp&qn);//初始化窗口队列

StatusEnCuQueue(QCustomerp&qn,QEptrQ);//进入队列

StatusDeCuQueue(QCustomerp&qn,QCuElem&Q);//删除队列中的元素

StatusGetQHead(QCustomerpqn,QCuElem&Q);//获得队列中的第一个元素

StatusDestoryQueue(QCustomerpqn);//销毁队列

voidPtint_QStatus(QCustomerpQCu[]);//打印队列长度

voidBank_SimulationFunc();

voidtest(charstr[]);

 

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

inti=0,e=0,counter=0;

intTotalTime=0,CustomerNum=0;//累计客户逗留时间,客户数

intCloseTime;//关门时间

intwindowsnum=0;

//主函数

intmain(){

EventListev;//事件表

QCuEventen;

QCuppQCu=NULL;

OpenForDay(ev,en,QCu);

while(ev->next)

{

en.NType=ev->next->NType;

en.OccurTime=ev->next->OccurTime;

DelFirstEvent(ev);

if(en.NType==0)

CustomerArrived(ev,QCu,en);

else

CustomerDeparture(ev,QCu,en);

Ptint_QStatus(QCu);

}

CloseForDay();

}

//主要功能子函数

StatusOpenForDay(EventList&ev,QCuEventen,QCupp&q)

{

inttemp=0;

printf("请输入随机数种子(或输入0使用随机种子):

");

scanf("%d",&temp);

if(temp==0)srand((unsigned)time(NULL));

elsesrand(temp);

printf("请输入营业时间(单位:

分钟):

");

scanf("%d",&temp);

CloseTime=temp;

TotalTime=0;

CustomerNum=0;

en.OccurTime=0;

en.NType=0;

en.next=NULL;

ev=(EventList)malloc(sizeof(QCuEvent));

ev->next=NULL;

OrderInser(ev,en);

printf("请输入办理业务的窗口数(至少1个):

");

scanf("%d",&windowsnum);

q=(QCustomerp*)malloc((windowsnum+1)*sizeof(QCustomerp));

for(inti=1;i<=windowsnum;i++)

{

InitCuQueue(q[i]);

}

returnOK;

}

StatusCustomerArrived(EventList&ev,QCupp&q,QCuEventen)

{

test("顾客到达处理<<<<<<<<");

CustomerNum++;

//产生随机数

//srand(54);

intdurtime=rand()%30+1;

intintertime=rand()%5+1;

//插入到达事件表

QCuEventenTemp;

intt=en.OccurTime+intertime;

enTemp.OccurTime=t;

enTemp.NType=0;

enTemp.next=NULL;

if(t

printf("时间%d\n",t);

//插入最短队

QEptrQ;

Q=(QEptr)malloc(sizeof(QCuElem));

Q->ArrivalTime=en.OccurTime;

Q->Duration=durtime;

Q->next=NULL;

inti=MinCuQueue(q);

EnCuQueue(q[i],Q);

//插入离开事件

enTemp.OccurTime=en.OccurTime+durtime;

enTemp.NType=i;

enTemp.next=NULL;

if(QLength(q[i])==1)OrderInser(ev,enTemp);

returnOK;

}

StatusCustomerDeparture(EventList&ev,QCupp&q,QCuEventen)

{

test(">>>>>>>>顾客离开处理");

inti=en.NType;

printf("离开时间%d\n",en.OccurTime);

if(en.OccurTime>CloseTime)

{

DestoryQueue(q[i]);

}

else{

QCuElemcustomer;

DeCuQueue(q[i],customer);

//客户逗留时间

TotalTime+=en.OccurTime-customer.ArrivalTime;

printf("总时间为%d\n",TotalTime);

if(q[i].front->next)

{

GetQHead(q[i],customer);

QCuEventenTemp;

enTemp.OccurTime=en.OccurTime+customer.Duration;

enTemp.NType=i;

OrderInser(ev,enTemp);

}

}

returnOK;

}

voidCloseForDay()

{

printf("***************************************\n");

printf("*\n");

printf("*所有顾客业务办理总时间:

%d分钟\n",TotalTime);

printf("*业务办理顾客数:

%d\n",CustomerNum);

printf("*平均每人办理时间:

%f\n",(float)TotalTime/(float)CustomerNum);

printf("*\n");

printf("***************************************\n");

}

//功能实现子函数

StatusOrderInser(EventList&ev,QCuEventen)

{

EventListentemp,qtemp;

entemp=(EventList)malloc(sizeof(QCuEvent));

entemp->OccurTime=en.OccurTime;

entemp->NType=en.NType;

entemp->next=NULL;

if(!

ev->next)

{

ev->next=entemp;

returnOK;

}

qtemp=ev;

while(qtemp->next&&qtemp->next->OccurTime

{

qtemp=qtemp->next;

}

entemp->next=qtemp->next;

qtemp->next=entemp;

returnOK;

}

intQLength(QCustomerpqn)

{

QEptrqtemp;

inti=0;

qtemp=qn.front->next;

while(qtemp)

{

qtemp=qtemp->next;

i++;

}

returni;

}

intMinCuQueue(QCuppq)

{

inti,min;

for(i=1,min=1;i<=windowsnum;i++)

{

min=QLength(q[min])<=QLength(q[i])?

min:

i;

}

returnmin;

}

StatusDelFirstEvent(EventList&ev)

{

EventListp;

p=ev->next;

ev->next=p->next;

free(p);

returnOK;

}

StatusInitCuQueue(QCustomerp&qn)

{

qn.front=(QEptr)malloc(sizeof(QCuElem));

qn.front->next=NULL;

qn.rear=qn.front;

returnOK;

}

StatusEnCuQueue(QCustomerp&qn,QEptrQ)

{

qn.rear->next=Q;

qn.rear=Q;

returnOK;

}

StatusDeCuQueue(QCustomerp&qn,QCuElem&Q)

{

QEptrqtemp;

qtemp=qn.front->next;

Q.ArrivalTime=qtemp->ArrivalTime;

Q.Duration=qtemp->Duration;

qn.front->next=qtemp->next;

if(qn.rear==qtemp)qn.rear=qn.front;

free(qtemp);

returnOK;

}

StatusGetQHead(QCustomerpqn,QCuElem&Q)

{

Q.ArrivalTime=qn.front->next->ArrivalTime;

Q.Duration=qn.front->next->Duration;

returnOK;

}

StatusDestoryQueue(QCustomerpqn)

{

QEptrp;

while(qn.front->next)

{

p=qn.front->next;

qn.front->next=p->next;

free(p);

}

qn.front->next=NULL;

qn.rear=qn.front;

returnOK;

}

voidPtint_QStatus(QCustomerpQCu[])

{

intl;

for(inti=1;i<=windowsnum;i++)

{

l=QLength(QCu[i]);

printf("队列%d:

长%d:

",i,l);

for(intn=1;n<=l;n++)

{

printf("@");

}

printf("\n");

}

}

voidtest(charstr[])

{

printf("--%s--\n",str);

}

四、实验结果

1.实验数据

实验结果

 

中间部分省略………………………………………

 

五、实验小结

1.数据结构使用小结

(1).实验结果分析

利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。

如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务时间,基本上实现了银行事件的模拟。

(2)感觉处理的数据越大显示的随机数的差别越小。

2.需完善之处

本程序功能简单,就其实用性而言,没多大意义。

但是我们可以在此基础上添加一些人性化的功能,比如说,此程序还可以通过添加一些输入格式错误时,出现引导操作者输入正确格式的提醒。

增加存款或查询功能,对每一位客户实名登记等等功能使得程序实用性更加强大。

课程设计体会

通过此次课程设计

实验心得体会

数据结构是一门理论性较强且抽象的课程,银行业务模拟需要用到结点类,队列等知识,所以我们要首先对结点类、队列有充分的认识和理解。

同时也要对我们以前学过的构造函数等进行巩固。

经过一周的数据结构课程设计,至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的一周时间里,虽然时间比较紧,但我学到了很多以前不知道的东西,同时不仅复习和巩固了以前所学过的知识,而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得了理论必须和实践永远的结合起来,才能有质的飞跃,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到过很多问题,但我一直坚持着,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉得一定要把以前所学过的知识重新温故。

虽然我的算法不够完好,还有许多问题,但我一定会调试成功的。

通过银行业务模拟我认识到模拟技术的庞大和好处,对我以后不管是生活还

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2