1. 문제 설명
4단계까지 구현한 키오스크 프로그램은 커피 메뉴와 디저트 메뉴를 구조체 배열로 저장하고, 메뉴 등록 / 조회 / 변경 / 삭제 / 주문 / 재고관리(선택) 기능을 수행할 수 있다. 이번 5단계에서는 고정 크기의 구조체 배열을 사용하지 않고, 메뉴 리스트를 동적으로 관리하도록 수정한다.
5단계는 두 부분으로 구성된다.
- 5-1단계: 동적 메모리 할당 기반 메뉴 리스트(필수)
- 5-2단계: 링크드 리스트 기반 메뉴 리스트 (심화 선택)
2. 목표
- 메뉴 정보를 고정 크기 배열이 아닌 동적 메모리로 관리할 수 있다.
- malloc(), realloc(), free()를 사용하여 메뉴 리스트 크기를 실행 중에 조정할 수 있다.
- 메뉴 등록 시 필요한 만큼 메모리를 확장할 수 있다.
- 메뉴 삭제 시 동적 메모리의 데이터를 정리할 수 있다.
- 프로그램 종료 시 할당한 메모리를 해제할 수 있다.
- 심화 단계에서는 링크드 리스트를 사용하여 메뉴를 노드 단위로 관리할 수 있다.
5-1단계: 동적 메모리 할당 기반 메뉴 리스트 (필수)
3. 요구사항
3.1 데이터 구조 수정
기존 고정 배열을 제거하고 포인터 변수를 사용하시오.
기존 코드 예:
MenuItem coffee_menu_list[10];
MenuItem dessert_menu_list[10];
수정 코드 예:
MenuItem* coffee_menu_list;
MenuItem* dessert_menu_list;
int coffee_count;
int dessert_count;
int coffee_capacity;
int dessert_capacity;
3.2 메뉴 리스트 초기화 기능 추가
프로그램 시작 시 메뉴 리스트를 동적 할당하시오. 초기 용량은 배열과 마찬가지로 커피 5개, 디저트 5개로 설정한다.
#define INIT_CAPACITY 5
예:
coffee_menu_list = malloc(sizeof(MenuItem) * INIT_CAPACITY);
dessert_menu_list = malloc(sizeof(MenuItem) * INIT_CAPACITY);
요구사항:
- 메모리 할당 실패 시 오류 메시지를 출력한다. ( malloc() 리턴값 체크)
- 초기 count는 0으로 설정한다.
- 초기 capacity는 5로 설정한다.
3.3 메뉴 등록 기능 수정 - register_menu_item()
메뉴 등록 시 현재 저장된 메뉴 개수가 capacity와 같으면 메모리 크기를 확장하시오.
요구사항:
- 커피 메뉴인지 디저트 메뉴인지 선택한다.
- 메뉴명, 가격, 재고수량을 입력받는다.
- menu_id는 자동 증가로 설정한다.
- status는 기본값 판매중으로 설정한다.
- 재고수량이 0이면 status를 품절로 설정한다.
- 현재 배열이 가득 찼으면 realloc()을 사용하여 capacity를 2배로 확장한다.
- 새 메뉴를 리스트에 저장한다.
출력 예:
메뉴구분 (1. 커피, 2. 디저트): 1
메뉴명 입력: 아메리카노
가격 입력: 3000
재고수량 입력: 20
[메모리 확장] coffee_menu_list capacity: 5 -> 10
[등록 완료]
3.4 메뉴 삭제 기능 수정 - delete_menu_item()
동적 메모리에서 메뉴를 삭제할 수 있도록 수정하시오.
요구사항:
- 전체 메뉴를 출력한다.
- 삭제할 메뉴 번호를 입력한다.
- 해당 메뉴를 찾는다.
- 메뉴가 존재하지 않으면 오류 메시지를 출력한다.
- 삭제할 메뉴 뒤에 있는 메뉴들을 한 칸씩 앞으로 이동한다.
- count를 1 감소시킨다.
출력 예:
삭제할 메뉴 번호 입력: 102
[삭제 완료]
3.5 메뉴 조회 기능 수정 - retrieve_menu_item()
동적 메모리에 저장된 메뉴 목록을 출력하시오.
요구사항:
- coffee_count, dessert_count만큼 반복하여 출력한다.
- capacity 크기 전체를 출력하지 않는다.
- 재고수량도 함께 출력한다.
출력 예:
====================[Coffee]============================
No Name Price Status Stock
========================================================
101 Americano 3000 AVAILABLE 20
102 Cafe Latte 4000 AVAILABLE 15
현재 저장 개수: 2
현재 배열 크기: 5
3.6 프로그램 종료 시 메모리 해제
프로그램 종료 전에 동적 할당한 메모리를 해제하시오.
요구사항:
- free(coffee_menu_list);
- free(dessert_menu_list);
- free() 후 포인터를 NULL로 설정한다.
출력 예:
[프로그램 종료]
동적 메모리를 해제했습니다.
5-2단계: 링크드 리스트 기반 메뉴 리스트
4. 요구사항
4.1 데이터 구조 수정
메뉴 정보를 링크드 리스트 노드로 관리하시오.
typedef struct menu_node {
MenuItem data;
struct menu_node* next;
} MenuNode;
커피 메뉴와 디저트 메뉴의 시작 노드를 각각 관리한다.
MenuNode* coffee_head;
MenuNode* dessert_head;
4.2 메뉴 등록 기능 수정
메뉴 등록 시 새 노드를 동적 생성하여 리스트의 마지막에 추가하시오.
요구사항:
- malloc()을 사용하여 새 노드를 생성한다.
- 새 노드의 data에 메뉴 정보를 저장한다.
- 새 노드의 next는 NULL로 설정한다.
- 리스트가 비어 있으면 head가 새 노드를 가리키도록 한다.
- 리스트가 비어 있지 않으면 마지막 노드 뒤에 새 노드를 연결한다.
출력 예:
메뉴구분 (1. 커피, 2. 디저트): 2
메뉴명 입력: 치즈케이크
가격 입력: 5000
재고수량 입력: 5
[노드 생성 완료]
[등록 완료]
4.3 메뉴 조회 기능 수정
링크드 리스트를 순회하면서 메뉴 정보를 출력하시오.
요구사항:
- head부터 시작한다.
- 현재 노드가 NULL이 될 때까지 반복한다.
- 각 노드의 data를 출력한다.
출력 예:
====================[Coffee]============================
No Name Price Status Stock
========================================================
101 Americano 3000 AVAILABLE 20
102 Cafe Latte 4000 AVAILABLE 15
4.4 메뉴 변경 기능 수정
링크드 리스트에서 메뉴 번호를 검색하여 메뉴 정보를 수정하시오.
요구사항:
- 전체 메뉴를 출력한다.
- 수정할 메뉴 번호를 입력한다.
- head부터 순회하며 menu_id가 일치하는 노드를 찾는다.
- 메뉴명, 가격, 판매상태, 재고수량 중 수정 항목을 선택한다.
- 재고수량이 0이면 판매상태를 품절로 변경한다.
- 재고수량이 1 이상이면 판매상태를 판매중으로 변경할 수 있다.
4.5 메뉴 삭제 기능 수정
링크드 리스트에서 특정 메뉴 노드를 삭제하시오.
요구사항:
- 삭제할 메뉴 번호를 입력한다.
- 삭제할 노드를 찾는다.
- 삭제할 노드가 head인 경우 head를 다음 노드로 변경한다.
- 중간 또는 마지막 노드인 경우 이전 노드의 next를 삭제할 노드의 next로 연결한다.
- 삭제한 노드는 free()로 해제한다.
출력 예:
삭제할 메뉴 번호 입력: 101
[삭제 완료]
노드 메모리를 해제했습니다.
4.6 프로그램 종료 시 전체 노드 해제
프로그램 종료 전에 모든 노드를 해제하시오.
요구사항:
- 커피 리스트의 모든 노드를 해제한다.
- 디저트 리스트의 모든 노드를 해제한다.
- 노드를 하나씩 순회하면서 free()를 수행한다.
출력 예:
[프로그램 종료]
커피 메뉴 리스트 메모리를 해제했습니다.
디저트 메뉴 리스트 메모리를 해제했습니다.
5. 제출 형식
분할된 소스코드 파일을 제출한다.
main.c
kiosk_ui.c
kiosk_ui.h
menu_item.c
menu_item.h
order.c
order.h
5-2단계 링크드 리스트까지 구현한 경우, menu_item을 linked list로 정의하고 리스트에 추가/삭제/항목 가져오는 등의 기능을 구현한 파일을 별도 파일로 (예: menu_list.c, menu_list.h) 관리할 수 있다.
'[1] 프로그래밍1 및 실습(C언어) > [과제] 콘솔 키오스크' 카테고리의 다른 글
| [콘솔키오스크] 과제 4단계. 주문관리-재고(선택) 및 파일 분할 [5/21] (0) | 2026.05.17 |
|---|---|
| [콘솔키오스크] 과제 3단계. 주문 관리 기능 구현 [5/14] (0) | 2026.05.13 |
| [콘솔키오스크] 과제 2단계. 메뉴 관리 기능 구현 [5/7] - 결과 예시 (0) | 2026.05.10 |
| [콘솔키오스크] 과제 2단계. 메뉴 관리 기능 구현 [5/7] (0) | 2026.05.07 |
| [콘솔키오스크] 과제 1단계. Intro - 키오스크 과제[4/30] - 결과 예시 (0) | 2026.05.03 |