题目:银行业务模拟(难度系数:1.3)
[运行环境]
VS
[问题描述]
客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔 资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理 每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个 队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户, 则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排 到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一 个客户第二种业务被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查因为 此时已不可能还有能满足者转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不 需要时间。营业时间结束时所有客户立即离开银行。
写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。
[基本要求]
利用动态存储结构实现模拟,即利用C语言的动态分配函数mallocfree
[选做内容]
自己实现动态数据类型。(已作)
1. 需求分析
计算来银行办理业务的用户平均逗留时间:
⑴ 在运行终端控制台进行信息输入:
输入信息包括(信息都为整数):
1.银行拥有的款额 取值范围:[0,正无穷]
2.银行营业时间 取值范围:[0, 1440]
3.用户最大交易金额取值范围:(0,银行拥有款额]
4.俩个用户到达时间的最大值 取值范围:(0,银行营业时间]
5.用户最大交易时间取值范围:(0,银行营业时间]
⑵ 在运行终端控制台进行信息输出:
1.每个到达用户的到达时间,编号,要处理的金额,处理时间
2.事件表
3.总用户数
4.总逗留时间
5.平均逗留时间
⑶ 程序所能达到的功能;
1.输出每个用户的到达时间,编号,要处理的金额,处理时间
2.银行运营过程的全部事件(包括到达事件和离开事件)
c语言listinsert函数3.计算银行运营过程的用户数,总逗留时间,平均逗留时间
⑷ 三组测试数据:
1.正常情况:
1.银行拥有的款额:10000
2.银行营业时间: 600
3.用户最大交易金额:2000
4.俩个用户到达时间的最大值:20
5.用户最大交易时间:15
应输出:25.48
6.极端的情况:两个到达事件之间的间隔时间很短,而客户的交易时间很长
1.银行拥有的款额:10000
7.银行营业时间: 600
8.用户最大交易金额:2000
9.俩个用户到达时间的最大值:5
10用户最大交易时间:100
应输出:20.0
11极端的情况:两个到达事件之间的间隔时间很长,而客户的交易时间很短 1.银行拥有的款额:10000 2.银行营业时间: 600 3.用户最大交易金额:2000
12俩个用户到达时间的最大值:100
13用户最大交易时间:5
应输出:88.38
源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<Windows.h> typedef int Status;
#define OK 1
#define ERROR -1
/*#define MAXTIME 600
钟等于一秒)
#define MAX_TIMEJIANGE 5
#define MAX_TIMEJIAOYI 100
//定义银行运作时间(单位:分钟假设一分
//定义最大时间间隔
//定义最大操作时间 */
typedef struct kehu_event{
// 定义客户信息
int handel_time; //事件处理时间
int money;    //需要处理的钱数目(负数表示取钱,正数表示存钱)
int No;    //客户的序号
}ElemType;
typedef struct event{
/*定义事件类型*/
int index;    /*标志变量,1代表到达事件,其余代表离开事件*/
int time;    /*事件发生时间*/
int No;    /*触发该事件的客户序号*/
}event;
event data;
struct LNode *next;
}LNode, *Link;
typedef struct { /*定义链表*/ Link head, tail;
int len;
}*LinkList;
LinkList InitLink() { /*初始化链表操作*/
LinkList L = (LinkList*)malloc(sizeof(LNode));
if (L == NULL) return NULL;
L->head = NULL;
L->tail = NULL;
L->len = 0;
printf("链表初始化成功!!”); return L;
};
Status ClearLink(LinkList L) { /*链表的清空操作*/ if (L == NULL) return ERROR;
Link p = L->head;
Link k = L->head->next;
while (p != L->tail) {
free(p);
p = k;
if(k!=L->tail) k = k->next;
}
free(p);
L->head = NULL;
L->tail = NULL;
L->len = 0;
printf("链表已经清空!!"); return OK;
}
Status DestoryLink(LinkList L) { /*链表的销毁操作*/ if (L == NULL) return ERROR;
ClearLink(L);
free(L);
printf("链表销毁完毕!!");
return OK;
Status InsertLink(LinkList L, event e) { /*链表的尾部插入操作*/
if (L == NULL) return ERROR;
Link p = (Link)malloc(sizeof(LNode));
if (p == NULL) return ERROR;
p->data = e;
p->next = NULL;
if (L->head == NULL) {
L->head = p;
L->tail = p;
L->len = 1;
}else{
L->tail->next = p;
L->tail = p; L->len++;
}
〃printf("节点插入成功! !"); return OK;
}
Status LinkTraverse(LinkList L) {    /*链表的遍历操作*/
if (L == NULL) return ERROR;
Link p = L->head;
printf("\n 遍历结果:\n");
printf(" 客户序号:    事件触发时间:    事件类型:
");
printf("\n   
");
while (p != NULL) {
printf("\n    %d    %d", p->data.No, p->data.
time);
if (p->data.index == 1) {
printf("    到达");
printf("\n   
    ");
} else {
printf("    离开");
printf("\n   
    ");
}
p = p->next;
}
return OK;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。