天天看点

银行业务模拟系统

#ifndef BANK_SIM_H

#define BANK_SIM_H

#include <stddef.h>

#define COUNTER 4

#define ARRIVAL COUNTER

typedef struct {

size_t OccurTime, NType;

} Event;

typedef struct Enode {

Event event;

struct Enode *next;

} Enode, *EventList;

typedef struct {

size_t ArrTime, Duration;

} QElem;

typedef struct Qnode {

QElem Cust;

struct Qnode *next;

} Qnode, *Qptr;

typedef struct {

Qptr front, rear;

} LinkQueue;

int bank_open( void );

int CustArr( void );

int CustDepart( void );

void DelFirst( void );

int DeQueue( LinkQueue * );

void DestroyAll( void );

void DestroyList( EventList );

void DestroyQueue( LinkQueue * );

int EnQueue( LinkQueue *, QElem );

EventList InitList( void );

int InitQueue( LinkQueue * );

size_t Minimun( void );

int OrderInsert( EventList, Event );

size_t QueueLength( LinkQueue );

#endif

/

#include <stddef.h>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include "../header/bank_sim.h"

#define CLOSETIME 480

#define MAX_TIME 30

#define INTERVAL 5

EventList ev;

Event en;

LinkQueue q[COUNTER];

QElem customer;

size_t TotalTime, CustNum;

int bank_open( void )

{

size_t i;

srand( time(NULL) );

CustNum = TotalTime = 0;

if ( !( ev = InitList() ) ) {

return 0;

}

en.OccurTime = 0;

en.NType = ARRIVAL;

if ( !OrderInsert(ev, en) ) {

DestroyList( ev );

return 0;

}

for ( i = 0; i < COUNTER; ++i ) {

if ( !InitQueue(&q[i]) ) {

DestroyList( ev );

for ( i = 0; q[i].front; ++i ) {

DestroyQueue( &q[i] );

}

return 0;

}

}

return 1;

}

int CustArr( void )

{

int durtime, intertime;

QElem e;

size_t i;

++CustNum;

durtime = rand() / (RAND_MAX / MAX_TIME + 1) + 1;

intertime = rand() / (RAND_MAX / INTERVAL);

e.ArrTime = en.OccurTime;

e.Duration = durtime;

en.OccurTime += intertime;

if ( en.OccurTime < CLOSETIME ) {

if ( !OrderInsert(ev, en) ) {

DestroyAll();

return 0;

}

}

i = Minimun();

if ( !EnQueue(&q[i], e) ) {

DestroyAll();

return 0;

}

if ( QueueLength(q[i]) == 1 ) {

en.NType = i;

en.OccurTime = e.ArrTime + durtime;

if ( !OrderInsert(ev, en) ) {

DestroyAll();

return 0;

}

}

return 1;

}

int CustDepart( void )

{

Qptr tmp;

size_t i = en.NType;

if ( !DeQueue( &q[i] ) ) {

DestroyAll();

return 0;

}

TotalTime = TotalTime + en.OccurTime - customer.ArrTime;

if ( q[i].front != q[i].rear ) {

tmp = q[i].front->next;

customer = tmp->Cust;

en.OccurTime += customer.Duration;

if ( !OrderInsert(ev, en) ) {

DestroyAll();

return 0;

}

}

return 1;

}

void DelFirst( void )

{

EventList tmp = ev->next;

ev->next = tmp->next;

en = tmp->event;

free(tmp);

}

int DeQueue(LinkQueue *Q)

{

Qptr tmp;

if ( Q->front == Q->rear ) {

return 0;

}

tmp = Q->front->next;

customer = tmp->Cust;

Q->front->next = tmp->next;

if ( Q->rear == tmp ) {

Q->rear = Q->front;

}

free(tmp);

return 1;

}

void DestroyAll( void )

{

size_t i;

DestroyList( ev );

for ( i = 0; i < COUNTER; ++i ) {

DestroyQueue( &q[i] );

}

}

void DestroyList( EventList L )

{

EventList T = L;

for ( L = L->next; L; T = L, L = L->next ) {

free( T );

}

free( T );

}

void DestroyQueue(LinkQueue *Q)

{

while ( Q->front ) {

Q->rear = Q->front->next;

free( Q->front );

Q->front = Q->rear;

}

}

int EnQueue(LinkQueue *Q, QElem e)

{

Qptr tmp = malloc( sizeof *tmp );

if ( !tmp ) {

return 0;

}

tmp->Cust = e;

tmp->next = NULL;

Q->rear->next = tmp;

Q->rear = tmp;

return 1;

}

EventList InitList( void )

{

EventList h;

if ( !( h = malloc(sizeof *h) ) ) {

return NULL;

}

h->next = NULL;

return h;

}

int InitQueue(LinkQueue *Q)

{

Q->rear = Q->front = malloc( sizeof *Q->front );

if ( !Q->front ) {

return 0;

}

Q->front->next = NULL;

return 1;

}

size_t Minimun( void )

{

size_t h = 0, i, j, k;

j = QueueLength(q[0]);

for ( i = 1; i < COUNTER; ++i ) {

k = QueueLength(q[i]);

if ( j > k ) {

j = k;

h = i;

}

}

return h;

}

int OrderInsert(EventList ev, Event a)

{

EventList tmp, h = ev, e = ev->next;

if ( !( tmp = InitList() ) ) {

return 0;

}

tmp->event = a;

while ( e && (a.OccurTime > e->event.OccurTime) ) {

h = e;

e = e->next;

}

h->next = tmp;

tmp->next = e;

return 1;

}

size_t QueueLength(LinkQueue Q)

{

size_t i;

for ( i = 0; Q.front->next; ++i ) {

Q.front = Q.front->next;

}

return i;

}

/

#include <stdio.h>

#include <stdlib.h>

#include "header/bank_sim.h"

extern EventList ev;

extern Event en;

extern size_t TotalTime, CustNum;

int main( void )

{

if ( !bank_open() ) {

return EXIT_FAILURE;

}

while ( ev->next ) {

DelFirst();

if ( en.NType == ARRIVAL ) {

if ( !CustArr() ) {

return EXIT_FAILURE;

}

} else if ( !CustDepart() ) {

return EXIT_FAILURE;

}

}

printf( "Average Stay Time:%.2f minutes/n", (float)TotalTime / CustNum );

puts( "Press ENTER to quit..." );

getchar();

DestroyAll();

return EXIT_SUCCESS;

}

继续阅读