티스토리 뷰

[주제]


- 주문한 음식이 포장되어 나오기를 기다리는 고객을 위한 대기실을 만드려고 함



[조건]


- 운영 시간은 1시간

- 고객의 첫 주문 이후 15초당 다음 1명씩 주문

- 고객은 총 3가지 햄버거 중 무작위로 1개만 주문가능

- 햄버거 조리 시간(치즈버거 12초, 불고기버거 15초, 더블버거 24초)

- 한 번에 하나의 햄버거만 조리가능

- 조리가 끝나기 전까지 다음 주문을 받지 않음

- 주문 처리가 된 고객은 대기실에서 나옴



[목표]


- 1시간 동안 여러 종류의 햄버거를 요리하는 상황에서 고객을 대기시킬 수 있는 대기실의 크기를 산출하기 위하여 크기에 따라

  얼마나 안정적으로 수용할 수 있는지 확률적으로 나타내기

  ※ 예) 수용인원이 30명인 공간: 안정적으로 고객을 수용할 확률은 50%(시뮬 10회 시도 시 5회 성공, 5회 실패)



[소스코딩]


※ 큐는 이전에 사용한 '배열 기반으로 구현된 원형 큐' 소스를 활용



■ CircularQueue.h


#ifndef CIRCULARQUEUE_H_
#define CIRCULARQUEUE_H_
 
#define TRUE     1
#define FALSE    0
 
#define QUE_LEN  100
 
typedef struct _cQueue
{
    int front;                       // 삭제할 데이터의 위치를 가리키는 변수
    int rear;                        // 삽입할 데이터의 위치를 가리키는 변수
    int queArr[QUE_LEN];             // QUE_LEN 길이를 갖는 큐 배열
} CQueue;
 
typedef CQueue Queue;
 
void QueueInit(Queue * pq);          // 큐 초기화 함수
int QIsEmpty(Queue * pq);            // 큐에 데이터가 존재하는지 확인하는 함수
 
void Enqueue(Queue * pq, int data);  // 큐에 데이터를 저장하는 함수
int Dequeue(Queue * pq);             // 큐의 데이터를 반환하는 함수
int QPeek(Queue * pq);               // 큐의 데이터를 조회하는 함수
 
#endif
cs


- 'QUE_LEN'을 대기실 공간으로 사용



■ CircularQueue.c


#include <stdio.h>
#include <stdlib.h>            // exit 함수를 사용하기 위함
#include "CircularQueue.h"
 
// 큐 초기화 함수 //
void QueueInit(Queue * pq)
{
    pq->front = 0;
    pq->rear = 0;
}
 
// 큐에 데이터가 존재하는지 확인하는 함수 //
int QIsEmpty(Queue * pq)
{
    if(pq->front == pq->rear)
        return TRUE;
 
    else
        return FALSE;
}
 
// 큐의 다음 위치에 해당하는 배열의 인덱스 값을 반환하는 함수 //
int NextPosIdx(int pos)
{
    if(pos == QUE_LEN-1)
        return 0;
 
    else
        return pos+1;
}
 
// 큐에 데이터를 저장하는 함수 //
void Enqueue(Queue * pq, int data)
{
    if(NextPosIdx(pq->rear) == pq->front)
    {
        printf("Queue Memory FULL!!");
        exit(-1);
    }
 
    pq->rear = NextPosIdx(pq->rear);
    pq->queArr[pq->rear] = data;
}
 
// 큐의 데이터를 반환하는 함수 //
int Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    pq->front = NextPosIdx(pq->front);
    return pq->queArr[pq->front];
}
 
// 큐의 데이터를 조회하는 함수 //
int QPeek(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    return pq->queArr[NextPosIdx(pq->front)];
}
cs



■ HamburgerSim.c


#include <stdio.h>
#include <stdlib.h>          // rand, srand 함수를 사용하기 위함
#include <time.h>            // time 함수를 사용하기 위함
#include "CircularQueue.h"
 
#define CUS_COME_TERM    15  // 고객의 주문 간격: 초 단위
 
#define CHE_BUR     0        // 상수: 치즈버거
#define BUL_BUR     1        // 상수: 불고기버거
#define DUB_BUR     2        // 상수: 더블버거
 
#define CHE_TERM    12       // 조리 시간(sec): 치즈버거
#define BUL_TERM    15       // 조리 시간(sec): 불고기버거
#define DUB_TERM    24       // 조리 시간(sec): 더블버거
 
int main(void)
{
    int makeProc = 0;
    int cheOrder = 0, bulOrder = 0, dubOrder = 0;
    int sec;
 
    Queue que;
 
    QueueInit(&que);
    srand(time(NULL));
 
    for(sec=0; sec<3600; sec++)
    {
        if(sec % CUS_COME_TERM == 0)
        {
            switch(rand() % 3)
            {
                case CHE_BUR:
                    Enqueue(&que, CHE_TERM);
                    cheOrder += 1;
                    break;
 
                case BUL_BUR:
                    Enqueue(&que, BUL_TERM);
                    bulOrder += 1;
                    break;
 
                case DUB_BUR:
                    Enqueue(&que, DUB_TERM);
                    dubOrder += 1;
                    break;
            }
        }
 
        if(makeProc <= 0 && !QIsEmpty(&que))
            makeProc = Dequeue(&que);
 
        makeProc--;
    }
 

    printf("Simulation Report!! \n\n");
    printf("[Order Count]\n");
    printf("- Cheese Burger: %d \n", cheOrder);
    printf("- Bulgogi Burger: %d \n", bulOrder);
    printf("- Double Burger: %d \n\n", dubOrder);
    printf("※ Waiting room size: %d \n", QUE_LEN);


    return 0;
}
cs


■ main 함수 설명


int makeProc = 0;
int cheOrder = 0, bulOrder = 0, dubOrder = 0;
int sec;
 
Queue que;
 
QueueInit(&que);
srand(time(NULL));
cs


- 조리대 앞 대기를 체크할 변수 'makeProc' 선언 및 초기화

- 주문 개수를 체크할 변수 'cheOrder, bulOrder, dubOrder' 선언 및 초기화

- 시간을 체크할 변수 'sec' 선언

  ※ 1당 1초로 가정


- 큐 생성 및 초기화

- 고객이 무작위로 주문할 때 난수가 고정적이지 않게 'srand, time'함수를 사용. 1초가 지날 때마다 새로운 시드 값을 결정

  ※ srand: rand함수는 시드(seed)라는 값에의해 생성되므로 시드값을 설정을 해주지 않아 고정된 같은 시드값으로 실행이되어 

            최초에만 무작위로 결정됨. 이를 해결하기 위해서 srand함수를 이용하여 시드값을 설정

  ※ time(NULL): 1970년 1월 1일 이후의 경과된 시간을 초 단위로 반환



for(sec=0; sec<3600; sec++)
    {
        if(sec % CUS_COME_TERM == 0)
        {
            switch(rand() % 3)
            {
                case CHE_BUR:
                    Enqueue(&que, CHE_TERM);
                    cheOrder += 1;
                    break;
 
                case BUL_BUR:
                    Enqueue(&que, BUL_TERM);
                    bulOrder += 1;
                    break;
 
                case DUB_BUR:
                    Enqueue(&que, DUB_TERM);
                    dubOrder += 1;
                    break;
            }
        }
 
        if(makeProc <= 0 && !QIsEmpty(&que))
            makeProc = Dequeue(&que);
 
        makeProc--;
    }
cs


--- 주문 처리에 대한 반복문 시작 ---


- 3600회(=3600초. 1시간)를 반복


// 현재 지난 시간(sec)을 15(CUS_COME_TERM)로 나눈 나머지가 0일 경우 = 15초가 지났을 경우

- 무작위로 0~2 사이의 값을 결정(햄버거 3가지 중 1개를 주문)

  ※ 0(CHE_BUR), 1(BUL_BUR), 2(DUB_BUR)


- 결정된 햄버거의 조리 시간을 알고 있는 고객을 대기실(큐. que)에 넣고 주문 개수를 증가시킨 뒤 switch 종료


// 주문 후 조리대 앞에 아무도 없고(makeProc == 0), 대기실(큐)에 고객이 존재할 경우

- 대기실(큐)에서 나와서(반환) 조리대 앞으로 가서 대기


--- 주문 처리에 대한 반복문 종료 ---



printf("Simulation Report!! \n\n");
printf("[Order Count]\n");
printf("- Cheese Burger: %d \n", cheOrder);
printf("- Bulgogi Burger: %d \n", bulOrder);
printf("- Double Burger: %d \n\n", dubOrder);
printf("※ Waiting room size: %d \n", QUE_LEN);
return 0;
cs


- 햄버거 종류별로 주문 개수와 대기실의 크기를 출력



■ 실행결과



※ 1회 실행결과이며, 큐의 활용 이해만 넘어가기 위해 세부적인 반복은 테스트만 하고 넘어감


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함