プログラミング学習の記録 #017(FORTRAN)
C言語の操作について、一通り学習できたので、今回からはFORTRANの学習を進めていこうと思う。前回までのC言語の学習は、以下の記事を参考にしてほしい。
FORTRANを学習する理由としては、地球惑星科学を専攻するが、地球惑星科学の数値計算ではFORTRANが用いられることが多い(多かった)ということが挙げられる。今後、数値計算をしていく際に、あえてFORTRANを用いることはないと思うが、古代言語を解読するうえで必要な基礎知識程度は、今、学習しておいて損はないと思う。
教科書は、C言語に引き続き、以下の書籍を利用する。
Ubuntuカスタマイズ
これまでMacのPCを用いてプログラミング学習を進めていたが、下宿にある古いデスクトップPCにUbuntuを入れているので、このPCもプログラミング学習に使えるように色々と設定をしておいた。
エイリアス
今回、エイリアスについては、このサイトを参考にして設定した。ホームディレクトリにおいて、以下のコマンドを入力してviを開いた。
$ vi .bash_aliases
そして、viの中で以下のように書いて、エイリアスを設定した。
alias cc='cc -lm'
alias ff='gfortran'
alias rm='rm -i'
スニペット
次に、このサイトを参考にして、VSCodeでスニペットの設定をした。今回は、Fortran用のスニペットを設定するので、「fortran-modern.json」に以下のように書いた。
{
"Fortran Start": {
"prefix": "fstart",
"body": [
"program fortran_study",
"",
" $1",
"",
" print *, 'HAPPY SMILE (^_^)v'",
"end program fortran_study"
]
}
}
FORTRANの特徴
FORTRANの長所としては、以下の点が挙げられる。
人間の言語に比較的近いので、プログラムコードを簡単に書くことができる。
高性能のコンパイラが多いので、大規模計算に適している。
一方で、短所としては、以下の点が挙げられる。
プログラムの構造がわかりにくい傾向がある。
文字処理に適していない。
基本構造
FORTRANのプログラムコードの基本構造は、以下の通りである。
program [プログラム名]
//プログラム本文
end program [プログラム名]
この基本構造によってプログラムを実行することができた。しかし、教科書には、以下の基本構造が紹介されていた。以下の基本構造では、うまく実行できなかった。
program [プログラム名]
//プログラム本文
stop
end
教科書によると、FORTRANのプログラムコードは、桁数に制約がある固定形式ということであったが、最近のFORTRANは、そのような制約がない自由形式であるらしい。
型宣言
FORTRANで用いることができる変数型は、以下の通りである。
整数 integer
単精度実数 real
倍精度実数 double precision
複素数 complex
文字型 character
ただし、複素数型は、以下のように実部と虚部を丸括弧で囲う。
complex z
z = ( 2, 3 )
このとき、虚数単位 $${i}$$ として、複素数 $${z = 2 + 3i}$$ ということになる。また、FORTRANには、暗黙の型宣言と呼ばれる慣習がある。i,j,k,l,m,nのアルファベットからはじまる変数は、型宣言をせずとも、整数型として処理される。しかし、わかりやすいコードにするために、常に型宣言をしておいた方がよい。
基本演算
加減乗除および冪乗の計算は、+,-,*,/,**によって行うことができる。教科書を参考にして、加減乗除および冪乗の計算を行うプログラムコードを書いた。
program fortran_study
integer a1,a2
integer x1,x2,x3,x4,x5
a1 = 7
a2 = 2
x1 = a1 + a2 !plus
x2 = a1 - a2 !minus
x3 = a1 * a2 !times
x4 = a1 / a2 !divide
x5 = a1 ** a2 !power
write(6,*) a1,' + ',a2,' = ',x1
write(6,*) a1,' - ',a2,' = ',x2
write(6,*) a1,' * ',a2,' = ',x3
write(6,*) a1,' / ',a2,' = ',x4
write(6,*) a1,' ^ ',a2,' = ',x5
print *, 'HAPPY SMILE (^_^)v'
end program fortran_study
データ入出力
C言語と同様に、FORTRANでもデータの入出力が可能である。教科書によると、データ出力はwrite、データ入力はreadを用いることで実行可能ということであったが、このサイトによると、printを用いることでもデータ出力が可能であるということであった。ただし、writeでは画面への出力だけでなく、ファイルへの出力も可能であるのに対して、pritntでは画面への出力のみが可能であるということである。このサイトによると、書式指定子に「*」を書くと、適当な書式が設定されて便利ということである。
write
装置指定子を設定することで、画面出力やファイル出力などを指定することができる。
write([装置指定子],[書式指定子]) [変数名や文字列などの並び]
以下のような簡単なコードを書いた。
program fortran_study
integer a,b
double precision c
a = 7
b = 3
c = a
c = c / b
write (*,"(i3,i3)") a,b
write (*,"(i3,i3)") a+b,a-b
write (*,"(f6.4)") c
print *, 'HAPPY SMILE (^_^)v'
end program fortran_study
これを実行すると、以下のように表示された。
% ./a.out
7 3
10 4
2.3333
HAPPY SMILE (^_^)v
read
read([装置指定子],[書式指定子]) [変数名の並び]
program fortran_study
integer x,y
write(*,1114,advance='no') "Input the integer x: "
read (*,*) x
write(*,1114,advance='no') "Input the integer y: "
read (*,*) y
write (*,0129) x,y
0129 format(i5,i5)
1114 format(a)
print *, 'HAPPY SMILE (^_^)v'
end program fortran_study
これを実行すると、以下のように表示された。ただし、$${x=24,y=31}$$を入力した。
% ./a.out
Input the integer x: 24
Input the integer y: 31
24 31
HAPPY SMILE (^_^)v
画面出力のみであるから、装置指定子は不要であり、書式指定子のみを書く。
print [書式指定子], [変数名や文字列などの並び]
上述のwriteと同様に、簡単なコードを書いた。
program fortran_study
integer a,b
double precision c
a = 7
b = 3
c = a
c = c / b
print '(i3,i3)', a,b
print '(i3,i3)', a+b, a-b
print '(f6.4)', c
print *, 'HAPPY SMILE (^_^)v'
end program fortran_study
これを実行すると、以下のように表示された。
% ./a.out
7 3
10 4
2.3333
HAPPY SMILE (^_^)v
これは、writeを用いたときと同様の結果である。
format
書式指定においては、formatを利用することができる。
program fortran_study
double precision a,b
a = 24.0
b = 3.0
print 1114, a,b
print 1114, a*b,a/b
print 1114, a/(b**2), a/(b**3)
write (*,1114) a,b
write (*,1114) a*b,a/b
write (*,1114) a/(b**2),a/(b**3)
1114 format(f9.4,f9.4)
print *, 'HAPPY SMILE (^_^)v'
end program fortran_study
これを実行すると、以下のように表示された。
% ./a.out
24.0000 3.0000
72.0000 8.0000
2.6667 0.8889
24.0000 3.0000
72.0000 8.0000
2.6667 0.8889
HAPPY SMILE (^_^)v
このようにformatを利用してコードを書くことで、同じ書式を複数回用いることができる。
-----
動け!タイムライン