FORTRANプログラミング入門 3回 プログラム作成の基本,標準入出力

木村拓馬
FORTRAN プログラミング入門
–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
木村拓馬
2014 年 4 月 17 日 19:40
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
1/24
木村拓馬
.
本日は
.
.
簡単?なことをたくさん
プログラミングの基礎知識
コンパイラ「g95」の基本的な使い方
Fortran のルール・データ型
プログラムの始めと終わり(PROGRAM / END PROGRAM)
WRITE 文による出力(画面にデータを表示する)
変数の宣言・代入
四則演算
READ 文による入力(キーボードからデータを入力)
演習
初心者は,細かい説明は気にしないで,とりあえずプログラムを書いて
動かして覚えると良いと思う
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
2/24
木村拓馬
プログラムとは
コンピュータで実行したい処理手順を一定のルール (文法) に従って記述し
たものをプログラムという.
プログラムを記述するための言語(単語・文法)をプログラミング言語と
呼ぶ.
処理手順の例:
1) 数字を記憶する場所を用意
2) 数字を入力する
3) 入力した数字を使って計算
4) 計算結果を画面に表示する
プログラムを記述することをプログラミングと呼び,プログラミングする
人をプログラマと呼ぶ.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
3/24
木村拓馬
プログラミングの工程
(Fortran 等で)コンピュータに何かをさせたい場合,
1) 設計:
問題を分析して,具体的に何をさせるのか・処理の手順を決める
2) コーディング:
コンピュータでもできる基本的な処理に分解し,
処理・手順をプログラミング言語のルールに従って記述する
3) コンパイル:
プログラミング言語(人間にわかりやすい)で書かれたプログラムを,
機械語(コンピュータにわかりやすい)に変換
4) 変換して得られた実行ファイルを計算機に実行させる
人間がプログラミング言語を用いて記述したプログラムをソースコードと
いう.コードを作ることをコーディングという
コンピュータが直接実行可能な機械語に翻訳するプログラムをコンパイ
ラといい,コンパイラによる翻訳工程をコンパイルという.
コンパイルされたファイルは,コンピュータが処理を実行可能なファイル
ということで実行ファイルと呼ばれる.
他に,間違い・欠陥(バグ)を探して修正するデバッグという作業を行う
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
4/24
木村拓馬
コンパイルと実行(g95)
本講義では,
「g95」を用いてコンパイルする.
.
g95 [4]
.
無料の Fortran 95 対応コンパイラ(GNU オープンソース, GPL ライセンス)
最近の安定版はバージョン 0.93(October 2012)
Linux,UNIX,Windows,Mac OS 等で利用可.
Fortran 2003, 2008 のいくつかの機能を実装している
.
http://g95.org/
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
5/24
木村拓馬
コンパイルと実行(g95)
g95 を用いて,前回作成したプログラム
.
test.f90
.
program test
write(*,*) ’Hello world!’
end
program test
.
をコンパイルしてみよう.
端末を開き,プログラム (test.f90) を保存した場所に移動(CD),そして,
.
.[user@host␣˜/FPR1]$g95␣test.f90
で,g95 を用いて test.f90 をコンパイルできる.
コンパイルが成功すると,a.out という実行ファイルができているはず.
実行する場合は,以下のように実行ファイル名を入力.
.
.[user@host␣˜/FPR1]$./a.out
このとき,カレントディレクトリを表す./ を忘れないこと.
すると画面に「Hello world!」と表示されるはず.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
6/24
木村拓馬
コンパイルと実行(g95)
コンパイルに失敗することはよくある.これは比較的簡単に修正できる.
.
test.f90 の二行目の最後のアポストロフィ( ’ ) を書き忘れてみた
.
program test
write(*,*) ’Hello world!
.end program test
をコンパイルすると,
.
In file test.f90:2
write(*,*) ’Hello world!
1
Error:
Unterminated character constant beginning at (1)
.
のように「test.f90 の 2 行目で,”1”の指す所から始まる文字列が終わってない」
と指摘される.コンパイルに失敗したら,まずはメッセージを読み修正しよう.
.
a.out が嫌な場合
.
[user@host␣˜/FPR1]$g95␣-o␣test.out␣test.f90
[user@host␣˜/FPR1]$./test.out
.
上のようにオプション-o を使用すると,a.out ではなく指定した名前 (test.out)
の実行ファイルが生成される.
test.out の部分は好きな名前を付けてよい(e.g. sukinanamae.o)
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
7/24
木村拓馬
コンパイルと実行(g95)
コンパイルに失敗することはよくある.これは比較的簡単に修正できる.
.
test.f90 の二行目の最後のアポストロフィ( ’ ) を書き忘れてみた
.
program test
write(*,*) ’Hello world!
.end program test
をコンパイルすると,
.
In file test.f90:2
write(*,*) ’Hello world!
1
Error:
Unterminated character constant beginning at (1)
.
のように「test.f90 の 2 行目で,”1”の指す所から始まる文字列が終わってない」
と指摘される.コンパイルに失敗したら,まずはメッセージを読み修正しよう.
.
a.out が嫌な場合
.
[user@host␣˜/FPR1]$g95␣-o␣test.out␣test.f90
[user@host␣˜/FPR1]$./test.out
.
上のようにオプション-o を使用すると,a.out ではなく指定した名前 (test.out)
の実行ファイルが生成される.
test.out の部分は好きな名前を付けてよい(e.g. sukinanamae.o)
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
7/24
木村拓馬
Fortran の基本
.
FORTRAN とは
.
史上最初の(本格的な)プログラミング言語.1954 年に IBM の John W. Backus
によって開発された
FORmula TRANslation の略.数式(を自動的に機械語に)翻訳
C, C++, Java といった言語が誕生するまで,科学技術計算に関係する膨大な数の
プログラムのほとんどが FORTRAN で書かれている.
⇒ 数十年にわたって蓄積された豊富なソフトウェア資産が活用できる
.
.
数値計算に適した言語で,現在でも理工学の諸分野で使われている
(簡単で使いやすい,実行が速い,数値計算に必要な機能が充実している).
本講義では,Fortran 90 を扱う
.
.
1965 年に ISO (国際標準化機構) にて国際的な標準言語として認定 (FORTRAN66).
その後 FORTRAN77, Fortran90, Fortran95, Fortran2003, Fortran2008 と改良され続
けている(次は Fortran 2015?).
Fortran90 にて大幅な改訂
FORTRAN77 までは FORTRAN (すべて大文字) ,
Fortran90 以降は Fortran (F のみ大文字で他は小文字) と表す慣習がある.
従来の FORTRAN77 プログラムはすべて動くように改訂,95 以降いろいろ廃止
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
8/24
木村拓馬
Fortran の基本
.
FORTRAN とは
.
史上最初の(本格的な)プログラミング言語.1954 年に IBM の John W. Backus
によって開発された
FORmula TRANslation の略.数式(を自動的に機械語に)翻訳
C, C++, Java といった言語が誕生するまで,科学技術計算に関係する膨大な数の
プログラムのほとんどが FORTRAN で書かれている.
⇒ 数十年にわたって蓄積された豊富なソフトウェア資産が活用できる
.
.
数値計算に適した言語で,現在でも理工学の諸分野で使われている
(簡単で使いやすい,実行が速い,数値計算に必要な機能が充実している).
本講義では,Fortran 90 を扱う
.
.
1965 年に ISO (国際標準化機構) にて国際的な標準言語として認定 (FORTRAN66).
その後 FORTRAN77, Fortran90, Fortran95, Fortran2003, Fortran2008 と改良され続
けている(次は Fortran 2015?).
Fortran90 にて大幅な改訂
FORTRAN77 までは FORTRAN (すべて大文字) ,
Fortran90 以降は Fortran (F のみ大文字で他は小文字) と表す慣習がある.
従来の FORTRAN77 プログラムはすべて動くように改訂,95 以降いろいろ廃止
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
8/24
木村拓馬
使用できる文字
Fortran90 で使用できる文字は,以下の英数字と特殊文字:
英大文字
英小文字
数字
特殊文字空白
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
空白 = + - * / ( ) , . ’ : $ ! ” % & ; ?
英大文字と英小文字は区別されない (ただし,文字列として扱う場合は区別
される).
用いるコンパイラによっては,仮名や漢字などの文字を扱うこともできる.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
9/24
木村拓馬
書き方のルール
行
1 行は 132 桁まで.
”; ” (セミコロン) で区切れば 1 行に複数の文を書くことも可.
どこから書き始めてもよい(自由形式)が,処理の単位などで字下げ
(インデント) して,プログラムを読みやすくすること.
継続行
1 行に入りきらない場合は,行末に”&” (ampersand) を記述すると次の
行へ継続することができる.”&”だけの行はダメ
文字列の場合は,行末と次の行の最初にも ”&” を記述.
注釈(comment)
”!” (exclamation mark) が注釈記号を表す.
”!” 以降はその行の終わりまでが注釈となる.
注釈はプログラムの解釈に影響を与えない
.
例:継続行と注釈 (ex3.1.f90)
.
program ex_comment
write(*,*) ’Hello world!’
write(*,*) ’Hello &
&world!’
!write(*,*) ’Hello world!’
end
program ex_comment
.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
10/24
木村拓馬
データ型
Fortran90 には主に以下のようなデータ型が用意されている.
型
型指定子
整数型
実数型
倍精度実数型
複素数型
論理型
文字型
INTEGER [種別型パラメタ選択子]
REAL [種別型パラメタ選択子]
DOUBLE PRECISION
COMPLEX [種別型パラメタ選択子]
LOGICAL [種別型パラメタ選択子]
CHARACTER [文字選択子]
種別型パラメタ選択子は,(KIND=4),(KIND=8),(4),(8) などで,精度
(使用するバイト)を決める
文字選択子は,(LEN=10),(10) などで,格納する文字数を決める
これらは省略でき,REAL のみ, INTEGER のみでもOK.
このときふつう種別型パラメタ選択子は (KIND=4),文字選択子は1文字
(LEN=1) となる
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
11/24
木村拓馬
定数
整数
通常 4 バイト(32 ビット)なので,−231 ∼ 231 − 1 の範囲.
実数
単精度(4 byte)
:有効数字が約 7 桁,絶対値が 10±38 程度まで扱える.
4.56E+1 (= 4.56 · 101 ), 7.89E-10 (= 7.89 · 10−10 )
倍精度(8 byte)
:有効数字が約 16 桁,絶対値が 10±308 程度まで.
4.56D+1, 7.89D-10
複素数
複素数は (実数部, 虚数部) と記述
(1.23D0, 4.0D0) (1.2D-3, -1.0D0)
論理定数
真であれば.TRUE.,偽であれば.FALSE. で表す.
文字
アポストロフィ( ’ ) かダブルクォーテーション ( ” ) で括る.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
12/24
木村拓馬
プログラムの構成
.
[PROGRAM [プログラム名]]
宣言部
実行部 (代入,演算,入出力など)
.END [PROGRAM [プログラム名]]
.
プログラムの始まりと終わりの合図
.
PROGRAM 文
主プログラムの開始は以下の PROGRAM 文を記述.
プログラム名は省略可能で,PROGRAM 文自体も省略可能.
(プログラム名とファイル名が異なってもよい)
(規格には見当たらないが,変なプログラム名はエラーになるらしい)
END PROGRAM 文
.
プログラムの終了
PROGRAM およびプログラム名は省略可能だが,END は必要.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
13/24
木村拓馬
出力
WRITE 文または PRINT 文を用いる.
.
WRITE
(装置番号, 書式識別子) 文字または変数名
.
.
PRINT
書式識別子, 文字または変数名
.
装置番号にアスタリスク (*) を指定すると標準出力(画面)に出力
(装置番号は「ファイル入出力」の回で扱う予定)
書式識別子にアスタリスク (*) を指定すると標準書式
(書式識別子は「書式指定」
・
「反復処理」の回で扱う予定)
文字列をそのまま出力する場合は,出力したい文字列をアポストロフィー
(’)で囲む
一般に,書式の指定がない場合は,WRITE 文を書くたびに改行
複数のデータをまとめて出力するときはカンマ(,)で区切る
.
例:画面に文字列’Hello world!’ を出力(test.f90)
.
program test
write(*,*) ’Hello world!’
end
program
test
.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
14/24
木村拓馬
変数の宣言
.
型宣言文:変数を使うときは,前もって合図.
.
変数とは,データを一時的に記憶しておくための領域に名前を付けたもの.
ふつう記憶する領域を確保するためには,変数を使用する前に名前(変数
名)と種類(データ型)と大きさ(配列の回で扱う)の宣言を行う.
Fortran90 で型宣言をする場合,コロン( : )を 2 つ付けて宣言する.
たとえば,
INTEGER :: I
で,整数 (integer) を記憶する”I”という名前の変数が使用できるようになる
.
表のように,同じ型の変数はまとめて宣言する
型
整数型
実数型
倍精度実数型
複素数型
倍精度複素数型
論理型
文字型
記述方法
INTEGER :: I, J, K
REAL :: A, B, C
DOUBLE PRECISION :: D, E, F
COMPLEX :: G, H
COMPLEX(8) :: G, H
LOGICAL :: P, Q, R
CHARACTER :: A
CHARACTER(5) :: A
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
15/24
木村拓馬
変数の宣言
Fortran は特に型宣言をしなければ,変数名の最初の文字によってその変数の型
が自動的に決定する(暗黙の型宣言).
変数名の頭文字
I, J, K, L, M, N (小文字も同様)
A ∼ H, O ∼ Z (小文字も同様)
変数の型
整数型
実数型
.
注意
.
変数の打ち間違えなどによって予期せぬバグが起こる可能性があるため,本講
義では PROGRAM 文の後に
IMPLICIT NONE
と記述し,暗黙の型宣言を使用せず,すべての変数の型宣言を書くことを推奨.
.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
16/24
木村拓馬
代入
変数に値を代入するには,代入演算子= (イコール) を用いる.
(数学の等号の意味とは違うことに注意).
.
. 変数名=値
.
i=1
. a=10.0
次の例では,整数 (integer) の変数 i と実数 (real) の変数 a の使用を宣言,
変数に値を代入 (=) し,変数の値を画面に出力
.
例:変数の宣言・代入・画面に出力(ex3.2.f90)
.
program ex_variable
implicit none
integer :: i
real :: a
i=1
a=10.0
write(*,*) i
write(*,*) ’a=’,a
end
program
.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
17/24
木村拓馬
入力
キーボードやファイルから変数にデータを入力するには,READ 文を用いる.
.
READ
(装置番号, 書式識別子) 変数名
.
.
READ
書式識別子, 変数名
.
装置番号にアスタリスク (*) を指定すると標準入力(キーボード)
(装置番号は「ファイル入出力」の回で扱う予定)
複数のデータをまとめて入力するときはカンマ(,)で区切る
.
例:キーボードから整数を入力(ex3.3.f90)
.
program ex_read
implicit none
integer :: i,j
write(*,*) ’input an integer: i’
read(*,*) i
write(*,*) ’i=’, i
write(*,*) ’input two integers: i, j’
read(*,*) i,j
write(*,*) ’i=’, i, ’, j=’, j
end
program ex_read
.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
18/24
木村拓馬
演算規則
四則演算と冪算
Fortran90 で使える算術演算子には優先順位がある.
.
.
算術演算子
+
*
/
**
意味
加算
減算
乗算
除算
べき算
優先順位
低
低
中
中
高
異なる型の演算結果
異なる型が混在した場合,型の強い方の型が使用される.
.
.
整数< 単精度実数< 倍精度実数< 単精度複素数< 倍精度複素数
整数型と実数型の演算結果は実数となる
実数型と複素数型の演算結果は複素数となる
etc.
注意. 整数÷整数の演算結果も整数(小数点以下切り捨て)となる.
1/3 と 1.0/3.0 は違う
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
19/24
木村拓馬
演算規則
.
例:計算してみよう(ex3.4.f90)
.
program ex_arithmetics
implicit none
integer :: i=1, j=3
! 四則演算と冪算
write(*,*) 1+3
write(*,*) 1-3
write(*,*) 1*3
write(*,*) 1/3
write(*,*) 1.0/3.0
write(*,*) 1./3.
write(*,*) 2.**3.
write(*,*)
! 演算子の優先順位
write(*,*) 1+2*3
write(*,*) (1+2)*3
write(*,*)
! 変数を使って演算
write(*,*) i+j, i-j
i=i+1; write(*,*) i
i=i+1; write(*,*) i
i=i+1; write(*,*) i
end
program ex_arithmetics
.
integer :: i=1
のように,変数の宣言と同時に値を代入できる
1 は整数型,1.0 と 1. は実数型
1/3 は整数と整数の演算だから整数,
1.0/3.0 は実数と実数の演算だから実数,
と結果が違うので注意
write(*,*) だけの行は出力を改行.
カッコ()でくくると,計算の優先順位が高くなる
i=i+1 で,i の値が1増える.
このような演算をインクリメントという.
減らすのはデクリメント(i=i-1).
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
20/24
木村拓馬
参考文献
[1]
JIS X 3001-1:2009 (プログラム言語 Fortran – 第 1 部:基底言語)
[2]
渡部 善隆:Fortran 90 の紹介, 九州大学大型計算機センター広報, Vol.29,
No.4 (1996), pp.301-313.
[3]
株式会社インセプト:IT 用語辞典 e-Words,http://e-words.jp/(2014 年 4
月 10 日閲覧)
[4]
The G95 Project,http://g95.org(2014 年 4 月 10 日閲覧)
[5]
戸川隼人:ザ・Fortran90/95,サイエンス社(1999)
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
21/24
木村拓馬
Appndix
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
22/24
木村拓馬
書式指定
入出力を見やすくするために,以下の編集記述子を用いて桁数を指定して入出
力を行わせることができる.
I 型編集記述子 (In)
整数型データの入出力に用いる.全部で n 桁で右詰め表示.
F 型編集記述子 (Fn.m)
実数型データの入出力に用いる.全部で n 桁で,小数点以下 m 桁で,右詰めで表示.
E 型編集記述子 (En.m)
実数型データの指数部付き入出力に用いる.全部で n 桁で,小数点以下 m 桁で,右
詰めで表示.
A 型編集記述子 (An)
文字型データの入出力に用いる.全部で n 文字で右詰めで表示.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
23/24
木村拓馬
書式指定
.
例:write 文に書式指定(ex3.5.f90)
.
PROGRAM EX_SHOSIKI
INTEGER :: I, J, K
REAL :: A, B, C
CHARACTER(5) :: STRING=’CHaRa’
I = 1 ; K = 12 ; J = 123 ; A = 1.234 ; B = 12.3456
WRITE (*, ’(I3)’) I
WRITE (*, ’(I5, I5, I5)’) I, J, K
WRITE (*, ’(3I5)’) I, J, K
WRITE (*, ’(2F10.3)’) A, B
WRITE (*, ’(A5)’) STRING
WRITE (*, ’(A4)’) STRING
.END PROGRAM EX_SHOSIKI
.
実行すると
.
1
1 123 12
1 123 12
1.234 12.346
CHaRa
CHaR
.
FORTRAN プログラミング入門,–第 3 回 プログラム作成の基本,標準入出力,変数,演算–
24/24