C¾ð¾î °ü·ÃÇؼ­..Áú¹®ÀÌ ÀÖ½À´Ï´Ù.

   Á¶È¸ 2573   Ãßõ 0    

안녕하세요. 매번 질문만 올리는 학부생 안개속영원입니다. 

http://www.2cpu.co.kr/QnA/674147 (원글)




뭔가 더 고민을 해봤습니다. 

해주신 조언을 기반으로 해서 CircularQueue.c , CircularQueue.h 파일 내에서 발생하는 오류는 대부분 잡았습니다. (무아님 감사합니다!)

이제 다음 문제를 해결하려고 하는데..우선 치즈버거,불고기버거, 더블버거의 요리시간은 2분 3분 5분으로 정했고, 주문 간격은 3분으로 정했습니다. 

대기시간이란게 요리 완료 시간까지 포함하는 것이 아니고, 주문 후 요리를 시작하기 전 까지의 시간이라 생각하고 계산을 했습니다.

(즉 요리시간 - 주문 간격 = 주문자가 대기하는 시간) 

그리고 계산을 좀 편하게 하기 위해서 일정한 간격(3분)에 단순히 한 종류의 버거를 주문한다 가정하고 정리하니

치즈버거 요리시간 - 주문 간격 = 2-3 =-1

불고기버거 요리시간 - 주문 간격 = 3-3 = 0 (대기시간 없음)

더블버거 요리시간 - 주문 간격 = 5-3 = 2 (대기시간 2분)

이런 결과가 나왔습니다. 

마이너스 값이 나온걸 보면..이걸 예외처리로 빼야 할 것 같은데 어떻게 코드로 옮길지가 문제네요.

그리고 평균 값도 처음에는 (대기시간 * 주문수)/주문수 이렇게 생각해서 작성했는데 오류가 발생하구요.

3번째 문제는 랜덤으로 주문간격을 주면 될 것 같은데 그랬다간 대기시간이 3분을 기준했을 때와는 달라지니까 그것도 고민이구요.

4번은 큐를 더 늘려야 하는지 (주방의 수를 늘리는 것.)외에 좋은 방법이 있을까요?

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
#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       // 조리 시간(sec): 치즈버거
#define BUL_TERM    3       // 조리 시간(sec): 불고기버거
#define DUB_TERM    5       // 조리 시간(sec): 더블버거
 
int main(void)
{
    int makeProc=0;
    int cheOrder = 0, bulOrder = 0, dubOrder = 0;
    int min;
    Queue que;
    double waittingTime=0;
 
    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);
                   
                    waittingTime=-1;
                    cheOrder += 1;
                    break;
 
                case BUL_BUR:
                    Enqueue(&que, BUL_TERM);
                    
                    waittingTime=0;
                    bulOrder += 1;
                    break;
 
                case DUB_BUR:
                    Enqueue(&que, DUB_TERM);
                    
                    waittingTime=2;
                    dubOrder += 1;
                    break;
            }
        }
 
        if(makeProc <= 0 && !QIsEmpty(&que))
           { makeProc = Dequeue(&que);
           
            } 
 
        makeProc--;
        
    }
 
    printf("Simulation Report!! \n\n");
    printf("- 치즈버거 주문시 평균 대기시간 : %0.1f \n", (waittingTime*cheOrder)/cheOrder);
    printf("- 고기버거 주문시 평균 대기시간 : %0.1f \n", (waittingTime*bulOredr)/bulOrder);
    printf("- 더블버거 주문시 평균 대기시간 : %0.1f \n\n", (waittingTime*dubQrder)/dubOrder);
 
 
    return 0;
}
 
 
cs


CircularQueue.c , 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
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
#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].cookingTime = data;
}
 
// 큐의 데이터를 반환하는 함수 //
int Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    pq->front = NextPosIdx(pq->front);
    return pq->queArr[pq->front].cookingTime;
}
 
 
 
cs


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
#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);             // 큐의 데이터를 반환하는 함수
 
#endif
 
cs


디버그 결과입니다.

고수님들의 가르침 기다리겠습니다.



ªÀº±Û Àϼö·Ï ½ÅÁßÇÏ°Ô.
¹Ú°æ¿ø 2018-11
³²ÀÌ ÁÖ¹®ÇÑ ¿ä¸®¸¦ ³²ÀÌ ¹Þ¾Ò´Âµ¥ ³» ´ë±â½Ã°£ÀÌ ÁÙ¾îµå´Â°Ç ¾Æ´ÏÁö ¾Ê½À´Ï±î
Àú ¹æ½ÄÀ¸·Î °è»êÇÑ ÁÖ¹®ÀÚÀÇ ´ë±â½Ã°£¿¡¼­ ¸¶À̳ʽº °ªÀÌ ³ª¿Ô´Ù´Â°Ç ±× ¸ðµ¨ÀÌ Á¤È®ÇÏÁö ¾Ê´Ù´Â°É ÀǹÌÇÕ´Ï´Ù
³»°¡ °¡°Ô¿¡ °É¾îµé¾î°¡ À½½ÄÀ» ÁÖ¹®ÇÏ´Â ÁÖ¹®ÀÚ¶ó »ý°¢ÇÏ°í °úÁ¤À» ÇÑ ¹ø µû¶ó°¡º¸¸é µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù
°íÄ¡±â Èûµç ¸¹Àº ¹ö±×µéÀº state¿Í °ü·ÃµÈ °ÍµéÀÔ´Ï´Ù... ²Ä²ÄÈ÷ ºÁ¾ß corner case¸¦ ³õÄ¡Áö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù
¹«¾Æ 2018-11
Ä¡Áî¹ö°Å ¿ä¸®½Ã°£ - ÁÖ¹® °£°Ý = 2-3 =-1
¿¡¼­ ¸¶À̳ʽº°¡ ³ª¿À´Â °ÍÀº.. ÁÖ¹æÀÌ 1ºÐµ¿¾È ³î°í ÀÖ´Ù°í Çؼ®ÇÏ°í ´ë±â½Ã°£Àº 0 À̶ó°í ó¸®Çؾ߰ÚÁÒ.


QnA
Á¦¸ñPage 2243/5618
2015-12   1174347   ¹é¸Þ°¡
2014-05   4625745   Á¤ÀºÁØ1
2021-02   4385   °í·¡1006
04-16   801   dragoune
2015-05   5792   ¼³¿µ¼ö
2018-09   3648   ¹Î»çÀå
2014-01   4162   Leo
2018-09   3128   ±èÁ¦¿¬
2021-02   4486   ĵÀ§µå
2022-09   996   2CPUÃÖÁÖÈñ
2022-09   721   ¿µ»êȸ»ó
04-30   567   ¶óÀÌÅ©À¯
2018-09   3229   Dosh
2016-07   14700   KDHNOVA
2019-11   1672   Rayi
2015-05   3855   ±èµ¿¿ø1
2016-07   4300   Â÷³ÝÄÄÇ»ÅÍ
2016-07   8156   ³ª³ª³ª³ª³ª
2018-10   5260   °ÇÀüÁö
2019-12   2348   ÁÖȲº°
2022-10   1057   ±è¹ÎöGC
05-27   448   ¹«½î»Ôó·³