[P4C] C언어 코딩 도장 : UNIT 32 ~ UNIT 33
Unit 32. 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"를 출력하면 된다.