우리가 직접 작성한 코드는 "소스 코드"라고 불립니다. 이를 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
그릇 사이즈는 한계가 있는데 그 한계를 넘어버릴 때 나타나는 문제.
의사 코드
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;
}
의사 코드
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 );
}
의사 코드
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");
}
}
우리 팀은 각자의 코드를 올리면 팀원들이 리뷰해주는 방식으로 진행해보았다. 나의 코드에 대한 리뷰는 "함수를 사용해 가독성을 확보할 것"이었다. 사실 간단한 코드를 짤 때 함수를 굳이 사용해야 되나 라는 의문이 들었지만 함수를 사용한 팀원들의 코드를 보니 함수를 왜 사용해야되는지 한 눈에 알 수 있었다. 함수와 주석처리를 사용한 팀원들의 코드는 확실히 깔끔하고 이해하기 쉬웠다. 나의 코드를 나만 보는게 아니기 때문에 팀원들의 이해를 위해 함수 사용을 생활화하여 가독성과 효율성을 높이는 연습을 해야겠다.