c언어에서 반복문은 3개가 있습니다. for, while, do while. 이 셋이 있는데요. 세 개를 차근차근 배워봅시다. 오늘은 그 중, 제가 백준이라는 사이트에서 제일 많이 쓴, for문을 알아보도록 하겠습니다.
for(s1;condition;s2)for_block
문법은 위와 같은데요. condition1에는 조건문이 들어갑니다. 예를 들자면 i>=0이라던지, i!=0이라던지. 보통, 저는 s2는 반복 변수를 증가시키는 용도, 예를 들어서 i++과 같은 용도로 많이 쓰고요. s1은 루프 변수 초기화를 위한 용도로 씁니다. 그리고 for문도 블록이 있는데요. 중괄호로 쓸 수 있어요.
이걸 대략적으로 그려보면, s1을 수행합니다. 다음에 condition이 참이면 for block을 수행하고 s2를 수행합니다. 언제까지 반복할까요? condition이 거짓일 때 까지 반복합니다. 이것만 보면 조금 어려울 듯 하니 3개의 예제를 보면서 이해해 봅시다.
먼저 한 줄에 하나씩 1부터 n까지를 순서대로 출력하는 것을 생각해 봅시다.
먼저, i = 1로 초기화를 할 거에요. 우리는 for block에서 어떤 일을 수행하면 될 거 같나요? i의 값을 출력하면 됩니다. 그러니까 for block에 print(i)를 넣어주면 될 거에요. C언어에서는 printf 함수로 처리할 수 있습니다.
그런데 i가 n보다 작거나 같다면, 계속 루프를 돌아야 할 겁니다. 그러면 condition에 무엇이 들어가야 할까요? i가 n보다 작거나 같다면이 들어가면 좋겠네요. 즉, i<=n이다라는 조건이 들어가면 됩니다.
그런데 이렇게만 작성하면 어떤가요? i의 값이 1로 고정이 되어 있고, n=10이라고 치면 i의 값이 Loop를 도는 과정에서 변하지 않아요. 따라서, 계속 루프를 돌겠지요. 그러면 어떻게 해야 하나요? i를 출력하고 나서 i의 값을 증가시켜야 합니다. 1을 출력하면, 그 다음에 출력해야 할 값이 2이기 때문입니다.
즉, i = i+1 문장을 s2에 넣어주면 됩니다. 이걸 그대로 코드로 옮겨 봅시다.
보시면 s1, 즉 문장 1의 자리에 int i=1이라는 것이, 문장2 자리에 i=i+1이 들어갔음을 알 수 있어요. 그리고 for문 블록에는 printf문이 들어갔고요. 그러면 거꾸로, n부터 1까지 출력하려면 어떻게 하는 게 좋을까요?
i가 1일 때에는 N을 출력해야 합니다. i가 2일 때에는 N-1을 출력해야 합니다. 규칙을 찾을 수 있나요? 같은 행에 있는 두 수의 합은 1+N임을 알 수 있어요. 즉, N+1-i의 값을 출력하면 된다는 것을 알 수 있어요.
그러면, for루프를 돌 때 마다, (N+1-i)를 출력하면 됩니다.
이것을 그대로 코드로 옮기면 다음과 같습니다. 다른 방법은 없을까요? i의 값을 N부터 1까지 감소시키는 겁니다. 그러면, 다음과 같이, 다시 그릴 수 있습니다.
보시면, i = n으로 초기화를 시킵니다. 그리고 i의 값이 1보다 크다면 Loop를 계속 돌립니다. 루프를 한 번 돌 때 마다, i의 값을 출력하고 i의 값을 하나 감소시킵니다. 그런 식으로 처리하면 n = 3일 때, i = 3으로 초기화가 먼저 될 거고요. 3을 출력하고 i값이 2가 되고, 2 출력하고 i 값이 1이 되고, 1 출력하고 i값이 0이 될 겁니다.
그런데 0이 된 순간 i>=1 조건과 맞지 않기 때문에 빠져 나오겠군요. 즉, 이렇게 그려도, n부터 1까지 출력합니다.
이것을 그대로 코드로 구현하면 위와 같습니다.
1단부터 9단까지 출력하는 구구단 프로그램을 만든다고 해 봅시다. 그러면 우리는 일단 반복 변수 i가 1부터 9까지 돌리면 될 겁니다. 즉 i<=9일 때 까지 돌리면 됩니다. 크게 보면요.
gugudan(i)는 i단을 출력하는 루틴입니다. 큰 그림만 그려보면 우리는 1단, 2단, 3단, 4단, ... , 9단을 출력해야 하니까, 큰 그림을 그려보면 i는 1부터 9까지 순차적으로 증가하면서 gugudan(i) 루틴을 진행하면 되겠죠. 이걸 코드로 구현해 보면 아래와 같습니다.
그러면 routin_gugudan만 생각해 봅시다. i단이 들어오면 어떻게 해야 하나요? i*1부터 i*2, ... , i*9까지 출력해 주어야 합니다. 그런가요? 그러면 i와 곱하는 수를 j라고 한다면 j 또한 1부터 9까지 변해야 합니다. 그런가요? 그러면 그림을 이렇게 다시 그릴 수 있어요.
조금 복잡해 보이는데요. 사실 gugudan(i)만 따로 떼어놓고 보면 j의 값을 1로 초기화 하고, j<=9인지를 판단해서, 그렇다면 i*j를 출력하고, j의 값을 하나 증가시켜 주면 됩니다.
이것을 코드로 구현하면 위와 같습니다. for문이 이중으로 중첩되었습니다. 예제 3개를 완전히 이해하실 수 있다면, C언어 for문을 이해하시는 데에는, 크게 문제 없을 듯 싶습니다.
'코딩 > C' 카테고리의 다른 글
c언어 do while문 : 반복문 루프를 최소한 1번 이상 수행한다. (5) | 2019.08.22 |
---|---|
C언어 while문 : 포문과 함께 많이 쓰인다. (8) | 2019.08.20 |
C언어 삼항 연산자 : 1줄로 정리되는 마법 (9) | 2019.08.14 |
c언어 if문 : 조건이 참이면 블록 안으로 들어간다. (2) | 2019.08.09 |
c언어 double형 vs float형 : 어떤 차이가 있을까요? (2) | 2019.08.06 |
최근댓글