본문 바로가기
Project

[C] 연결리스트로 키오스크 로직 구현하기 (DB x 예쁜 화면 x)

by @sseyeon_ 2020. 12. 22.
반응형

 
헤헤 컴공 복전 첫학기 때 구현했던 키오스크 코드 공유해봅니다 !!
 
 
지금이야 뭐 연결리스트보단 배열로 아이템을 담았다 빼는 게 더 효율적인 방법인 걸 알지만
저땐 그거고 뭐고 그냥 만들기 바빴지요 ^^..
 
만든지 1년 반이 넘어서 잘 기억은 안나지만 그래도 기록하려구요
혹시나 누가 필요할까봐서요 ~ 
 
도움이 되셨다면 좋아요와 댓글, 자주 방문하기 부탁드려요 👀💖
 
 
프로그램은 

여기에서 확인하실 수 있습니다 >,,<
 
 

1. 구조체 선언 (Menu)

 

 
  - 메뉴에 대한 정보를 저장할 구조체를 생성했습니다.
  - 메뉴 이름(name)과 가격(price)으로 구성된 구조체입니다.
 
 

2. 노드 정의(basket)

 

 
  - 사용자가 입력한 메뉴를 저장하기 위한 연결리스트 입니다.
  - 메뉴 번호(num)와 다음 노드를 가리키는 구조체 포인터(next)로 구성되어 있습니다.
 

3. showMenu()

 

 
  - 메뉴판을 불러오는 함수입니다.
  - 메뉴판은 수제작 ^^ 하였습니다 ㅎㅎ 
 

4. menuDetail()

 

 
  - 세부사항을 선택하는 함수입니다.
  - 음료추가라든지, 사이즈 업 이라든지 .. 
 

5. insert_Basket()

 

 
  - 장바구니에 선택한 아이템을 넣는 함수입니다.
 

6. insert_end_Basket()

 

 
  - 다음 노드로 연결시키는 함수인데 insert_Basket()에서 해결을 안하고 따로 만들었나봅니다.
 

7. showOrder()

 

 
  - 연결리스트에 저장된 메뉴, 즉 사용자가 선택한 메뉴들을 띄웁니다 !! 
 

8. Payment()

 

 
  - 총 가격을 계산하는 함수 입니다.
  - 매장에서 먹으면 10% 할인까지 해 준 다구욧 0.< 
 

9. freeBasket()

 

 
  - malloc으로 메모리를 끌어왔으면 해제를 시켜줘야죠 !! 
  - 계산이 완료된 메뉴는 삭제됩니다!
 
 
 
 
 
[ 전체 코드 ]

#include<stdio.h>
#include<stdlib.h>


typedef struct Menu {
 char name[20];
 int price;
}Menu;

// 노드 정의
typedef struct basket {
 int num;
 struct basket * next;   //다음 노드를 가리키는 포인터
}basket;

basket * start = NULL; // 시작 노드를 가리키는 포인터

void showMenu(Menu * m) {

 printf("\n%20s\t\t%20s\t\t%20s\n", "<한식>", "<양식>", "<중식>");

 int n = 1;
 for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
   printf("%15s(00%d) / %6d원\t", m[n - 1].name, n, m[n - 1].price);
   n++;
  }printf("\n");
 }printf("\n");

}

void insert_end_Basket(basket * end, basket * new_node) {
 end->next = new_node;
}
void insert_Basket(int menu_num) {

 basket * cur = NULL; // 현재 노드를 가리키는 포인터
 basket * new_node = NULL;   // 새로 생성된 노드를 가리키는 포인터

 if (start == NULL) {   // 제일 처음 생성하는 노드
  new_node = (basket*)malloc(sizeof(basket));   //노드생성
  new_node->next = NULL;   // 포인터 초기화
  new_node->num = (menu_num)-1;   // 첫 노드에는 메인 음식 번호를 넣음
  start = new_node;   //시작지점으로 설정
 }
 else {
  new_node = (basket*)malloc(sizeof(basket));   //노드생성
  new_node->next = NULL;   // 포인터 초기화
  new_node->num = (menu_num)-1;   // 두번째부터는 세부사항

  // cur가 마지막 노드를 가리키게 함
  for (cur = start; cur->next != NULL; cur = cur->next);
  insert_end_Basket(cur, new_node);   // 다음 노드로 link
 }
}


void menuDetail() {
 while (1) {
  int sel;   // 선택 입력
  printf("\n1. 음료추가 (1000원)\n");
  printf("2. 사이즈 업 (500원)\n");
  printf("3. 소스 추가 (700원)\n");
  printf("0. 종료\n");
  printf("세부사항을 선택해 주세요 >> ");
  scanf_s("%d", &sel);
  if (sel == 0)
   break;
  insert_Basket(sel);

 }
}

void showOrder(Menu * m, Menu * dm) {
 printf("\n\t< 주문 장바구니 > \n");
 basket * cur = NULL;
 if (start == NULL)
  printf("     주문 내역이 없습니다!\n\n");
 else {
  for (cur = start; cur != NULL; cur = cur->next) {
   if (cur == start) {
    printf("%14s / %6d원 \n", m[cur->num].name, m[cur->num].price);
   }
   else {
    printf("%14s / %6d원 \n", dm[cur->num].name, dm[cur->num].price);
   }
  }
 }printf("\n");
}

void Payment(Menu *m, Menu * dm, int T_O) {
 basket * cur = NULL;
 int totalpay = 0;
 for (cur = start; cur != NULL; cur = cur->next) {
  if (cur == start) {
   totalpay += m[cur->num].price;
  }
  else {
   totalpay += dm[cur->num].price;
  }
 }
 if (T_O == 2) {
  int tmp = totalpay;
  totalpay *= 0.9;
  printf("\n테이크아웃 할인 적용 : %d 원 -> %d 원\n", tmp, totalpay);
 }
 printf("\n최종 결제 금액 : %d원\n\n", totalpay);
}

void freeBasket(basket ** start) {
 while (*start != NULL) {
  basket *tmp = *start;
  (*start) = (*start)->next;
  free(tmp);

 }
 printf("결제 완료 ! \n");
 printf("<< 이용해주셔서 감사합니다. >> \n");
}

void main() {

 int T_O;
 Menu m[9] = { { "순두부찌개", 7000 }, { "로제 파스타", 6500 }, { "짜장면", 5000 }, { "전주비빔밥", 8000 }, { "돈까스", 7500 }, { "탕수육", 12000 }, { "양념게장 정식", 8500 } , { "소고기 필라프", 7000 }, { "마파두부밥", 8000 } };
 Menu detailMenu[3] = { {"음료 추가", 1000}, {"사이즈 업", 500}, {"소스 추가", 700} };
 basket*first = 0;

 printf("\n\t1.매장에서 식사\t\t2.테이크아웃\n >> ");
 scanf_s("%d", &T_O);
 system("pause");
 system("cls");

 while (1) {
  int menu, menu_num;
  printf("\n");
  printf("1. 메뉴선택\n");
  printf("2. 주문사항 확인\n");
  printf("3. 결제\n");
  printf("0. 종료\n\n");
  printf("번호 입력 >> ");
  scanf_s("%d", &menu);
  system("cls");
  switch (menu) {
  case 1:
   showMenu(m);
   // [순두부, 7000]
   printf("메뉴번호를 입력하세요 : ");
   scanf_s("%d", &menu_num);
   // 변수 int로 저장
   insert_Basket(menu_num);
   system("pause"); system("cls");
   menuDetail();   //여기에 while문 쓰기  
   break;
  case 2:
   showOrder(m, detailMenu);
   break;
  case 3:
   Payment(m, detailMenu, T_O);
   freeBasket(&start);
   break;
  case 0:
   exit(1);
  default:
   printf("번호를 잘못 입력하셨습니다. 다시 입력해주세요.\n");
   break;
  }system("pause");
  system("cls");
 }
}

 

반응형