'while'에 해당되는 글 3건

  1. 2015.07.14 MATLAB의 반복문 while ~ end
  2. 2015.05.27 파이썬의 while ~ else 반복문
  3. 2015.05.18 C/C++ 의 while 반복문

 for 반복문이 정해진 횟수만큼의 반복 수행을 한다면 while 명령은 명령군을 무한 번까지 반복할 수 있다. while 뒤의 조건이 참이면 속한 명령어들을 계속 반복 수행하게 된다. 사용법은 다음과 같다.


while 조건문
   명령문1
   명령문2
   ⋮
end


1부터 100까지의 합을 구하는 프로그램을 while문을 이용하여 작성해보자. 다음 프로그램을 ‘whilex1.m'으로 저장하고 명령창에서 수행해 보자.


clear all
n=1;
m=0;
while (n<=100)
   m+=n;
   n++;
end


여기서 n++ 는 n=n+1 과 같고 m+=n 은 m=m+n과 같다.


 다른 예로서 n이 양의 정수일 때 n! 이 106 을 넘는 가장 작은 n을 구하는 프로그램을 while문을 이용하여 작성해보면 다음과 같다.


1: clear all
2: n=1;
3: while prod(1:n)<1e6
4:     n++;
5: end


3번 줄에서 n!이 106보다 작으면 n을 1증가시키고 (n++) 다시 3번 줄의 조건을 수행하는데 만약 n!이 106보다 크면 바로 프로그램이 종료가 된다. 따라서 프로그램의 수행이 끝난 시점에 변수 n에 저장된 수가 106을 넘는 가장 작은 정수가 되는 것이다.


 또 다른 예제를 들면 다음과 같다. 편의상 각각의 줄 앞에 번호를 붙였다.


1: clear all
2: num=0; EPS=1;
3: while (1+EPS)>1
4:     EPS=EPS/2;
5:     num=num+1;
6: end
7: disp(EPS)


1번 줄에서 작업 공간의 모든 변수를 제거하고 2번 줄에서 변수들을 초기화 시켰다. 그리고 3,4,5번줄은 EPS가 컴퓨터가 더 이상 구분할 수 없이 작아질 때까지 EPS를 2로 계속 나누면서 반복하는 것이다. 이것은 내부변수 eps를 구하는 알고리듬을 구현해 본 것이다. eps는 MATLAB이 표현할 수 있는 가장 작을 수라고 앞에서 소개했었다. 일반적으로 실수를 표현하는데 있어서 한정된 비트수를 쓰기 때문에 기계 내부적으로 표현할 수 있는 가장 작은 수가 존재한다.


 while문의 조건문은 결과가 스칼라일수도 있으나 일반적으로 행렬일 수도 있다. 이 경우 행렬의 ‘모든’ 요소가 참(0이 아닌값)일 경우에 반복문을 수행하게 된다. 즉 하나라도 0인 요소가 있으면 반복문의 수행을 중단하게 된다. 다음 예제를 입력하고 ‘whilex3.m'으로 저장한 후 실행시켜 보라.


a = ones(2,2);
b = 4*a;
while b
   b = b-a;
end


처음의 두 실행문에서 행렬 a와 b는 다음과 같이 각각 생성된다.

그리고 처음의 while문에서 행렬 b의 모든 요소는 0이 아니므로 반복문이 수행되고 그 결과로서 행렬 b는 다음과 같이 변하게 된다.

그 다음 아직도 행렬 b의 모든 요소는 0이 아니므로 반복문이 수행되고 그 결과로서 행렬 b는 다음과 같이 변하게 된다.

그 다음 다음번의 수행에서 행렬 b는 다음과 같이 변하게 되고

이제는 행렬b의 모든 요소가 0이므로 반복문을 수행하지 않고 while문을 빠져 나오게 된다.



Posted by 살레시오

댓글을 달아 주세요

 파이썬의 while 명령은 단순 반복을 수행한다.


while 조건식:
실행문
....


여기서 조건식이 참이면 실행문을 수행하고 다시 조건을 검사한다. 즉, 조건문이 거짓이 될 때까지 실행문을 반복 수행하는 것이다.


>>> m,p = 1,1
>>> while m<=10:
...     p *= m
...     m += 1
>>> p
3628800


이  예는 10! 을 구하는 프로그램이다. 10!=3628800 이라는 것을 알 수 있다.


 for문과 마찬가지로 while 문도 else 절이 붙을 수 있다.


while 조건식:
실행문들1
else:
실행문들2


조건식이 거짓으로 판정되어서 ‘실행문들1’이 수행되지 않을 때 else 절의 ‘실행문들2’가 수행된다. 만약 break 문에 의해서 반복이 끝난다면 (for반복문과 마찬가지로) else절은 수행되지 않고 그 바깥으로 빠져 나가게 된다.


n=3
while n>=0:
   m = input("Enter a interger :")
   if int(m)==0: break
   n -= 1
else:
   print('4 inputs.')


이 예제는 4개의 0이 아닌 정수를 입력 받으면 else 절이 수행된다.


.#실행 결과 1
Enter a interger :1
Enter a interger :2
Enter a interger :3
Enter a interger :4
4 inputs.


만약 그 전에 0이 입력된다면 else 절이 수행되지 않고 while 반복문을 완전히 종료하게 된다.


# 실행 결과 2
Enter a interger :0


for 반복문과 마찬가지로 break 문에 의한 반복 종료인지 아니면 조건문이 False 가 되어서 반복문을 종료하는 지를 구별하여 다른 실행문을 수행할 경우에 while ~ else 절을 사용하면 된다.


m=997
n=2
while n<m//2:
if m%n==0: break
n += 1
else:
print(m,'is a prime number!')


이 예는 997이 소수(prime number)인지 아닌지 판별하는 함수이다. 2부터 498까지 차례로 나누어서 나머지가 한번이라도 0이 된다면 break 문에 걸리게 된다. 만약 한 번도 0이 아니라서 반복문이 끝까지 돌았다면 else 절이 수행되어 소수임을 표시한다.(음영진 부분은 seq 형이다.)



Posted by 살레시오

댓글을 달아 주세요

4.4 while 반복문     [doc]     [smts]

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


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

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


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


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

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


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

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


0404-01.c
#include <stdio.h>
int main() {
   int icnt = 0;
   while (icnt < 10) {
       printf("hi ");
       icnt++;
   }
}
실행 결과
hi hi hi hi hi hi hi hi hi hi

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


0404-01b.c
#include <stdio.h>
int main() {
   int icnt = 0;
   while (icnt++ < 10) {
       printf("hi ");
   }
}
실행 결과
hi hi hi hi hi hi hi hi hi hi

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


0404-02
#include <stdio.h>
int main() {
   int ia = 1, isum = 0;
   while (ia <= 100) {
       isum += ia;
       ia++;
   }
   printf("isum = %d", isum);
}
실행 결과
isum = 5050

for문과 비교해 보면 초기실행문이 while문 바깥에 나와 있고 변환식은 while문 안으로 들어가 있다. 이 예제는 다음과 같이 조금 더 간결하게 만들 수 있다.


0404-02
#include <stdio.h>
int main() {
   int ia = 1, isum = 0;
   while (ia <= 100) {
       isum += ia++;
   }
   printf("isum = %d", isum);
}
실행 결과
isum = 5050

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


isum += ++ia;

이렇게 바뀌면 어떻게 동작을 할 지 생각해 보라. 단항연산자 ++, --의 동작에 대해서 한 번 더 이해가 갈 것이다.

 또 다른 예로 1부터 숫자를 더해나갈 때 어느 수까지 더하면 10000이 처음으로 넘는지를 알아내는 프로그램을 작성해 보자. 이 경우 while 반복문을 사용하면 다음과 같이 간단하게 작성할 수 있다.


0404-03.c
#include <stdio.h>
int main() {
  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앞에 붙였다. 이렇게 해야만 정확한 결과가 얻어진다는 것을 유의해야 한다. (왜인지 생각해 보자.)



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 break 명령  (0) 2015.05.19
C/C++ 의 do ~ while 반복문  (0) 2015.05.18
C/C++ 의 while 반복문  (0) 2015.05.18
C/C++의 for 반복문  (0) 2015.05.18
C/C++ 의 switch ~ case 제어문  (0) 2015.05.18
C/C++ 의 if ~ else 조건 제어문  (0) 2015.05.18
Posted by 살레시오

댓글을 달아 주세요