C 언어 질문 !

C 언어 질문 !

작성일 2024.05.11댓글 1건
    게시물 수정 , 삭제는 로그인 필요

C언어 원형 덱을 활용한 배송 시스템을 만드는 문제인데요 

조건과 원리, 결과는 이렇습니다 

다음은 배송 시스템을 원형덱을 사용하여 구현한 코드이다.

주문을 하면 장바구니에 상품을 담는다. 긴급 배송은 우선 배송(앞), 일반 배송은 일반 배송(뒤)으로 장바구니에 담긴다.
상품 정보는 하나의 구조체로 수량에 관계없이 1개씩 장바구니에 담긴다.
구조체는 {이름, 수량, 지역, 긴급여부}로 이루어 진다. 
[{coke, 3, 서울, y}, {cider, 5, 충남, n}, {chicken, 1, 서울, n}, {coke, 8, 경기, y}]

담긴 상품들은 각 지역의 물류 창고로 이동을 한다. 지역 물류 창고도 긴급 배송 상품은 우선 배송 위치로, 
일반 배송 상품은 일반 배송 위치로 보낸다(deliver_to_warehouse).
상품들은 지역 물류 창고가 받을 수 있는 최대 크기 까지 보내진다.
장바구니 : [긴급1, 일반1, 일반2, 일반3, ] / 서울 : [ , , , ]
장바구니 : [ , , , 일반3, ] / 서울 : [긴급1, 일반1, 일반2, ]

지역 물류 창고는 긴급 배송을 우선시 하여, 창고가 다 찼다면 가장 뒤에 있는 일반 상품부터 다시 장바구니로 돌려 놓고 긴급 배송을 우선 배송 위치로 보낸다. 
서울 : [일반1, 일반2, 일반3, ] / 장바구니 : [긴급1, 일반4, , , , ]
서울 : [긴급1, 일반1, 일반2, ] / 장바구니 : [ , 일반4, 일반3, , , ]

모든 상품이 긴급 배송이라면 물류 창고는 더 이상 상품을 받지 않는다(deliver_to_warehouse를 호출해도 변화가 없음). 
장바구니 : [긴급4, 일반4, , , , ] / 서울 : [긴급1, 긴급2, 긴급3, ]
장바구니 : [긴급4, 일반4, , , , ] / 서울 : [긴급1, 긴급2, 긴급3, ]

각 물류 창고로 옮겨진 상품들은 배송 기능 호출(deliver_to_customer) 시 트럭에 실어 배송된다. 
트럭은 기본적으로 상품을 앞에서부터 3개 물품에 대해 배송을 1회 진행 한다.

다음과 같이 6개의 상품이 존재할 경우, 앞에서 3개의 상품만 배송하고 나머지 3개는 다음 호출시에 배송되어
총 2회 호출에 의해 배송이 완료된다.
1회 호출 : [긴급, 긴급, 일반, 일반, 일반, 일반, , , , ] -> [ , , , 일반, 일반, 일반, , , , ]
2회 호출 : [ , , , 일반, 일반, 일반, , , , ] -> [ , , , , , , , , , ]

3개 미만의 상품만 존재할 경우, 긴급 배송 상품에 한하여 1개 이상부터 배송이 가능하다.
[긴급, 일반, , , , , , , , ] -> [ , 일반, , , , , , , , ]
[긴급, 긴급, , , , , , , , ] -> [ , , , , , , , , , ]

즉, 1회 호출로 배송이 가능한 경우는
[일반 일반 일반], [긴급 긴급 일반], [긴급 일반 일반], [긴급, 긴급, 긴급], [긴급], [긴급 긴급] 6가지 경우다.

main 함수의 choice 값은 각각 다음과 같은 기능을 한다.

1 : 원하는 상품의 상품명, 수량, 지역, 긴급 배송 여부를 선택하여 장바구니에 담는다.
2 : 장바구니에 담긴 상품들은 각 지역에 맞는 물류 창고로 이동시킨다.
3 : 각 지역 물류 창고에서 고객에게 배송을 진행하고, 이때 배송되는 상품의 정보를 출력한다.
4 : 현재 장바구니에 있는 상품들의 정보와 각 물류 창고에 있는 상품들의 정보를 차례로 출력한다.
5 : 시스템 종료

또한 준비된 코드는 이렇습니다 

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define MAX_BASKET_SIZE 20
#define MAX_WAREHOUSE_SIZE 10
#define MAX_PRODUCT_NAME_SIZE 20

#define SEOUL 1
#define GYEONGGI 2
#define CHUNGNAM 3

#define SEOUL_KR "서울"
#define GYEONGGI_KR "경기"
#define CHUNGNAM_KR "충남"

// Item 구조체 정의
typedef struct Item {
    char productName[MAX_PRODUCT_NAME_SIZE];
    int count;
    int location;
    bool isUrgent;
} Item;

// 각각의 덱과 rear, front를 관리하는 변수 선언
Item basket[MAX_BASKET_SIZE];
int basketFront;
int basketRear;

Item seoul[MAX_WAREHOUSE_SIZE];
int seoulFront;
int seoulRear;

Item gyeonggi[MAX_WAREHOUSE_SIZE];
int gyeonggiFront;
int gyeonggiRear;

Item chungnam[MAX_WAREHOUSE_SIZE];
int chungnamFront;
int chungnamRear;

// 에러를 나타내는 ITEM 선언
Item ERROR_ITEM = {0, };

// error 함수 정의
/*
 * @Name : error
 * @Param : None
 * @Return : ERROR_ITEM
 * @Description : 오류 상황 처리를 위한 함수. 에러 메시지 출력 후 ERROR_ITEM 리턴
 */
Item error() {
    return ERROR_ITEM;
};

// init_queue 함수 정의
/*
 * @Name : init_queue
 * @Description : front와 rear를 0으로 초기화
 */
void init_queue() {
    basketFront = basketRear = 0;
    seoulFront = seoulRear = 0;
    gyeonggiFront = gyeonggiRear = 0;
    chungnamFront = chungnamRear = 0;
}

// is_empty 함수 정의
/*
 * @Name : is_basket_empty, is_seoul_empty, is_gyeonggi_empty, is_chungnam_empty
 * @Return : 해당 덱이 비어있는지 여부
 * @Description : 해당 덱이 비어있는지 확인
 */
int is_basket_empty() { return basketFront == basketRear; }

int is_seoul_empty() { return seoulFront == seoulRear; }

int is_gyeonggi_empty() { return gyeonggiFront == gyeonggiRear; }

int is_chungnam_empty() { return chungnamFront == chungnamRear; }

// is_full 함수 정의
/*
 * @Name : is_basket_full, is_seoul_full, is_gyeonggi_full, is_chungnam_full
 * @Return : 해당 덱이 가득 차 있는지 여부
 * @Description : 해당 덱이 가득 차 있는지 확인
 */
bool is_basket_full() { return basketFront == (basketRear + 1) % MAX_BASKET_SIZE; }

bool is_seoul_full() { return seoulFront == (seoulRear + 1) % MAX_WAREHOUSE_SIZE; }

bool is_gyeonggi_full() { return gyeonggiFront == (gyeonggiRear + 1) % MAX_WAREHOUSE_SIZE; }

bool is_chungnam_full() { return chungnamFront == (chungnamRear + 1) % MAX_WAREHOUSE_SIZE; }

// size 함수 정의
/*
 * @Name : basket_size, seoul_size, gyeonggi_size, chungnam_size
 * @Return : 각 덱의 크기
 * @Description : 각 덱의 크기를 반환
 */
int basket_size() { return (basketRear - basketFront + MAX_BASKET_SIZE) % MAX_BASKET_SIZE; }

int seoul_size() { return (seoulRear - seoulFront + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE; }

int gyeonggi_size() { return (gyeonggiRear - gyeonggiFront + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE; }

int chungnam_size() { return (chungnamRear - chungnamFront + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE; }

// enqueue 함수 정의
/*
 * @Name : basket_enqueue, warehouse_enqueue
 * @Param : Item 변수
 * @Description : 각 덱에 Item을 추가
 */
void basket_enqueue(Item item) {
    if (is_basket_full()) return;

    basketRear = (basketRear + 1) % MAX_BASKET_SIZE;
    basket[basketRear] = item;
}

void warehouse_enqueue(Item item) {
    switch (item.location) {
        case SEOUL:
            if (is_seoul_full()) return;

            seoulRear = (seoulRear + 1) % MAX_WAREHOUSE_SIZE;
            seoul[seoulRear] = item;
            break;
        case GYEONGGI:
            if (is_gyeonggi_full()) return;

            gyeonggiRear = (gyeonggiRear + 1) % MAX_WAREHOUSE_SIZE;
            gyeonggi[gyeonggiRear] = item;
            break;
        case CHUNGNAM:
            if (is_chungnam_full()) return;

            chungnamRear = (chungnamRear + 1) % MAX_WAREHOUSE_SIZE;
            chungnam[chungnamRear] = item;
            break;
    }
}

// dequeue 함수 정의
/*
 * @Name : basket_dequeue, seoul_dequeue, gyeonggi_dequeue, chungnam_dequeue
 * @Param : None
 * @Return : 삭제된 Item
 * @Description : 각 덱에서 가장 앞에 있는 Item을 제거하고 반환
 */
Item basket_dequeue() {
    if (is_basket_empty())
        return error("  큐 공백 에러");

    basketFront = (basketFront + 1) % MAX_BASKET_SIZE;
    return basket[basketFront];
}

Item seoul_dequeue() {
    if (is_seoul_empty())
        return error("  큐 공백 에러");

    seoulFront = (seoulFront + 1) % MAX_WAREHOUSE_SIZE;
    return seoul[seoulFront];
}

Item gyeonggi_dequeue() {
    if (is_gyeonggi_empty())
        return error("  큐 공백 에러");

    gyeonggiFront = (gyeonggiFront + 1) % MAX_WAREHOUSE_SIZE;
    return gyeonggi[gyeonggiFront];
}

Item chungnam_dequeue() {
    if (is_chungnam_empty())
        return error("  큐 공백 에러");

    chungnamFront = (chungnamFront + 1) % MAX_WAREHOUSE_SIZE;
    return chungnam[chungnamFront];
}

// peek 함수 정의
/*
 * @Name : basket_peek, seoul_peek, gyeonggi_peek, chungnam_peek
 * @Return : 가장 앞에 있는 Item
 * @Description : 각 덱에서 가장 앞에 있는 Item을 반환(제거하지 않음)
 */
Item basket_peek() {
    if (is_basket_empty())
        return error("  큐 공백 에러");

    return basket[(basketFront + 1) % MAX_BASKET_SIZE];
}

Item seoul_peek() {
    if (is_seoul_empty())
        return error("  큐 공백 에러");

    return seoul[(seoulFront + 1) % MAX_WAREHOUSE_SIZE];
}

Item gyeonggi_peek() {
    if (is_gyeonggi_empty())
        return error("  큐 공백 에러");

    return gyeonggi[(gyeonggiFront + 1) % MAX_WAREHOUSE_SIZE];
}

Item chungnam_peek() {
    if (is_chungnam_empty())
        return error("  큐 공백 에러");

    return chungnam[(chungnamFront + 1) % MAX_WAREHOUSE_SIZE];
}

// init_deque 함수 정의
/*
 * @Name : init_deque
 * @Description : init_queue 호출
 */
void init_deque() { init_queue(); }

// add_rear 함수 정의
/*
 * @Name : add_basket_rear, add_warehouse_rear
 * @Param : Item 변수
 * @Description : 각 덱의 뒷 부분에 Item 추가
 */
void add_basket_rear(Item item) { basket_enqueue(item); }
void add_warehouse_rear(Item item) { warehouse_enqueue(item); }

// delete_front 함수 정의
/*
 * @Name : delete_basket_front
 * @Param : None
 * @Return : 삭제된 Item
 * @Description : 각 덱의 가장 앞에 있는 Item을 제거하고 반환
 */
Item delete_basket_front() { return basket_dequeue(); }
Item delete_seoul_front() { return seoul_dequeue(); }

Item delete_gyeonggi_front() { return gyeonggi_dequeue(); }

Item delete_chungnam_front() { return chungnam_dequeue(); }

// get_front 함수 정의
/*
 * @Name : get_basket_front, get_seoul_front, get_gyeonggi_front, get_chungnam_front
 * @Param : None
 * @Return : 각 덱의 가장 앞에 있는 Item
 * @Description : 각 덱의 가장 앞에 있는 Item을 반환(제거하지 않음)
 */
Item get_basket_front() { return basket_peek(); }

Item get_seoul_front() { return seoul_peek(); }

Item get_gyeonggi_front() { return gyeonggi_peek(); }

Item get_chungnam_front() { return chungnam_peek(); }

// add_front 함수 정의
/*
 * @Name : add_basket_front, add_warehouse_front
 * @Param : Item 변수
 * @Description : 각 덱의 앞 부분에 Item 추가
 */
void add_basket_front(Item item)
{
    if (is_basket_full()) {
        error("  덱 포화 에러");
        return;
    }
    basket[basketFront] = item;
    basketFront = (basketFront - 1 + MAX_BASKET_SIZE) % MAX_BASKET_SIZE;
}

void add_warehouse_front(Item item)
{
    switch (item.location) {
        case SEOUL:
            if (is_seoul_full()) break;

            seoul[seoulFront] = item;
            seoulFront = (seoulFront - 1 + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE;
            break;
        case GYEONGGI:
            if (is_gyeonggi_full()) break;

            gyeonggi[gyeonggiFront] = item;
            gyeonggiFront = (gyeonggiFront - 1 + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE;
            break;
        case CHUNGNAM:
            if (is_chungnam_full()) break;

            chungnam[chungnamFront] = item;
            chungnamFront = (chungnamFront - 1 + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE;
            break;
    }
}

// delete_rear 함수 정의
/*
 * @Name : delete_basket_rear, delete_seoul_rear, delete_gyeonggi_rear, delete_chungnam_rear
 * @Param : None
 * @Return : 삭제된 Item
 * @Description : 각 덱의 가장 뒤에 있는 Item을 제거하고 반환
 */
Item delete_basket_rear() {
    int prev = basketRear;
    if (is_basket_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    basketRear = (basketRear - 1 + MAX_BASKET_SIZE) % MAX_BASKET_SIZE;
    return basket[prev];
}

Item delete_seoul_rear() {
    int prev = seoulRear;
    if (is_seoul_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    seoulRear = (seoulRear - 1 + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE;
    return seoul[prev];
}

Item delete_gyeonggi_rear() {
    int prev = gyeonggiRear;
    if (is_gyeonggi_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    gyeonggiRear = (gyeonggiRear - 1 + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE;
    return gyeonggi[prev];
}

Item delete_chungnam_rear() {
    int prev = chungnamRear;
    if (is_chungnam_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    chungnamRear = (chungnamRear - 1 + MAX_WAREHOUSE_SIZE) % MAX_WAREHOUSE_SIZE;
    return chungnam[prev];
}

// get_rear 함수 정의
/*
 * @Name : get_basket_rear, get_seoul_rear, get_gyeonggi_rear, get_chungnam_rear
 * @Param : None
 * @Return : 가장 뒤에 있는 Item
 * @Description : 각 덱의 가장 뒤에 있는 Item을 반환(제거하지 않음)
 */
Item get_basket_rear() {
    if (is_basket_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    return basket[basketRear];
}

Item get_seoul_rear() {
    if (is_seoul_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    return seoul[seoulRear];
}

Item get_gyeonggi_rear() {
    if (is_gyeonggi_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    return gyeonggi[gyeonggiRear];
}

Item get_chungnam_rear() {
    if (is_chungnam_empty()) {
        error("  덱 공백 에러");
        return ERROR_ITEM;
    }
    return chungnam[chungnamRear];
}

// print_queue 함수 정의
/*
 * @Name : print_queue
 * @Param : msg[] - 출력할 메시지
 * @Description : 각 덱의 데이터를 출력
 */
void print_queue(char msg[]) {
    int i, maxi = basketRear;
    if (basketFront >= basketRear) maxi += MAX_BASKET_SIZE;
    printf("%s[-]= ", msg, basket_size());
    for (i = basketFront + 1; i <= maxi; i++)
        printf("- ", basket[i % MAX_BASKET_SIZE]);
    printf("\n");
}


// print_deque 함수 정의
/*
 * @Name : print_deque
 * @Param : msg[] - 출력할 메시지
 * @Description : print_queue를 호출하여 덱의 데이터 출력
 */
void print_deque(char msg[]) { print_queue(msg); }

// print_item 함수 정의
/*
 * @Name : print_item
 * @Param : item - 출력할 Item
 * @Description : 주어진 Item의 정보를 출력
 */
void print_item(Item item) {
    char location[10];

    switch (item.location) {
        case 1:
            strcpy(location, SEOUL_KR);
            break;
        case 2:
            strcpy(location, GYEONGGI_KR);
            break;
        case 3:
            strcpy(location, CHUNGNAM_KR);
            break;
        default:
            return;
    }

    printf("품명:%s, 개수:%d, 지역:%s, 배송:%s\n",
           item.productName,
           item.count,
           location,
           item.isUrgent ? "긴급" : "일반");
}


// add_item 함수 정의
/*
 * @Name : add_item
 * @Param : productName - 상품명, count - 수량, location - 지역, checkUrgent - 긴급 여부
 * @Return : 추가된 Item
 * @Description : 주어진 정보를 이용하여 Item을 생성하여 덱에 추가
 */
Item add_item(char *productName, int count, int location, char checkUrgent) {
    struct Item item;

    strcpy(item.productName, productName);
    item.count = count;
    item.location = location;
    item.isUrgent = (checkUrgent == 'y');

    if (item.isUrgent)
        add_basket_front(item);
    else
        add_basket_rear(item);

    return item;
}

// checkWareHouses 함수 정의
/*
 * @Name : checkWareHouses
 * @Return : 덱이 모두 가득 찼는지 여부
 * @Description : 모든 창고가 가득 찼는지 확인
 */
bool checkWareHouses(Item item) {
    switch (item.location) {
        case SEOUL:
            if (is_seoul_full()) return false;
            break;
        case GYEONGGI:
            if (is_gyeonggi_full()) return false;
            break;
        case CHUNGNAM:
            if (is_chungnam_full()) return false;
            break;
    }

    return true;
};

// add_urgent_item 함수 정의
/*
 * @Name : add_urgent_item
 * @Param : urgentItem - 긴급으로 추가할 Item
 * @Description : 긴급으로 추가된 Item을 해당 위치의 창고 맨 앞에 추가
 */
Item add_urgent_item(Item urgentItem) {
    switch (urgentItem.location) {
        case SEOUL:
            if (get_seoul_rear().isUrgent && is_seoul_full()) break;

            basket_enqueue(delete_seoul_rear());
            add_warehouse_front(urgentItem);
            break;
        case GYEONGGI:
            if (get_gyeonggi_rear().isUrgent && is_gyeonggi_full()) break;

            basket_enqueue(delete_gyeonggi_rear());
            add_warehouse_front(urgentItem);
            break;
        case CHUNGNAM:
            if (get_chungnam_rear().isUrgent && is_chungnam_full()) break;

            basket_enqueue(delete_chungnam_rear());
            add_warehouse_front(urgentItem);
            break;
    }
}

// deliver_to_warehouse 함수 정의
/*
 * @Name : deliver_to_warehouse
 * @Description : 창고로 상품을 이동시키는 함수
 */
void deliver_to_warehouse() {
    while (checkWareHouses(basket_peek()) && basket_size() > 0) {
        Item nowItem = basket_peek();

        if (nowItem.isUrgent)
            add_warehouse_front(basket_dequeue());
        else
            warehouse_enqueue(basket_dequeue());
    }

    while (strcmp(basket_peek().productName, ERROR_ITEM.productName) != 0 && basket_peek().isUrgent && checkWareHouses(basket_peek())) {
        add_urgent_item(basket_dequeue());
    }

    printf("각 지역으로 배송\n");
}

// deliver_to_customer 함수 정의
/*
 * @Name : deliver_to_customer
 * @Description : 고객에게 상품을 배송하는 함수
 */
void deliver_to_customer() {
    int delivered = 0; // 이미 배송된 상품 수를 추적하는 변수

    // basket이 비어있지 않고, 배송된 상품 수(delivered)가 4 미만인 동안 반복
    while (!is_basket_empty() && delivered < 4) {
        // basket의 맨 뒤에 있는 상품을 배송 후 삭제
        delete_basket_rear();
        delivered++; // 배송된 상품 수 증가
    }
}


// print_status 함수 정의
/*
 * @Name : print_status
 * @Description : 현재 상품 위치를 확인하는 함수
 */
void print_status() {
    printf("basket : %d \n", basket_size());
    printf("seoul : %d \n", seoul_size());
    printf("gyeonggi : %d \n", gyeonggi_size());
    printf("chungnam : %d \n", chungnam_size());
}

// main 함수 정의
/*
 * @Name : main
 * @Return : 0
 * @Description : Deque 테스트를 진행한다.
 */
int main() {
    int choice;
    char productName[MAX_PRODUCT_NAME_SIZE] = {0,};
    int count;
    int location;
    char isUrgent;

    printf("프로그램 시작\n");
    init_deque();

    printf("1.상품 담기  2.상품 물류 창고로 이동  3.배송 및 확인  4.현재 상태 확인  5.종료\n");

    while (1) {
        printf("원하는 기능의 번호를 입력하세요 : ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("상품명을 입력하세요 : ");
                scanf("%s", productName);

                do {
                    printf("수량을 입력하세요(1~10) : ");
                    scanf("%d", &count);
                } while (count > 10 || count < 0> 3);

                printf("1.서울  2.경기  3.충남\n");
                do {
                    printf("지역을 선택하세요 : ");
                    scanf("%d", &location);
                } while (location < 0> 3);

                getchar();
                printf("긴급 배송 여부를 선택하세요(y/n) : ");
                scanf("%c", &isUrgent);

                add_item(productName, count, location, isUrgent);

                break;
            case 2:
                deliver_to_warehouse(); // 공개
                break;
            case 3:
                deliver_to_customer(); // 코드 작성
                break;
            case 4:
                print_status(); // 코드 작성
                break;
            case 5:
                printf("시스템 종료");
                return 1;
            default:
                printf("잘못된 입력입니다\n");
                break;
        }
    }
}

이고 

제가 원하는 출력 방법은 



프로그램 시작

1.상품 담기  2.상품 물류 창고로 이동  3.배송 및 확인  4.현재 상태 확인  5.종료

원하는 기능의 번호를 입력하세요 : 1

상품명을 입력하세요 : h

수량을 입력하세요(1~10) : 10

1.서울  2.경기  3.충남

지역을 선택하세요 : 3

긴급 배송 여부를 선택하세요(y/n) : y

원하는 기능의 번호를 입력하세요 : 4

basket : 1

1.품명:h, 개수:10, 지역:충남, 배송:긴급

seoul : 0

gyeonggi : 0

chungnam : 0

원하는 기능의 번호를 입력하세요 : 2

각 지역으로 배송

원하는 기능의 번호를 입력하세요 : 4

basket : 0

seoul : 0

gyeonggi : 0

chungnam : 1

1.품명:h, 개수:10, 지역:충남, 배송:긴급

원하는 기능의 번호를 입력하세요 : 1

상품명을 입력하세요 : s

수량을 입력하세요(1~10) : 3

1.서울  2.경기  3.충남

지역을 선택하세요 : 2

긴급 배송 여부를 선택하세요(y/n) : n

원하는 기능의 번호를 입력하세요 : 1

상품명을 입력하세요 : s

수량을 입력하세요(1~10) : 2

1.서울  2.경기  3.충남

지역을 선택하세요 : 1

긴급 배송 여부를 선택하세요(y/n) : y

원하는 기능의 번호를 입력하세요 : 2

각 지역으로 배송

원하는 기능의 번호를 입력하세요 : 1

상품명을 입력하세요 : e

수량을 입력하세요(1~10) : 3

1.서울  2.경기  3.충남

지역을 선택하세요 : 3

긴급 배송 여부를 선택하세요(y/n) : n

원하는 기능의 번호를 입력하세요 : 1

상품명을 입력하세요 : o

수량을 입력하세요(1~10) : 6

1.서울  2.경기  3.충남

지역을 선택하세요 : 2

긴급 배송 여부를 선택하세요(y/n) : n

원하는 기능의 번호를 입력하세요 : 4

basket : 2

1.품명:e, 개수:3, 지역:충남, 배송:일반

2.품명:o, 개수:6, 지역:경기, 배송:일반

seoul : 1

1.품명:s, 개수:2, 지역:서울, 배송:긴급

gyeonggi : 1

1.품명:s, 개수:3, 지역:경기, 배송:일반

chungnam : 1

1.품명:h, 개수:10, 지역:충남, 배송:긴급

원하는 기능의 번호를 입력하세요 : 2

각 지역으로 배송

원하는 기능의 번호를 입력하세요 : 4

basket : 0

seoul : 1

1.품명:s, 개수:2, 지역:서울, 배송:긴급

gyeonggi : 2

1.품명:s, 개수:3, 지역:경기, 배송:일반

2.품명:o, 개수:6, 지역:경기, 배송:일반

chungnam : 2

1.품명:h, 개수:10, 지역:충남, 배송:긴급

2.품명:e, 개수:3, 지역:충남, 배송:일반

원하는 기능의 번호를 입력하세요 : 3

서울 배송

품명:s, 개수:2, 지역:서울, 배송:긴급

경기 배송

충남 배송

품명:h, 개수:10, 지역:충남, 배송:긴급

배송 완료

원하는 기능의 번호를 입력하세요 : 4

basket : 0

seoul : 0

gyeonggi : 2

1.품명:s, 개수:3, 지역:경기, 배송:일반

2.품명:o, 개수:6, 지역:경기, 배송:일반

chungnam : 1

1.품명:e, 개수:3, 지역:충남, 배송:일반

원하는 기능의 번호를 입력하세요 : 4

basket : 0

seoul : 0

gyeonggi : 2

1.품명:s, 개수:3, 지역:경기, 배송:일반

2.품명:o, 개수:6, 지역:경기, 배송:일반

chungnam : 1

1.품명:e, 개수:3, 지역:충남, 배송:일반

원하는 기능의 번호를 입력하세요 : 3

서울 배송

경기 배송

충남 배송

배송 완료

원하는 기능의 번호를 입력하세요 : 5

시스템 종료

입니다. 

또한 


// deliver_to_customer 함수 정의

/*

 * @Name : deliver_to_customer

 * @Description : 고객에게 상품을 배송하는 함수

 */

void deliver_to_customer() {

    int delivered = 0; // 이미 배송된 상품 수를 추적하는 변수


    // basket이 비어있지 않고, 배송된 상품 수(delivered)가 4 미만인 동안 반복

    while (!is_basket_empty() && delivered < 4) {

        // basket의 맨 뒤에 있는 상품을 배송 후 삭제

        delete_basket_rear();

        delivered++; // 배송된 상품 수 증가

    }

}



// print_status 함수 정의

/*

 * @Name : print_status

 * @Description : 현재 상품 위치를 확인하는 함수

 */

void print_status() {

    printf("basket : %d \n", basket_size());

    printf("seoul : %d \n", seoul_size());

    printf("gyeonggi : %d \n", gyeonggi_size());

    printf("chungnam : %d \n", chungnam_size());

} 이 부분은 제가 한 부분인데 잘 안되는 것 같아서 이 부분에 대한 수정이나 다른 부분에 대한 코드 방법을 알려주세요! 



#c 언어 #c 언어 연산자 #c 언어 컴파일러 #c 언어 기초 #c 언어 포인터 #c 언어 scanf #c 언어 배열 #c 언어 함수 #c 언어 구조체 #c 언어 자료형

profile_image 익명 작성일 -

**조건:**

* 원형 덱을 사용하여 배송 시스템 구현

* 고객이 주문하면 장바구니에 상품 추가

* 배송원이 상품을 제거하고 고객에게 배송

**원리:**

* 원형 덱은の先入れ先出し(FIFO) 데이터 구조로, 한쪽 끝에서 요소를 삽입하고 다른쪽 끝에서 제거할 수 있음.

* 이를 이용하여, 주문이 덱 앞쪽에 추가되고 배송 시 상품이 덱 뒷쪽에서 제거됨.

**코드:**

```c

#include <stdio.h>

#include <stdlib.h>

// 원형 덱 구조체 정의

typedef struct CircularDeque {

int front; // 덱 앞쪽 인덱스

int rear; // 덱 뒷쪽 인덱스

int size; // 덱 크기

int* arr; // 원형 덱 배열

} CircularDeque;

// 원형 덱 초기화 함수

CircularDeque* createCircularDeque(int size) {

CircularDeque* deque = (CircularDeque*)malloc(sizeof(CircularDeque));

deque->front = deque->rear = -1;

deque->size = size;

deque->arr = (int*)malloc(deque->size * sizeof(int));

return deque;

}

// 원형 덱에 요소 삽입 함수

void insertRear(CircularDeque* deque, int data) {

if ((deque->front == 0 && deque->rear == deque->size - 1) || (deque->rear == (deque->front - 1) % (deque->size - 1))) {

printf("Overflow!\n");

return;

}

else if (deque->front == -1) { // 덱이 비어 있는 경우

deque->front = deque->rear = 0;

}

else if (deque->rear == deque->size - 1 && deque->front != 0) { // 덱 뒷쪽 인덱스가 배열 끝에 도달한 경우

deque->rear = 0;

}

else {

deque->rear++;

}

deque->arr[deque->rear] = data;

}

// 원형 덱에서 요소 제거 함수

int deleteFront(CircularDeque* deque) {

if (deque->front == -1) {

printf("Underflow!\n");

return -1;

}

int data = deque->arr[deque->front];

if (deque->front == deque->rear) { // 덱에 하나의 요소만 남은 경우

deque->front = deque->rear = -1;

}

else if (deque->front == deque->size - 1) { // 덱 앞쪽 인덱스가 배열 끝에 도달한 경우

deque->front = 0;

}

else {

deque->front++;

}

return data;

}

// 배송 시스템 구현 함수

void deliverySystem(CircularDeque* orders) {

while (orders->front != -1) {

int order = deleteFront(orders);

printf("배송된 주문: %d\n", order);

}

}

// main 함수

int main() {

int size, order;

printf("배송 시스템을 위한 원형 덱 크기를 입력하세요: ");

scanf("%d", &size);

CircularDeque* orders = createCircularDeque(size);

printf("주문을 입력하세요 (종료: -1): ");

while (1) {

scanf("%d", &order);

if (order == -1) break;

insertRear(orders, order);

}

deliverySystem(orders);

return 0;

}

```

**결과:**

입력된 주문이 차례대로 덱에 추가되고, 배송 시 상품이 덱에서 제거되어 출력됩니다.

c언어 질문

... printf("8진수==>%o\n", data); } 각 정수형을 출력하는건데 오류가 나요 c언어 왕초보라 기본적인 것도 모르니 자세히 알려주시면 감사하겠습니다.....

c언어 질문있습니다.

c언어 질문있습니다. 1. 정수형 long long과 부동소수점형 long double 둘다 64비트인데 왜 부동소수점형이 훨씬 큰 범위의 숫자를 표현할 수 있는 건가요 2. 9.625를...

c언어 질문

c언어에서 if (a&&b)처럼 if문 조건문 ()안에 &&논리곱 연산자가 들어갈 경우 a&&b중 a가... (C언어 규격에서 저 부분이 어떻게 명시되어 있었는지 기억이 잘 안 나네요.. 표준은...

c언어 질문

A,S,M,D,Q 외에 다른 글자를 입력하면 지원되지 않는 연산자라고 떠야되는데 안뜨네요 어떻게 수정해야 되나요? 바로 채택 해드립니다...

C언어 질문 /몫 나누기 연산자

... 파이썬에서 x=3/2, x=float(x) 하면 1.5라고 소수로 뜨고, 몫연산자는 1로 떳었는데, 왜 C언어에서는 /가 몫 연산자인가요? C언어에서는 나누어서 소수를 나타내는...

c언어 질문

c언어에서 'a' 또는 's' 또는 'd' 또는 'f' 가 입력되기 전까지 100에서 1초에 1씩 빼고 싶은데 어떻게 해요 (내공 30) <> <> <> " " " " " " < kbhit()로 키보드가 눌러졌는지...

c언어 질문

c언어에서 헤더 파일을 만들때 왜 .h 라는 헤더 파일에 함수를 정의만 하고 다시 헤더파일의 소스파일(.c)에 함수를 만드나요??.. 그냥 헤더파일(.h)이나 헤더파일의 소스파일...

c언어 질문

c언어 배운 지 얼마 안된 초보입니다... "%c"와 " %c"의 차이가 궁금해서 질문합니당.... 공백을 쓰고 안 쓰고 차이가 무엇인지 알려주세요.... scanf 의 서식 문자열에 공백...

c언어 질문

c언어로 게임을 만들고 있습니다. #include <stdio.h> #include <Windows.h... 이후에도 오류가 생긴다면 코드를 첨부해서 질문주시면 그것또한...