카테고리 없음

김복천국 최종 코드

joo_coding 2025. 3. 29. 21:58
/*---------------------헤더--------------------*/
#include <stdio.h>
#include <stdlib.h> // 말록 프리
#include <string.h> // strcpy

#define MENU_NUM 48
#define BASKET_SIZE 10

typedef struct // < 메뉴 구조체 >
{
    int menu_code;
    char menu_name[30];
    int menu_price;
} menu;

typedef struct // < 장바구니 구조체 >
{
    int menu_code;
    int how_many;
} s_basket;


void menu_borad(menu *m) // 메뉴 출력 함수
{
    printf("========메뉴판========\n");

    for (int i = 0; i < MENU_NUM; i++)
    {
        printf("%02d.\t %-12s\t %4d원\n", i+1, m[i].menu_name, m[i].menu_price);
        // 가로배치는 별찍기 응용
    }
}

void cash_receipt(s_basket *basket, menu *m, int menu_count ,int user_total, int dc_money, int pay_money)
{
    printf("====================\n");
    printf("    현금영수증    \n");
    printf("메뉴:\n");
    for (int i = 0; i < menu_count; i++) // 유저가 산 만큼만 장바구니 보기
    {
        for (int j = 0; j < MENU_NUM; j++) // 메뉴 목록
        {
            if (basket[i].menu_code == m[j].menu_code) // 장바구니가 
            {
                printf("%d. %s %d개\n", i+1, m[j].menu_name, basket[i].how_many);
            }
        }
    }
    printf("합계: %d원\n", user_total + dc_money);
    printf("할인: %d원\n", dc_money);
    printf("총 결제금액: %d원\n", user_total);
    printf("====================\n\n");
}

void card_receipt(s_basket *basket, menu *m, int menu_count, int user_total, int dc_money, int pay_money)
{
    printf("====================\n");
    printf("    카드영수증    \n");
    printf("메뉴:\n");
    for (int i = 0; i < menu_count; i++) // 유저가 산 만큼만 장바구니 보기
    {
        for (int j = 0; j < MENU_NUM; j++) // 메뉴 목록
        {
            if (basket[i].menu_code == m[j].menu_code) // 장바구니가 
            {
                printf("%d. %s %d개\n", i+1, m[j].menu_name, basket[i].how_many);
            }
        }
    }
    printf("카드부가세: %d원\n", (user_total+dc_money)/10);
    printf("합계: %d원\n", user_total);
    printf("할인: %d원\n", dc_money);
    printf("총 결제금액: %d원\n", user_total);
    printf("====================\n\n");
    
}

int main_pick(int main_meun_pick, int month, int day)
{
    printf("[  김복천국 키오스크  ]\n[                     ]\n");
    printf("[       1. 정산       ]\n");
    printf("[       2. 주문       ]\n");
    printf("[       3. 종료       ]\n\n");

    int main_menu_pick;
    printf("입력: ");
    scanf("%d", &main_menu_pick);

    return main_menu_pick;
}

void main_1(int month, int day, int sales)
{
    printf("===========\n");
    printf("정산을 시작합니다. \n");
    printf("날짜:%d월%d일\n", month, day);
    printf("일매출: %d원\n", sales);
    printf("===========\n\n");
}


/*---------------------main--------------------*/
int main()
{
    s_basket basket[BASKET_SIZE];

    int daily_sales=0; // 일매출
    int date_month=3, date_day=1;

    // 김밥,라면,덮밥,찌개,떡볶이,튀김,기타,음료 (1~8)
    menu all_menu[] = // 멤버) 코드,이름,가격
    {
        // 1. 김밥 (8)
        {1101,"김밥",3000},
        {1102,"치즈김밥",3500},
        {1103,"참치김밥",3500},
        {1104,"김치김밥",3500},
        {1105,"야채김밥",3000},
        {1106,"소고기김밥",4000},
        {1107,"돈까스김밥",4000},
        {1108,"삼겹살김밥",4500},
    
        // 2. 라면 (7)
        {1201,"라면",3000},
        {1202,"계란라면",3500},
        {1203,"치즈라면",3500},
        {1204,"만두라면",3500},
        {1205,"짬뽕라면",4000},
        {1206,"떡라면",3500},
        {1207,"떡만두라면",4000},
    
        // 3. 덮밥 (9)
        {1301,"제육덮밥",7000},
        {1302,"오징어덮밥",7500},
        {1303,"오징어제육덮밥",8000},
        {1304,"돈까스덮밥",8000},
        {1305,"쇠고기덮밥",8000},
        {1306,"김치덮밥",7000},
        {1307,"김치제육덮밥",7500},
        {1308,"소세지덮밥",7500},
        {1309,"오므라이스",7500},
    
    
        // 4. 찌개 (8)
        {1401,"김치찌개",7000},
        {1402,"된장찌개",7000},
        {1403,"참치김치찌개",7500},
        {1404,"고기듬뿍찌개",8000},
        {1405,"차돌된장찌개",8000},
        {1406,"부대찌개",8000},
        {1407,"동태찌개",8000},
        {1408,"순두부찌개",8000},
    
        // 5. 떡볶이 (6)
        {1501,"떡볶이",5000},
        {1502,"치즈떡볶이",6000},
        {1503,"해물떡볶이",7000},
        {1504,"짜장떡볶이",7000},
        {1505,"라볶이",6000},
        {1506,"치즈라떡볶이",7000},
            
    
        // 6. 튀김 (5)
        {1601,"김말이튀김",4000},
        {1602,"야채튀김",4000},
        {1603,"만두튀김",4000},
        {1604,"고추튀김",5000},
        {1605,"오징어튀김",5000},
            
    
        // 7. 기타 (1)
        {1701,"공기밥",1500}, // 44
    
        // 8. 음료수 (4)
        {1801,"콜라",1000},
        {1802,"사이다",1000},
        {1803,"오렌지환타",1000},
        {1804,"파인애플환타",1000}, // 48

        // 빈칸
        {0,"빈칸",0} // 49
    
        }; // 총 48개


    while (1) // 종료전까지 키오스크를 계속 돌린다.
    {
        ////////////////////////////////////////
        int menu_count=0;   // 유저가 메뉴 고른 횟수
        int basket_count=0; // 장바구니에 들어있는 메뉴 갯수
        int drink_count=0;  // 장바구니에 들어있는 음료 갯수
        int real_count=0;   // 할인에 적용할 갯수 (전체-음료) 
    
        int user_total=0; // 장바구니 총액
        int dc_money=0;   // 할인된 금액들
        int pay_money=0;  // 총액-할인금액
        int takeout_cost=0; // 포장비
        ////////////////////////////////////////

        printf("매출:%d원         ", daily_sales);
        printf("%d월%d일\n", date_month, date_day);

        int main_menu_pick;
        main_menu_pick = main_pick(main_menu_pick, date_month, date_day);

        if (main_menu_pick == 1)
        {
            main_1(date_month,date_day,daily_sales);
            daily_sales = 0; // 일매출 초기화
            date_day += 1;   // 날짜 하루 추가
        }

        else if (main_menu_pick == 2)
        {
            // 메뉴출력
            menu_borad(all_menu);

            // 주문하기
            int buy_or_not = 1;
            while (buy_or_not == 1) // 그만 산다고 할 때 까지 반복
            {
                int menu_pick; // 메뉴선택
                printf("===============");
                printf("\n메뉴를 골라주세요: ");
                scanf("%d", &menu_pick);
        
                for (int i = 0; i < 48; i++) // 메뉴 48개를 훑는다.
                {
                    if (menu_pick == i) // i번 메뉴를 골랐다면?
                    {
                        printf("'%s'를 골랐습니다.\n", all_menu[i-1].menu_name);

                        int how_many; // 몇개 살건지?
                        printf("수량을 입력해주세요: ");
                        scanf("%d", &how_many);

                        int cancle_or_not; // 진짜 살건지, 취소할건지?
                        printf("(1)취소   (2)담기   ");
                        scanf("%d", &cancle_or_not);

                        if (cancle_or_not == 1)
                        {
                            printf("취소하셨습니다. 다시 골라주세요.\n");
                            break; // 반복문을 나가서 다시 메뉴 선택
                        }
                        
                        else if (cancle_or_not == 2)
                        {  
                            // 현재 카운트가 0이니까 0번에 저장을 해준다.
                            basket[menu_count].menu_code = all_menu[i-1].menu_code; // 메뉴코드 저장
                            basket[menu_count].how_many = how_many; // 몇개샀는지 저장
                            basket_count += how_many; // 장바구니에도 몇개 샀는지 저장
                            user_total += (all_menu[i-1].menu_price * how_many); // 합계에 저장
                            menu_count += 1; // n번째 메뉴에 저장했으니 다음은 n+1

                            if (menu_pick > 44) // 고른 메뉴가 음료수라면?
                            {
                                drink_count += how_many;
                            }
                            break;
                        }
                    }
                }

                printf("\n[   현재 장바구니   ]\n");
                for (int i = 0; i < menu_count; i++) // menu_count 현재 유저가 고른 메뉴갯수만큼 장바구니 보여주기
                {
                    for (int j = 0; j < MENU_NUM; j++)
                    {
                        // 메뉴판의 코드와 장바구니에 담긴 메뉴코드가 같다면?
                        if (all_menu[j].menu_code == basket[i].menu_code)
                        {
                            // 메뉴명과 수량을 저장
                            printf("%s(%d개)\n", all_menu[j].menu_name, basket[i].how_many);       
                        }
                    }
                }

                printf("[총합: %d개 | 합계: %d원]\n", basket_count, user_total);

                printf("\n(1)더 주문하기   (2)결제하기   ");
                scanf("%d", &buy_or_not);

                if (buy_or_not == 1)
                    continue; // 더 주문하기 누르면 다시 메뉴선택
                
                else if (buy_or_not == 2)
                    break; // 결제하기 누르면 반복문 탈출
            }
            real_count = (basket_count - drink_count); // 음료는 할인체크 시 포함되지 않는다.

            // 세트할인 체크) 1.음료서비스 / 2.10%할인 / 3.세트할인(김라,떡튀,분식)
            // 1.메뉴가 5개 넘으면 음료수 있나 체크
            if ((real_count) >= 5) // 메뉴카운트에서 음료갯수는 빼야 진짜 갯수
            { 
                printf("\n(음료수 서비스 확인중)\n");

                if (drink_count >= 1)
                {
                    int drink_service = (real_count/5); // 나눈게 n개면 음료수 n개 주라

                    printf("받을 수 있는 서비스 음료수: %d개\n", drink_service);
                    printf("현재 장바구니에 담긴 음료수: %d개\n", drink_count);
                    printf("장바구니에 담긴 수량만큼만 할인됩니다.\n");
                    
                    int drink_dc=0;
                    drink_dc += (1000 * drink_count);
                    dc_money += drink_dc;
                    user_total -= drink_dc;

                    printf("음료 할인: %d원\n", drink_dc);
                }
                else
                {
                    printf("음료를 안담으셨네요.(할인없음)\n");
                }
            }

            // 2. 10개 넘으면 10% 할인
            if (real_count >= 10)
            {
                printf("\n메뉴를 10개 이상 고르셨네요. 10% 할인 해드릴게요!\n");
                dc_money += (user_total * 0.1);
                printf("할인금액: %.0f원\n", user_total * 0.1);
            }

            int gim_count=0;
            int ra_count=0;
            int ddeok_count=0;
            int fry_count=0;

            // 3. 세트할인 (김라/떡튀/분식특선)
            printf("\n(세트메뉴 확인중)\n");
            for (int i = 0; i < menu_count; i++) // 장바구니를 훑었을 때
            {
                int code = basket[i].menu_code/100; // 메뉴 카테고리 11~18

                if (code == 11) // 김
                {
                    gim_count += basket[i].how_many;
                    printf("김밥 %d개\n", gim_count);
                }
                if (code == 12) // 라
                {
                    ra_count += basket[i].how_many;
                    printf("라면 %d개\n", ra_count);
                }
                if (code == 15) // 떡
                {
                    ddeok_count += basket[i].how_many;
                    printf("떡볶이 %d개\n", ddeok_count);
                }
                if (code == 16) // 튀
                {
                    fry_count += basket[i].how_many;
                    printf("튀김 %d개\n", fry_count);
                }
            }

            int tmp=0;
            for (int i = 0; i < 100; i++)
            {
                // 분식특선을 제일 먼저 해줘야함
                if (gim_count > 0 && ra_count > 0 && ddeok_count > 0 && fry_count > 0)
                {
                    printf("분식특선 할인 적용(-2000원)\n");
                    gim_count --;
                    ra_count --;
                    ddeok_count --;
                    fry_count --;
                    tmp += 4; // 500x4 = 2000원
                }

                if (gim_count > 0 && ra_count > 0)
                {
                    printf("김라세트 할인 적용(-1000원)\n");
                    gim_count --;
                    ra_count --;
                    tmp += 2; // 500x2 = 1000원
                }

                if (ddeok_count > 0 && fry_count > 0)
                {
                    printf("떡튀세트 할인 적용(-500원)\n");
                    ddeok_count --;
                    fry_count --;
                    tmp ++; // 500원
                }  
            }
            dc_money += (500 * tmp);
            printf("\n#세트할인 총액: %d원\n", 500*tmp);
            

            // 포장or매장
            int takeout_or_not;
            printf("(1)포장   (2)매장   ");
            scanf("%d", &takeout_or_not);

            if (takeout_or_not == 1)
            {
                if (basket_count < 5) // 5개 미만
                {
                    printf("포장비 2000원 추가\n");
                    takeout_cost += 2000;
                    printf("총 결제금액: %d원\n", user_total+takeout_cost);
                }

                else
                printf("포장비 없음\n");
            }

            else if (takeout_or_not == 2)
            {
                printf("매장으로 선택하셨습니다.\n");
            }


            // 현금or카드
            int cash_or_card;
            printf("(1)카드   (2)현금   ");
            scanf("%d", &cash_or_card);

            if (cash_or_card == 1)
            {
                printf("카드결제를 선택하셨습니다.\n");
                printf("합계: %d원\n", user_total);
                printf("카드 부가세: %d원\n", (user_total/10));
                printf("할인금액: %d원\n", dc_money);
                // user_total += (user_total*0.1);  // 부가세 추가
                // user_total += takeout_cost;      // 포장비 추가
                // user_total -= dc_money;          // 할인금액 차감
                //printf("총 결제금액: %d원\n", user_total);


                printf("====================\n");
                printf("    카드영수증    \n");
                printf("메뉴:\n");
                for (int i = 0; i < menu_count; i++) // 유저가 산 만큼만 장바구니 보기
                {
                    for (int j = 0; j < MENU_NUM; j++) // 메뉴 목록
                    {
                        if (basket[i].menu_code == all_menu[j].menu_code) // 장바구니가 
                        {
                            printf("%d. %s %d개\n", i+1, all_menu[j].menu_name, basket[i].how_many);
                        }
                    }
                }

                printf("\n합계: %d원\n", user_total);
                printf("카드 부가세: %d원\n", (user_total/10));
                printf("할인금액: -%d원\n", dc_money);
                user_total += (user_total*0.1);  // 부가세 추가
                user_total += takeout_cost;      // 포장비 추가
                user_total -= dc_money;          // 할인금액 차감
                printf("총 결제금액: %d원\n", user_total);
                printf("====================\n\n");
            }

            else if (cash_or_card == 2)
            {
                printf("현금결제를 선택하셨습니다.\n");
                user_total += takeout_cost;
                user_total -= dc_money;
                printf("총 결제금액: %d원\n", user_total);

                cash_receipt(basket, all_menu, menu_count, user_total, dc_money, pay_money);
            }

            // 결제 끝나면  일매출에 저장 + 장바구니 리셋
            daily_sales += user_total;
            user_total = 0;
            dc_money = 0;
            takeout_cost = 0;

            menu_count = 0;
            basket_count = 0;
            drink_count = 0;
            real_count = 0;
        }

        else if (main_menu_pick == 3)
        {
            if (daily_sales > 0)
            {
                printf("정산 후 종료합니다.\n");
                main_1(date_month,date_day,daily_sales);
                daily_sales = 0; // 일매출 초기화
                date_day += 1; // 날짜 하루 추가
            }
            
            printf("종료합니다.\n");
                break;
        }

        else
        {
            printf("잘못 입력하셨습니다.\n");
            continue;
        }
    }

    return 0;

}