728x90
반응형

2주차 C언어 심화 과정에 대한 내용이다.
문제는 저작권상 적지 않았고 내가 작성한 코드만 정리하려고 한다.

 

📌 문제 1

간단한 연산문제와 조건문을 적절히 사용하면 쉽게 해결할 수 있는 문제였다.
나는 반복문을 통해서 재고가 소진될 때까지 주문할 수 있게 만들어보았다.
그리고 글씨에 색을 넣어 입력하는 부분과 재고가 부족할 때, 재고가 소진되었을 때를 강조해주었다.

#include <stdio.h>
#include <cs50.h>

int main(void) {
    int stock = 0; // 재고량
    int price = 0; // 물품 가격
    int order = 0; // 주문량
    double vat = 0; // 부가세
    double priceWithVat = 0; // 부가세 포함 물품 가격
    double priceForOrder = 0; // 매출액 (주문량 * 부가세 포함 물품 가격)
    int remainStock = 0; // 남은 재고량
    double salesTotal = 0; // 총 매출액 (각 매출액을 더한 값)

    stock = get_int("물품의 재고량을 입력해주세요 : "); // 재고량 입력하기
    price = get_int("물품의 가격을 입력해주세요 : "); // 물품의 가격 입력하기

    vat = price * 0.1; // 부가세 계산하기 (물품 가격의 10%)
    priceWithVat = price + vat; // 부가세 포함 물품의 가격 (물품 가격 * 부가세)
    remainStock = stock; // 남은 재고량 (처음에는 남은 재고량 = 재고량)
    
    // 재고가 소진될 때까지 반복
    while(true) {
        // 만약 재고가 0개라면 반복문을 나간다.
        if (remainStock == 0) {
            printf("\n%c[1;31m재고가 모두 소진되었습니다.%c[0m\n", 27, 27);
            break;
        }

        // 주문량 입력하기
        order = get_int("\n%c[1;32m주문량을 입력해주세요 : %c[0m", 27, 27);

        // 만약 주문량이 재고량보다 많다면 남아있는 재고량 알려주기
        if (order > remainStock) {
            printf("\n%c[1;33m현재 %d 개의 재고가 남아있습니다.%c[0m\n", 27, remainStock, 27);
        } else { // 주문량보다 재고량이 많다면
            remainStock -= order; // 남은 재고량에서 주문량 빼기
            priceForOrder = order*priceWithVat; // 매출액 계산하기
            salesTotal += priceForOrder; // 총 매출액 더해주기

            printf("\n주문건수 : %d 건\n", order);
            printf("기존 재고량 : %d 개\n", stock);
            printf("남은 재고량 : %d 개\n", remainStock);
            printf("총 매출액(부가세포함) : %.f 원\n", salesTotal);
        }
    }
    
    // main 함수 정상 종료
    return 0;
}

/*
    글씨 색 넣기 - 터미널에서 ESC 코드를 사용해서 글씨에 색을 넣어줄 수 있다.
    사용방법 : printf("%c[1;{색 코드 입력}m {출력할 문자 입력} %c[0m \n", 27, 27);
    27 을 넣는 이유 : 터미널에서 ESC 를 출력해야 하는데 아스키 코드 값(27) 을 사용해서 출력해준다.
*/

실행 결과

 

 

📌 문제 2

목표금액을 입력하게하고 그 금액에 대한 이자를 계산해서 더해주는 문제였다.
간단한 문제였기 때문에 함축적이기보다 풀어서 알아보기 쉽게 작성해보았다.

#include <stdio.h>
#include <cs50.h>

int main(void) {
    int principal = 0; // 목표금액
    double interest = 0; // 이자
    
    // 목표금액 입력
    principal = get_int("목표금액을 입력하세요(원) : ");
    // 이자 계산
    interest = principal * 0.012;

    printf("만기 금액 : %.0f 원\n", principal + interest);

    return 0;
}

실행 결과

 

 

📌 문제 3

요일마다 메뉴가 정해져있어 요일을 입력하면 메뉴가 나오는 문제였는데
어떻게 하면 정말 식당에서 사용하는 프로그램처럼 짤 수 있을지 고민해보았는데
아직 좋은 아이디어가 떠오르지 않아 간단하게만 작성해보았다.
반복문을 넣어서 더 추가할 예정이다.

#include <stdio.h>
#include <cs50.h>
#include <string.h>

int main(void) {
    // 포인터를 활용해 효율적으로 메모리 공간 사용
    // week 배열에는 월요일부터 일요일까지의 "요일" 값이 순서대로 들어있다.
    char *week[] = {"월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"};
    // food 배열에는 월요일부터 일요일까지의 "메뉴" 값이 순서대로 들어있다.
    char *food[] = {"청국장", "비빔밥", "된장찌개", "칼국수", "냉면", "소불고기", "오삼불고기"};

    // week 배열의 크기 구하기 - sizeof 사용, byte 단위로 출력한다.
    // sizeof(week) = 8 바이트 문자열 7개의 요소 포함 = 8 * 7 = 56
    // sizeof(week[0]) = 문자열 하나의 크기 8 바이트
    int length = sizeof(week) / sizeof(week[0]);
    
    // 요일 입력하기
    string dayOfWeek = get_string("요일을 입력하세요: ");

    // 반복문을 통해 week 배열의 크기만큼 반복한다.
    for(int i = 0; i < length; i++) {
        // 입력한 요일(dow)과 week 배열에서 같은 값이 있는 지 비교한다.
        if(strcmp(dayOfWeek,week[i]) == 0) {
            // 요일과 메뉴의 배열 위치가 같이 때문에 같은 위치의 배열값을 출력해준다.
            printf("%s: %s\n", week[i], food[i]);
        }
    }

    // main 함수를 정상적으로 종료하겠다는 뜻
    return 0;
}

/*
    strcmp() 함수는 문자열을 비교해
    ASCII 코드 기준으로 두 문자열이 같으면 0,
    ASCII 코드 기준으로 앞 문자열이 크면 1,
    ASCII 코드 기준으로 뒤 문자열이 크면 -1
    을 반환한다.
*/

실행 결과

 

추가적으로 cs50 라이브러리에서 string 을 지원해주기 때문에 string 2차원 배열을 통해서 값을 저장하고 배열안의 값을 통해 비교한 후 출력해주었다. cs50 라이브러리를 사용하면 string 타입의 문자열을 만들 수 없기 때문에 라이브러리를 통해서 비교적으로 쉽게 코드를 짤 수 있었다.

 

#include <stdio.h>
#include <cs50.h>
#include <string.h>

int main(void) {
    // 2차원 배열에 "요일"과 "메뉴"를 같이 넣어준다.
    // 요일 = menu[][0] , 메뉴 = menu[][1]
    // string 배열은 cs50.h 에 의해서 사용할 수 있다.
    string menu[7][2] = {
        {"월요일", "청국장"},
        {"화요일", "비빔밥"},
        {"수요일", "된장찌개"},
        {"목요일", "칼국수"},
        {"금요일", "냉면"},
        {"토요일", "소불고기"},
        {"일요일", "오삼불고기"}
    };
    
    // 요일 입력하기
    string dayOfWeek = get_string("요일을 입력하세요: ");

    for(int i=0; i<7; i++) {
        if(strcmp(dayOfWeek, menu[i][0]) == 0) {
            printf("%s: %s\n", menu[i][0], menu[i][1]);
        }
    }

    return 0;
}

/*
    strcmp() 함수는 문자열을 비교해
    ASCII 코드 기준으로 두 문자열이 같으면 0,
    ASCII 코드 기준으로 앞 문자열이 크면 1,
    ASCII 코드 기준으로 뒤 문자열이 크면 -1
    을 반환한다.
*/

실행 결과

 

마지막으로 생각보다 쉽게 코드를 짤 수 있었지만 어떻게하면 효율적인 코드를 작성할 수 있을지 어떻게 커스텀해서 재밌는 결과를 보여줄지 고민을 되게 많이 했던 것 같다. 그리고 최적화를 하기 위해서는 어떻게 코드를 변경해야할지 고민하면서 문제를 풀었던 것 같다.
더 공부하고 나서 지금 작성한 코드들을 다시 한 번 생각해봐야겠다.

728x90
반응형
복사했습니다!