원형큐에서 가져와서 처리하는 문제임.
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define MAX_QUEUE_SIZE 30 // 창고의 크기(얼마나 컴퓨터를 받을 수 있는가) / 임의로 30으로 설정하였음
#define MAX_REPAIR 3 // 동시에 3개를 다룰 수 있음
typedef struct {
int id; // 컴퓨터에게 번호를 붙여줌
int arrival_time; // 컴퓨터를 의뢰받는 날짜
int service_time; // 컴퓨터 수리에 걸리는 시간
int status; // 컴퓨터의 수리가 끝났는지 체크하는 변수. 1이면 수리완료 0이면 수리중
}element; // 컴퓨터 정보
typedef struct {
int front;
int rear;
element data[MAX_QUEUE_SIZE]; // 창고 안의 컴퓨터들(data[창고크기])
}Qtype; // 대기창고
// 창고 구현을 위한 원형큐 함수들
void error(char* message) {
fprintf(stderr, "%s\n", message);
exit(1);
}
void init_queue(Qtype* q) {
q->front = q->rear = 0;
}
int is_empty(Qtype* q) {
return (q->front == q->rear);
}
int is_full(Qtype* q) {
return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front);
}
void enqueue(Qtype* q, element item) {
if (is_full(q))
error("창고가 포화상태입니다.");
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
q->data[q->rear] = item;
}
element dequeue(Qtype* q) {
if (is_empty(q))
error("창고가 공백 상태입니다.");
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return q->data[q->front];
}
element peek(Qtype* q) {
if (is_empty(q))
error("창고가 공백 상태입니다");
return q->data[q->rear];
}
void init_cpt(element computer) {
computer.id = 0;
computer.arrival_time = 0;
computer.service_time = 0;
computer.status = -1;
}
int main() {
int End_day = 10;
int pay_total = 0; // 보수
int Num_computer = 0;
int service_time = 0;
int check_new = 0; // 새로운 컴퓨터 수리 의뢰가 들어왔는지 확인하기 위한 변수 선언
int total_computers = 0; // 총 컴퓨터 대수
element computer[MAX_REPAIR] = { 0, }; // 동시에 3대를 수리할 수 있음
element finished_computer[MAX_REPAIR] = { 0, }; // 수리가 끝난 컴퓨터를 모아놓는 곳
Qtype warehouse; // warehouse라는 대기창고 생성
init_queue(&warehouse); // 창고 초기화
srand(time(NULL)); //
for (int i = 0; i
computer[i].id = Num_computer++; // 컴퓨터번호 1증가
computer[i].arrival_time = 0; // 그냥 0으로 가정하였음
computer[i].service_time = rand() % 7 + 1; // 1~7일 소요
computer[i].status = 0;
}
for (int day = 1; day <= End_day; day++) { //1일차 부터 End_day까지
printf("\t\t - %d일차 -\n\n", day);
if (rand()
check_new += 1;
element new_computer;
new_computer.id = Num_computer++;
new_computer.arrival_time = day;
new_computer.service_time = rand() % 7 + 1;
new_computer.status = 0;
enqueue(&warehouse, new_computer);
}
printf("-------------------수리현황판-------------------\n\n");
for (int i = 0; i
{
if (computer[i].status == 1) {
finished_computer[i] = computer[i];
if (!is_empty(&warehouse)) {
computer[i] = dequeue(&warehouse);
printf("컴퓨터[%d](을/를) 수리중입니다. 남은기간:[%d]일\n", computer[i].id, computer[i].service_time);
if (computer[i].service_time > 0) {
computer[i].service_time--;
if (computer[i].service_time == 0) {
computer[i].status = 1;
}
}
}
}
else if (computer[i].status == 0) {
printf("컴퓨터[%d](을/를) 수리중입니다. 남은기간:[%d]일\n", computer[i].id, computer[i].service_time);
if (computer[i].service_time > 0) {
computer[i].service_time--;
if (computer[i].service_time == 0) {
computer[i].status = 1;
}
}
}
}
printf("\n");
printf("------------------------------------------------\n");
printf(" ※ 공지사항 ※\n");
for (int i = 0; i
if (finished_computer[i].status == 1) {
printf("컴퓨터[%d]의 수리가 끝났습니다. 가져가주세요\n", finished_computer[i].id);
init_cpt(finished_computer[i]);
pay_total += rand() + 5;
total_computers++;
}
}
if (check_new == 1) {
printf("\n컴퓨터[%d]의 수리요청 접수!.", Num_computer - 1);
check_new = 0;
}
printf("\n\n");
}
printf("%d일 동안 얻은 총 보수는 [%d]만원 입니다.\n", End_day, pay_total);
printf("%d일 동안 수리한 컴퓨터 수는 총 [%d]대 입니다.\n\n", End_day, total_computers);
return 0;
}
출력해보면
- 7일차 -
-------------------수리현황판-------------------
컴퓨터[4](을/를) 수리중입니다. 남은기간:[2]일
컴퓨터[3](을/를) 수리중입니다. 남은기간:[6]일
컴퓨터[5](을/를) 수리중입니다. 남은기간:[6]일
------------------------------------------------
※ 공지사항 ※
컴퓨터[0]의 수리가 끝났습니다. 가져가주세요
컴퓨터[1]의 수리가 끝났습니다. 가져가주세요
컴퓨터[2]의 수리가 끝났습니다. 가져가주세요
- 8일차 -
-------------------수리현황판-------------------
컴퓨터[4](을/를) 수리중입니다. 남은기간:[1]일
컴퓨터[3](을/를) 수리중입니다. 남은기간:[5]일
컴퓨터[5](을/를) 수리중입니다. 남은기간:[5]일
------------------------------------------------
※ 공지사항 ※
컴퓨터[0]의 수리가 끝났습니다. 가져가주세요
컴퓨터[1]의 수리가 끝났습니다. 가져가주세요
컴퓨터[2]의 수리가 끝났습니다. 가져가주세요
- 9일차 -
-------------------수리현황판-------------------
컴퓨터[6](을/를) 수리중입니다. 남은기간:[2]일
컴퓨터[3](을/를) 수리중입니다. 남은기간:[4]일
컴퓨터[5](을/를) 수리중입니다. 남은기간:[4]일
------------------------------------------------
※ 공지사항 ※
컴퓨터[4]의 수리가 끝났습니다. 가져가주세요
컴퓨터[1]의 수리가 끝났습니다. 가져가주세요
컴퓨터[2]의 수리가 끝났습니다. 가져가주세요
컴퓨터[8]의 수리요청 접수!.
대충 이런식으로 나오는데
나는 한번 공지사항에 수리가 끝났다고 나온거는 다시 안나오게끔 하고싶음..
(만약 8일차에 컴퓨터[1],[2] 수리가 끝났다고 나왔으면 9일차에는 안나오게끔)
이 부분 오늘 10시간 동안 붙잡았는데 해결을 못함... 자기혐오생긴다..
혹시 알려주는 사람 한테는 선물 주겠슴
댓글 0