본문 바로가기
기획자 댜니의 뒤처지지 않기/컴퓨팅 사고력

부스트코스 CS50 | 3주차 배열 학습 기록

by 알 수 없는 사용자 2021. 2. 1.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

3주차 배열 공부한 것 복습차원에서 학습 기록 시작합니다! 3주차엔 팀미션이 꽤 어려워서 새벽까지 삽질을 계속 했었습니다. 샘플미션 비교하면서 코드분석하고 팀원들에게 도움을 요청하고 그렇게해서 완성! ㅠㅠ 하고나니 뿌듯했던 이 맛에 코딩하는 거죠!

 

지금은 코칭스터디 2기 모집이 끝났지만 부스트코스에서 CS50 컴퓨터 과학 외의 다양한 IT 강의를 무료로 들을 수 있으니 관심 있으신 분들은 아래 링크를 클릭해주세요!

www.boostcourse.org/

CS50 컴퓨터 과학 학습 기록


1. 오늘 새로 알게된 내용

컴파일링 4단계:

  • 전처리(Precompile) : #으로 시작되는 C소스 코드는 전처리기에서 실질적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려줌
  • 컴파일(Compile): 컴파일러라고 불리는 프로그램은 C코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일, 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만들어 줌
  • 어셈블(Assemble): 어셈블리 코드를 오브젝트 코드로 변환
  • 링크(Link): 여러 개의 파일로 이루어져 있는 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐줌 

문자열(string)이 메모리에 저장되는 방식:

  • 문자(char)의 배열로 저장된다
  • 문자열의 각 문자는 메모리상에 연이어서 저장된다
  • 문자열의 끝에는 널(NUL) 종단 문자가 포함된다.

 


2. 공부를 하며 고민한 내용

팀미션의 난이도가 높다하여 의사코드로 먼저 작성해보는 연습을 가지려고 했다. 우선 아래와 같이 문제를 내 생각 위주로 분석해봤다

 

 

> 문제 분석

1) 문제: 학점 계산하기

2) 지시문:

[글자색상 의미: (필요 데이터 및 기능) (내가 생각한 지시문 해석) (이해가 필요한 부분)]

  • 학생의 점수학점을 구하는 프로그램 작성
  • 키보드에서 입력받은 성적 (0~100점)의 유효성 체크
    • '성적을 입력하세요 (0~100) : {사용자가 값입력하는 곳}' 필요
    • 유효성 체크: 0 <= 성적 <= 100 (범위에 따른 if문 필요)
    • 만약 120 입력시(범위를 초과함)엔 '성적을 올바르게 입력하세요! 범위는 0 ~ 100 입니다' 출력 
  • 학점은 배열을 이용하여 초기화 (문제상 '학점 테이블' 제공)
  • 학점은 "학점" 과 같이 계산하는데, 반드시 "학점 테이블"을 사용하여 계산하고, 학점도 "학점 테이블"의 내용을 출력 (학점 테이블을 이용하여 학점 계산하고 학점테이블 내용을 출력함)
  • 성적을 입력하여 계속 학점을 구하며(루프문 필요 while or for) 특별한 문자인 "999"를 입력하면 프로그램 종료
    프로그램 시작시 안내문 필요

 

왜 어렵다고 한지 알것같다. 우선 지금까지 배운 코드를 사용해서 어떻게 구현해야 하는거지...막막했다. 결국 모든 코드를 완벽하게 구현하지 않아도 된다는 공지글이 올라왔다. 협업의 중요성을 강조하여 팀원들과 협력하여 의사코드만으로 작성해도 좋다는 말도 덧붙여져 있었다. 그래서 우선 내방식의 의사코드를 작성했다. (나만 알아볼수 있게 짠거라 다른 사람은 못 알아볼 수 있다..)

 

 

> 내 방식의 의사코드

라이브러리 호출

아래 출력
main

학점 프로그램
종료를 원하면 "999"를 입력
[학점 테이블]
점수:
학점:

성적을 입력하세요 (0~100) : {사용자가 값입력하는 곳}

while 입력한 값 != 999
{
    유효성 체크 if 0 <= 성적 <= 100 {
        //학점은 학점 테이블 범위와 입력한 성적과 매칭해 공식을 세운다
        
    } else if {
        '성적을 올바르게 입력하세요! 범위는 0 ~ 100 입니다'
    }
    printf("학점은 %s 입니다.\n", grade);

    //grade 구하는 공식
    필요인자: 사용자입력값, 학점테이블, 기준이되는성적
    if (입력값 >= 성적) {
        해당성적 인덱스의 학점 불러오기
    }
    
}

 

2주차까지 배운내용을 토대로 대충 어떻게 코드를 짤지 설계한 후, 팀톡방에서 팀원들이 어떻게 짰는지 이야기를 들어봤다.

그 중 샘플미션(팀미션수행에 도움이 되도록 제공한 참고용 미션)을 활용하여 구현한 분이 있어 나도 샘플미션을 확인하고 더 생각을 해보려고 한다. 샘플미션 답안지에 코드별 설명 주석이 없어 아쉽지만... 문제지와 비교하면서 공부하면 되겠지...

 

그렇게 해서 만든 1차 코드를 거쳐 최종적으로 아래와 같이 코드를 짜게되었다.

 

 

> 최종_최종_최종.c

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

const int SCORES[9] = {95, 90, 85, 80, 75, 70, 65, 60, 0};   //학점의 기준점 성적 
const char *GRADES[9] = {"A+", "A ", "B+", "B ", "C+", "C ", "D+", "D ", "F "};   //학점 명칭
char* calculateGrade(int answer, const int scores[], const char *grades[]);

int main(void) {
    printf("학점 프로그램\n종료를 원하면 \"999\"를 입력\n[ 학점 테이블 ]\n");
    printf("점수 : ");
    for (int i=0; i<9; i++) {
        printf("%d    ", SCORES[i]);
    }
	printf("\n학점 : ");
    for (int i=0; i<9; i++) {
        printf("%s    ", GRADES[i]);
    }

int k = 0;  //while문 key

    while(k != 999) {      //“999” 를 입력하면 프로그램을 종료
        int answer = get_int("\n성적을 입력하세요 (0 ~ 100) : ");
        k = answer; 

            if (answer >= 0 && answer <= 100){    //입력받은 성적 (0 ~ 100 점) 의 유효성을 체크
                char *grade = calculateGrade(answer, SCORES, GRADES);
                 printf("학점은 %s 입니다.", grade);
            } else if (answer == 999) {

                printf("학점 프로그램을 종료합니다.\n");
                return 0;

            } else {
                printf("성적을 올바르게 입력하세요! (0 ~ 100)\n");   //틀림을 알림
            } 
            continue;
    }

}

char* calculateGrade(int answer, const int scores[], const char *grades[]) {
	char *grade;

        grade = malloc(2); // 명시적으로 2bytes memory를 allocation

        for (int i = 0; i < 9; i++) {
            if (answer >= scores[i]) {
            strcpy(grade, grades[i]);
            break;
            }
        }

        return grade;
}

 

코드 실행 결과

 

샘플미션을 보고 부족한 부분을 채워서 코딩한 것이라, 앞으로 더 공부해야할 영역이 생겼다.

  • 포인터 변수
  • 동적 메모리 할당
    • 메모리 누수를 방지하고자 동적으로 할당한 메모리를 해제해주는 코드

 


3. 도움이 될 만한 내용, 자료

포인터가 뭐고 왜 쓰는건가요?

youtu.be/u65F4ECaKaY


4. 회고

CS50 강의를 들으면 들을수록 참 좋은 강의인 것 같다. 이전에 파이썬 등을 독학할 때는 '이론 반, 추론 반' 으로 공부했는데, 확실히 소프트웨어의 동작이라던지 기초를 알기 쉽게 설명해준다. 버그가 진짜 버그(곤충)때문에 생긴 말인지는 처음 알았을 정도였으니 ㅎㅎ 평소에 자주쓰던 용어들의 개념과 원리를 돌아보게된다.  

 

코칭스터디의 팀미션은 어느정도 코딩을 할 줄 아는 나에게는 문제지와 비교하며 샘플미션의 의도를 파악하는 건 무리는 아니지만, 이제 막 개발자의 꿈을 가지고, 컴퓨팅 사고력을 기르려고 기초강의를 듣는 학생들에겐 좀 무리인 미션으로 여겨져 안타까웠다... 다행히 많은 부스터들이 의견을 제시하고 운영진이 이를 반영하려고 노력하는 것 같다. 힌트도 주신다고 하니 4주차 미션이 기대된다.

댓글