맥시마는 반복 수행을 위한 명령어 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문을 이용하여 다양한 반복 작업과 많은 요소를 갖는 객체(리스트나 다항식 등)를 생성할 수 있다.





Posted by 살레시오
,

 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.  



Posted by 살레시오
,

 파이썬의 for 반복문 안에서 break 명령을 사용할 수 있는데 이 명령은 즉시 그것이 포함된 가장 안 쪽의 반복문을 빠져 나온다. 다음 반복문을 보자.


for n in lst:
   if n==0:
       break
   print(n)


이것은 lst 안의 요소들을 차례대로 프린트하다가 0이 발견되면 바로 반복을 멈추는 프로그램이다. 만약 lst=[1,2,3,0,4,5] 라면 1,2,3만 출력되고 반복문은 종료될 것이다. 만약 반복문의 중첩되어 있다면 가장 안쪽의 반복문만 빠져 나온다는 점에 유의해야 한다.


파이썬의 for 반복문은 else 명령과 짝을 이룰 수도 있다.


for 변수 in 반복가능자:
   수행문들1
else:
   수행문들2


else 블럭에 포함된 ‘수행문들2’는 for 반복문이 반복형의 마지막 요소까지 모두 반복했을 경우 그 다음에 수행된다. 즉, 모든 반복이 성공적으로 수행된 경우에 한 번 수행된다. 하지만 break문을 만나면 else 구문은 수행되지 않고 for 블럭을 완전히 빠져나간다.


for n in lst:
   if n==0: break
   print(n)
else:
   print(‘There is no 0.’) # break문을 만나지 않았다면 수행된다.


이 예제의 경우 lst 안에 0이 있다면 break를 만나게 되고 따라서  else 블럭은 수행되지 않고 for 반목문을 빠져 나오게 된다.


따라서 for 반복문이 종료된 시점에서 이 종료가 모든 반복을 다 수행한 후의 정상적인 종료인지, 아니면 break 명령에 의한 강제 종료인지에 따라서 수행해야 될 일을 구분할 필요가 있는 경우에 for~else 구문을 사용하면 된다.



Posted by 살레시오
,

 파이썬의 for 반복문은 C/C++의 그것과는 약간 다르다. (JAVA나 C#의 foreach 명령과 유사한 점이 많다.) 기본 적인 문법은 다음과 같다.


for 변수 in 반복형:
수행문


여기서 반복형은  열거형(sequence,  range형, 문자열, 리스트, 튜플 등), 딕셔너리 등이 있다.


 예로 기존의 리스트를 이용하여 리스트 요소들 중 짝수의 개수를 세는 프로그램을 작성해 보자.


>>> lst = [11, 44, 21, 55, 101]
>>> cnt = 0
>>> for n in lst :
if n%2==0:
cnt += 1
>>> cnt
1


이 예제는 리스트 lst 의 각 요소가 순서대로 n 변수에 대입되고 반복문이 수행된다.


range()함수와 range 형

 for 구문과 자주 같이 사용되는 파이썬 내장 함수 중에서 range() 함수가 있는데 이 함수는 range 형을 만들어 준다. (range 형은 시퀀스 형에 속한다.) for 반복문과 조합되어서 자주 사용되므로 여기에서 자세히 설명하도록 하겠다. range() 함수는 세 가지 용법이 있다. 다음에서 m, n, s는 정수이다.


range(n)  # 0 부터 n-1 까지의 요소를 가지는 range 형 반환
range(m,n)  # m 부터 n-1 까지의 요소를 가지는 range 형 반환
range(m,n,s)  # m 부터 n-1 까지의 요소(s는 step)를 가지는 range 형 반환


한 가지 주의할 점은 파이썬 3.x에서는 range()함수는 range 형을 반환한다. (반면 파이썬 2.x 에서는 리스트를 반환한다.) 따라서 파이썬 3.x에서는 이 rangeg형을 리스트로 만들기 위해서는 list()함수를 반드시 명시적으로 사용해야 한다.


>>> range(5)
range(0,5)
>>> list(range(5))
[0,1,2,3,4]
>>> list(range(1,11))
[1,2,3,4,5,6,7,8,9,10]
>>> list(range(0,30,5)) # 5가 증분
[0,5,10,15,20,25]
>>> list(range(0,-5,-1)) # -1이 증분
[0,-1,-2,-3,-4]
>>> list(range(0))
[]
>>> list(range(1,0))
[]


하지만 for문 안에서 range 함수를 사용할 경우 궂이 리스트로 바꿀 필요는 없다. 왜냐면 for 문에는 반복형(iterable)이 사용되며 range 객체는 열거형(sequence)이므로 반복형이기 때문이다.

예를 들어서 ‘hi.’라는 문자열을 다섯 번 출력하는 프로그램을 작성해 보자.


for _ in range(5):
print(‘hi.’)


이 반복문은 변수 _ 가 0,1,2,3,4 값을 가지고 각각 반복을 수행하게 된다. 실제 이 변수가 사용되지는 않으므로 그냥 _ 로 지정하였다. (파이썬에서 dummy variable 의 이름은 보통 _ 로 지정한다.)


구구단의 2단을 출력하는 프로그램을 작성해 보자.


>>> for n in range(2,10):
...     print('2 x %d = %d'%(n, 2*n))

2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18


여기서 변수 n은 2부터 9까지의 값을 가지고 반복문이 수행된다. range(2,10)은 2부터 9까지의 숫자를 차례로 생성한다.


for 반복문은 중첩해서도 얼마든지 사용할 수 있다. 구구단의 2단부터 9단까지 한꺼번에 출력하려면 다음과 같이 작성하면 될 것이다.


>>> for m in range(2,10):
...     for n in range(2,10):
...             print('%d x %d = %d'%(m,n,m*n))
...     print('-'*10)


여기에서 print(‘-’*10)은 ‘----------’ 을 출력한다.




Posted by 살레시오
,

4.3 for 반복문    [doc]    [smts]

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


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

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


 다음 예제를 보자


0403-01.c
#include <stdio.h>
int main() {
   int ia;
  for (ia=0; ia<10; ia++) {
      printf("count : %d\n", ia);
  }
}
실행 결과
count : 0
count : 1
count : 2
count : 3
count : 4
count : 5
count : 6
count : 7
count : 8
count : 9

이 예제는 단순히 화면에 0부터 9까지 출력하는 프로그램이다. for구문이 수행되는 단계를 기술하면 다음과 같다.


      ① 반복문에 진입하기 전에 초기 실행문은 한 번 수행된다.

      ② 조건식을 검사한다.

      ③ 조건식이 참이라면 반복명령문(들)을 실행한다.

      ④ 변환문을 수행한 후 ②로 돌아간다.


위의 예제에서는 변환문은 ia++ 이다. ia는 0부터 시작해서 10보다 작을 경우 루프를 돌며 반복문을 수행한다. 즉 10번 반복문을 수행한다.


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


0403-02.c

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

실행 결과

count : 9
count : 8
count : 7
count : 6
count : 5
count : 4
count : 3
count : 2
count : 1
count : 0

이 예는 앞의 경우와 반대로 10부터 1까지 카운트다운을 하는 프로그램이다. 이 경우 변수 ia는 반복문이 시작될 때 생성되고 반복문이 종료되면 소멸된다. 즉, 반복문이 종료되면 변수 ia는 사용할 수 없다. 단, 이 기능은 C99 이후부터 지원하므로 gcc 를 실행할 때 ‘-std=c99’ 옵션을 반드시 추가해야 한다. 만약 C++컴파일러를 사용한다면 (g++) 별다른 옵션 조절없이 이 기능을 사용할 수 있다.


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


0403-03.c
#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 반복문을 이용하여 작성해 보자.


0403-04.c
#include <stdio.h>
int main() {
   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단가지 출력하는 프로그램이다.


0403-05.c
#include <stdio.h>
int main() {
   for (int ia=2; ia<10; ia++) {
       for (int ib=2; ib<10; ib++) {
           printf("%d x %d = %d\n",ia, ib, ia*ib);
       }
       printf("------------\n");
   }
}

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


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

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


 만약 isum 변수를 반복문 종료 후에도 사용하고 싶다면 반드시 for문 밖에서 선언해야 한다. 다음 예는 1부터 100까지의 합을 구하는 예이다.


0403-06.c
#include <stdio.h>
int main() {
   int isum = 0;
   for (int ia=1; ia<=100; ia++) {
       isum += ia;
   }
   printf("isum = %d", isum); // isum변수를 사용할 수 있다.
}
실행 결과
isum = 5050

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



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

C/C++ 의 do ~ while 반복문  (0) 2015.05.18
C/C++ 의 while 반복문  (0) 2015.05.18
C/C++ 의 switch ~ case 제어문  (0) 2015.05.18
C/C++ 의 if ~ else 조건 제어문  (0) 2015.05.18
C/C++ 포인터 사용시 주의할 점  (0) 2015.05.18
Posted by 살레시오
,

  자바 식별자는 길이에 제한이 없으며 '_' 뿐만 아니라 '$' 문자도 사용할 수 있다는 점이 특이하다.


  자바에서는 반복문 앞에 라벨을 붙여서 그 라벨을 break, continue 문 뒤에 붙여 중첩된 반복문을 한꺼번에 벗어날 수 있다.


loop1: for(...) {

    for (… ) {

        …

        break loop1; //바깥쪽 루프를 벗어남.

        …

        continue loop1: //바깥쪽 루프의 그 다음 반복을 바로 수행.

    }

}


반복문의 이름이 지정되지 않은 break, continue 문은 그것을 포함하는 가장 안쪽의 반복문을 제어하지만 이처럼 라벨링을 이용하면 그 바깥쪽의 반복문을 제어할 수 있다.


  그리고 JAVA5 이상부터는 C#의 foreach 나 파이썬의 for문과 같은 기능을 사용할 수 있다. 문법은 다음과 같다. 


for(자료형 변수명: 집합) {

}


여기서 집합은 배열,콜렉션,enum 등이다. 이렇게 하면 예를 들어 배열의 각 요소가 변수명에 대입되어 차례로 반복문을 수행하게 된다.


enum Week { 월, 화, 수, 목, 금, 토, 일 }

public static void main(String args []) {

    // enum 타입을 foreach 로 출력

    for (Week day : Week.values()) { // Week.values()에는 Week 의 값들이 교대로 들어갑니다.

    System.out.println(day + "요일");

}


// 정수 배열을 foreach 로 출력

int[] num = { 14, 54, 52, 26, 62, 55 };

for (int i : num)

    System.out.println(i);


// 문자열 배열을 foreach 로 출력

String names[] = { "수성", "금성", "지구", "화성" };

for (String s : names)

    System.out.println(s);

}

[#00065]


Posted by 살레시오
,


  자바 식별자는 길이에 제한이 없으며 '_' 뿐만 아니라 '$' 문자도 사용할 수 있다는 점이 특이하다.


  자바에서는 반복문 앞에 라벨을 붙여서 그 라벨을 break, continue 문 뒤에 붙여 중첩된 반복문을 한꺼번에 벗어날 수 있다.


loop1: for(...) {

    for (… ) {

        …

        break loop1; //바깥쪽 루프를 벗어남.

        …

        continue loop1: //바깥쪽 루프의 그 다음 반복을 바로 수행.

    }

}


반복문의 이름이 지정되지 않은 break, continue 문은 그것을 포함하는 가장 안쪽의 반복문을 제어하지만 이처럼 라벨링을 이용하면 그 바깥쪽의 반복문을 제어할 수 있다.


  그리고 JAVA5 이상부터는 C#의 foreach 나 파이썬의 for문과 같은 기능을 사용할 수 있다. 문법은 다음과 같다.


for(자료형 변수명: 집합) {

}


여기서 집합은 배열,콜렉션,enum 등이다. 이렇게 하면 예를 들어 배열의 각 요소가 변수명에 대입되어 차례로 반복문을 수행하게 된다.

enum Week { 월, 화, 수, 목, 금, 토, 일 }

public static void main(String args []) {
    // enum 타입을 foreach 로 출력

    for (Week day : Week.values()) { // Week.values()에는 Week 의 값들이 교대로 들어갑니다.
    System.out.println(day + "요일");
}

// 정수 배열을 foreach 로 출력
int[] num = { 14, 54, 52, 26, 62, 55 };
for (int i : num)
    System.out.println(i);

// 문자열 배열을 foreach 로 출력
String names[] = { "수성", "금성", "지구", "화성" };
for (String s : names)
    System.out.println(s);
}


Posted by 살레시오
,