华东交通大学数据结构课程设计银行模拟系统.docx
《华东交通大学数据结构课程设计银行模拟系统.docx》由会员分享,可在线阅读,更多相关《华东交通大学数据结构课程设计银行模拟系统.docx(23页珍藏版)》请在冰点文库上搜索。
华东交通大学数据结构课程设计银行模拟系统
课程设计(论文)任务书
软件 学院 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(tprintf("时间%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.需完善之处
本程序功能简单,就其实用性而言,没多大意义。
但是我们可以在此基础上添加一些人性化的功能,比如说,此程序还可以通过添加一些输入格式错误时,出现引导操作者输入正确格式的提醒。
增加存款或查询功能,对每一位客户实名登记等等功能使得程序实用性更加强大。
课程设计体会
通过此次课程设计
实验心得体会
数据结构是一门理论性较强且抽象的课程,银行业务模拟需要用到结点类,队列等知识,所以我们要首先对结点类、队列有充分的认识和理解。
同时也要对我们以前学过的构造函数等进行巩固。
经过一周的数据结构课程设计,至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的一周时间里,虽然时间比较紧,但我学到了很多以前不知道的东西,同时不仅复习和巩固了以前所学过的知识,而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得了理论必须和实践永远的结合起来,才能有质的飞跃,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到过很多问题,但我一直坚持着,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉得一定要把以前所学过的知识重新温故。
虽然我的算法不够完好,还有许多问题,但我一定会调试成功的。
通过银行业务模拟我认识到模拟技术的庞大和好处,对我以后不管是生活还