9. 반복 (Loops)

비슷한 작업을 반복하여야 할 때 loops 를 사용한다. 다른 프로그램 언어를 알고 있다면 for-loops, while-loops, 또는 until-loops 등에 관하여 알고 있을 것이다. Fortran 77에는 한 가지 loop 즉 do-loop 뿐이다. do-loop는 다른 언어에서 for-loop라고 하는 것과 같다. if 와 goto 문을 이용하면 다른 loop를 흉내낼 수 있다.

do-loops

do-loop 는 간단히 세고자 할 경우 사용한다. 다음은 정수 1부터 n (n의 값은 다른 곳에서 지정되었다고 가정한다.)까지의 합을 매번 구하는 예이다.
      integer i, n, sum
 
      sum = 0
      do 10 i = 1, n
         sum = sum + i
         write(*,*) 'i =', i
         write(*,*) 'sum =', sum
  10  continue
숫자 10 은 문장 번호 label이다. 보통 한 프로그램 안에 문장 번호가 필요한 loop와 다른 문장이 많이 있다. 각각의 프로그램 (또는 부프로그램) 안에서 고유의 문장 번호를 부여하도록 주의하여야 한다. 칸 (column) 2-5는 이 문장 번호를 적는 곳이다. 문장 번호롤 사용하는 숫자는 의미가 없으므로 어떤한 정수를 사용하여도 관계없다. 보통 한 번에 10씩 증가하도록 한다.

do-문장에서 정의한 변수는 특별한 명려이 없는 한 1씩 증가한다. 그러나 step 을 사용하여 그 증가량을 다른 정수로 바꿀 수 있다. 다음은 1부터 10사이의 짝수를 큰 수부터 인쇄하는 프로그램이다.

      integer i
 
      do 20 i = 10, 1, -2
         write(*,*) 'i =', i
  20  continue

do loop의 일반적인 형태는 다음과 같다.

      do label  var =  expr1, expr2, expr3
         statements
label continue
var 는 loop 변수 (또는 loop index라고도 한다)는 정수형태이어야 한다. expr1 는 var의 초기값, expr2 는 종료 한계이고 expr3 는 증가(step)이다.

주의 : do-loop 변수를 loop 안에서 다른 방법으로 바꾸어서는 안된다. 이 경우 심각한 혼란을 초래한다.

많은 Fortran 77 compiler에서 do-loop를 enddo 문장으로 끝낼 수 있도록 한다. 이 경우의 장점은 enddo가 앞에서 사용한 가장 최근의 do 문장의 끝을 의미하므로 문장 번호를 사용하지 않아도 된다는 점이다. enddo 구조는 상당히 많이 사용되지만 표준 ANSI Fortran 77은 아니다.

while-loops

while-loop를 사용하는 가장 직관적인 방법은
      while (logical expr) do
         statements
      enddo
이거나
      do while (logical expr) 
         statements
      enddo
이다. while 문이 참(true)인 한 내부의 문장들을 반복한다. 이 syntax를 여러 컴퓨터에서 사용할 수 있기는 하나 ANSI Fortran 77은 아니다. 올바른 방법은 if와 goto를 사용하는 것이다.
label if (logical expr) then
         statements
         goto label
      endif 

다음은 100보다 작거나 같은 수를 2의 지수로 하여 그 값을 계산하고 인쇄하는 프로그램이다.

     integer n

     n = 1
  10 if (n .le. 100) then
        n = 2*n
        write (*,*) n
        goto 10
     endif

until-loops

종료 기준이 문장의 시작이 아니라 맨 끝에 있는 경우 이를 보통 until-loop라고 한다. 유사 코드는 다음과 같다.
      do
         statements
      until (logical expr)
Fortran 77에서는 이 역시 if와 goto를 사용하여 구성하여야 한다.
label continue
         statements
      if (logical expr) goto label
마지막의 논리식이 유사 코드의 논리식의 부정이어야 한다는 점을 주의하라.

Loops in Fortran 90

Fortran 90에서는 do-enddo 구조를 loop 구조의 기본으로 한다. 따라서 둘 씩 세어 내려갈 경우 다음과 같이 한다.
      do i = 10, 1, -2
         write(*,*) 'i =', i
      end do
while 과 until loop도 do-enddo 구조로 구성할 수 있으나 conditional exit 문을 더하여야 한다. 일반적인 경우에는
      do
         statements
         if (logical expr) exit
         statements
      end do
exit 조건이 앞에 있으면 while loop이고 맨 뒤에 있으면 until loop인 셈이다.


Exercises

Exercise A
다음 유사 코드를 표준 Fortran 77에 맞추어 다시 써라. 가능하면 goto를 사용하지 말라.
      i = 1
      while (i<100) do
         sum = sum + i
         i = i+2
      enddo


      i = 0
      x = 1.0
      repeat
         x = f(x)
         i = i+1
      until (x<0)
      write(*,*) i, x

Exercise B
다음 code는 올바르지 못하다. F77에 맞추어 다시 써라. (Tip: Compile하고 수행시켜 두 프로그램이 같은 결과를 주는지 살펴 보라.)
      i = 1
      sum = 0
   10 do 20 i = 1, 50
         if (i .gt. 10) goto 30
         sum = sum + i
   20 continue
   30 if (i. le. 20) then
         sum = sum - 1
         goto 20
      else
         sum = 2*sum
      endif
      write(*,*) 'Sum =', sum

[Fortran Tutorial]
충남대학교 물리학과 오 병성