この文書の URL は http://www.cc.kyoto-su.ac.jp/~mtkg/lecture/comp_B/2012/01.html です。

Fortran とは

Fortran (フォートラン)は1950年代に作られたプログラミング言語で FORmula TRANslator (数式翻訳機)が名前の由来です。 歴史のある古い言語ですが、いまでも科学技術計算(天気予報など)の分野で広く用いられています。 言語規格の改訂が何度か行われており、FORTRAN 66, FORTRAN 77, Fortran 90, Fortran 95, Fortran 2003 といった複数の規格が存在します。 この講義では主に Fortran 90 規格に準拠します。

教科書・参考書

Fortran を勉強するには教科書を持っておいた方がよいでしょう。 多くの本が出ていますが、Fortran 90 以降の規格に対応したものをお勧めします。

プログラムを試しながら読み進めていって下さい。

実際のプログラミングでは、言語の規格や文法を遵守するだけでなく、効率のよい計算方法(アルゴリズム)を選択することが非常に重要です。 アルゴリズムの解説も多く出版されているので、読んでみることをお勧めします。

計算結果の表示

まずは計算結果を表示させてみましょう。 エディタを使って次のプログラムをそのまま打ち込んでください。 ファイル名は work0101.f90 とします。 Fortran 90 では .f90 という拡張子が用いられます。 (FORTRAN 77 以前は .f という拡張子を用います。)

全角文字と半角文字は区別されるので注意してください。 ! ではじまるコメント部分を除き、Fortran のプログラムは基本的にすべて半角文字で書かれます。

!
! print the sum of 19 and 71
!
program work0101
  implicit none

  write(*,*) 19 + 71

  stop
end program work0101

プログラムの作成と実行

コンピュータに計算を実行させるには、まずソースプログラムをコンピュータが理解できる形式に変換する必要があります。 この変換作業のことをコンパイル (compile) といい、変換作業を行うプログラムのことをコンパイラ (compiler) といいます。 Fortran コンパイラには有料のものを含め多くの種類があります。 Ubuntu (Linux) では無料で入手できる GNU Forran コンパイラ (コマンド名は gfortran であることが多い) が用いられています。

ターミナルから次のコマンドを実行してください。 先頭の % はシェルのプロンプトなので入力する必要はありません。

% gfortran work0101.f90

コンパイルが正常に終了すると a.out という実行可能形式のファイルが作られます。 これを実行すると、ソースプログラムに記述した計算が行われます。

% ./a.out
          90

コメント(注釈)

ソースプログラム中の ! から行末までの部分はコメント(注釈)です。 work0101.f90 の例では先頭の3行がコメントです。 コメントにはプログラムの説明などを簡潔に記述しましょう。 プログラム本体とは異なり、コメントには日本語を使っても構いません。

プログラムの構造

プログラムからコメントを取り除くと次のような構造をしています。

program プログラム名
  implicit none

  プログラムの本体

  stop
end program プログラム名

当面は「プログラム名」と「プログラムの本体」の部分を書き換えて、いろいろなプログラムを作ることにしましょう。

write 文

画面に情報を出力するには write 文を用います。 書式は

write(*,*) 出力並び

です。 出力並びには出力したい変数などをカンマ , で区切って並べます。 (*,*) は「出力装置」(画面やファイルなど)と「出力の書式」を指示する部分です。 当面は (*,*) をおまじないとして使ってください。

練習問題

19 から 71 を引いた値を画面に出力するプログラムを作成し、正しくコンパイル、実行できることを確認せよ。 ファイル名は work0102.f90 とする。

program work0102
  implicit none

  write(*,*) 19 - 71

  stop
end program work0102

変数の利用

プログラムの中で複雑な計算を行うには「変数」 (variable) を使う必要がでてきます。 変数は数値などを格納するための「箱」だと考えればよいでしょう。

Fortran で変数を使うにはプログラムの冒頭で「宣言」を行う必要があります。

integer :: nx

この宣言によって nx という変数が用意されます。 この変数には整数値のみを格納することができ、 nx は整数型の変数と呼ばれます。 integer は整数という意味です。

変数名は英数字 a-z, 0-9 と下線 _ を組み合わせて自由につけることができます。 ただし、1文字目は英字でなければいけません。 また、Fortran では大文字と小文字は区別されないことに注意してください。 (例えば sum, Sum, SUM はすべて同じ変数を表します。)

変数を使ったプログラム

変数に値を代入し、それを表示するプログラムを作成してみましょう。 ファイル名は work0103.f90 とします。

!
! 変数を使ったプログラム
!
program work0103
  implicit none
  integer :: nx, ny             ! 整数型の2つの変数 nx, ny を宣言

  nx = 15                       ! nx に 15 を代入
  ny = nx + 48                  ! ny に nx + 48 を代入

  write(*,*) 'nx = ', nx        ! nx の値を表示
  write(*,*) 'ny = ', ny        ! ny の値を表示

  stop
end program work0103

複数の変数を宣言

nx, ny という2つの変数を宣言するには変数名をカンマ , で区切って

integer :: nx, ny

とします。 行数は多くなりますが

integer :: nx
integer :: ny

としても構いません。 適宜使い分けてください。

代入

代入記号 = は「右側の値を左側の変数に代入せよ」という意味です。 上の例では、まず nx に 15 が代入され、次に ny に 63 が代入されます。

文字列定数

Fortran ではアポストロフィ ' またはクオーテーション " で囲んだ文字列が文字列定数となります。 '" は文字列の境界を示すデリミタ (delimiter) と呼ばれ、文字列には含まれません。

'I have a pen'
"This is an apple"

文字列にデリミタを含めるには、もう一方のデリミタを利用します。

'a sample of "embedded delimiters"'
"it's"

連続する ''' を表すこともできます。 したがって "it's"'it''s' と書くこともできます。

上のプログラムでは 'nx = ' という文字列と変数 nx が出力並びに指定されています。

write(*,*) 'nx = ', nx

練習問題

3つの整数型変数 nx, ny, nz の値を表示するプログラムを作成せよ。 ファイル名は work0104.f90 とする。 ただし、それぞれの値は次のように定めるものとする。

nx = 16
ny = nx + 18
nz = ny - 41

nx, ny, nz の値はいくつになるか?

program work0104
  implicit none
  integer :: nx, ny, nz

  nx = 16
  ny = nx + 18
  nz = ny - 41

  write(*,*) nx, ny, nz

  stop
end program work0104

キーボードからの入力

決まった数字だけを表示しても面白くないので、こんどはキーボードから値を読み込んで表示するプログラムを作成してみましょう。

program work0105
  implicit none
  integer :: nx

  write(*,*) 'Input an integer:'
  read(*,*) nx

  write(*,*) 'nx * 12 = ', nx * 12

  stop
end program work0105

コンパイルしてプログラムを実行すると、画面にメッセージ Input an integer: が表示され、入力待ちの状態になります。 値を読み込ませるには、キーボードから数字を入力し、リターンキーを押してください。 以下の例では 8 を入力してリターンキーを押しています。

% ./a.out
 Input an integer:
8
 nx * 12 =           96

複数の値を入力する場合は、数値や文字列を空白で区切って入力します。

read 文

キーボードから数値や文字列を読み込むには read 文を利用します。 書式は

read(*,*) 入力並び

です。 入力並びには値を入力したい変数をカンマ , で区切って並べます。 (*,*) は「入力装置」(キーボードやファイルなど)と「入力の書式」を指示する部分です。 write 文の時と同様、当面は (*,*) をおまじないとして使ってください。

積を求める

アスタリスク記号 * は乗算を表します。

練習問題

キーボードから2つの整数を読み込み、その積を表示するプログラムを作成せよ。 ファイル名は work0106.f90 とする。

program work0106
  implicit none
  integer :: nx, ny

  write(*,*) 'Input two integers:'
  read(*,*) nx, ny

  write(*,*) 'nx * ny = ', nx * ny

  stop
end program work0106

プログラムを実行すると入力待ちの状態になります。 nx, ny に値を入力するには2つの数字を空白で区切って入力しリターンキーを押します。

本日の課題

1. Hello world

画面にメッセージ Hello world を表示するプログラムを作成せよ。

program work0107
  implicit none

  write(*,*) 'Hello world'

  stop
end program work0107

2. 和と差

キーボードから2つの整数を読み込み、それらの和と差を表示するプログラムを作成せよ。

program work0108
  implicit none
  integer :: nx, ny

  write(*,*) 'Input two integers:'
  read(*,*) nx, ny

  write(*,*) 'Wa: ', nx + ny
  write(*,*) 'Sa: ', nx - ny

  stop
end program work0108

3. 和と積

キーボードから3つの整数を読み込み、それらの和と積を表示するプログラムを作成せよ。

program work0109
  implicit none
  integer :: n1, n2, n3

  write(*,*) 'Input two integers:'
  read(*,*) n1, n2, n3

  write(*,*) 'Wa: ', n1 + n2 + n3
  write(*,*) 'Seki: ', n1 * n2 * n3

  stop
end program work0109

4. 実行形式ファイルの名前の変更

コンパイラに -o オプションを指定すると、実行可能形式ファイルの名前を a.out から変更することができる。 書式は

gfortran -o 出力ファイル名 ソースファイル名

である。 次のようにコンパイルを行うと、実行可能形式ファイルは work0102.exe になる。

% gfortran -o work0102.exe work0102.f90

これを確認せよ。