13. 입출력 형식문 (Format statements)

이제까지는 자유 형식 free format 입출력의 예를 살펴 보았다. 이 경우에는 여러 형태 (integers, reals, characters, etc.)의 값을 출력하는 방법에 관하여 이미 설정된 규칙을 사용하는 것이다. 그러나 프로그램들은 입력이나 출력을 특별한 형태, 예를 들면 실수의 유효숫자를 몇 개로 할 지 등을 지정하고 싶을 것이다. 이런 목적으로 Fortran 77에는 입출력 형식문인 format 문이 있다. 입려과 출력에서 같은 format 문을 사용한다.

Syntax

      write(*, label) list-of-variables
 label format format-code
다음은 구체적인 예이다. 정수 변수 하나의 값을 4 자를 찍을 수 있는 공간에 인쇄하고 실수 변수 하나를 소수점 아래 3 자리까지 고정된 형태로 인쇄하고자 할 때는 다음과 같이 한다.
      write(*, 900) i, x
  900 format (I4,F8.3)
format의 문장 번호 900은 임으로 선택한 것이다. 보통 이래로 내려가면서 큰 번호를 사용하는 것이 편리하다. format 다음에 괄호(parenthesis)를 하고 그 안에 format code를 적는다. I4는 4칸에 정수를, F8.3 는 8칸에 실수를 소수점 아래 3자리의 고정된 형태로 인쇄하라는 뜻이다.

format 문은 그 프로그램 안의 어느 곳에 있어도 상관없다. 보통 입출력 문 바로 다음에 해당 format 문을 놓거나 프로그램 끝에 모든 format 문을 모아 놓는 방법을 사용한다.

보편적인 format 형식(Common format codes)

가장 보편적인 format 형식(format code)은 다음과 같다.
   A - 문자열 (text string)
   D - 배수정밀도, 지수 표시 (double precision numbers, exponent notation)
   E - 실수, 지수 표시 (real numbers, exponent notation)
   F - 실수, 고정 형식 (real numbers, fixed point format)
   I - 정수 (integer)
   X - 수평 띠기 (horizontal skip (space))
   / - 수직 띠기 (새 줄) (vertical skip (newline))
format 형식 F (또는 D, E)는 일반적으로 Fw.d가 되는데 여기서 w는 숫자를 적을 전체 칸을 나타내는 정수 상수이고 d는 유효 숫자를 나타내는 정수 상수이다.

정수의 경우에는 전체 폭만을 규정하면 되므로 Iw의 형식이 된다. 마찬가지로 문자열은 Aw로 규정할 수 있는데 전체 폭을 적지 않기도 한다.

숫자나 문자열이 전체 칸보다 작으면 빈칸(space)로 채워진다. 보통 문자의 경우에는 오른쪽에 맞추오지지만 정확한 것은 format code마다 다르다.

수평 띠기를 할 때는 nX code를 사용한다. 아는 n 개의 수평 빈 칸을 의미한다. n은 생략할 수 있고 이 경우 n=1 을 의미한다. 수직 띠기 (새 줄)은 /를 사용한다. slash 하나가 새 줄 하나를 의미한다. 각각의 read 나 write 문은 새줄(newline)로 끝난다는 점을 주의한다. (이 것이 C와 다른 점이다)

예제 (Some examples)

Fortran code
      x = 0.025
      write(*,100) 'x=', x
  100 format (A,F)
      write(*,110) 'x=', x
  110 format (A,F5.3)
      write(*,120) 'x=', x
  120 format (A,E)
      write(*,130) 'x=', x
  130 format (A,E8.1)
는 다음과 같은 출력을 만든다.
 x=      0.0250000
 x=0.025
 x=  0.2500000E-01
 x= 0.3E-01
Note how blanks are automatically padded on the left and that the default field width for real numbers is usually 14. 왼쪽이 어떻게 빈칸으로 채워졌는지 살펴 보고 실수의 기 설정된 폭은 보통 14임을 알아 둔다. 또 Fortran 77에서 0-4의 숫자는 버리고 5-9는 올리는 반올림하는 것을 볼 수 있다.

이 예에서는 각각의 write 문이 다른 format 문을 사용하였다. 하지만 다른 write 문에서 같은 format 문을 사용하여도 관계없다. 사실상 이것이 format 문을 사용하는 장점이다. In fact, this is one of the main advantages of using format statements. 예를 들어 표를 만들 때 각각의 줄이 같은 형식이 되도록 할 경우 편리하다.

입출력 문 안의 format 문 (Format strings in read/write statements)

별도의 format 문을 사용하여 fprmat 형식을 지정하는 방법 이외에 입출력 문 안에 직접 format code를 사용할 수 있다. 예를 들면
 
      write (*,'(A, F8.3)') 'The answer is x = ', x
는 다음과 같다.
 
      write (*,990) 'The answer is x = ', x
  990 format (A, F8.3)
또는 문자열을 format 문 안에 넣을 수 있다.
 
      write (*,999) x
  999 format ('The answer is x = ', F8.3)

내재한 loop와 반복 (Implicit loops and repeat counts)

좀더 복잡한 경우를 살펴 본다. 이차원 정수 배열의 위 왼쪽 5 x 10을 5 줄에 걸쳐 한 줄에 10개씩 인쇄하고 싶다면 다음과 같이 한다.
      do 10 i = 1, 5
         write(*,1000) (a(i,j), j=1,10)
   10 continue
 1000 format (I6)
이 경우 줄에 대하여는 명백한 (explicit) do loop를 사용하였고 칸에 대하여는 은연중에 내재한 implicit loop를 사용하였다.

format 문에는 다음과 같이 반복할 경우가 있다.

  950 format (2X, I3, 2X, I3, 2X, I3, 2X, I3)
이를 간단히 나타내면
  950 format (4(2X, I3))
또 명백하게 몇 번 반복하는지 나타내지 않고 반복하는 경우도 가능하다. vector의 처음 50 개를 한 줄에 10 개씩 인쇄하고자 할 때 다음과 같이 할 수 있다.
      write(*,1010) (x(i), i=1,50)
 1010 format (10I6)
format문에 의하면 열 개의 수자를 인쇄하여야 한다. 하지만 write 문에서는 50 개를 인쇄하려고 한다. 따라서 처음 10 개의 숫자를 인쇄한 뒤 같은 format 문을 사용하여 다음 10 개를 인쇄하고 그 다음에도 반복한다.

Exercises

Exercise A
인쇄하고자 하는 값이 format과 일치하지 않으면 이상한 일이 생긴다. 다음 예제를 살펴 본다.
 
      write(*,100) 12, 12345
      write(*,110) 0.12345
      write(*,110) 123.45
      write(*,110) 12345.0
  100 format (I4, 2X, I4)
  110 format (F6.2)

Exercise B
다음과 같은 Pascal's matrix를 만드는 프로그램을 작성한다. 마지막에 위 왼쪽 6 x 6 배열을 인쇄한다. 각 줄에 숫자를 보기 좋게 배열하여 보아라.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1


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