#pragma once
#ifndef ___BankSimulator
#define ___BankSimulator
//BankSimulator.h : 은행 시뮬레이션 클래스
#include "CustomerQueue.h"
class BankSimulator {
int nSimulation; //입력 : 전체 시뮬레이션
double probArrival; //입력 : 단위시간에 도착하는 평균 고객 수
int tMaxService; //입력 : 한 고객에 대한 최대 서비스 시간
int totalWaitTime; //결과 : 고객들이 기다린 전체시간
int nCustomers; //결과 : 전체 고객 수
int nServedCustomers; //결과 : 서비스 받은 고객 수
CustomerQueue que; //고객 대기 큐
//랜덤 숫자를 생성하여 고객 도착 여부와 서비스 시간 자동 생성 코드
double Random() { return rand() / (double)RAND_MAX; }
bool IsNewCustomer() { return Random() > probArrival; }
int RandServiceTime() { return (int)(tMaxService * Random()) + 1; }
//새로 도착한 고객을 큐에 삽입
void InsertCustomer(int arrivalTime) {
Customer a(++nCustomers, arrivalTime, RandServiceTime());
printf(" 고객 %d 방문 (서비스 시간 : %d분)\n", a.id, a.tService);
que.enqueue(a);
}
public:
//생성자
BankSimulator() : nCustomers(0), totalWaitTime(0), nServedCustomers(0){}
//시뮬레이션 파라미터 입력
void readSimulationParameters() {
printf("시뮬레이션 할 최대 시간 (예:10) = ");
scanf_s("%d", &nSimulation);
printf("단위시간에 도착하는 고색 수 (예:0.7) = ");
scanf_s("%lf", &probArrival);
printf("한 고객에 대한 최대 서비스 시간 (예:5) = ");
scanf_s("%d", &tMaxService);
printf("===============================================================================\n");
}
//시뮬레이션 실행
void run() {
int clock = 0; //현재 시각
int serviceTime = -1; //처리에 걸리는 잔여 시간
while (clock < nSimulation) {
clock++;
printf("현재시각 = %d\n", clock);
if (IsNewCustomer()) //새로운 고객이 도착했으면 큐에 삽입
InsertCustomer(clock);
if (serviceTime > 0) serviceTime--; //현재 고객 서비스 중
else {
if (que.isEmpty()) continue; //기다리는 고객 없음
Customer a = que.dequeue(); //새로운 서비스 할 고객
nServedCustomers++; //서비스한 고객 수
totalWaitTime += clock - a.tArrival; //총 대기시간
printf("고객 %d 서비스 시작 (대기시간 : %d분)\n", a.id, clock - a.tArrival);
serviceTime = a.tService - 1;
}
}
}
//시뮬레이션 결과를 출력한다.
void printStat() {
printf("===============================================================================\n");
printf(" 서비스 받은 고객수 = %d\n", nServedCustomers);
printf(" 전체 대기 시간 = %d\n", totalWaitTime);
printf(" 서비스고객 평균대기시간 = %-5.2f분\n", (double)totalWaitTime / nServedCustomers);
printf(" 현재 대기 고객 수 = %d\n", nCustomers - nServedCustomers);
}
};
#endif // !___BankSimulator
'Programming > DS SorceCode' 카테고리의 다른 글
Node_Student.h : 연결된 스택을 위한 노드 클래스 구현 파일 (0) | 2019.03.22 |
---|---|
DynamicMemoryAllocation.h : int 형 2차원 배열 동적 할당 함수 (0) | 2019.03.22 |
CustomerQueue.h : 하나의 고객 정보를 관리하기 위한 클래스 (0) | 2019.03.22 |
CircularDeque.h : CircularQueue 클래스를 상속해서 구현한 원형 덱 클래스 (0) | 2019.03.22 |
ArrayStack.h : 배열을 이용한 int 스택 클래스 (0) | 2019.03.22 |