银行业务模拟[1]1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、需求分析
1.程序所实现的功能;
客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应的有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立即排入第二队等候,直至满足时才离开银行,否则业务处理完后立即离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。
分析该需求,得到如下的流程图:
2.程序的输入,包含输入的数据格式和说明;
int TotalMoney=10000; //银行初始存款
int CloseTime=480; //营业时间
int ArriveTime; //到达的时间
int dealTime; //处理的时间
int dealMoney = 5000; //处理的钱数
int currentTime = 0; //当前时刻
int TotalMoneyTime = 0; //办理业务的总时间
int counter = 0; //初始化客户数
int number = 1;
int state =1; //事件的状态,0和1
int currentTimeOfDeal = 0;
int theArriveTime = 0;
int num; //客户号
int type; //到达或离开
int beginTime; //endtime-begintime为处理的时间
int money; //正数为存款,负数为取款
3.程序的输出,程序输出的形式;
可根据需要输出客户记录表;显示一天内客户的数目,未处理客户清单,输出数据为整型数据。
每个客户的平均逗留时间,银行资金余额,输出数据为float型。
4.测试数据,如果程序输入的数据量比较大,需要给出测试数据;
银行初始资金总额为100000(元).营业时间为600(分钟)。其他模拟参量
自定。两种极端的情况:一是两个到达事件之间的间隔时间很短,而客户
的交易时间很长,另一个恰好相反,设置两个到达事件的间隔时间很长,
而客户的交易时间很短。客户逗留时间,到达时间,客户存取款金额由程
序随机产生。
二、概要设计
1.定义程序中用到的抽象数据类型;
队列的抽象数据类型为:
ADT queue{
数据对象:D={TotalMoney,CloseTime,ArriveTime,dalTime,dealMoney,currentTime,TotalMoneyTime,counter,number }
数据关系:R={
数据操作:
initqueue(linkqueue &q)
操作结果:构造一个空队列q
enqueue (linkqueue &q)
初始条件:队列q已存在
操作结果:插入元素为队尾元素,返回头指针q
dequeue(linkqueue &q)
初始条件:队列q已存在
操作结果若队列不空,删除Q的队头元素,把队头元素赋给,并返回
OK,否则返回ERROR
}queue
2.程序中包含的模块及模块间的关系说明。
(1)主程序模块
void main( )
{
初始化;
While(n==1)
{
接受客户信息;
处理客户信息;
}
}
(2)队列模块—实现队列抽象数据类型,记录客户到达时间并处理各模块之间的调用关系如下:
三、详细设计
1. 定义程序中所有用到的数据及其数据结构,及其基本操作的实现;
队列结构体指针结构:
typedef struct queue
{
Queue* head; //队列的头结点
Queue* rear; //队列的尾节点
}queue;
2.主函数和其他函数的伪码算法;
(1)主函数:
int main()
{
printf("\t\t********************************************\n");
printf("\t\t** 银行业务模拟系统**\n");
printf("\t\t** **\n");
printf("\t\t** **\n");
printf("\t\t** 1.开始模拟0.退出**\n");
printf("\t\t** **\n");
printf("\t\t********************************************\n");
printf("\t\t********************************************\n");
printf("\t\t********************************************\n");
int n;
scanf("%d",&n);
while(n==1)
{
srand(time(NULL)); //随机生成0~dealtime的处理时间
printf("输入最大到达时间间隔:\n");
scanf("%d",&ArriveTime);
printf("输入最大的处理时间:\n");
scanf("%d",&dealTime);
theArriveTime +=rand()%ArriveTime + 1;
while(currentTime < CloseTime)
{
currentTime++;
if( currentTimeOfDeal < currentTime ) currentTimeOfDeal = currentTime ;
if( currentTimeOfDeal == currentTime ) state = 1;
if( currentTime == theArriveTime )
{