부스트코스 CS50 코칭스터디2기 2주차

C언어

컴파일러

우리가 직접 작성한 코드는 "소스 코드"라고 불립니다. 이를 2진수로 작성된 "머신 코드"로 변환해야 컴퓨터가 이해할 수 있습니다. 이런 작업을 컴파일러라는 프로그램이 수행해줍니다.

소스 코드 -> << 컴파일러 >> -> 머신코드

샌드박스 명령어

$ clang hello.c

clang이라는 컴파일러로 hello.c라는 코드를 컴파일하라는 의미. 그 결과 a.out이라는 파일 생성

$ ./a.out

./ 명령어를 통해 a.out 프로그램 실행 (./에서 .은 현재 폴더를 나타냄)

$ clang -o string string.c -lcs50

여기서 -o string은 string.c를 string.out이라는 머신코드로 저장하도록 하는 명령어 -lcs50은 "link"라는 의미를 지닌 -l이라는 인자에 우리가 추가로 포함한 "cs50"파일을 합친 것. 이를 통해 컴파일시 cs50 파일을 연결하도록 알려줄 수 있다.

다소 복잡한 이런 과정 대신에, 아래 make 명령어를 통해 간단하게 컴파일을 수행할 수도 있다.

$ make string

CS50 라이브러리 내의 get 함수

  • get_char
  • get_double
  • get_float
  • get_int
  • get_long
  • get_string

형식 지정자

  • %c : char
  • %f : float,double
  • %i : int
  • %li : long
  • %s : string

오버플로우

그릇 사이즈는 한계가 있는데 그 한계를 넘어버릴 때 나타나는 문제.

팀미션 👩🏻‍💻

1. 재고량과 매출액을 구하는 문제

의사 코드
1 주문건수를 입력받는다
2 기존 재고량에서 주문 건수를 빼 남은 재고량을 구한다
3 남은 재고량이 0보다 작으면
4 남은 재고량에 맞게 입력해주세요를 출력한다
5 그렇지 않으면
6 수박가격에 부가세를 더한 값에 주문 건수를 곱한 후 기존의 매출액에 현재 매출액을 더한다
7 기존 재고량을 남은재고량으로 초기화한다
8 남은 재고량이 0 보다 크다면
9 1번째 줄로 돌아간다
10 그렇지 않으면
11 종료한다

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

// 주문시 재고를 감소시켜준다.
int order(int product, int count){
	product = product - count;
	return product;
}

// 판매량을 계산한다.
int getSalesRate(int price, int count){
	return price*count;	
}

// 부가가치세를 계산한다.
int getTax(int amount){
	return amount / 10;
}

// 오늘 하루 총 매출량에 대한 정보를 프린트해준다.
void printTodayCalculate(int orderCount, int originalCount, int afterOrderCount, int amount){
    printf("---------------------------------\n");
    printf("주문 건수 : %i\n", orderCount);
    printf("기존 재고량 : %i\n", originalCount);
    printf("남은 재고량 : %i\n", afterOrderCount);
    printf("매출액(부가세 포함): %i\n", amount);
    printf("---------------------------------\n");
    
    if(afterOrderCount == 0){
        printf("********************\n");
        printf("**** sold out ! ****\n");
        printf("********************\n");
    }
}

// 남은 재고량과 주문량을 비교하여 주문 가능한지 확인한다
bool validOrderCount(int remainStock, int orderCount){
	if(remainStock < orderCount) return true;
	else return false;
}

int main(void){
	int originalStock = 5;
	int watermelonePrice = 10000;
	int orderCount;
	int amount;
	int tax;
    int totalPrice = 0;
	int remainStock = originalStock;

	while(remainStock > 0){
        orderCount = get_int("주문시킬 양을 입력해주세요 : ");
		if(validOrderCount(remainStock, orderCount)){
			printf("주문량이 재고보다 많습니다 . 다시 주문해주세요 :  ");
			
		}else{
			remainStock = order(originalStock, orderCount);
			amount = getSalesRate(watermelonePrice, orderCount);
			tax = getTax(amount);
            totalPrice += amount + tax;
            printTodayCalculate(orderCount, originalStock, remainStock, totalPrice);
            originalStock = remainStock;
		}
	}
	
	return 0;
}

2. 예금액을 구하는 문제

의사 코드
1 예금할 금액을 입력받는다
2 예금할 금액과 예금할 금액에 1.2를 곱한값을 출력한다
3 종료한다

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

int main(void)
{
    double myMoney = get_double("예금할 금액 : ");
    double totalMoney = myMoney * 12;
    printf("매달 %0.f원씩 1년 동안 저금할 경우 받게 되는 금액은 %0.f원 입니다.\n", myMoney, totalMoney * 1.2 );
}

3. 요일별 메뉴를 출력하는 문제

의사 코드
1 요일을 입력받는다
2 만약 요일이 월요일이라면
3 월요일 : 청국장을 출력한다
4 그렇지 않고 요일이 화요일이라면
5 화요일 : 비빔밥을 출력한다
6 그렇지 않고 요일이 수요일이라면
7 수요일 : 된장찌개를 출력한다
8 그렇지 않고 요일이 목요일이라면
9 목요일 : 칼국수를 출력한다
10 그렇지 않고 요일이 금요일이라면
11 금요일 : 냉면을 출력한다
12 그렇지 않고 요일이 토요일이라면
13 토요일 : 소불고기를 출력한다
14 그렇지 않고 요일이 일요일이라면
15 일요일 : 오삼불고기를 출력한다
16 종료한다

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

int main(void)
{
    string answer = get_string("요일을 입력하세요 : ");

    if(strcmp(answer, "월요일") == 0){
        printf("월요일 : 청국장\n");
    }
    else if(strcmp(answer, "화요일") == 0 ){
        printf("화요일 : 비빔밥\n");
    }
    else if(strcmp(answer, "수요일") == 0){
        printf("수요일 : 된장찌개\n");
    }
    else if(strcmp(answer, "목요일") == 0){
        printf("목요일 : 칼국수\n");
    }
    else if(strcmp(answer, "금요일") == 0){
        printf("금요일 : 냉면\n");
    }
    else if(strcmp(answer, "토요일") == 0){
        printf("토요일 : 소불고기\n");
    }
    else{
        printf("일요일 : 오삼불고기\n");
    }
}

회고 ✍🏻

우리 팀은 각자의 코드를 올리면 팀원들이 리뷰해주는 방식으로 진행해보았다. 나의 코드에 대한 리뷰는 "함수를 사용해 가독성을 확보할 것"이었다. 사실 간단한 코드를 짤 때 함수를 굳이 사용해야 되나 라는 의문이 들었지만 함수를 사용한 팀원들의 코드를 보니 함수를 왜 사용해야되는지 한 눈에 알 수 있었다. 함수와 주석처리를 사용한 팀원들의 코드는 확실히 깔끔하고 이해하기 쉬웠다. 나의 코드를 나만 보는게 아니기 때문에 팀원들의 이해를 위해 함수 사용을 생활화하여 가독성과 효율성을 높이는 연습을 해야겠다.

좋은 웹페이지 즐겨찾기