Open Jsh2997 opened 2 years ago
main.c
int runSystem (_System mySystem ){ int terminateFlag =1 ; while (terminateFlag ){ printMenus (mySystem ); printOptions (mySystem ); if (!handleInput (mySystem )) terminateFlag =0 ; } return 0 ; } int runApp (){ _System mySystem = initSystem (); if (!mySystem ){ printf ("시스템을 종료합니다.\n "); return 0 ; } if (!runSystem (mySystem ))return 0 ; } int main (){ if (!runApp ()){ printf ("프로그램 종료 \n "); return 0 ; } } Kiosk.h
typedef struct Menu { char name ; int price ; int stock ; }Menu ; typedef struct Transaction { struct Transaction link ; Menu menu ; }Transaction ; typedef struct Kiosk { Transaction transaction ; int transactionLength ; Menu menu ; int input ; }Kiosk ; void freeKiosk (Kiosk kiosk ){ free (kiosk ->menu ); Transaction ptr = kiosk ->transaction; // 링크드 리스트의 경우 순회하며 메모리를 해제해 주어야 함 Transaction temp ; while (ptr != NULL ){ temp = ptr ; ptr = ptr ->link ; free (temp ); } free (ptr ); free (kiosk ); return ; } Kiosk initKiosk (){ Kiosk kiosk =(Kiosk )malloc (sizeof (Kiosk )); if (!kiosk ){ printf ("키오스크 초기화에 실패했습니다.\n "); return 0 ; } // 금액 초기화 kiosk ->input =0 ; // 메뉴 목록 초기화 Menu menu []={ "치즈버거",3500 ,10 , "불고기버거",4000 ,8 , "핫치킨버거",4000 ,8 , "더블치즈베이컨버거",5500 ,6 , "디럭스슈림프버거",6000 ,5 }; kiosk ->menu =(Menu *)malloc (sizeof (menu )); for (int i =0 ; i <sizeof (menu )/sizeof (Menu ); i ++){ kiosk ->menu [i ].name = menu [i ].name ; kiosk ->menu [i ].price = menu [i ].price ; kiosk ->menu [i ].stock = menu [i ].stock ; } // 영수증 기록 초기화 kiosk ->transactionLength =0 ; kiosk ->transaction = NULL ; return kiosk ; } System.h
typedef struct _System { Kiosk kiosk ; }_System ; _System initSystem (){ _System mySystem =(_System )malloc (sizeof (_System )); if (!mySystem ){ printf ("시스템 초기화에 실패했습니다.\n "); return 0 ; } mySystem ->kiosk = initKiosk (); if (!mySystem ->kiosk )return 0 ; printf ("***\n "); printf ("*성현's 햄버거 키오스크\n "); printf ("*****\n "); printf ("-------------------------\n "); printf (" 시스템 초기화 \n "); return mySystem ; } void printMenus (_System mySystem ){ int menuNum = _msize (mySystem ->kiosk ->menu )/sizeof (Menu ); printf ("-------------------------\n "); for (int i =0 ; i < menuNum ; i ++){ printf ("%d번 : %s (%d) | 재고수량 : %d \n ", i +1 , mySystem ->kiosk ->menu [i ].name , mySystem ->kiosk ->menu [i ].price , mySystem ->kiosk ->menu [i ].stock ); } return ; } void printOptions (_System mySystem ){ printf ("-------------------------\n "); printf ("현재 투입된 총 금액 : %d원입니다.\n ", mySystem ->kiosk ->input ); printf ("-------------------------\n "); printf ("메뉴 키(key) 안내 \n "); printf ("-------------------------\n "); printf ("a : 100원짜리 동전 투입 \n "); printf ("s : 500원짜리 동전 투입 \n "); printf ("d : 1000원짜리 지폐 투입 \n "); printf ("f : 5000원짜리 지폐 투입 \n "); printf ("-------------------------\n "); printf ("q : 현금 반환 \n "); printf ("w : 판매 매출 확인 \n "); printf ("e : 자판기 매출, 메뉴 초기화 \n "); printf ("-------------------------\n "); printf ("x : 프로그램 종료 \n "); printf ("-------------------------\n "); printf ("키(key)를 입력하세요 : "); return ; } void printTransaction (_System mySystem ){ Transaction ptr = mySystem ->kiosk ->transaction ;; int length =0 ; int rev =0 ; printf ("거래번호%t| 메뉴%t| 가격%t \n "); printf ("-------------------------\n "); while (ptr != NULL ){ // link가 null일 때까지 계속 탐색 printf ("%d%t| %s%t| %d%t|\n ",++length , ptr ->menu.name , ptr ->menu.price ); rev += ptr ->menu.price ; ptr = ptr ->link ; } printf ("-------------------------\n "); printf ("총매출 : %d %t| 판매량 : %d \n ", rev , length ); } void addTransaction (_System mySystem , Menu menu ){ Transaction ptr = mySystem ->kiosk ->transaction ; if (ptr == NULL ){ // 최초의 거래, 즉 kiosk가 초기화 되었을때 가지고 있던 트랜잭션이 NULL인 상태 ptr =(Transaction )malloc (sizeof (Transaction )); ptr ->menu = menu ; ptr ->link = NULL ; mySystem ->kiosk ->transaction = ptr ; mySystem ->kiosk ->transactionLength ++; return ; } else { while (ptr ->link != NULL ){ // 이외의 경우에는 끝까지 탐색 ptr = ptr ->link ; } } ptr ->link =(Transaction )malloc (sizeof (Transaction )); ptr = ptr ->link ; ptr ->menu = menu ; ptr ->link = NULL ; mySystem ->kiosk ->transactionLength ++; return ; } int handleInput (_System mySystem ){ int num =0 , ch ; char op = NULL ; while ((ch =getchar ())!= EOF ){ // 숫자 혹은 문자를 입력받는다. if (ch >='0'&& ch <='9') num = num 10 + ch -'0'; // 숫자일 경우 num에 10제곱씩 더하며 else if (ch =='\n ')break ; // 줄바꿈 문자일 경우 입력을 종료한다 else op = ch ; // 일반적인 문자일 경우 op 변수에 입려한다. } if (op != NULL ){ // 일반적인 문자가 입력된 경우 switch (op ){ // switch 문을 통해 기능들을 제공한다. case 'a': mySystem ->kiosk ->input +=100 ; break ; case 's': mySystem ->kiosk ->input +=500 ; break ; case 'd': mySystem ->kiosk ->input +=1000 ; break ; case 'f': mySystem ->kiosk ->input +=5000 ; break ; case 'q': printf ("-------------------------\n "); printf ("%d 원을 반환 해 드렸습니다.\n ", mySystem ->kiosk ->input ); mySystem ->kiosk ->input =0 ; break ; case 'w': printf ("-------------------------\n "); printTransaction (mySystem ); break ; case 'e': printf ("-------------------------\n "); freeKiosk (mySystem ->kiosk ); mySystem ->kiosk = initKiosk (); printf ("키오스크가 초기화 되었습니다.\n "); break ; case 'x': return 0 ; break ; default : printf ("-------------------------\n "); printf ("잘못된 입력입니다. 다시 입력하세요 \n "); break ; }return 1 ; } else if (num >=1 && num <= _msize (mySystem ->kiosk ->menu )/sizeof (Menu )){ if (mySystem ->kiosk ->input >= mySystem ->kiosk ->menu [num -1 ].price && mySystem ->kiosk ->menu [num -1 ].stock >0 ){ // 금액, 재고 확인 addTransaction (mySystem , mySystem ->kiosk ->menu [num -1 ]); // 영수증에 구매 정보 싣기 mySystem ->kiosk ->input -= mySystem ->kiosk ->menu [num -1 ].price ; // 가격 차감 mySystem ->kiosk ->menu [num -1 ].stock --; // 재고 차감 printf ("-------------------------\n "); printf ("주문하신 %s가 나왔습니다~!.\n ", mySystem ->kiosk ->menu [num -1 ].name ); } else if (mySystem ->kiosk ->menu [num -1 ].stock ==0 ){ printf ("-------------------------\n "); printf ("재고가 없습니다.\n "); } else { printf ("-------------------------\n "); printf ("현금을 더 투입해 주세요 \n "); } } else { // 숫자가 제공하는 메뉴의 번호 범위를 넘어갈경우 예외처리 printf ("-------------------------\n "); printf ("잘못된 입력입니다. 다시 입력하세요 \n "); };
main.c
include
include "System.h"
int runSystem (_System mySystem ){ int terminateFlag =1 ; while (terminateFlag ){ printMenus (mySystem ); printOptions (mySystem ); if (!handleInput (mySystem )) terminateFlag =0 ; } return 0 ; } int runApp (){ _System mySystem = initSystem (); if (!mySystem ){ printf ("시스템을 종료합니다.\n "); return 0 ; } if (!runSystem (mySystem ))return 0 ; } int main (){ if (!runApp ()){ printf ("프로그램 종료 \n "); return 0 ; }
} Kiosk.h
pragma once
include
include
typedef struct Menu { char name ; int price ; int stock ; }Menu ; typedef struct Transaction { struct Transaction link ; Menu menu ; }Transaction ; typedef struct Kiosk { Transaction transaction ; int transactionLength ; Menu menu ; int input ; }Kiosk ; void freeKiosk (Kiosk kiosk ){ free (kiosk ->menu ); Transaction ptr = kiosk ->transaction; // 링크드 리스트의 경우 순회하며 메모리를 해제해 주어야 함 Transaction temp ; while (ptr != NULL ){ temp = ptr ; ptr = ptr ->link ; free (temp ); } free (ptr ); free (kiosk ); return ; } Kiosk initKiosk (){ Kiosk kiosk =(Kiosk )malloc (sizeof (Kiosk )); if (!kiosk ){ printf ("키오스크 초기화에 실패했습니다.\n "); return 0 ; } // 금액 초기화 kiosk ->input =0 ; // 메뉴 목록 초기화 Menu menu []={ "치즈버거",3500 ,10 , "불고기버거",4000 ,8 , "핫치킨버거",4000 ,8 , "더블치즈베이컨버거",5500 ,6 , "디럭스슈림프버거",6000 ,5 }; kiosk ->menu =(Menu *)malloc (sizeof (menu )); for (int i =0 ; i <sizeof (menu )/sizeof (Menu ); i ++){ kiosk ->menu [i ].name = menu [i ].name ; kiosk ->menu [i ].price = menu [i ].price ; kiosk ->menu [i ].stock = menu [i ].stock ; } // 영수증 기록 초기화 kiosk ->transactionLength =0 ; kiosk ->transaction = NULL ; return kiosk ; } System.h
pragma once
include
include
include "Kiosk.h"
typedef struct _System { Kiosk kiosk ; }_System ; _System initSystem (){ _System mySystem =(_System )malloc (sizeof (_System )); if (!mySystem ){ printf ("시스템 초기화에 실패했습니다.\n "); return 0 ; } mySystem ->kiosk = initKiosk (); if (!mySystem ->kiosk )return 0 ; printf ("***\n "); printf ("*성현's 햄버거 키오스크\n "); printf ("*****\n "); printf ("-------------------------\n "); printf (" 시스템 초기화 \n "); return mySystem ; } void printMenus (_System mySystem ){ int menuNum = _msize (mySystem ->kiosk ->menu )/sizeof (Menu ); printf ("-------------------------\n "); for (int i =0 ; i < menuNum ; i ++){ printf ("%d번 : %s (%d) | 재고수량 : %d \n ", i +1 , mySystem ->kiosk ->menu [i ].name , mySystem ->kiosk ->menu [i ].price , mySystem ->kiosk ->menu [i ].stock ); } return ; } void printOptions (_System mySystem ){ printf ("-------------------------\n "); printf ("현재 투입된 총 금액 : %d원입니다.\n ", mySystem ->kiosk ->input ); printf ("-------------------------\n "); printf ("메뉴 키(key) 안내 \n "); printf ("-------------------------\n "); printf ("a : 100원짜리 동전 투입 \n "); printf ("s : 500원짜리 동전 투입 \n "); printf ("d : 1000원짜리 지폐 투입 \n "); printf ("f : 5000원짜리 지폐 투입 \n "); printf ("-------------------------\n "); printf ("q : 현금 반환 \n "); printf ("w : 판매 매출 확인 \n "); printf ("e : 자판기 매출, 메뉴 초기화 \n "); printf ("-------------------------\n "); printf ("x : 프로그램 종료 \n "); printf ("-------------------------\n "); printf ("키(key)를 입력하세요 : "); return ; } void printTransaction (_System mySystem ){ Transaction ptr = mySystem ->kiosk ->transaction ;; int length =0 ; int rev =0 ; printf ("거래번호%t| 메뉴%t| 가격%t \n "); printf ("-------------------------\n "); while (ptr != NULL ){ // link가 null일 때까지 계속 탐색 printf ("%d%t| %s%t| %d%t|\n ",++length , ptr ->menu.name , ptr ->menu.price ); rev += ptr ->menu.price ; ptr = ptr ->link ; } printf ("-------------------------\n "); printf ("총매출 : %d %t| 판매량 : %d \n ", rev , length ); } void addTransaction (_System mySystem , Menu menu ){ Transaction ptr = mySystem ->kiosk ->transaction ; if (ptr == NULL ){ // 최초의 거래, 즉 kiosk가 초기화 되었을때 가지고 있던 트랜잭션이 NULL인 상태 ptr =(Transaction )malloc (sizeof (Transaction )); ptr ->menu = menu ; ptr ->link = NULL ; mySystem ->kiosk ->transaction = ptr ; mySystem ->kiosk ->transactionLength ++; return ; } else { while (ptr ->link != NULL ){ // 이외의 경우에는 끝까지 탐색 ptr = ptr ->link ; } } ptr ->link =(Transaction )malloc (sizeof (Transaction )); ptr = ptr ->link ; ptr ->menu = menu ; ptr ->link = NULL ; mySystem ->kiosk ->transactionLength ++; return ; } int handleInput (_System mySystem ){ int num =0 , ch ; char op = NULL ; while ((ch =getchar ())!= EOF ){ // 숫자 혹은 문자를 입력받는다. if (ch >='0'&& ch <='9') num = num 10 + ch -'0'; // 숫자일 경우 num에 10제곱씩 더하며 else if (ch =='\n ')break ; // 줄바꿈 문자일 경우 입력을 종료한다 else op = ch ; // 일반적인 문자일 경우 op 변수에 입려한다. } if (op != NULL ){ // 일반적인 문자가 입력된 경우 switch (op ){ // switch 문을 통해 기능들을 제공한다. case 'a': mySystem ->kiosk ->input +=100 ; break ; case 's': mySystem ->kiosk ->input +=500 ; break ; case 'd': mySystem ->kiosk ->input +=1000 ; break ; case 'f': mySystem ->kiosk ->input +=5000 ; break ; case 'q': printf ("-------------------------\n "); printf ("%d 원을 반환 해 드렸습니다.\n ", mySystem ->kiosk ->input ); mySystem ->kiosk ->input =0 ; break ; case 'w': printf ("-------------------------\n "); printTransaction (mySystem ); break ; case 'e': printf ("-------------------------\n "); freeKiosk (mySystem ->kiosk ); mySystem ->kiosk = initKiosk (); printf ("키오스크가 초기화 되었습니다.\n "); break ; case 'x': return 0 ; break ; default : printf ("-------------------------\n "); printf ("잘못된 입력입니다. 다시 입력하세요 \n "); break ; }return 1 ; } else if (num >=1 && num <= _msize (mySystem ->kiosk ->menu )/sizeof (Menu )){ if (mySystem ->kiosk ->input >= mySystem ->kiosk ->menu [num -1 ].price && mySystem ->kiosk ->menu [num -1 ].stock >0 ){ // 금액, 재고 확인 addTransaction (mySystem , mySystem ->kiosk ->menu [num -1 ]); // 영수증에 구매 정보 싣기 mySystem ->kiosk ->input -= mySystem ->kiosk ->menu [num -1 ].price ; // 가격 차감 mySystem ->kiosk ->menu [num -1 ].stock --; // 재고 차감 printf ("-------------------------\n "); printf ("주문하신 %s가 나왔습니다~!.\n ", mySystem ->kiosk ->menu [num -1 ].name ); } else if (mySystem ->kiosk ->menu [num -1 ].stock ==0 ){ printf ("-------------------------\n "); printf ("재고가 없습니다.\n "); } else { printf ("-------------------------\n "); printf ("현금을 더 투입해 주세요 \n "); } } else { // 숫자가 제공하는 메뉴의 번호 범위를 넘어갈경우 예외처리 printf ("-------------------------\n "); printf ("잘못된 입력입니다. 다시 입력하세요 \n "); };