모두를 위한 컴퓨터 과학(CS50 2019) <3>

구찌댕댕이·2022년 6월 14일
0
post-thumbnail
  • 사용자 정의 함수

    우리가 지금까지 사용하던 'get_int','get_string' 등의 함수는 우리가 직접 구현할 필요가 없었던 이유는 과거의 어떤 사람들이 모두 구현해두었기 때문이다.
    함수의 이름을 cough라고 정하고 cough 함수를 만들어 본다면, 먼저 void를 입력하고 원하는 함수명(cough)을 적은 뒤 괄호 안에 void를 적어준다.
    그리고 printf로 cough를 출력하는 코드를 작성한다.
    이제 int main(void)의 안에 cough(함수명)를 사용하면 우리가 정의해둔 대로 cough가 출력된다.
#include <stdio.h>

void cough(void);

int main(void)
{
    for (int i = 0; i < 3; i++)
    {
        cough();
    }
}

void cough(int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("cough\n");
    }
}
  • 중요한 main 함수가 아래에 있는 것보다 위에 있는것이 보기 좋지만, main 함수를 위로 올리고 cough 함수를 내린다면 오류가 발생한다.
    이 것을 해결하려면 다시 cough함수를 위로 올려야한다.
    하지만 함수를 1개가 아닌 여러개를 만들수록 main 함수는 아래로 내려가기 때문에
    void cough(void); 을 위에 적어 C를 속이는 방법을 사용한다.
    지금 cough함수를 정의하진 않았지만 이런 함수가 있다 라고 눈속임을 한후 main 이후 cough함수를 정의해 주어 오류를 해결한다.

  • 다른 예제를 통해 알아본다면

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

int get_positive_int(void);

int main(void)
{
    int i = get_positive_int();
    printf("%i\n", i);
}

int get_positive_int(void)
{
    int n;
    do
    {
        n = get_int("Positive Integer: ");
    }
    while (n < 1);
    return n;
}

여기서 get_positive_int 함수는 CS50라이브러리(cs50.h)에 없는 함수이다.
이 전에 사용했던 get_intget_string 함수처럼 어떤 값을 받아와서 변수에 저장하는 것처럼 이 함수도 어떤 값을 받아 뭔가를 반환하게 할 수 있다.
int get_positive_int(void) 에서 함수 왼쪽에 있는 단어(int)출력의 종류를 의미 하며, 괄호 안의 단어(void)입력의 종류를 뜻한다.
만약 입출력이 없다면 void를 적는다.
그리고 int n; 은 컴퓨터에게 n이라고 하는 변수를 달라는 일종의 힌트이며, 그 안에 어떤 값을 저장할지 아직 모르기 때문에 그냥 int n;만 적는 것이다.
그럼 n은 쓰레기 값(Garbage Value)이라고 부르는 값을 가지게 되며, 나중에 제대로 값을 넣으면 된다.
그 다음 int get_positive_int(void) 함수 안의 do-while의 루프가 있다.
이 불리언 표현 while(n<1);일때 다음을 수행하라는 뜻.
만약 n이 1보다 작다면 계속해서 질문을 반복하는 것이다.
while을 단독으로 사용하면 while의 조건이 참이어야만 수행을 하지만, do-while은 do에서 무조건 한 번은 먼저 수행한 후 불리언을 판단한다.

  • 중첩루프

    마리오 게임에서 흔히 보는 것 처럼 화면에 여러 개의 벽돌을 가로나 세로로 여러 개 이어서 출력하고 싶으면 어떻게 해야 할까?
#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int n;

    do
    {
        n = get_int("Size: ");
    }
    while (n < 1);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("#");
        }
        printf("\n");
    }
}
  • 먼저 int n; 으로 정수 값을 갖는 변수 n을 정의한다.
    그리고 do{ …}while()을 이용해서 while( )의 조건이 만족할때 까지 get_int 함수로 사용자의 입력값을 받아 n에 저장하여 원하는 사이즈의 값을 받는다.
    그리고 for 루프를 두 번 중첩해서 돌면서 “#”(벽돌)을 출력한다.
    첫 번째 루프에서는 변수 i를 기준으로 n번 반복하고, 그 안의 내부 루프에서는 변수 j를 기준으로 n번 반복한다.
    내부 루프에서는 “#”(벽돌)을 출력하고, 내부 루프가 끝날 때마다 줄바꿈을 수행한다.
    따라서 최종적으로는 가로가 n개, 세로가 n개인 “#”(벽돌)이 출력하게 된다.

출처 : https://www.boostcourse.org/cs112/joinLectures/41307

profile
개발자를 꿈꾸는 사람 입니당

0개의 댓글

Powered by GraphCDN, the GraphQL CDN