Post

[C] 순환문

이번 시간엔 순환문에 대해서 포스팅해보려고 합니다.

순환문(loop)

- for

- while

- do ~ while (현대 언어에서는 잘 안 쓰인다고 함.)

for 순환문 구문

Desktop View

for(①초기식; ②조건식; ④증감식){

③수행문;

..

}

①초기식 : 최초에 단한번 수행

②조건식 : 참 / 거짓 결과값

위 조건식의 결과가 ‘거짓’ 이면 for문 종료

③수행문 : 위 조건식이 ‘참’ 이면 수행

④증감식 : 수행문이 끝나면 증감식 수행

증감식이 끝나면 다시 ②조건식 으로..

순환문을 작성시 내가 만드는 순환문에 대해 다음을 확실하게 인지하고 작성해야 합니다.

1. 몇번 순환하는 가?

2. 순환중에 사용된 인덱스값의 시작값과 끝값은?

3. 순환문이 끝난뒤 인덱스값은?

특히 3번에서 순환문이 끝난뒤 인덱스값은 보통 고려를 안 하는데 이것까지 고려해야 for문이 끝나고도 이어지는 문장에 대해서 정확하게 계산할 수 있습니다.

for문 작성시 TIP:

  1. n번 순환 하는 경우 (즉 횟수가 촛점인 경우)

for(int i = 0; i < n; i++){ .. }

  1. a ~ b 까지 순환하는 경우 (즉 시작값과 끝값이 중요한 경우)

for(int i = a; i <= b; i++){ .. }

그리고 for문 안에서 선언된 int i 같은 경우는 지역변수기 때문에 for문 바깥에서는 쓰일 수 없습니다. 따라서 for문 후에도 사용하고 싶다면 for 문이 시작 되기 전에 선언을 하면 됩니다.

Desktop View

이런 식으로 말이죠.

그렇다면 for 문을 이용해서 구구단 2단을 출력 해볼까요?

printf를 사용해서 할 수 도 있지만 일일이 하는 비효율적인 방식은 프로그래머의 마음가짐이 아니겠죠?

for문을 사용하면 2줄 만에 가능합니다

Desktop View

이렇게 말이죠. 초기값 i는 1부터 시작합니다. 그리고 9까지 실행되며 따라서 실행횟수는 총9 번이죠.

한번 실행 될 때마다 i는 1씩 커지며 따라서 printf문의 마지막 %d(2*i) 는 2의배수로 출력이 될것입니다.

Desktop View

출력이 잘 되었네요!

이제는 for문으로 구구단이 아닌 1~n 까지의 누적합을 구해볼까요?

예를 들어 1~100까지의 누적 합을 구한다고 해보죠 그렇다면

Desktop View

자 먼저 n=100이니까 초기값을 설정하고 이 누적합을 담을 그릇 sum을 선언했습니다.

저번에 말씀드렸다시피 +=는 누적연산자로서 i 가 1이 된다면 sum 초기값 0에서 1을 더하고 그 수를 sum에 대입하죠. 그 다음에 i가 2가 된다면 기존 누적된 값1에 2를 더하고 저장하고… 이런식으로 100까지 진행하게 됩니다.

그리고 중요한것은 printf문을 for문이 바깥에 두어 총 합산을 한번만 출력하도록 해보았습니다.

Desktop View

값이 잘 나오죠? 재밌네요!

while 순환문 구문

while 문은 조건식이 ‘참’인 동안 while 블럭을 반복합니다.

형식은

while(조건식){ ….. }이 되겠네요. 그리고 중요한 것은 while문과 for문은 100%호환이 가능합니다. 따라서 while 문으로 만든 것은 for문으로 만들 수 있고 그 반대도 성립하게 되죠. 그렇다면 전에 for문으로 만든 구구단을 while 문으로 만들어 보겠습니다.

Desktop View

while 문으로 만들어보았습니다. for 문과 다른점은 조건식에는 조건만 넣을 수 있어서 i의 선언이라던지 i의 증감식은 따로 적어야 합니다.

순서는 위에서 아래대로 i가 10보다 작으면 printf문과 i++문을 실행하게 됩니다. 그리고 i가 10이 되는순간 조건식에 부합하지 않아 while문을 빠져나오겠지요.

Desktop View

잘 출력이 됩니다!

중첩 순환문( nested-loop)

중첩 순환문이란, 순환문 안에 존재하는 순환문을 말합니다.

이를 이용하면 더 복잡한 구조의 문장을 간단하게 만들 수 있죠.

예를 들어, 순환문을 한개만 쓸 때에는 구구단을 2단 밖에 못만들었지만 중첩 순환문을 사용하면 구구단 전체를 만들 수 있습니다.

Desktop View

제가 한번 만들어 보았는데요, 한번 자세히 살펴봅시다.

먼저 첫번째 for문에 들어오면 i는 2로 되어있겠네요 그리고 두번째 for문으로 들어갑니다. 따라서 첫번째 for문이 한번 순환이 되려면 두번째 for문을 빠져나와야하는데, 그러면 두번째 for문 전체가 순환 되고 그다음에 첫번째 for문이 한번 순환 되겠죠? 따라서 두번째 포문이 전체 순환 될때까지 i는 2값으로 고정됩니다. 그 상태에서 j 만 1부터 9까지 10번 실행되죠. 그래서 2단이 다 만들어지고 그다음에 i가 1증가하여 3이 되면 또 두번째 for문으로 가서 전체를 실행하고… 이런식으로 9단까지 만들어지는 겁니다.

Desktop View

이런식으로 길게 9단이 다 나왔습니다! 정말 편리하죠?

Break 와 Continue

Break: 순환문 안에서 break를 만나면, 자기를 감싸는 가장 가까운 순환문을 종료합니다.

Continue: 순환문 안에서 continue를 만나면, 자기를 감싸는 가장 가까운 순환문 으로 돌아갑니다.

중요한 것은 ‘순환문’을 종료해야 한다는것! 저는 처음에 할때 if 문 안에 있는 break인데 왜 for문을 빠져나가는지 ㅋㅋㅋ 바보같았죠.. 조건문이 아닌 순환문! 기억합시다!

Desktop View

예시를 가져왔습니다. for문에서 ()안에 조건문에 두번째가 비었네요? 이런 경우 항상 참으로 무한번 반복하게 되죠.. 그렇지만! if 문 안에 i가 7의 배수가 될 때, break로 for문을 종료 할 수 있습니다. 그렇다면 i 는 6까지만 출력이 되겠죠?( printf문이 if문 보다 뒤에 있으므로)

Desktop View

역시! 재미있네요!

반대로 continue도 봅시다.

Desktop View

이것은 무엇일까요? i 는 0부터 시작합니다. 들어가자마자 ++로 1이 증가되는군요. 그리고 조건문에 걸립니다. 조건은 2의 배수, 즉 i가 2의 배수가 된다면 continue를 실행하게 되어 가장 가까운 조건문으로 돌아갑니다. 따라서 2의 배수일때에는 printf문으로 가지 않고 다시 while문의 처음으로 돌아가게 되죠. 그렇다면 i 는 0부터 10까지인데 출력은 어떻게 될까요? 맞습니다! 2의 배수는 건너 뛰고 홀수만 남게 되겠죠. 한번 볼까요?

Desktop View

자~ 잘 출력이 되었네요 ㅎㅎ

Do~ While 순환문 구문

dowhile문은 요즘에 잘 안쓰인다고 해요 그래도 배웠으니 포스팅을 해봅시다~

Desktop View

제가 while 문과 dowhile문을 만들었는데요, 둘의 차이가 무엇일까요?

while 문과 dowhile문 조건이 둘다 i<0이네요 따라서 초기값이 1로 설정된 i로 실행을 하면

그냥 while문은 실행되지 않습니다. 조건에 맞지 않거든요. 따라서 printf문은 실해오디지 않고 “while 수행중” 이라는 글자도 출력되지 않겠죠.

하지만 dowhile문은 다릅니다. 일단 do! 하는겁니다. 그리고 while의 조건을 대입하고 맞으면 다시 실행하는 거죠 따라서 조건에 맞지 않아도 한번은 실행이 된다.. 그게 dowhile문 입니다.

Desktop View

보이시는 것처럼 do~ while 수행중이라는 printf문만 실행이 되었네요!

오늘은 loop, 순환문에 대해서 알아보았습니다!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.