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

   Á¶È¸ 2804   Ãßõ 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 4836/5689
2014-05   5010908   Á¤ÀºÁØ1
2015-12   1546577   ¹é¸Þ°¡
2019-05   2808   ±èÁØÀ¯
2021-01   2807   È­¶õ
2019-11   2807   È­Á¤Å¥»ï
2020-08   2807   Àü¼³¼ÓÀǹ̡¦
2022-12   2807   iroo
2020-02   2807   SamP
2020-07   2807   ¹¹¶óÄ«³ë
2020-02   2806   FreeBSD
2022-05   2806   ´ó´óÀÌ
2020-04   2806   Ãֽÿµ
2020-11   2806   ½ºÄµl¹ÎÇö±â
2023-01   2806   ÇÁ·Î½Ã¾Æ
2019-04   2805   BMMen
2022-06   2805   keiminem
2021-06   2805   ¾Ë¼ö¾ø´ÂÈû
2018-11   2805   ¾È°³¼Ó¿µ¿ø
2019-05   2805   Æ丣¼¼¿ì½º
2019-12   2805   À½¾Ç»ç¶û
2020-04   2805   ĵÀ§µå
2019-06   2805   ÇàÀÎ2