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
을 반환한다.
*/
실행 결과
마지막으로 생각보다 쉽게 코드를 짤 수 있었지만 어떻게하면 효율적인 코드를 작성할 수 있을지 어떻게 커스텀해서 재밌는 결과를 보여줄지 고민을 되게 많이 했던 것 같다. 그리고 최적화를 하기 위해서는 어떻게 코드를 변경해야할지 고민하면서 문제를 풀었던 것 같다.
더 공부하고 나서 지금 작성한 코드들을 다시 한 번 생각해봐야겠다.
'스터디&교육 > 부스트코스 CS50 2기' 카테고리의 다른 글
부스트코스(Boostcourse) CS50 4주차 심화 과정 💎 생각해보기 (0) | 2021.02.03 |
---|---|
부스트코스(Boostcourse) CS50 3주차 심화 과정 💎 생각해보기 (0) | 2021.01.23 |
부스트코스(Boostcourse) CS50 2주차 C언어 - 문자열 (1) | 2021.01.15 |
부스트코스(Boostcourse) CS50 2주차 C언어 - C 언어 기초 (0) | 2021.01.13 |
부스트코스(Boostcourse) CS50 1주차 심화 과정 💎 생각해보기 (0) | 2021.01.13 |