Fortran入門
プログラミング言語「Fortran」に関する情報。
プログラミング・文法の解説は、Fortran77の文法に従っています。
このページの情報は古いので、リンク切れ等あるかもしれません。
私は、以下のコンパイラー&エディターを、WindowsXPがインストールされたパソコンで使用しています。
- FTN77 Personal Edition
Salford Softwareの無料で使用できるFortran77のコンパイラー - CPad for Salford FTN77
FTN77 Personal Edition用のFortran開発環境です。
簡単にコンパイル&実行ができます。
目次
無料コンパイラー
- FTN77 Personal Edition
Salford Softwareの無料で使用できるFortran77のコンパイラー - FTN95 Personal Edition
Salford Softwareの無料で使用できるFortran95のコンパイラー - F Compilers
- G95
- f2c
Fortran77のコードをCのコードに変換する。 - Watcom Fortran
- G77
エディター
CPad for Salford FTN77
FTN77 Personal Edition用のFortran開発環境です。
簡単にコンパイル&実行ができます。
書き方
1行に一つの文(プログラム)を書きます。
左から6字目までは空けて、7字目から書きます。
プログラムの最後には、stop、endを書きます。
write(*,*)'sample' stop end
1字目が「c」もしくは「*」の場合、その行にはコメントを書けます。
6字目が空白と0以外の場合、その行は前の行の続きになります。
c この行はコメント * この行もコメント wri +te(*,*)'sample' stop end
変数と型
- 変数名の長さは6字以下(7字以上OKの場合もある)
- 変数名に使える文字は英数字
- 変数名の先頭は英字
- 型宣言をしない場合、i、j、k、l、m、nで始まる変数は実数型、それ以外は整数型(暗黙の型宣言)
- 型宣言
型宣言はプログラムの先頭で行う。
integer 変数名 ・・・ 整数型
real 変数名 ・・・ 実数型 - 以下の場合、型変換が行われる。
違う型の変数に代入した場合
違う型の変数を混ぜて計算した場合
int(変数) ・・・ 整数型に変換
real(変数) ・・・ 実数型に変換
float(変数) ・・・ 実数型に変換
integer i1 real x1,x2,x3 x1=5 x2=2 i1=x1/x2 write(*,*)'x1=',x1 write(*,*)'x2=',x2 write(*,*)'i1=x1/x2=',i1 c write(*,*)'int(x1)=',int(x1) stop end
入出力
- 入力は、read(*,*)変数名,変数名
- 出力は、write(*,*)変数名,変数名
- 「(*,*)」は、入出力装置と書式の指定
「*」の場合、標準的な処理を行ってくれる - 文字列を表示したい場合は、「’」で文字列を囲む
read(*,*)x,y,z w=x+y+z write(*,*)'w=x+y+z=',w stop end
書式の指定
- 書式の指定は、formatで行う。
- 下の例で、100、105は文番号
- formatの行の文番号は、1~5字目までに書く
- 「format(1f5.2)」の「1」は、データを1個ずつ読み込むという意味
- 「format(1f5.2)」の「f」は、実数型のデータとして読み込むという意味
整数型の場合は「i」 - 「format(1f5.2)」の「5.2」は、「全部で5桁、小数点以下2桁」という意味
read(*,100)v,w,x,y 100 format(1f5.2) write(*,105)v,w,x,y 105 format(' ',2f10.3) stop end
算術関数
Fortranでは以下の算術関数を使用できます。
角度の単位はラジアン。
x**y | xのy乗 |
abs(x) | xの絶対値 |
sqrt(x) | xの平方根 |
mod(i,j) | iをjで割った余り |
max(x,y,・・・) | x、y、・・・の最大値 |
min(x,y,・・・) | x、y、・・・の最小値 |
log(x) | log x |
log10(x) | log10x |
exp(x) | ex |
sin(x) | sin x |
cos(x) | cos x |
tan(x) | tan x |
asin(x) | arcsin x |
acos(x) | arccos x |
atan(x) | arctan x |
atan2(x,y) | arctan x/y |
sinh(x) | sinh x |
cosh(x) | cosh x |
tanh(x) | tanh x |
pi=atan(1.0)*4.0 cos60=cos(pi/3.0) write(*,*)'π=',pi write(*,*)'cos60°=',cos60 stop end
判断(if文)
- if(条件式)条件式が成立した場合に実行するプログラム
- if(条件式)then
条件式が成立した場合に実行するプログラム(複数行書ける)
end if - if(条件式)then
条件式が成立した場合に実行するプログラム(複数行書ける)
else
条件式が不成立の場合に実行するプログラム(複数行書ける)
end if - if(条件式1)then
条件式1が成立した場合に実行するプログラム(複数行書ける)
else if(条件式2)then
条件式1が不成立で条件式2が成立した場合に実行するプログラム(複数行書ける)
else if(条件式3)then
条件式1と条件式2が不成立で条件式3が成立した場合に実行するプログラム(複数行書ける)
end if - 条件式が成立した場合に実行するプログラム(条件式が不成立の場合に実行するプログラム)の中にもif文を書ける
下の例の「x.lt.20」は「x<20」の意味
write(*,*)'x=' read(*,*)x if(x.lt.20)then write(*,*)'x<20' else write(*,*)'x≧20' end if stop end
比較演算子と論理演算子
.lt. | <(less than) |
.le. | ≦(less or equal) |
.eq. | =(equal) |
.ge. | ≧(greater or equal) |
.gt. | >(greater than) |
.ne. | ≠(not equal) |
.and. | 論理積(かつ) |
.or. | 論理和(または) |
.not. | 論理否定(ではない) |
write(*,*)'X=' read(*,*)x if((x.gt.10).and.(x.lt.20))then write(*,*)'10<X<20' else if(x.le.10)then write(*,*)'X≦10' else write(*,*)'X≧20' end if stop end
繰り返し(do文)
do 文番号 制御変数=初期値,終値,増分 繰り返し実行するプログラム 文番号 continue
- 増分は省略すると1となる
- continueの行の文番号は、1~5字目までに書く
- doの行で、制御変数が終値に達していない場合、「繰り返し実行するプログラム」が実行される
- 「繰り返し実行するプログラム」が実行された後、制御変数に増分が加算され、doの行に戻る
- doループ内にdoループを書いてもかまわない
do 100 i=1,9 do 200 k=1,9 write(*,*)i,'×',k,'=',i*k 200 continue 100 continue stop end
配列
- 配列とは、1つの変数(配列変数)で複数のデータを扱う場合に用いる。
- 配列名の付け方は、変数名の付け方と同じ。
- 配列を使用する場合は、配列名と大きさをプログラムの先頭で宣言しておかなければならない。
dimension 配列名(下限:上限,下限:上限,・・・),・・・ - 下限を指定しない場合、下限は1となる。
dimension m(9) do 100 i=1,9 m(i)=i 100 continue write(*,*)(m(k),k=6,9) stop end
GOTO文
go to 文番号で、文番号のある行に飛ぶ。
200 write(*,*)'偶数を入力してください。' read(*,*)k if(mod(k,2).eq.0)then go to 100 else go to 200 end if 100 write(*,*)'OK' stop end
サブルーチンと関数
サブルーチンとは、同じ作業を何度も行う場合などに、その部分をメインプログラムと切り離しておいて、必要なときに呼び出して使うことができるというものです。
call サブルーチン名(引数,引数,・・・) stop end c subroutine サブルーチン名(引数,引数,・・・) プログラム return end
サブルーチン名の付け方は、変数名と同じですが、型は関係ありません。
dimension x(2) x(1)=1 x(2)=2 y=5 call ss(x,y,z) write(*,*)'x1=',x(1) write(*,*)'x2=',x(2) write(*,*)'y=',y write(*,*)'z=x1+x2+y=',z stop end c subroutine ss(a,b,c) dimension a(2) c=a(1)+a(2)+b return end
返す値が1つの場合は関数も使えます。
関数では、返す値を関数名に代入します。
関数名の付け方は、変数名の付け方と同じです。
function 関数名(引数,引数,・・・) プログラム 関数名=値 or 計算式 return end
x=2.0 y=f(x) write(*,*)'x=2.0、','f(x)=2x+3=',y stop end c function f(a) f=2*a+3 return end
計算式が1行の場合は、文関数が使えます。
f(x)=2.0*x+3.0 y=f(2.0) write(*,*)'x=2.0、','f(x)=2x+3=',y stop end
ディスカッション
コメント一覧
まだ、コメントがありません