-
[알고리즘/C언어] 구구단 출력을 goto문으로 해보자 (정보처리기사, 실기)Algorithm 2019. 5. 23. 00:03
#include <stdio.h> int main() { int i, j, k; for (i = 2; i <= 9; i++) { for (j = 1; j <= 9; j++) { k = i * j; printf("%2d * %2d = %2d \n", i, j, k); } printf("-----%d단 종료---- \n", i); } printf("---구구단 종료--------- \n"); printf("%2d * %2d = %2d \n", i, j, k); system("pause"); return 0; }
그니까 문제는 이거다.
C언어를 배우던 자바스크립트를 배우던 for문 공부할 때 제일 흔하게 나오는 예제가 구구단 출력이고
이중 for문 사용하여 구구단 출력은 아주 마르고 닳도록 해봐서 눈 감고도 숨쉬듯이 흘러나오는데,
막상 이게 알고리즘 Flow chart로 나오면 순간 숨이 턱 막히면서 이게 뭐지.. 싶은거다.ㅋㅋㅋㅋㅋ
물론 뜯어놓고 보면 그게 그건데 괜히 헷갈리고 눈에 잘 안들어온단 말이다.
그래서 정리를 해보려고 한다.
for문으로 만든 코드를 Flow chart로 그려보면 다음과 같이 그릴 수 있다.
그림을 자세히 보면 i = i + 1;연산과 J = J + 1; 연산을
마지막에 하는 모습을 확인할 수 있다.
그러니까 for문과 똑같은 방식이다.
구구단은 2단부터 9단 / 각 단은 1부터 9까지의 숫자를 곱하는데,
2단부터 시작하니까 i의 초기값을 2, 1부터 곱하니까 J의 초기값을 1로 정한다.
좀 더 이해하기 쉽고 직관적이다.
그리고 곱셈 연산 끝난 후에 J에 1을 증가시키고
9까지 모두 곱해서 2단 연산을 끝낸 후 i를 1 증가시킨다.
이 방식의 특징은 연산을 다 끝낸 후, i와 J의 값이 10이 되어 나온다는 점이다.
나는 2단부터 9단, 1부터 9까지 더했는데,
연사을 다 끝내고 나서 9가 아닌 10이 찍혀서 나온다.
왜냐면 위에서 말했듯이 i와 j가 연산을 다 끝낸 후 1 증가되기 때문이다.
#include <stdio.h> int main() { int i, j, k; i = 2; AA: if (i <= 9) { j = 1, k = 0; BB: if (j <= 9) { k = i * j; printf("%2d * %2d = %2d \n", i, j, k); j = j + 1; goto BB; } printf("-----%d단 종료---- \n", i); i = i + 1; goto AA; } printf("---구구단 종료--------- \n"); printf("i=%2d, j=%2d, k=%2d \n", i, j, k); system("pause"); return 0; }
goto문으로 써보면 이런 식으로 쓸 수 있겠다.
실행결과를 보면 i와 j가 10이다.
이제 사람들은 의문을 가지게 되었다.
9단까지 연산했으면 9라는 값을 가지고 빠져나가게 할 순 없을까?
그래서 먼저 i와 j의 값을 증가시키고 후에 연산을 하는 방식을 생각해냈다.
그러니까 Flow chart로 표현해보면 이렇다.
(아래 3가지 그림은 모두 같은 내용을 다른 방식으로 표현한 그림이다.)
[1] i, J, K를 선언한다.
[2] i의 초기값으로 1을 할당한다.
[3] i에 1을 더한다. (2단부터 시작하니까)
[4] J와 K의 초기값은 0이다. (J는 i에 곱할 1부터 9까지의 숫자를 담을 변수 / K는 i와 J의 곱을 담을 변수)
[5] J에 1을 더한다.
[6] i와 J를 곱하여 K에 할당한다.
[7] J가 9보다 작은지 판별한다. -> 작으면 5번으로 이동 / 크면 8번으로 이동
[8] i가 9보다 작은지 판별한다. -> 작으면 3번으로 이동 / 크면 9번으로 이동
[9] 종료
2단부터 시작하지만 i의 초기값을 2가 아닌 1로 설정하고
하나 증가시킨 후에 다음 과정으로 넘어간다.
j의 값도 마찬가지.
이렇게 코드를 짜면 반복이 종료되고 i와 j의 값은 10이 아닌 9가 출력된다.
#include <stdio.h> int main() { int i, j, k; i = 1; AA: i++; // i = i + 1; j = 0, k = 0; BB: j++; // j = j + 1; k = i * j; printf("%2d * %2d = %2d \n", i, j, k); if (j < 9) { goto BB; } printf("-----%d단 종료---- \n", i); if (i < 9) { goto AA; } printf("---구구단 종료--------- \n"); printf("i=%2d, j=%2d, k=%2d \n", i, j, k); system("pause"); return 0; }
위 Flow chart를 C언어 goto문으로 표현하면 이렇게 표현된다.
실행결과를 보면 i와 j의 값이 9이다.
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/C언어] 수열의 합 알고리즘(5) / Sum = (1 * 10) + (2 * 9) + (3 * 8) + ... + (10 * 1) (정보처리기사, 실기) (0) 2019.05.24 [알고리즘/C언어] 수열의 합 알고리즘(4) / 합과 차 반복 (정보처리기사, 실기) (0) 2019.05.24 [알고리즘/C언어] 수열의 합 알고리즘(3) / 계차수열의 합 (정보처리기사, 실기) (0) 2019.05.20 [알고리즘/C언어] 수열의 합 알고리즘(2) / for문, while문, do-while문, goto문 (정보처리기사, 실기) (0) 2019.05.19 [알고리즘/C언어] 수열의 합 알고리즘 (정보처리기사, 실기) (0) 2019.05.13 COMMENT