logo资料库

广工数据结构银行业务模拟课设.docx

第1页 / 共35页
第2页 / 共35页
第3页 / 共35页
第4页 / 共35页
第5页 / 共35页
第6页 / 共35页
第7页 / 共35页
第8页 / 共35页
资料共35页,剩余部分请下载后查看
数据结构课程设计报告
数据结构课程设计报告 题目: 银行业务模拟 学 专 院 计算机学院 业 计算机科学与技术 年级班别 学 号 学生姓名 指导教师 成 绩 ____________________ 2018 年 1 月 16 日
报告: 内容: □详细 □完整 □不完整 设计方案: □非常合理 □合理 □较差 实现: □全部实现 □部分实现 □未实现 文档格式: □规范 □基本规范 □不规范 答辩: □理解题目透彻,问题回答流利 □理解题目较透彻,回答问题基本正确 □部分理解题目,部分问题回答正确 □未能完全理解题目,答辩情况较差 总评成绩: □优 □良 □中 □及格 □不及格
一.需求分析 1. 程序问题描述:本程序为银行客户业务模拟,其业务模拟分为两种:第一功能是申请从 银行得到一笔资金,即取款或借款。第二功能是向银行投入一笔资金,即存款或还款。 银行有两个服务窗口,相应地有两个队列。 2. 程序具体实现的功能: (1) 第一功能:客户到达银行后先排第一个队。处理每个客户业务时,如果属于第 一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等 候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个 第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对 能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。 (2) 第二功能:如果在此检查过程中,一旦银行资金总额少于或等于刚才第一个队 列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检 查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第 一个 队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间 结束时所有客户立即离 开银行。 (3) 在客户到达事件中要模拟实现银行排队情况,考虑同一时刻多个客户到达银行 排队。 (4) 该程序要求实现银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行 内逗留的平均时间。 3. 演示程序以用户与计算机交互方式执行,即在计算机终端上显示“是否开始模拟”询问 信息时,由用户在键盘上输入演示程序中规定的运算命令;开始模拟后根据指令输入相 应的测试数据取值范围,得到测试结果。 4. 数据测试: (1) 一天营业开始时银行拥有的款额为 10000(元),营业时间 600(分钟)。 (2) 客户存取款金额不大于 3000 元,这里是为了防止系统出现死循环,因为银行开 始营业的金额为 10000 元,若取款金额过大,容易出现客户一直在等待取款的 状态而无法正常办理业务。 (3) 由于模拟参量可以自定,变量 total、closetime 以及客户办理业务时间和下个客 户到达的时间间隔上下界均交互地从终端读入,这里注意测定两种极端的情况: 一是两个到达事件之间的间隔时间很短,而客户的交易时间很长,另 一个恰好
相反,设置两个到达事件的间隔时间很长,而客户的交易时间很短。 注意:为了避免出现同一时间到达客户过多,使得接待客户远少于到达人数,出现业务 问题,这里我设置同一时间到达人数不超过 3 人,这里仅是为了测试方便,可以根据具 体情况变更。测试数据均由系统随机产生。 二.概要设计 1.基本要求:利用动态存储结构实现模拟,单链表以及队列来实现。 2.ADT 定义: ADT QEvent,*EventList { 数据对象:D={ ai | ai∈ElemSet, i=1,2,...,n, n≥0 } 数据关系:R1={ |ai-1, ai∈D, i=2,...,n } 基本操作: int InitList(); //初始化事件链表 int OrderInsert(EventList L, QEvent e); //将事件 e 按发生时间顺序插入有序链表 L 中 int ListEmpty(EventList L); //判断事件表是否为空 void DestroyList(EventList L); //销毁事件链表 } ADT QEvent, *EventList; ADT LinkQueue { 数据对象:D={ ai | ai∈ElemSet, i=1,2,...,n, n≥0 } 数据关系:R1={ |ai-1, ai∈D, i=2,...,n } 基本操作: int InitQueue(LinkQueue *Q); //初始化队列 Q int EmptyQueue(LinkQueue *Q); //若队列 Q 为空,返回 TRUE,否则返回 FALSE int DelQueue(LinkQueue *Q, QEvent *memrroy); //若队列 Q 不为空,首结点出队,用 memrroy 返回,并返回 OK;否则返回 ERROR int EnQueue(LinkQueue *Q, QEvent e); //结点 e 入队 Q } ADT LinkQueue; void DestroyQueue(LinkQueue *Q1,LinkQueue *Q2); //销毁队列 }ADT LinkQueue; 3. 程序模块的划分:
(1) 主函数: Main(){ 输出主界面; 选择操作:进入银行业务模拟系统/退出程序; While(“命令”==开始){ 初始化; 客户到达事件处理; 客户离开事件处理; 输出数据; 销毁客户数据,清理内存; 输出主界面; 选择操作:进入银行业务模拟系统/退出程序; } 退出程序; } (2)动态存储数据模块: 第一部分:外部变量声明。 第二部分:队列结构体以及链表的建立。 (3)三个模块的图形关系:
三.详细设计 //源代码 #include #include #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef struct ElemType{ int nov; int NType; int ArriveTime; //0 为到达事件,1 为离开事件
int Duration; int waitTime; int money; }ElemType; typedef struct Event { ElemType data; struct Event *next; }QEvent, *EventList; typedef struct { QEvent *front; QEvent *rear; }LinkQueue; //延迟函数 //事件类型 //头指针 //尾指针 void delay(unsigned int xms); //事件表 int InitList(); //初始化事件链表 int OrderInsert(EventList L, QEvent e); //将事件 e 按发生时间顺序插入有序链表 L 中 int ListEmpty(EventList L); //判断事件表是否为空 //队列 int InitQueue(LinkQueue *Q); //初始化队列 Q int EmptyQueue(LinkQueue *Q); //若队列 Q 为空,返回 TRUE,否则返回 FALSE int DelQueue(LinkQueue *Q, QEvent *memrroy); //若队列 Q 不为空,首结点出队,用 memrroy 返回,并返回 OK;否则返回 ERROR int EnQueue(LinkQueue *Q, QEvent e); //结点 e 入队 Q //交易处理 void OpenForDay(); void CustomerArrived(); QEvent *Find(EventList L,int num); //初始化操作 //顾客达到事件
void CustomerDepature(EventList L,LinkQueue *Q1,LinkQueue *Q2); //设置离开事件 void QueueTwo(EventList L,LinkQueue *Q,int money); //队列 2 处理 void output(EventList L); //输出客户平均逗留时间及营业信息 //销毁数据 void DestroyQueue(LinkQueue *Q1,LinkQueue *Q2); //销毁队列 void DestroyList(EventList L); //销毁事件链表 //宏定义 #define MAXSIZE 5 //重要变量 EventList ev; QEvent en; LinkQueue q1; LinkQueue q2; QEvent customer; int windows_num; //队列指针结构体数组 //队列节点 //窗口个数 int TotalTime,CustomerNum ; //顾客总时间,顾客总人数 int close_time; int current_time; int total; int max_use,max_gap; int min_use,min_gap; //测试代码 int main(void){ int i; printf("*****************\n"); printf("是否开始模拟:\n"); printf("1.开始\t2.退出\n"); scanf("%d",&i); while(i==1){ OpenForDay();
分享到:
收藏