C 언어 질문 !
-
게시물 수정 , 삭제는 로그인 필요
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());
} 이 부분은 제가 한 부분인데 잘 안되는 것 같아서 이 부분에 대한 수정이나 다른 부분에 대한 코드 방법을 알려주세요!
프로그램 시작
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 언어 자료형