华东交通大学数据结构课程设计银行模拟系统.docx
- 文档编号:18393439
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:23
- 大小:185.96KB
华东交通大学数据结构课程设计银行模拟系统.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={
基本操作:
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.需完善之处 本程序功能简单,就其实用性而言,没多大意义。 但是我们可以在此基础上添加一些人性化的功能,比如说,此程序还可以通过添加一些输入格式错误时,出现引导操作者输入正确格式的提醒。 增加存款或查询功能,对每一位客户实名登记等等功能使得程序实用性更加强大。 课程设计体会 通过此次课程设计 实验心得体会 数据结构是一门理论性较强且抽象的课程,银行业务模拟需要用到结点类,队列等知识,所以我们要首先对结点类、队列有充分的认识和理解。 同时也要对我们以前学过的构造函数等进行巩固。 经过一周的数据结构课程设计,至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的一周时间里,虽然时间比较紧,但我学到了很多以前不知道的东西,同时不仅复习和巩固了以前所学过的知识,而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得了理论必须和实践永远的结合起来,才能有质的飞跃,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到过很多问题,但我一直坚持着,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉得一定要把以前所学过的知识重新温故。 虽然我的算法不够完好,还有许多问题,但我一定会调试成功的。 通过银行业务模拟我认识到模拟技术的庞大和好处,对我以后不管是生活还
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华东 交通大学 数据结构 课程设计 银行 模拟 系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)