银行业务系统等待队列

更新时间:2024-07-07 19:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数据结构与算法课程设计实验报告

目录

一、 实验问题描述-------------------------2

二、 实验需求分析-------------------------3

三、 软件概要设计-------------------------4

四、 软件详细设计-------------------------5

五、 编码与调试分析----------------------14

六、 程序运行操作说明--------------------15

七、 测试结果----------------------------16

八、 课程设计心得体会--------------------18

九、 自主学习参考文献--------------------19

1

数据结构与算法课程设计实验报告

一、实验问题描述:

本课程设计的目的就是要达到能够灵活运用程序设计基础所讲授内容,能够针对一个需求比较明确的小型软件,设计合理的解决方案,并能够用编程语言转化为可执行程序,以解决实际问题。进一步掌握开发一个小型实用软件系统的基本步骤和方法、进一步培养良好的编程习惯、提升学习能力,熟练掌握数据结构中所学知识,并加以运用到实际软件开发中去,掌握调试代码的基本方法,通过调试找出BUG出现的地方以及原因,并运用正确的方法进行DEBUG。

设银行有四个服务窗口,一个等待队列, 每个窗口均可以办理存款、取款、挂失、还贷业务,每种业务所需的服务时间不同,客户到达银行后,先到打号机上打号,号票上包括到达时间、编号和需要办理的业务,然后在银行内等候, 当任一服务窗口空闲时,处理等候客户中排在最前面的客户的业务。写一个上述银行业务的模拟系统,通过模拟方法求出客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。

基本要求:

每个客户到达银行的时间和需要办理的业务随机产生,输出一天客户在银行的平均逗留时间和每个窗口每天办理的客户数和每种业务数。

提高要求:

设计图形用户界面,模拟中国银行真实的打号机操作界面,当用户选择一种业务后,要提示用户排在前面的人数。

测试数据:营业时间为8小时,其他模拟量自行设定。

每个人在生活中都会随时随地的和银行业务接触,因而也造成了银行工作人员的业务繁忙,同时大量的办理业务客户的出现也扰乱了银行秩序。因此在实际生活中需要的前提下,诞生银行业务办理系统是必然的。每个客户到达银行后自行到打号机前打取自己的票号,从而就产生了一个银行业务办理等待队列,每个客户都根据自己的小票信息在银行等待办理自己的业务,从而有效地解决了客户多引起的秩序混乱,当某个窗口空闲时,等待队列中的最前一个客户就到当前空闲的窗口办理自己的业务,后面的客户继续等待,直到再一个空闲窗口出现。通过对以上功能的实现,从而在实际生活中解决了人们日常生活中的银行业务办理需求,解决生活中的实际问题,方便人们的生活和工作,提高办事效率和生活质量。

二、实验需求分析:

2.1、软件的基本功能

银行有四个服务窗口,一个等待队列, 每个窗口均可以办理存款、取款、挂失、还贷业务,每种业务所需的服务时间不同,客户到达银行后,先到打号机上打号,号票上包括到达时间、编号和需要办理的业务,然后在银行内等候, 当任一服务窗口空闲时,处理等候客户中排在最前面的客户的业务。银行业务的模拟

2

数据结构与算法课程设计实验报告

系统,通过模拟方法求出客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。设计图形用户界面,模拟中国银行真实的打号机操作界面,当用户选择一种业务后,要提示用户排在前面的人数。

2.2、程序执行时的输入/输出形式

按照程序执行是的界面提示选择操作顺序,若需要执行银行业务模拟,则在菜单选项中选择执行,如果执行成功系统会提示模拟信息生成成功,否则会提示无可查信息;信息生成完成后选择执行显示客户逗留时间,就可以输出当天模拟情况下的总模拟人数,当天银行下班为止总共办理的客户数量,和未办理完业务的客户数量,和客户当天在银行的平均逗留时间;选择显示各窗口业务统计信息可看到当天的四个窗口的业务办理情况,分别办理了那些业务和各种业务的总数;也可按窗口分别显示四个窗口分别办理了那些客户的业务,以及他们的业务办理信息;另外可以手动选择业务并产生相应的到达时间切输出打号的信息。如果输入值与要求不符合,则系统会提示输入数据错误,并重新输入或者结束程序。

2.3、测试数据要求

程序执行时按照既定的数据类型及大小分别输入有效数据,若出现输入数据与既定数据类型及大小不符合则输出错误提示并选择执行下一步。

三、软件概要设计:

(1)抽象数据类型:

根据题目的要求,考虑用队列类型比较适合。 ADT Queue Data

队列中元素具有相同类型及先进先出特性,相邻元素具有前驱和后继关系 Operation InitQueue

前置条件:队列不存在

输入:无

功能:初始化队列 输出:无

后置条件:创建一个空队列

DestroyQueue

前置条件:队列已存在

3

数据结构与算法课程设计实验报告

输入:无

功能:销毁队列 输出:无

后置条件:释放队列所占用的存储空间

EnQueue

前置条件:队列已存在

输入:元素值x

功能:入队操作,在队尾插入一个元素x 输出:如果插入不成功,抛出异常

后置条件:如果插入成功,队尾增加了一个元素 DeQueue

前置条件:队列已存在 输入:无

功能:出对操作,删除对头元素

输出:如果删除成功,返回被删元素值,否则,抛出异常 后置条件:如果删除成功,对头减少了一个元素 GetQueue

前置条件:队列已存在

输入:无

功能:读取当前的对头元素

输出:若队列不空,返回当前的对头元素值 后置条件:队列不变

Empty

前置条件:队列已存在 输入:无

功能:判断队列是否为空

输出:如果队列为空,返回1;否则,返回0 后置条件:队列不变

End ADT

4

数据结构与算法课程设计实验报告

(2)主程序流程:

开始 输入数据 判断是否是整型数 输入数据错误 无可查信息 判断是否打号 业务生成成功,请等待 结束 5

数据结构与算法课程设计实验报告

(3)模块调用关系:

本程序中函数包括:

main函数,队列操作相关函数;

Personnel_Func(Ticket t2[],int n,int s)函数,手动业务生成函数,可选择要生成的业务同时产生一个到达时间和打票信息;

Ticket_Produce_Function(Ticket t[],int n)函数,自动生成客户到达银行时的打票信息,其中包括到达时间,小票编号,业务种类;

Personnel_Distribution_Func(int n,int flag)函数,业务办理函数,等待队列中的每个元素出对后通过时间的计算和窗口闲忙的判断把客户分配到各个窗口办理业务;

Business_statistic_Func(Windows win[],int m)函数,统计各个窗口当天办理的各种业务种类,以及各种业务的数量;

Display_Business_Func(Windows win[],int m,int n,int coordinate)函数,按窗口分别显示各个窗口办理了那些客户的业务,以及数量;

Make_waittime_Func(int n)函数,计算当天银行中办理业务的所有客户在银行的逗留时间,以及当天总共办理了多少客户的业务和有多少客户的业务在下班时还没有办理业务;

Menu()函数,模拟输出银行业务办理系统的打号菜单,并分类显示各个窗口业务办理情况。

6

数据结构与算法课程设计实验报告

其函数调用关系如下:

Mian() Menu() Personnel_Distribution_Func(int n,int flag) Make_waittime_Func(int n) Business_statistic_Func(Windows win[],int m) Display_Business_Func(Windows win[],int m,int n,int coordinate) Personnel_Func(Ticket t2[],int n,int s) Ticket_Produce_Function(Ticket t[],int n) Personnel_Distribution_Func(int n,int flag)) 7

数据结构与算法课程设计实验报告

4.详细设计

(1)实现概要设计的数据类型:

采用队列

const int QueueSize = 1000;

template //定义模板类BankBusinses

class BankBusinses {

public: BankBusinses(); void EnQueue(); int GetQueue(); void Personnel_Func(Ticket t2[],int n,int s); //手动业务生成函数 int Ticket_Produce_Function(Ticket t[],int n); //打号函数 int Personnel_Distribution_Func(int n,int flag); //业务办理函数

intBusiness_statistic_Func(Windows win[],int m); //业务统计函数voidDisplay_Business_Func(Windows win[],int m,int n,int coordinate);//业务显示函数 voidMake_waittime_Func(int n); //等待时间函数 intMenu(); //菜单函数 Windows win[4]; //窗口 Ticket

t[QueueSize]; //票 Ticket t2[QueueSize];

private: };

string name; //业务名称

int businesstime; //办理业务所需时间 int alltime; //办理所有业务的总时间 int waittime; //等待时间

double averagetime; //平均等待时间 long *a,*b,*v;

int data[QueueSize]; Ticket data2[QueueSize]; int front,rear;

8

数据结构与算法课程设计实验报告

(2)主程序以及其它模块的算法描述: 主函数具体代码:

int main()

{ BankBusinses C; while(1) { switch(C.Menu()){ case 1: srand(time(0)); n=(rand()%(500-1)+1); for(i = 0;i < n;i++){ C.t[i].arrivaltime.hour = (rand()%(17-9)+9); C.t[i].arrivaltime.minute = rand()`; C.t[i].arrivaltime.second = rand()`;} C.Ticket_Produce_Function(C.t,n); C.EnQueue(); C.GetQueue(); C.Personnel_Distribution_Func(n,0); break; case 2: if(flag==0){cout<<\无可查询信息 !\\n\ else{C.Make_waittime_Func(n);} break; case 3: if(flag==0){cout<<\无可查询信息 !\\n\ else{C.Business_statistic_Func(C.win,4);} break; case 4: if(flag==0){cout<<\无可查询信息 !\\n\ else{C.Display_Business_Func(C.win,4,n,0);} break; case 5: if(flag==0){cout<<\无可查询信息 !\\n\ else{C.Display_Business_Func(C.win,4,n,1);} break; case 6: if(flag==0){cout<<\无可查询信息 !\\n\ else{C.Display_Business_Func(C.win,4,n,2);} break; case 7: if(flag==0){cout<<\无可查询信息 !\\n\ else{C.Display_Business_Func(C.win,4,n,3);} break; case 8: for(i=0;i>m,!cin.eof()) if(!cin.good()) {

9

数据结构与算法课程设计实验报告

cin.clear(); cin.ignore(); cout<<\输入错误 !\\n\\t\\t请重新输入!\ Sleep(1000); } else if(m!=0 && m!=1){ Sleep(1000); } else if(cin.good() && (m==0 || m==1) ){ if(m==0) {tag=1;} break;}} if(tag==1)break; C.Personnel_Func(C.t2,0,m);} break; case 0: //如返回值为0则程序结束 cout << \ exit(0); } } return 0;}

主函数的功能调用了各个实现函数。首先是调用菜单函数显示出模拟菜单,提示用户按照要求进行选择操作,输入有误则会重新操作,否则进行下一个功能函数的调用,产生模拟客户的基本业务信息,在信息随机产生后就会调用核心函数把办理业务的客户根据实际情况分配到不同的窗口办理自己的业务。调用时间计算函数确定客户平均逗留时间和办理客户的人数。最后是清屏函数。直至用户选择退出。

(3)其它模块的算法描述 打号函数

功能:调用随机函数产生客户到达银行的随机时间和随机业务,并通过冒泡法对所有时间排序,然后进入队列等待。 int BankBusinses::Ticket_Produce_Function(Ticket t[],int n)

{

srand(time(0));

n=(rand()%(500-1)+1); for(i = 0;i < n;i++) { //产生客户到达银行的随机时间 C.t[i].arrivaltime.hour = (rand()%(17-9)+9); C.t[i].arrivaltime.minute = rand()`; C.t[i].arrivaltime.second = rand()`; }

for(i = 0;i < n;i++)

{ t[i].number = i; //编号产生 rear=(rear+1)%QueueSize; data[rear]=t[i].number; //产生的编号入队 sign = (rand()%(5-1))+1;

10

数据结构与算法课程设计实验报告

t[i].business = sign;//产生随机客户业务 }

}

处理客户业务函数 功能:调用打号函数对队列中的元素分配到不同的窗口办理业务。 int BankBusinses::Personnel_Distribution_Func(int n,int flag) {

int c[4] //作用是对应储存四个窗口业务办理结束的时间,在循环过程中后一个业务办理结束时间将修改当前结束时间

Ticket_Produce_Function(t,n); //调用时间生成函数 c[0]=a[0]+b[0]; //第一个窗口结束时间初值为队列中第一个客户办理业务的结束时间

waittime=b[0]; //第一个客户的逗留时间 int *d; d=new int[4]; //动态申请长度为四的一维数组,用于存放被修改结束时间的窗口的序号, 判断四个窗口中的结束时间是否大于下一个客户办理业务的开始时间, 如果小于则数组的d[j]中保存该窗口的序号,否则该地址存为-1, 判断窗口序号保存数组d[j]中是否有被保存的窗口序号, 若有则结束,且记住该窗口序号;

如果有窗口序号被修改,则继续修改当前结束时间为下一个客户的业务办理结束时间, 窗口各种业务累计, 如果当前窗口序号全未被修改,即当前所有窗口均处于忙碌状态,下一个客户需等待, 找出当前所有正在办理业务的窗口中,结束时间最早的窗口;

c[k]=c[k]+b[i+1]; //修改该窗口的结束时间,即下一个在等待的客户到该窗口办理业务, 窗口各种业务累计

}

窗口业务统计函数 功能:统计各个窗口办理业务的情况,人数以及各种业务种类。 int BankBusinses::Business_statistic_Func(Windows win[],int m) { int i,n=0,allnum=0; for(i=0;i<4;i++) {

allnum=win[i].withdrawals+win[i].deposit+win[i].reportloss+win[i].borrowed;

cout <<\窗口 \ cout <

cout<

}

窗口业务显示函数

11

数据结构与算法课程设计实验报告

功能:显示各个窗口当天的业务办理情况。 void BankBusinses::Display_Business_Func(Windows win[],int m,int n,int coordinate)

{ int j,flag=1; cout<<\窗口\办理: \ cout<

等待时间函数 功能:计算当天所有客户在银行的平均逗留时间,和当日总共办理的客户数,和未办理完业务的客户数。

void BankBusinses::Make_waittime_Func(int n) { flag=Personnel_Distribution_Func(n,flag); if((n-flag-1)!=0){ cout<<\未办理完业务的编号: \ aver=(waittime/(flag+1))/60.0; for(i=flag+2;i

5、编码与调试分析

编码与调试过程中遇到的问题及解决办法:

【问题一】:随机产生的时间无序,等待队列需按照有序等待。

解决办法: 定义时间结构体类型的数组存储时间,然后对时间进行排序并进入队列。

解决此问题的核心代码:

for(i = 0;i < n;i++) for(j = i+1;j < n;j++){ if(t[i].arrivaltime.hour>t[j].arrivaltime.hour) { temp=t[i].arrivaltime.hour; t[i].arrivaltime.hour=t[j].arrivaltime.hour; t[j].arrivaltime.hour=temp; temp=t[i].arrivaltime.minute; t[i].arrivaltime.minute=t[j].arrivaltime.minute; t[j].arrivaltime.minute=temp; temp=t[i].arrivaltime.second; t[i].arrivaltime.second=t[j].arrivaltime.second; t[j].arrivaltime.second=temp;}}

12

数据结构与算法课程设计实验报告

for(i = 0;i < n;i++) for(j = i+1;j < n;j++){ if(t[i].arrivaltime.hour==t[j].arrivaltime.hour && t[i].arrivaltime.minute>t[j].arrivaltime.minute){

temp=t[i].arrivaltime.minute; t[i].arrivaltime.minute=t[j].arrivaltime.minute; t[j].arrivaltime.minute=temp; temp=t[i].arrivaltime.second; t[i].arrivaltime.second=t[j].arrivaltime.second; t[j].arrivaltime.second=temp;} else continue;} for(i = 0;i < n;i++) for(j = i+1;j < n;j++){ if(t[i].arrivaltime.hour==t[j].arrivaltime.hour && t[i].arrivaltime.minute==t[j].arrivaltime.minute && t[i].arrivaltime.second>t[j].arrivaltime.second){

temp=t[i].arrivaltime.second; t[i].arrivaltime.second=t[j].arrivaltime.second;

t[j].arrivaltime.second=temp;}else continue;}

【问题二】:无法将队列元素按照出对顺序进行分配到各个窗口。

解决办法: 定义一个整型数组c[4] 作用是对应储存四个窗口业务办理结束的时间,在循环过程中后一个业务办理结束时间将修改当前结束时间。队列元素出对后,根据到达时间和办理业务的时间可判断出客户离开银行的时间。首先对数组c[4]进行初始化,找出数组中的最小元素,用对头元素修改数组c[4]中的最小值。

另动态申请数组d[4]={-1,-1,-1,-1},用来保存数组c[4]中被修改的值的地址;如果每一个客户的离开银行时间都小于下一个客户的到达时间,则下一个客户就进入当前窗口办理业务;如果离开时间大于下一个客户的到达时间,则在c[4]中找出最小值,且用下一个客户的离开时间修改当前值,同时用d[4]保存该地址。如果四个窗口均有人办理业务,则客户应在等待队列中等待。其实现方法任然是找出窗口中办理业务的客户结束时间的最小值,同时判断该窗口的闲忙情况,然后用下一个客户的结束时间修改当前最小值,并保存地址。

【问题三】:计算客户在银行的平均逗留时间问题。

解决方法: 客户在银行的平均逗留时间的计算分为两种情况。第一种情况,当天随机产生的客户都办理完了自己的业务,在这种情况下只需统计每个客户在银行的逗留时间之和再求平均值,即为平均逗留时间,计算方法为 (每个客户开始办理业务的时间—到达银行的时间+办理业务所用时间)。第二种情况,当天随机产生的客户太多在下班时还有客户没有办理业务,且在银行停止营业时离开银行;这种情况下的平均时间计算分为两部分,它包括第一种情况下已经办理完业务的客户所用时间和还没有办理业务的客户的等待时间之和,计算方法为 (已经办理完业务的每个客户开始办理业务时间—到达银行的时间+办理业务的时间)+( 未办理业务的每个客户的离开时间—到达银行时间 )。

13

数据结构与算法课程设计实验报告

6、使用说明

进入菜单,根据提示进行选择

(a).如果要自动生成业务信息,输入‘1’; (b).如果要显示客户逗留时间,输入‘2’; (c).如果要显示各窗口业务统计信息,输入‘3’; (d).如果要显示窗口一的业务办理情况,输入‘4’; (e).如果要显示窗口二的业务办理情况,输入‘5’; (f).如果要显示窗口三的业务办理情况,输入‘6’; (g).如果要显示窗口四的业务办理情况,输入‘7’; (h).如果要手动输入选择要办理的业务,输入‘8’; (j).如果要退出程序运行,输入‘0’。 7、测试结果

菜单

14

数据结构与算法课程设计实验报告

逗留时间

窗口业务统计

15

数据结构与算法课程设计实验报告

窗口1业务

输入错误

16

数据结构与算法课程设计实验报告

手动选择业务

17

数据结构与算法课程设计实验报告

结束运行

8、自学知识

在课程设计过程中,特别是在代码编写和调试的过程中,自学了很多新的知识。例如:随机函数的使用,srand(time(NULL))随机种子,rand()%x随机函数产生一定范围内的随机数,它包含在头文件#include ,#include中,Sleep()函数的应用,让程序暂停一定时间后再运行,它包含在头文件#include中。

18

数据结构与算法课程设计实验报告

9、课程设计心得体会

我选做的题目是银行业务模拟系统,在开始动手做之前,我首先分析了一下这个系统的可行性以及需求情况。然后根据分析对系统的重要数据字段进行定义,设计出系统的模型。

本程序在刚开始调试时有许多错误,通过逐步调试不断修改代码最终程序得到了一定的完善能够正常运行

在这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。同时还需要多动脑子,尽量把所学的知识综合起来应用。 除此之外,我还得到了一些有用的教训:写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误,在写代码的过程中要把各种可能出现BUG的地方都想到,严格控制对数据的判断以增强程序的健壮性。

通过这次数据结构与算法课程设计,我学到了很多以前没有很好掌握的知识,也很好的巩固了理论课上学到的理论。更增强了自己的动手实践能力。

参考书:

[1]《c++面向对象程序设计》 清华大学出版社 谭浩强著 [2]《数据结构(C++版)》清华大学出版社 王红梅、胡明、王涛著 [3]《Visual C++》课程设计 严华峰著

19

本文来源:https://www.bwwdw.com/article/0fi.html

Top