레이블이 문법인 게시물을 표시합니다. 모든 게시물 표시
레이블이 문법인 게시물을 표시합니다. 모든 게시물 표시

2015년 5월 18일 월요일

C/C++ 의 do ~ while 반복문

 반복문에 사용되는 do~while 의 문법은 다음과 같다.

do {
   실행문;
   ...
} while(조건문);

while문과 차이점은 실행문이 처음에 한번은 무조건 실행된다는 것이다. 그 이후 while 뒤의 조건문을 체크하여 참이면 do 블럭을 다시 수행하고 거짓이면 그대로 반복을 종료한다.  초보자가 주의할 점은 while()문 뒤의 세미콜론을 빠뜨리기 쉽다는 것이다.
 다음이 do-while문의 예인데 1부터 100까지의 합을 구하는 것으로서 결과는 앞의 예제들과 같다.

int ia=1, isum=0;
do {
   isum += ia;
} while(ia++ < 100);

while 뒤의 조건문을 잘 파악하면 ia가 1부터 정확히 100까지 do 블럭을 반복한다는 것을 알 수 있다.

 다른 예를 들어보자.

#include <stdio.h>
int main() {
   int ia;
   printf(“Input a positive integer : “);
   do {
       scanf(“%d”, &ia)
   } while(ia<=0);
}

이 예는 사용자가 양의 정수를 입력할 때 까지 do 블럭 안의 scanf()함수를 실행한다.  왜냐면 0이나 음수를 입력하면 while 문 뒤의 조건문이 참이 되어 do 블럭을 다시 수행하기 때문이다. 양수가 입력되면 반복문이 종료된다.



C/C++ 의 while 반복문

 while 반복문은 for문에 비해서 구조가 간단하다.

while (조건문) {
   실행문1;
   …
   실행문n;
}

while 명령 바로 다음에 오는 조건문이 참이면 중괄호 안의 명령어들이 수행되고 거짓이라면 while 문을 빠져 나가게 된다. 만약 조건이 참이어서 실행문들이 다 수행되고 난 후에는 다시 조건문을 검사하여 참이면 다시 수행한다.

 조건문이 참이면 소속된 실행문을 수행하므로 다음 예는 무한 루프에 빠지게 된다.

while (1) {
printf(“hi\n”);
}

반면에 다음과 같은 반복문은 절대로 수행되지 않는다. 조건이 항상 거짓(0)이기 때문이다.

while (0) {
printf(“bye.\n”);
}

화면에 문자열 “hi”가 딱 10 번만 출력 되게 하려면 다음과 같이 외부 변수를 이용해야 할 것이다.

int icnt = 0;
while (icnt < 10) {
   printf(“hi\n”);
   icnt++;
}

위의 프로그램은 다음과 같이 조금 더 간략하게 작성할 수 있다. while 반목문에 속한 실행문이 하나일 경우 중괄호를 생략할 수 있다.

int icnt = 0;
while (icnt++ < 10)
printf(“hi\n”);

 다음 예제는 1부터 100까지의 합을 구하는 것을 while문으로 구현한 것이다.

int ia = 1, isum = 0;
while (ia <= 100) {
   isum += ia;
   ia++;
}

for문에서의 초기실행문이 while문 바깥에 나와있다. 그리고 변환식은 while문 안으로 들어가 있다. 이 예제는 다음과 같이 간결하게 만들 수 있다.

int ia = 1, isum = 0;
while (ia <= 100)
   isum += ia++;

반복문이 하나의 명령이라면 중괄호를 생략할 수 있다. 단항연산자 ++가 ia뒤에 붙었으므로 먼저 isum변수에 ia값을 더한 후 1이 증가함에 유의하자. 만약

isum += ++ia;

이렇게 바뀌면 어떻게 동작을 할 지 생각해 보라. 단항연산자 ++, --의 동작에 대해서 한 번 더 이해가 갈 것이다.
 또 다른 예로 1부터 숫자를 더해나갈 때 어느 수까지 더하면 10000이 처음으로 넘는지를 알아내는 프로그램을 작성해 보자. 이 경우 while 반복문을 사용하면 다음과 같이 간단하게 작성할 수 있다.

#include <stdio.h>
int main(void)
{
   int ia=0, isum=0;
   while(isum < 10000)
       isum += ++ia;
   printf("Sum from 1 to %d is %d.\n", ia, isum);
}

Sum from 1 to 141 is 10011.

이 예제에서는 ia=0으로 초기화 시킨 다음에 isum += ++ia 와 같이 ++연산자를 ia앞에 붙였다. 이렇게 해야만 정확한 결과가 얻어진다는 것을 유의해야 한다. (왜인지 생각해 보자.)


C/C++의 for 반복문

 프로그램에서 같은 코드를 변수값만 바꿔가며 반복해서 해야 하는 경우는 빈번하게 발생한다. 이런 경우를 위해서 반복문이 사용된다. C/C++ 에서 사용하는 반복문은 for 와 while 그리고 do~while 세 가지가 있으며 가장 많이 쓰이는 것은 for 반복문이다.

for (초기실행문; 반복조건; 변환문)
{
   명령문1;
   …
   명령문n;
}

for문 이후의 블럭이 정해진 수만큼 반복해서 수행이 된다. 초기실행문은 반복을 시작할 때의 초기값을 설정하는 부분이다. 만약 10번 반복해야 하고 초기값이 0이라면 이 부분에 0을 설정하는 실행문이 들어가야 한다. 만약 반복조건이 거짓이 되면 그 순간 반복문을 빠져 나가게 된다. 변환문은 매 반복이 끝나고(즉 명령문n이 끝난 다음) 반복조건이 참일 때 수행되는 명령문이다. 여기서 변수의 값을 증가 혹은 감소시킨다든가 하는 실행문이 위치하게 된다.

다음 예제를 보자
#include <stdio.h>
int main(void)
{
   int ia;
   for (ia=0; ia<10; ia++) {
       printf(“count : %d\n”,ia+1);
   }
}

이 예제는 단순히 화면에 1부터 10까지 출력하는 프로그램이다. for구문이 수행되는 단계를 기술하면 다음과 같다.
       ① 반복문에 진입하기 전에 초기 실행문은 한 번 수행된다.
       ② 조건식을 검사한다.
       ③ 조건식이 참이라면 반복명령문(들)을 실행한다.
       ④ 변환문을 수행한 후 ②로 돌아간다.
위의 예제에서는 변환문은 ia++가 해당이 된다. ia는 0부터 시작해서 10보다 작을 경우 루프를 돌며 반복문을 수행한다. 즉 10번 반복문을 수행한다.

초기 실행문에 아예 변수의 선언을 해도 된다.

#include <stdio.h>
int main(void)
{
   for (int ia=10; ia>0; ia--) {
       printf(“count : %d\n”,ia);
   }
}

이 예는 앞의 경우와 반대로 10부터 1까지 카운트다운을 하는 프로그램이다. 이 경우 변수 ia는 반복문이 시작될 때 생성되고 반복문이 종료되면 소멸된다. 즉, 반복문이 종료되면 변수 ia는 사용할 수 없다.

단, 이 기능은 C99 이후부터 지원한다. 만약 codelite 에서 컴파일 오류가 발생한다면 다음과 같이 C 컴파일러 옵션에 “;-std=c99”를 추가하면 된다. (다른 IDE를 사용하더라도 이 옵션을 체크/추가해야 한다.)

C++프로그램은 별다른 옵션 조절없이 이 기능을 사용할 수 있다.

 이제 for 반복문을 사용하여 1부터 100까지의 총합을 구하는 프로그램을 작성해 보자.

#include <stdio.h>
int main(void)
{
   int isum = 0;
   for (int ia=1; ia<=100; ia++) {
       isum += ia;    
   }
   printf(“result: %d.\n”,isum);
}

 for 문 뒤에 실수로 세미콜론을 붙이지 않도록 주의한다. 즉

for ( ia=1; ia<=100; ia++);
   isum += ia;

이와 같이 되면 문법적으로는 오류가 없으나 의도하지 않게 반복문이 수행되지 않을 것이다. 또한 for문 뒤에 오는 명령어가 하나뿐이라면 중괄호{}를 생략할 수 있어 좀더 간결하게 프로그램을 작성할 수 있다.
for ( ia=1; ia<=100; ia++)
   isum += ia;

하지만 반복문에 속한 명령문이 하나 뿐일지라도 중괄호로 포함해 주면 가독성 측면에서 좀 더 낫다.

 구구단을 출력하는 프로그램을 for 반복문을 이용하여 작성해 보자.

int ia = 3;
for (int ib=2; ib<10; ib++) {
   printf(“%d x %d = %d\n”,ia, ib, ia*ib);
}

이 예제에서 변수 ia는 단수를 지정하며 다음과 같이 3단을 출력한다.


3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

for문을 중첩해서 사용할 수 도 있다. 다음 예제는 2단부터 9단가지 출력하는 프로그램이다.

for (int ia=2; ia<10; ia++) {
   for (int ib=2; ib<10; ib++) {
       printf(“%d x %d = %d\n”,ia, ib, ia*ib);
   }
}

초기 실행문은 콤마(,)로 연결하여 여러 변수를 동시에 초기화시킬 수도 있다.

for (int ia=1, isum=0; ia<=100; ia++) {
   isum += iA;
}

단 이 경우 변수 ia와 isum은 반복문이 종료된 후 소멸되므로 사용할 수 없다. 변환문도 콤마로 구분하여 여러 변수를 동시에 변화시켜줄 수 있다. 또한 조건은 ||연산자나 &&연산자를 이용하여 다중 조건을 체크할 수도 있다. 혹은 리턴값을 가진 함수를 이용하여 그 값을 비교할 수도 있다.

 만약 isum 변수를 반복문 종료 후에도 사용하고 싶다면 반드시 for문 밖에서 선언해야 한다.

int isum = 0;
for (int ia=1; ia<=100; ia++) {
   isum += ia;
}
printf(“sum=%d”, isum); // isum변수를 사용할 수 있다.

    for 반복문 바깥에서 선언된 변수는 반복문이 종료된 이후에도 사용할 수 있다.