ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mario | CS50 Week 1
    Computer Science/CS 50 Harvard 2021. 11. 7. 00:36

    Harvard CS50 강의를 한글로 정리한것입니다.

     

    이때까지 학습한 내용으로 블록을 프린트하는 간단한 프로그램을 만들어보자.

    Question Marks

    #include <stdio.h>
    
    int main(void)
    {
        printf("????\n");
    }

    조금더 발전시켜서, for loop을 이용해서 n만큼의 물음표를 프린트하게도 할 수 있다.

    #include <stdio.h>
    
    int main(void)
    {
        int n = 4;
        for (int i = 0; i < n; i++)
        {
            printf("?");
        }
        printf("\n");
    }

    네개의 물음표(?)들을 프린트하는 프로그램이다. 컴파일 후 실행시킬수 있다.

    > make mario_blocks
    clang     mario_blocks.c  -lcs50 -o mario_blocks
    > ./mario_blocks
    ????

    이번엔 유저에게 인풋을 받아서 그만큼의 물음표를 프린트 할 수 있다. do/while loop을 이용해서, n이 1보다 작다면 다시 물어보게끔 하면, 0 또는 negative(음수)를 입력한 경우, 다시 물어볼 수 있다.

    #include <cs50.h>
    #include <stdio.h>
    
    int main(void)
    {
        int n;
        do
        {
            n = get_int("Width: ");
        }
        while (n < 1);
    
        for (int i = 0; i < n; i++)
        {
            printf("?");
        }
        printf("\n");
    }

    do/while loop에 대해 조금더 자세하게 설명하자면, do 안쪽에 있는 동작을 한 후, while의 condition에 해당하는지를 체크한다. 만약 true이면 이 동작을 계속 하는것이다. n이라는 variable을 선언해두었고, get_int를 이용해서 유저의 input을 받는다. 즉, 유저가 타입한 숫자가 n에 저장되게 된다. 그리고 n이 1보다 작은지 체크를 한 후, 작다면 다시 do 안에 있는 동작을 반복하고, 아니면 for loop으로 이동해서 n개만큼의 물음표를 프린트한다.

     

    아래와 같이 컴파일 후에, 실행해보자.

    > make mario_blocks
    clang     mario_blocks.c  -lcs50 -o mario_blocks
    > ./mario_blocks
    Width: 0
    Width: -1
    Width: 8
    ????????

     

     

    Square Box

    이번에는 인풋을 받아서 n * n 사이즈의 #으로 이루어진 박스를 프린트해보자. 즉, two-dimensional set의 블록들을 nested loop을 이용해서 코딩해보자.

    #include <cs50.h>
    #include <stdio.h>
    
    int main(void)
    {
        int n;
        do
        {
            n = get_int("Size: ");
        }
        while (n < 1);
    
        // For each row
        for (int i = 0; i < n; i++)
        {
            // For each column
            for (int j = 0; j < n; j++)
            {
                // Print a brick
                printf("#");
            }
    
            // Move to next row
            printf("\n");
        }   
    }

    2개의 for loop이 엮어있는 nested loop이 있다. 바깥쪽, 즉 outer loopi를 이용하고 n 만큼의 동작을 반복한다. 안쪽, 즉 inner loopj를 이용하고, 역시 n만큼 어떤 동작을 반복한다. 다시 말하면 outer loop은 n개의 줄을 프린트하고 끝에 새로운 줄을 위해 new line("\n")을 붙여준다. inner loop에서는 n만큼의 # characters를 프린트해준다. 컴파일 후 동작시켜보자.

    > make mario_square
    clang     mario_square.c  -lcs50 -o mario_square
    > ./mario_square
    Size: 2
    ##
    ##
    > ./mario_square
    Size: 5
    #####
    #####
    #####
    #####
    #####

     

    do/while이 아니라, break를 사용한 while loop으로도 코딩해볼 수 있다.

    #include <cs50.h>
    #include <stdio.h>
    
    int main(void)
    {
        int n;
        while (true)
        {
            n = get_int("Size: ");
            if (n > 1)
            {
                break;
            }
        }
    
        // For each row
        for (int i = 0; i < n; i++)
        {
            // For each column
            for (int j = 0; j < n; j++)
            {
                // Print a brick
                printf("#");
            }
    
            // Move to next row
            printf("\n");
        }   
    }

    break를 이용하면 while loop에서 또는 for loop에서 중간에 나갈 수 있다. 만약 위 예시에 break가 없다면, loop은 정지 없이 끊임없이 돌기 때문에 프로그램은 원하는대로 동작하지 않을것이다.

     

     

    Reference

     

    'Computer Science > CS 50 Harvard' 카테고리의 다른 글

    mario stairs | CS50 Week 1  (0) 2021.11.07
    Imprecision, overflow | CS50 Week 1  (0) 2021.11.07
    Loops, functions | CS50 Week 1  (0) 2021.11.06
    Conditionals, Boolean expressions | CS50 Week 1  (0) 2021.11.06
    Calculations | CS50 Week 1  (0) 2021.11.06

    댓글

Designed by Tistory.