Fortran とは
Fortran (フォートラン)は1950年代に作られたプログラミング言語で FORmula TRANslator (数式翻訳機)が名前の由来です。 歴史のある古い言語ですが、いまでも科学技術計算(天気予報など)の分野で広く用いられています。 言語規格の改訂が何度か行われており、FORTRAN 66, FORTRAN 77, Fortran 90, Fortran 95, Fortran 2003 といった複数の規格が存在します。 この講義では主に Fortran 90 規格に準拠します。
教科書・参考書
Fortran を勉強するには教科書を持っておいた方がよいでしょう。 多くの本が出ていますが、Fortran 90 以降の規格に対応したものをお勧めします。
- 数値計算のための Fortran 90/95 プログラミング入門(牛島省,森北出版)
- Fortran 90/95 プログラミング(冨田博之・齋藤泰洋,培風館)
- Modern Fortran Explained (Metcalf et al., Oxford Univ. Press)
プログラムを試しながら読み進めていって下さい。
実際のプログラミングでは、言語の規格や文法を遵守するだけでなく、効率のよい計算方法(アルゴリズム)を選択することが非常に重要です。 アルゴリズムの解説も多く出版されているので、読んでみることをお勧めします。
- C言語による最新アルゴリズム事典(奥村晴彦,技術評論社)
- Numerical Recipes with Source Code CD-ROM 3rd Edition: The Art of Scientific Computing (Press et al., Cambridge University Press)
計算結果の表示
まずは計算結果を表示させてみましょう。
エディタを使って次のプログラムをそのまま打ち込んでください。
全角文字と半角文字は区別されるので注意してください。
!
ではじまるコメント部分を除き、Fortran のプログラムは基本的にすべて半角文字で書かれます。
ファイル名はなんでも構いませんが、ここでは work0101.f90
とします。
Fortran 90 では .f90
という拡張子が用いられます。
(FORTRAN 77 以前は .f
という拡張子を用います。)
! ! 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
とする。
変数の利用
プログラムの中で複雑な計算を行うには「変数」 (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 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
とする。
プログラムを実行すると入力待ちの状態になります。
nx
, ny
に値を入力するには2つの数字を空白で区切って入力しリターンキーを押します。
本日の課題
1. Hello world
画面にメッセージ Hello world を表示するプログラムを作成せよ。
2. 和と差
キーボードから2つの整数を読み込み、それらの和と差を表示するプログラムを作成せよ。
3. 和と積
キーボードから3つの整数を読み込み、それらの和と積を表示するプログラムを作成せよ。
4. 実行形式ファイルの名前の変更
コンパイラに -o
オプションを指定すると、実行可能形式ファイルの名前を
a.out から変更することができる。
書式は
gfortran -o 出力ファイル名 ソースファイル名
である。
次のようにコンパイルを行うと、実行可能形式ファイルは work0102.exe
になる。
% gfortran -o work0102.exe work0102.f90
これを確認せよ。