ADT
* 점심시간은 1시간이고 그 동안 고객은 15초에 1명씩 주문을 하는 것으로 간주한다.
* 한 명의 고객은 하나의 버거만을 주문한다고 가정한다.
* 주문하는 메뉴에는 가중치를 두지 않는다. 모든 고객은 무작위로 메뉴를 선택한다.
* 햄버거를 만드는 사람은 1명이다. 그리고 동시에 둘 이상의 버거가 만들어지지 않는다.
* 주문한 메뉴를 받을 다음 고객은 대기실에서 나와서 대기한다.
* 고객이 주문하는 메뉴에 가중치를 두기 않기 위해서 다음 함수르 사용하기로 하겠다.
int rant(void) //무직위 메뉴의 선택을 위해서
Main.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "CircularQueue.h"
#define CUS_COME_TERM 15 // 고객의 주문 가격: 초 단위
#define CHE_BUR 0 // 치즈버거 상수
#define BUL_BUR 1 // 불고기버거 상수
#define DUB_BUR 2 // 더블버거 상수
#define CHE_TERM 12 // 치즈버거 제막 시간: 초 단위
#define BUL_TERM 15 // 불고기버거 제작 시간: 초 단위
#define DUB_TERM 24 // 더블버거 제작 시간: 초 단위
int main(void)
{
int makeProc = 0; // 햄버거 제작 진행상황
int cheOrder = 0, bulOrder = 0, dubOrder = 0;
int sec;
Queue que;
QueueInit(&que);
srand(time(NULL));
// 아래 for문의 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--;
}
printf("Simulation Report! \n");
printf(" - Chese burger: %d \n", cheOrder);
printf(" - Bulgogi burger: %d \n", bulOrder);
printf(" - Double burger: %d \n", dubOrder);
printf(" - Waiting room size: %d \n", QUE_LEN);
return 0;
}
CircularQueue.h
#ifndef __C_QUEUE_H__
#define __C_QUEUE_H__
#define TRUE 1
#define FALSE 0
#define QUE_LEN 100
typedef int Data;
typedef struct _cQueue
{
int front;
int rear;
Data queArr[QUE_LEN];
} CQueue;
typedef CQueue Queue;
void QueueInit(Queue* pq);
int QIsEmpty(Queue* pq);
void Enqueue(Queue* pq, Data data);
Data Dequeue(Queue* pq);
Data QPeek(Queue* pq);
#endif
CircularQueue.c
#include <stdio.h>
#include <stdlib.h>
#include "CircularQueue.h"
void QueueInit(Queue* pq) // 텅빈 경우 front와 rear은 동일위치 가리킴
{
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, Data data)
{
if (NextPosIdx(pq->rear) == pq->front) // 큐가 꽉 찼다면
{
printf("Queue Memory Error!");
exit(-1);
}
pq->rear = NextPosIdx(pq->rear); // rear를 한 칸 이동
pq->queArr[pq->rear] = data; // rear이 가리키는 곳에 데이터 저장
}
Data Dequeue(Queue* pq)
{
if (QIsEmpty(pq))
{
printf("Queue Memory Error!");
exit(-1);
}
pq->front = NextPosIdx(pq->front); // front를 한 칸 이동
return pq->queArr[pq->front]; // front가 가리키는 데이터 반환
}
Data QPeek(Queue* pq)
{
if (QIsEmpty(pq))
{
printf("Queue Memory Error!");
exit(-1);
}
return pq->queArr[NextPosIdx(pq->front)];
}
반응형