티스토리 뷰

반응형

7-1 반복문이란?

 

"Hello World!" 메시지를 열 번 출력하고 싶다. 이럴 때 printf를 열 번 사용하면 된다. 하지만 이것은 효율적이지 못하다.

따라서 printf로 "Hello World!"를 한 번 사용하고, 열 번 반복해달라고 하는 방법이 있을 것이다.

이러한 형태의 명령을 내리기 위해서 사용하는 것이 반복문 혹은 루프(loop)문이다.

 

C언어는 세 가지 형태의 반복문을 지니고 있다.

while문 , do~while문 , for문 이 그 세가지이다.

 

 

7-2 while문에 의한 문장의 반복

 

while문은 반복을 위한 문장이다.

while문의 기본원리는 특정 조건을 주고 그 조건이 만족될 때까지 계속해서 반복을 시키는 것이다.

 

#include<stdio.h>

 

int main(void)

{

   int i=0;

 

   while(i<10)

   {

      printf("Hello World! \n");

      i++;

   }

}

 

위의 예제를 실행해보면 "Hello World!"가 열 번이 출력되는 것을 확인할 수 있다.

연두색 글배경색이 있는 곳이 '반복의 조건'을 나타내고,

하늘색 글배경색이 있는 곳이 '반복 내용'을 나타낸다.

즉, i<10을 만족할때까지는 중괄호 안에 있는 내용을 반복하라는 의미인 것이다.

 

처음에 i=0이었고, i++에 의해 1씩 증가가 되어서 10이 되는 순간에 루프를 빠져나오게 됨으로써

i가 0부터 9까지, 즉 10번 반복 실행이 일어나게 되는 것이다.

이래도 잘 모르겠다면... 다시 읽어보면서 돌려보시길.^^;;

 

만약에 while문 안에 i++라는 문장이 없다면 계속해서 반복 루프를 실행하게 될 텐데,

이를 '무한 루프에 빠졌다'라고 표현하다.

이러한 무한 루프에 빠지지 않기 위해서 반복의 조건이 어느 시점에 무너질 수 있도록 반복문을 적절히 구성해야 한다.

 

들여쓰기 - 코드의 가독성을 높이기 위해서, 좌측 여백으로부터 어느 정도 건너 띄어 쓰는 것을 말함

 

들여쓰기는 선택이 아니라 필수이다.

코드가 복잡해지면 질수록 가독성이 큰 문제가 되는데 이를 막기 위해 적절한 들여쓰기가 필요하다.

 

while문의 중괄호는 둘 이상의 문장을 묶기 위해 사용된다.

반복하고자 하는 문장이 하나인 경우에는 중괄호를 써도 그만, 안 써도 그만이다.

 

while(i<10)

   printf("Hello World! \n"),i++;

 

예를 들어 이렇게 표현할 수 있는데, 코드의 라인 수는 줄었지만 가독성이 상대적으로 떨어지므로 적절한 경우가 아니면

줄여쓰는 것도 하지 않는 것이 좋다.

 

while문의 이해와 무한 루프

 

while(1)

{

   printf("Hello World! \n");

   i++;

}

 

만일 반복의 조건자리에 1을 넣으면 어떻게 될까?

컴퓨터에서 0이 아닌 수는 모두 true로 인식하기 때문에 무한 루프에 빠지게 될 것이다.

확인해보도록.

 

순서도(flow chart) - 시간적 흐름의 관점에서 프로그램의 구성을 디자인할 때 사용하는 약속된 기호

 

 

연습문제 7-1

문제 1

 

문제 2

 

문제 3

!= 을 사용하는 것이 포인트!

sum 초기값을 0으로 지정해 주는 것도 포인트!

val의 초기값을 0이 아닌 걸로 지정해주는 것도 포인트!

 

문제 4

 

문제 5

여러번 실수 끝에 성공...ㅠ

마지막에 sum 값을 float형으로 명시적 형 변환을 해주는 것을 잊지말자. 만일 이를 해주지 않으면 정수/정수가 되어 나눗셈의

결과도 정수가 되어 소수 부분이 잘려나가게 된다.

sum에 초기값을 주어야 한다.

i++를 잊지 말자.

 

while문의 중첩

 

#include<stdio.h>

 

int main(void)

{

   int i=2;

   int j=0;

 

   while(i<10)

   {

       j=1;

      while(j<10)

      {

         printf("%d*%d=%d \n",i,j,i*j);

         j++;

      }

      i++;

   }

   return 0;

}

 

위의 예시는 구구단을 2단부터 9단까지 순서대로 출력하는 프로그램이다.

while문의 중첩을 사용함으로써 상당히 짧게 구현하였다.

 

 

연습문제 7-2

문제 1

아이디어 접근까진 비슷하였으나, 루프에 num=0을 추가하는 것을 생각하지 못해 엄청나게 헤맸다.^^;;;;;

아직 부족한 부분이 많구나.

 

문제 2

1번을 풀자마자 상승기세를 이용해서 풀어서 그런지. 생각보다 쉽게 해결할 수 있었다.

아이디어가 문제.

 

 

7-3 do~while문에 의한 문장의 반복

 

보통은 do~while문보다 while문을 많이 사용한다.

do~while문의 처리는 while문로도 가능하고, while문의 처리는 do~while문으로도 가능하다.

while문과 do~while문의 차이점

while문은 반복의 조건 검사를 앞에서 하지만, do~while문은 반복의 조건 검사를 뒤에서 한다.

따라서, while문은 조건이 만족되지 않으면 루프를 한번도 실행하지 않게 되지만, do~while문은 반드시 한번은 루프를 실행하게 되어 있다.

 

do{

반복 내용

}while(반복의 조건);   //일단 루프를 한번 실행 후, "반복의 조건"이 만족되는 동안 "반복 내용"을 반복 실행하라

 

형태로 만들어진다. 

 

#include<stdio.h>

 

int main(void){

   int total=0;

   int val=0;

 

   do{

      printf("숫자 입력 (0 to quit): ");

      scanf("%d", &val);

      total+=val;

      }while(val!=0);

 

   printf("Total : %d \n", total);

   return 0;

}

 

위의 코드는 사용자가 입력하는 수를 계속 더하다가 0을 입력받으면 종료되는 프로그램이다.

이 프로그램은 사용자로부터 숫자를 입력받고 난 다음에야 비로소 계속 진행을 할 것인지 말 것인지를 결정하게 된다. 따라서 루프를 최소한 한번은 실행해야 한다. 이러한 경우에는 do~while문을 사용하는 것이 while문을 사용하는 것보다 자연스럽다.

 

 

연습문제 7-3

문제 1

방법 1


 
방법 2


 
문제 2

 


 
문제 3

 


 
  

7-2 for문에 의한 문장의 반복

 

while, do~while문은 기본적으로 반복 조건 검사 문장만을 포함하지만, for문은 이것 외에도 변수의 초기화 연산과 증가 및 감소를 실행할 수 있는 두 개의 문장을 더 포함한다. 그래서 "for문은 초기문, 조건문, 증감문 이렇게 총 3개의 문장을 기본적으로 포함하고 있다."라고 표현한다.

 

초기문이란? while문과 같은 반복문에 들어가기 전에 필요로 하는 초기화 문장을 의미

증감문이란? 루프를 빠져 나오기 위해서 반복의 조건을 무너뜨리기 위한 문장을 의미

 

for(초기문 ; 조건문 ; 증감문){

반복하고자 하는 내용

}

 

형태로 만들어진다.

 

int i;

 

for(i=0 ; i<10 ; i++){

   printf("Hello World \n");

}

 

위의 코드는 "Hello World"를 10번 출력하는 코드이다.

i의 초기값이 0일때 한번, 1일때 한번, ,,, ,9일때 한번 돌고 10이 되면 조건을 만족하지 못해 빠져나오게 되어

0~9까지 10번 출력하게 된다.

(직접 돌려보면 이해가 더 쉬울 것!^^)

 

for문은 필요에 따라

 

for( ; input<=0.0 ; ){

}

 

for( ; ; ; ){

}

 

자리를 비우고 사용할 수 있는데,

첫번째의 경우 반복의 조건에 관련된 문장이 필요없을 때, 조건만을 따지려고 할 때 사용하고,

두번째의 경우는 조건문을 비워 무한루프를 돌리고자 할 때 사용한다.

(자리가 비었다고 오류가 나는 것이 아니니 꼭 알고 있을 것!)

 

연습문제 7-4

문제 1

 


 if문을 사용하면 첫 번째 수가 반드시 크지 않더라도 구현이 가능할 것이다. 하지만 조금 귀찮다^^;;; 


문제 2

 


 팩토리얼을 구현하는데 상당한 실수가 많았다. 무한루프를 구현함에 있어서는 별 문제가 없었지만, 한번 연산 후에 total을 0으로 다시 놓는다거나

i의 형을 지정을 안해준다던가 하는 사소한 실수들을 많이 하다가 성공했다. 자주 안하니까 실수가 많다;;


 

이번 장에서 공부한 내용 정리

 

1. while문, do~while문, for문에 대해서 살펴보았다.

2. 세 가지 형태의 반복문이 중첩될 수 있음을 살펴보았다. 이 책에서는 중첩되는 반복문의 종류를 동일하게 하였지만, 서로 다른 반복문이 중첩될 수도 있다. 즉 for문이 while문을 중첩시킨다거나, do~while문이 for문을 중첩시킨다거나 하는 것도 가능하다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함
반응형