Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

Y_DevNote

[C언어] 주문/정산 프로그램( whlie문, switch문 활용 ) 본문

C언어

[C언어] 주문/정산 프로그램( whlie문, switch문 활용 )

Y_DevNote 2026. 4. 10. 10:50

| 프로그램 소개

본 프로그램은 전자기기 판매점에서의 주문 과정을 단순화하여 구현한 콘솔 기반 시스템이다.
사용자는 상품 번호와 수량을 입력하여 여러 번 주문할 수 있으며, 최종적으로 다음과 같은 기능이 수행된다.

  • 상품 선택 및 반복 주문
  • 주문 금액 자동 계산
  • 총 구매 금액 및 수량 누적
  • 할인 및 배송비 자동 적용
  • 사은품 지급 여부 판단

단순한 입력/출력 프로그램이지만, 반복문, 조건문, switch문, 누적 변수 처리
C언어의 핵심 개념을 종합적으로 활용하는 것이 목적이다.


| 실행 화면

◆ 주문 입력 과정

▲ 컴파일 시의 실행 화면
 

 


◆ 반복 주문 처리

 

◆ 최종 결제 결과

 
▲ 0을 입력했을 때의 결과창

| 코드 구조 및 설계 의도

 1) 반복 주문 구조 (while문)

 
  • 무한 반복을 통해 여러 번 주문 가능
  • 0 입력 시 반복 종료 후 결제 단계 진입

 2) 상품 선택 처리 (switch문)

 
  • 상품 번호 → 가격 매핑
  • 잘못된 입력 시 continue로 재입력 유도

 3) 누적 구조 

 
 
  • 총 수량, 총 금액을 계속 누적
  • 상품별 수량도 별도로 저장


→ 단순 계산이 아니라 상태를 유지하는 프로그램 구조로 작성하였다.


 4) 할인 / 배송비 / 사은품 

▲ if문을 활용한 조건 코드
 
→  if문을 사용하여 간단하게 작성해보았다.
→  실수 연산 대신 정수 연산을 사용하였다.

 

사은품 지급 조건은 두 가지 기준을 동시에 고려하도록 설계하였다.

  • 기계식 키보드를 1개 이상 구매한 경우
  • 전체 구매 수량이 5개 이상인 경우

이 두 조건은 각각 독립적인 기준이기 때문에,
논리 연산자 ||(OR)를 사용하여 하나의 조건문으로 통합하였다.

즉, 두 조건 중 하나라도 만족하면 사은품이 지급되도록 구현하였다.


| 가장 어려웠던 부분

가장 어려웠던 부분은 코드 작성보다 개발 환경에서 발생하는 경고 처리였다.

이번 코드 작성에서는 다음 문제가 있었다.

  • scanf 사용 시 보안 경고 발생
  • 실수 연산으로 인한 형변환 경고
  • 입력값 검증 부족으로 인한 프로그램 불안정

처음에는 코드가 틀린 줄 알고 수정하는 과정을 거쳤으나,
실제로는 컴파일러가 코드 안정성을 검사하는 과정이었다.


| 문제 해결 과정

 1) scanf  경고 해결

프로그램을 Visual Studio에서 실행하는 과정에서 scanf 사용 시 보안 경고가 발생하였다.
이는 C 표준 함수 사용에 대한 보안 강화 정책(SDL: Security Development Lifecycle) 때문이며, 코드 오류가 아니라 컴파일러의 경고 메시지이다.

이를 해결하기 위해 다음과 같이 처리하였다.

 

해당 전처리 지시문을 추가하여 Visual Studio에서 scanf 관련 보안 경고가 출력되지 않도록 설정하였다.

또한 프로젝트 속성에서 SDL 설정이 활성화되어 있는 경우에도 동일한 경고가 발생할 수 있으므로,
프로젝트 설정에서 SDL 검사를 비활성화하거나 기본 설정으로 변경하여 추가적인 경고를 제거하였다.

▲ 프로젝트 속성 내 SDL 검사 항목을 '아니요'로 설정


 2) 형변환 경고 해결

할인 계산 과정에서 실수 연산(0.1, 0.05)을 사용했을 때
컴파일러에서 형변환 관련 경고가 발생하였다.

이를 해결하기 위해 실수 연산 대신 정수 연산 방식으로 변경하였다.

 
▲ 기존의 실수 연산
 
▲ 정수 연산으로 수정
 

 


3) 입력값 검증 처리 문제 해결

초기 구현에서는 사용자가 잘못된 값을 입력했을 때 프로그램이 비정상적으로 진행될 가능성이 있었다.

이를 방지하기 위해 입력값 검증 코드을 추가하였다.

 
▲ 숫자가 아닌 값이 들어오면 즉시 프로그램을 종료하거나 안전하게 처리하도록 만든 코드
 

또한 상품 번호 범위를 벗어난 경우와 수량이 0 이하인 경우를 각각 처리하여,
잘못된 입력은 무효 처리하고 다시 입력하도록 구성하였다.

  • 잘못된 상품 번호 → 오류 메시지 출력 후 반복 유지
  • 수량 ≤ 0 → 해당 주문 무효 처리

| 깨달은 점

이번 과제를 통해 단순 문법 이상의 중요한 개념을 배울 수 있었다.

  • 프로그램은 동작보다 안정성이 더 중요하다.
  • 입력값 검증은 필수 요소이다.
  • 경고는 무시 대상이 아닌, 개선 방향을 알려주는 신호이다.

| 느낀 점 

 이번 과제를 통해 단순히 코드를 작성하는 것보다 프로그램의 전체 흐름을 설계하는 것이 더 중요하다는 것을 느꼈다.또한 입력값 검증을 구현하면서 실제 프로그램에서는 정상적인 입력뿐만 아니라 예외 상황까지 고려해야 한다는 점이 인상적이었다.

 

 결과적으로 이번 과제를 통해 C언어 문법뿐만 아니라 프로그램을 구조적으로 생각하는 방법을 배울 수 있었다. 특히 반복 주문 구조와 누적 계산, 조건에 따른 할인 및 배송비 처리 과정에서 여러 기능이 연결되어 동작한다는 점을 이해할 수 있었다.


| 후배들을 위한 팁

 - 처음부터 완벽하게 만들려고 하지 말 것.
 - 기능 하나씩 단계적으로 구현할 것.
 - 오류보다 경고를 먼저 해결할 것.
 - 출력 결과를 기준으로 역으로 코드 점검해볼 것.

 - 특히 switch + while 구조는 시험에 자주 나오니 꼭 익숙해질 것.

 


| 최종 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int menu, qty;
    int price = 0;

    int usb = 0, mouse = 0, keyboard = 0, headset = 0, charger = 0;

    int totalQty = 0;
    int totalPrice = 0;

    while (1) {
        printf("==============================\n");
        printf("전자기기 판매점 주문 시스템\n");
        printf("==============================\n");
        printf("1. USB 메모리 12000원\n");
        printf("2. 무선 마우스 25000원\n");
        printf("3. 기계식 키보드 55000원\n");
        printf("4. 헤드셋 38000원\n");
        printf("5. 충전기 18000원\n");
        printf("0. 결제하기\n");
        printf("==============================\n");

        printf("상품 번호 입력: ");

        if (scanf("%d", &menu) != 1) return 0;

        if (menu == 0) break;

        switch (menu) {
        case 1: price = 12000; break;
        case 2: price = 25000; break;
        case 3: price = 55000; break;
        case 4: price = 38000; break;
        case 5: price = 18000; break;
        default:
            printf("잘못된 상품 번호입니다.\n\n");
            continue;
        }

        printf("수량 입력: ");
        if (scanf("%d", &qty) != 1) return 0;

        if (qty <= 0) {
            printf("잘못된 수량입니다.\n\n");
            continue;
        }

        int orderPrice = price * qty;
        printf("주문금액: %d원\n\n", orderPrice);

        switch (menu) {
        case 1: usb += qty; break;
        case 2: mouse += qty; break;
        case 3: keyboard += qty; break;
        case 4: headset += qty; break;
        case 5: charger += qty; break;
        }

        totalQty += qty;
        totalPrice += orderPrice;
    }

    int discount = 0;
    if (totalPrice >= 100000) {
        discount = totalPrice * 10 / 100;
    }
    else if (totalPrice >= 70000) {
        discount = totalPrice * 5 / 100;
    }

    int delivery = 0;
    if (totalPrice < 30000) {
        delivery = 3000;
    }

    int finalPrice = totalPrice - discount + delivery;

    int gift = 0;
    if (keyboard >= 1 || totalQty >= 5) {
        gift = 1;
    }

    printf("\n========= 결제 내역 =========\n");
    printf("USB 메모리 구매 수량 : %d\n", usb);
    printf("무선 마우스 구매 수량 : %d\n", mouse);
    printf("기계식 키보드 구매 수량 : %d\n", keyboard);
    printf("헤드셋 구매 수량 : %d\n", headset);
    printf("충전기 구매 수량 : %d\n", charger);
    printf("----------------------------\n");
    printf("총 구매 수량 : %d\n", totalQty);
    printf("총 구매 금액 : %d원\n", totalPrice);
    printf("할인 금액 : %d원\n", discount);
    printf("배송비 : %d원\n", delivery);
    printf("최종 결제 금액 : %d원\n", finalPrice);

    if (gift) {
        printf("사은품 지급 대상입니다.\n");
    }
    else {
        printf("사은품 지급 대상이 아닙니다.\n");
    }

    printf("============================\n");

    return 0;

}