'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++의 for 반복문  (0) 2015.05.18
C/C++ 의 switch ~ case 제어문  (0) 2015.05.18
C/C++ 의 if ~ else 조건 제어문  (0) 2015.05.18
Posted by 살레시오
,