Programming Languages/C

[P4C] C언어 코딩 도장 : UNIT 32 ~ UNIT 33

h4won 2021. 2. 21. 22:28

Unit 32. goto로 프로그램의 흐름을 원하는 대로 바꾸기

goto 제어문

goto 제어문 : 프로그램을 작성하다보면 중간의 코드는 무시하고 원하는 부분으로 건너뛰어야 할 때 사용한다.

 

 

32.1 goto와 레이블 사용하기

goto레이블을 지정해서 사용한다. 레이블은 : (콜론)을 붙이며 레이블 이름을 짓는 규칙은 변수와 같다.

 - goto 레이블;

 - 레이블:

 

goto에 레이블을 지정하면 중간에 있는 코드는 무시하고 해당 레이블로 즉시 이동한다.

 

 

32.2 중첩루프 빠져나오기

#include <stdio.h>

int main()
{
    int num1 = 0;

    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (num1 == 20)    // num1이 20이라면
                goto EXIT;     // 레이블 EXIT로 즉시 이동

            num1++;
        }
    }

EXIT:    // 레이블 EXIT
    printf("%d\n", num1);    // 20

    return 0;
}

위 코드에서 만약 break를 사용했다면, break를 두번 써줘야 했을 것이다. (break는 현재 루프만 끝내기 때문)

그런데 이때 goto를 사용하면 간단하게 빠져나올 수 있다.

위의 코드는 변수 num1이 20이 되면 goto를 사용하여 레이블 EXIT로 즉시 이동한다.

 

 

32.3 goto와 에러 처리 패턴

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int gender;      // 성별: 남자 1, 여자 2
    int age;         // 나이
    int isOwner;     // 주택 소유 여부: 자가 1, 전월세 0

    scanf("%d %d %d", &gender, &age, &isOwner);

    printf("안녕하세요.\n");
    printf("문을 연다.\n");

    if (gender == 2)
        goto EXIT;    // 에러가 발생했으므로 EXIT로 이동

    if (age < 30)
        goto EXIT;    // 에러가 발생했으므로 EXIT로 이동

    if (isOwner == 0)
        goto EXIT;    // 에러가 발생했으므로 EXIT로 이동
 
EXIT:
    printf("안녕히계세요.\n");    // 에러 처리 코드를
    printf("문을 닫는다.\n");     // 한 번만 사용함

    return 0;    // 프로그램 종료
}

위는 가상의 통지서가 있는데 이 통지서를 집집마다 방문하여 "자가 주택을 소유한 30대 남자"에게 전달하는 코드이다.

문을 열고 성별, 나이, 주택 소유 여부를 확인한 뒤 "자가 주택을 소유한 30대 남자"에 하나라도 해당하지 않는다면 인사를 한 뒤 문을 닫는다(프로그램의 실행도 끝냄). 

이때, goto를 사용하면 에러 상황 때 항상 실행해야 하는 중복 코드를 하나로 모을 수 있다.

-> 중복 코드를 없앨 수 있고, 코드의 의도도 좀 더 명확해진다.

 

 

Unit 33. FizzBuzz

FizzBuzz는 매우 간단한 프로그래밍 문제이며 규칙은 다음과 같다.

 - 1에서 100까지 출력

 - 3의 배수는 Fizz 출력

 - 5의 배수는 Buzz 출력

 - 3과 5의 공배수는 FizzBuzz 출력

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 100; i++)      // 1부터 100까지 100번 반복
    {
        if (i % 3 == 0 && i % 5 == 0)   // 3과 5의 공배수일 때
            printf("FizzBuzz\n");       // FizzBuzz 출력
        else if (i % 3 == 0)            // 3의 배수일 때
            printf("Fizz\n");           // Fizz 출력
        else if (i % 5 == 0)            // 5의 배수일 때
            printf("Buzz\n");           // Buzz 출력
        else
            printf("%d\n", i);          // 아무것도 해당되지 않을 때 숫자 출력
    }

    return 0;
}

즉, 1부터 100까지 숫자를 출력하면서 3의 배수는 숫자 대신 "Fizz", 5의 배수는 숫자 대신 "Buzz", 3과 5의 공배수는 숫자 대신 "FizzBuzz"를 출력하면 된다.