C¾ð¾î Áú¹®ÀÔ´Ï´Ù.(¼öÁ¤Çß½À´Ï´Ù)
큐 문제를 보면서 공부하다 찾아볼만한 예제도 없어서 염치불구하고 이곳에...질문 올립니다.
데이터형을 추가하고 바꿨는데, CircularQueue.c 파일에서 오류가 발생하네요.
문제 사진과 함께, 내용을 보강합니다.
[주어진 시뮬레이션 파일의 주제]
- 주문한 음식이 포장되어 나오기를 기다리는 고객을 위한 대기실을 만드려고 함
- 원형 큐로 구현.
[조건]
- 운영 시간은 1시간
대기실의 크기는 100명을 수용할 수 있다고 가정.
- 고객의 첫 주문 이후 15초당 다음 1명씩 주문
- 고객은 총 3가지 햄버거 중 무작위로 1개만 주문 가능
- 햄버거 조리 시간(치즈버거 12초, 불고기버거 15초, 더블버거 24초)
- 한 번에 하나의 햄버거만 조리가능
- 조리가 끝나기 전까지 다음 주문을 받지 않음
- 주문 처리가 된 고객은 대기실에서 나옴
[목표]
- 1시간 동안 여러 종류의 햄버거를 요리하는 상황에서 고객을 대기시킬 수 있는 대기실의 크기를 산출하기 위하여 크기에 따라 얼마나 안정적으로 수용할 수 있는지 확률적으로 나타내기
[만들고자 하는 과제의 요구 사항]
0. 주어진 시뮬레이션 예제 코드를 기반으로 수정.
1. 주문 시간과 전체 시간, 평균 시간을 초단위에서 분으로 변경.
2. 조리시간과 메뉴 정보를 저장하기 위한 데이터 형을 추가하고, 이 추가한 데이터형에 맞게 큐가 동작할 수 있도록 헤더 파일, C파일 수정.
3.고객의 주문간격을 3분으로 고정하고, 고객이 주문한 후 주방에서 주문한 음식을 요리하기
시작하기 전까지의 평균 대기시간(waitingTime)를 계산하는 프로그램 작성.
4.주문 간격을 1~5분 사이 랜덤으로 지정하고, 마찬가지로 평균 대기시간을 계산하는 프로그램 구현.
5.4의 조건에서 주방을 2개로 늘려 평균 대기시간 계산하기.
sim.c
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <stdio.h> #include <stdlib.h> // rand, srand 함수를 사용하기 위함 #include <time.h> // time 함수를 사용하기 위함 #include "CircularQueue.c" #define CUS_COME_TERM 3 // 고객의 주문 간격: 분 단위 #define CHE_BUR 0 // 상수: 치즈버거 #define BUL_BUR 1 // 상수: 불고기버거 #define DUB_BUR 2 // 상수: 더블버거 #define CHE_TERM 2 // 조리 시간(min): 치즈버거 #define BUL_TERM 3 // 조리 시간(min): 불고기버거 #define DUB_TERM 5 // 조리 시간(min): 더블버거 int main(void) { int makeProc = 0; int cheOrder = 0, bulOrder = 0, dubOrder = 0; int min; double waitingtime=0; Queue que; QueueInit(&que); srand(time(NULL)); for(min=0; min<60; min++) { if(min % CUS_COME_TERM == 0) { switch(rand() % 3) { case CHE_BUR: Enqueue(&que, CHE_TERM); data.cookingTime=QueTerm; data.arrivalTime=min; Enquee(&que,data); cheOrder += 1; break; case BUL_BUR: Enqueue(&que, BUL_TERM); data.cookingTime=QueTerm; data.arrivalTime=min; Enquee(&que,data); bulOrder += 1; break; case DUB_BUR: Enqueue(&que, DUB_TERM); data.cookingTime=QueTerm; data.arrivalTime=min; Enquee(&que,data); dubOrder += 1; break; } } if(makeProc <= 0 && !QIsEmpty(&que)) { Data=Dequeue(&que); makeProc = data.cookingTime; waitingtime=waitingtime+(min-data.arrivaltime); 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", waitingtime); printf("※ Waiting room size: %d \n", arrivaltime); return 0; } | cs |
CircularQueue.h
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 | #ifndef CIRCULARQUEUE_H_ #define CIRCULARQUEUE_H_ #define TRUE 1 #define FALSE 0 #define QUE_LEN 100 typedef struct Data{ //데이터형 추가(주문 시간 및 메뉴 정보 저장) int cookingTime; int arrivalTime; }Data; typedef struct _cQueue { int front; // 삭제할 데이터의 위치를 가리키는 변수 int rear; // 삽입할 데이터의 위치를 가리키는 변수 Data 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 |
CircularQueue.c
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #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 |
고수님들의 가르침 기다리고 있겠습니다. 감사합니다.
오류가 발생한 부분입니다.
int makeProc = 0;
int cheOrder = 0, bulOrder = 0, dubOrder = 0;
int min;
double waitingtime = 0.0;
int QueTerm;
Queue que;
QueueInit(&que);
srand(time(NULL));
for (min = 0; min < 60; min++)
{
if (min % CUS_COME_TERM == 0)
{
switch (rand() % 3)
{
case CHE_BUR:
Enqueue(&que, CHE_TERM);
Data.cookingTime = QueTerm;
Data.arrivalTime = min;
cheOrder += 1;
break;
case BUL_BUR:
Enqueue(&que, BUL_TERM);
data.cookingTime = QueTerm;
data.arrivalTime = min;
bulOrder += 1;
break;
case DUB_BUR:
Enqueue(&que, DUB_TERM);
data.cookingTime = QueTerm;
data.arrivalTime = min;
dubOrder += 1;
break;
}
}
if (makeProc <= 0 && !QIsEmpty(&que))
{
Data = Dequeue(&que);
makeProc = data.cookingTime;
waitingtime = waitingtime + (min - data.arrivaltime);
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("※ 대기시간: %d \n", waitingtime);
printf("※ 평균시간: %d \n", arrivalTime);
return 0;
}
2¹øºÎÅÍ ¸·È÷³×¿ä.. ¶ó´Â Áú¹®¿¡ ´ë´äÀº...
¿½ÉÈ÷ Çϼ¼¿ä ¹Û¿¡ ¾øÀ» °Í °°½À´Ï´Ù.
Á¤È®ÇÏ°Ô ¹®Á¦¸¦ Ãß·Á¼ ¿Ã¸®¼¼¿ä.
¾îµð¼ ¹®Á¦°¡ »ý°å´ÂÁö ¿¡·¯ ¸Þ½ÃÁö¿Í Äڵ常 º¸¿©ÁÖ½Ã¸é ´äº¯ÀÌ ´õ »¡¸® ´Þ¸± °Í °°³×¿ä
pq->queArr[] ´Â ÀÚ·áÇüÀÌ Data ÀÌ°í
data ´Â ÀÚ·áÇüÀÌ int ¶ó¼ ´ëÀÔÀÌ ¾ÈµÇÁÒ.
(pq->queArr[pq->rear]).cookingTime = data;
ÀÌ µÇµç
(pq->queArr[pq->rear]).arrivalTime = 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)];
}
ÀÏ´Ü ¿À·ù°¡ ¹ß»ýÇÏ´Â ºÎºÐµé ½ÇÇà°á°ú ĸóÇؼ ¿Ã¸®°Ú½À´Ï´Ù.
Enqueue(&que, CHE_TERM);
Enquee(&que,data);
ÀÌ·¸°Ô ºñ½ÁÇÑ À̸§ÀÇ ´Ù¸¥ ÀÔ·Â ÆĶó¹ÌÅÍ ÇÔ¼ö°¡ Àִµ¥
¿ÀŸÀΰ¡¿ä? ÀǵµµÈ °Ç°¡¿ä?
Enquee(&que,data); ÀÌ°Ç ¿ÀŸ°°¾Æ¼ »°½À´Ï´Ù.