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

2015년 7월 28일 화요일

맥시마(maxima)의 for 반복문

 맥시마는 반복 수행을 위한 명령어 for 가 있다. 문법은 다음 표에 정리한 바와 같다.

[표 1] for반복문의 문법
생략 가능
(기본값은 1)
다음 중 택일
(반드시 하나는 있어야 함>
for <변수>:<초기값>
step <증감값>
thru <끝값>
do <수행문>
while <조건식>
unless <조건식>
for <변수> in <list>
do <수행문>

먼저 반복문에서 사용할 변수를 초기화 시켜야 한다. 그 다음에 증감값을 step명령 다음에 지정해 준다. 이 증감값은 생략가능하며 이 경우 기본값인 1로 지정된다.

가장 기본적인 사용법의 예는 다음과 같다. (display함수는 단순히 변수의 값을 화면에 출력하는 함수임)
만약 1부터 100까지의 합을 구하고 싶다면 다음과 같다.
증감값을 정하고 싶다면 step 명령어를 다음과 같이 이용한다.
for문을 이용하여 x5+x4+x3+x2+x+1을 생성하면 다음과 같다.
같은 명령을 thru 대신 while을 이용하면 다음과 같다.

또 다른 예로서 리스트 [0, 1, 2, 3, … , 29, 30]를 생성하려면 다음과 같이 하면 된다. 다음 명령을 입력한 후에 그 결과를 확인해 보자. (/*~*/사이의 주석문은 입력할 필요가 없다.)

똑같은 명령을 unless를 이용하여 작성하면 다음과 같다.
이러한 for문을 이용하여 다양한 반복 작업과 많은 요소를 갖는 객체(리스트나 다항식 등)를 생성할 수 있다.


2015년 7월 20일 월요일

싸이랩(scialb)의 for 반복문

 Scilab의 for 명령은 반복을 수행하기 위해서 사용되며. for 와 end 사이의 명령어들을 주어진 변수값을 가지고 반복 수행한다. 간단한 예를 들면 다음과 같다.
--> for n=1:5, disp(n), end

이 명령은 disp(n)이라는 명령을 반복해서 수행하는데 다음과 같은 결과를 표시한다.

         1.
         2.
         3.
         4.
         5.
 
이 예제에서 반복은 벡터에 대해서 수행되었다. 이전에 콜론(:) 연산자는 행벡터를 생성한다고 설명한 바 있다. 따라서 위의 예는 다음과 완전히 동일하다.
--> for n=[1 2 3 4 5], disp(n), end
하지만 전자의 경우가 훨씬 더 간략하므로 만약 등간격의 변수들에 대한 반복을 수행한다면 전자와 같이 사용하는 것이 더 일반적이다. (1부터 1000까지 반복하는 경우라면 후자같이 사용하지는 못할 것이다.)
 만약 1부터 10까지의 숫자 중 홀수에 대해서만 반복을 수행하고 싶다면 다음과 같이 하면 될 것이다.

--> for n=1:2:10, disp(n), end
 
그려면 화면에는 1부터 시작해서 하나씩 건너 뛴 숫자들을 표시할 것이다.

         1.
         3.
         5.
         7.
         9.
 
증분값을 음수로 주면 역순으로 수행할 수도 있다. 예를 들어서

--> for n=5:-1:1, disp(n), end
이라고 하면 화면에 5부터 1까지 역순으로 표시되는 것을 확인할 수 있다.
 for 반복문에서 사용되는 변수값은 꼭 정수뿐만 아니라 다양한 값이 될 수 있다. 실수의 예를 들면 다음과 같다.
--> for n=linspace(0,1,5),disp(n),end
    0.  
    0.25  
    0.5  
    0.75  
    1.  
또는 다음과 같이 실수가 아닌 경우도 된다.

--> for n=[0.1, %i, %pi, %e],disp(n),end
    0.1  
    i    
    3.1415927  
    2.7182818
 
반복 변수에 행렬이 지정될 때에는 그 행렬의 각각의 열벡터로 반복을 수행한다. 예를 들어서
--> for n=[1 2 3;4 5 6], disp(n), end
라는 반복문의 경우 세 번 반복이 수행되는데 각각의 반복문에서 n변수의 값은 [1;4], [2;5], [3;6], 즉 첫 번째 열, 두 번째 열, 그리고 세 번째 열이 된다. 따라서 결과는 다음과 같다.

   1.  
   4.  
   2.  
   5.  

   3.   
   6.  


2015년 7월 16일 목요일

MATLAB의 break, continue 명령

 반복문 수행 시 어떤 경우에는 수행 중이던 반복문을 중단하고 빠져 나와야 하는 경우가 발생할 수도 있다. break 문은 for 구문이나 while 반복문 내에서 사용되며 반복문을 빠져 나오게 만드는 명령어이다. 반복문은 한번 시작하면 반복 변수가 마지막 값을 가질 때까지 반복을 수행해야 하는데 break 명령은 그 위치에서 반복을 중단하고 반복문을 빠져 나오게 만든다. 다음의 예를 살펴보자.

for k=0:10
   for n=0:10
       if (n==5)
           break
   end
   end
end

이 예에서 첫 번째 for 문은 k가 0부터 10까지 수행되고, 각각의 k값에 대해서 안쪽의 for 루프를 만나 n이 0부터 10이 될 때까지 수행을 해야 하지만 n이 5일 때에는 if의 조건이 참이 되므로 break 문을 만나게 된다. 이 때, 안쪽 루프를 탈출하게 된다. 다시 바깥쪽의 for 문을 돌게 되는 것이다. 이 중첩된 루프가 끝났을 때엔 k에는 10이, 그리고 n에는 5가 입력되어 있다.

 또 다른 예를 들어보자. 1과 자기 자신으로만 나누어지는 2보다 큰 양의 정수를 소수(prime number)라고 한다. 주어진 정수 n이 소수인가 아닌가를 판별하는 가장 간단한 방법으로는 n을 2,3,4,…,n-1로 나누어지는지 차례로 검사하는 것이다. 그 모든 수에 대해서 나누어지는 수가 (즉 나머지가 0인 수가) 하나도 없다면 n은 소수일 것이고 그렇지 않다면 n은 소수가 아닌 것이다. 나머지를 구하는 함수는 rem()함수이다. rem(m,n)은 m을 n으로 나눈 나머지를 반환하여 준다. 다음 프로그램을 살펴보자.

1 : n=input('양의 정수를 입력하시오');
2 : for k=2:n-1
3 :     m=rem(n,k);
4 :     if m==0 break, end
5 : end
6 : if m==0
7 :     sprintf('%d는 소수가 아님.',n)
8 : else
9 :     sprintf('%d는 소수.',n)
10: end

사용자로부터 숫자 n을 입력받아서 2번 줄의 for문으로 인해 2부터 n-1까지 숫자로 차례로 나눠서 그 나머지를 구한다. 만약 중간에 나머지가 0인 경우가 발생한다면 더 이상 반복문을 수행할 필요가 없는 것이다. 따라서 이 경우를 4번 줄에서 검사하여 바로 반복문을 빠져나오게 된다. 그리고 6번 줄에서 만약 m이 0이라면 어떤 숫자로부터 나눠진 경우가 발생한 것이므로 소수가 아니라는 판정을 내리고 그렇지 않은 경우 소수라는 판정을 내리게 되는 것이다. (참고로 소수의 리스트를 구할 수 있는 matlab 함수로는 primes()함수가 있다.)
 continue 명령은은 for문이나 while문 안에서 쓰이며 루프의 맨 처음으로 제어 흐름을 바꿔 주는 역할을 한다. 즉 while에서는 조건을 비교하는 부분으로, 그리고 for에서는 반복 변수값을 변화시켜서 for문 바로 다음의 명령문으로 흐름을 바꿔주는 역할을 한다. 다음의 예를 살펴보자.

1: clear all
2: for n=1:10
3:     tmp=n^3;
4:     if (n==5) continue, end
5:     k(n) = tmp;
6: end

이 예에서 k의 값이 변하는 추이를 살펴보자. n이 5가 되기 전에 k에 1, 8, 27, 64의 값을 저장한다. 그런데 n==5가 참이 되면 continue 문이 실행되고, 즉시 n=6으로 되고 3번 줄로 되돌아 가게 된다. 그러므로, 벡터 k(5)에는 125가 저장이 되지 않고 다음 반복문으로 넘어가게 된다.


2015년 5월 27일 수요일

파이썬의 while ~ else 반복문

 파이썬의 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 형이다.)


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 블럭을 다시 수행하기 때문이다. 양수가 입력되면 반복문이 종료된다.