見出し画像

プログラミング学習の記録 #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 = ( 23 )

このとき、虚数単位 $${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

画面出力のみであるから、装置指定子は不要であり、書式指定子のみを書く。

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を利用してコードを書くことで、同じ書式を複数回用いることができる。

-----

動け!タイムライン

動物園か水族館にいきたいですね。