宣言文には、型宣言文、parameter文、data文、common文などがあります。宣言文は変数の型や長さ、変数の初期値などを定義する文で、直接実行の手順を記述する文ではありませんので、非実行文に分類されます。
宣言文はプログラム単位の中で最初の実行文より前に記述しなければなりません。
型宣言文とは変数の型や長さを宣言する文をいいます。型宣言文の一般記述形式は次のとおりです。
型宣言 v1,v2・・・
型宣言には、整数型変数:integer、実数型変数:real、文字型変数:characterを指定します。
v1,v2・・・
は並びで変数名、配列名などをカンマ , で区切って記述します。
integer文は指定した変数や配列が整数型であることを定義します。整数型の変数の値は整数です。integer文の一般記述形式は次のとおりです。
integer v1,v2・・・
real文は指定した変数や配列が実数型であることを定義します。実数型の変数の値は実数です。real文の一般記述形式は次のとおりです。
real v1,v2・・・
character文は指定した変数や配列が文字型であることを定義します。文字型の変数の値は「yamada taro」や「山田」などの文字列です。character文の一般記述形式は次のとおりです。
character v1*l1,v2*l2・・・
l1,l2・・・
は文字変数の長さ(文字数)です。長さが1の時は省略できます。
次に型宣言文の使用例を示します。
integer m,n,wa,sa,seki,sho,amari,i,j real a1,n character ji,moji*20,line*200
変数 m、n、wa、sa、seki、sho、amari、i、j は整数型、変数 a1、n は実数型、
変数 ji、moji、line は文字型です。ji の長さは1文字(文字変数の長さが1の時は省略可)、moji は 20 文字、line は 200 文字です。
Fortranでは型宣言文で定義せずに変数名を使用できます。この場合変数名の先頭が i, j, k, l, m, n のものは整数型、それ以外のものは実数型です。これを暗黙の型宣言といいます。
代入文とは = の左辺に変数、右辺に式を記述した文をいい、右辺に記述された式の結果を左辺の変数に格納します。代入文の一般記述形式は次のとおりです。
変数 = 式
式は、定数や変数などと、それらを演算子で組み合わせたものです。
次の算術演算子を使用した代入文を算術代入文といいます。
算術演算を行う演算子を算術演算子といいます。次に算術演算子とその意味を示します。
演算子 | 意味 |
---|---|
+ | 加算(+) |
- | 減算(−) |
* | 乗算(×) |
/ | 除算(÷) |
** | ベキ乗 |
計算の優先順位は、順位の高い方からベキ乗、乗・除算、加・減算で、数学の演算の優先順位と同じです。優先順位を変えたい時は、( )を用いて指定します。これも数学の演算と同じですが使用できる括弧の種類は( )のみです
次に算術代入文の記述例を示します。
例1) amari=m-sho*n 例2) m=789 例3) x=x*5.6+12-b1 例4) a=(m-sho)*n
例1)から例3)は、演算子の優先順位にしたがって計算します。
例4)は、まず( )の中の m - sho を計算し、その計算結果に n を掛けます。
キーボードやファイルからデータを読み込む時には read文(入力文)、計算結果などを画面上に表示する時やファイルに書き込む時には write文(出力文)を使用します。
read文、write文の一般記述形式は次のとおりです。
read(*,* [ ,end = 文番号] ) [入力並び] write(*,*) [出力並び]詳しくは、
read(装置番号,書式仕様 [ ,end = 文番号] ) [入力並び] write(装置番号,書式仕様) [出力並び]
[ ] 内の項は必要に応じて記述すればよく、[ ] とともに省略できます。
入力並びは、変数名、配列名、配列要素などをカンマ , で区切って並べたもので、出力並びは、変数名、配列名、配列要素、式などをカンマ , で区切って並べたものです。
装置番号と書式仕様について以下の表に示します。
装置番号 | 装置 |
---|---|
* | 標準入出力装置(read文ではキーボード、write文ではディスプレイ) |
5 | 標準入力装置(特に指定しないとキーボード) |
6 | 標準出力装置(特に指定しないとディスプレイ) |
2桁以内の番号 (0、00は除く) | その他の装置(ファイルなど) |
書式仕様 | 内容 |
---|---|
* | 自由書式:標準書式仕様を用いる |
文番号 | format文(書式仕様文)の文番号:書式仕様はプログラム作成者が記述 |
自由書式を指定した場合の書式仕様
入力:入力並びに指定されたデータの形式で、
データをカンマ , または空白で区切って入力する
出力:出力並びに指定されたデータの形式で、
データを適当な桁数で空白で区切って出力する
end = 文番号
はファイル終了指定子といい、入力データの終わりを検出した時に、指定した文番号に実行を移します。
次にread文、write文の使用例を示します。
例1) read(*,*) a,b,c
変数 a、b、c に標準入力装置から自由書式にしたがってデータを読み込みます。
例2) read(*,*,end=901) m,n
変数 m と n に標準入力装置から自由書式にしたがってデータを読み込みます。入力データが終わった時は文番号 901 の文に飛んで処理を続けます。
例3) read(5,301,end=901) m,n
301 format(2i5)
装置番号5(標準入力装置)の装置から文番号 301 の format文で指定した書式仕様にしたがって、入力並びの変数 m と n にデータを読み込みます。入力データが終わった時は文番号 901 の文に飛んで処理を続けます。
例4) write(*,*) m,n,wa,sa,seki,sho,amari
装置番号6(標準出力装置)の装置に、出力並びに記述した順番に変数m、n、wa、sa、seki、sho、amariの値を自由書式で出力します。
例5) write(*,*) ' 計算終り '
標準出力装置に文字定数 ' 計算終り ' を自由書式にしたがって出力します。
例6) write(6,611) m,n,wa,sa,seki,sho,amari
611 format(1x,7i8)
装置番号6(標準出力装置)の装置に、出力並びに記述した順番に変数m、n、wa、sa、seki、sho、amariの値を文番号 611 のformat文の書式仕様にしたがって出力します。
制御文は実行の流れを制御する実行文です。制御文にはstop文、end文、goto文、ブロックif文などがあります。
stop文は実行の終わりを示す文で、記述形式は次のとおりです。
stop
end文はプログラムの終わりと実行の終わりを示す文で、プログラムの最後に必ず記述します。end文の記述形式は次のとおりです。
end
プログラムは特に指定のない限り記述した文の順番どおりに(プログラムの先頭から末尾に向かって)実行されます。実行の順番(流れ)を変える時は 飛び越し を使用します。
goto文は指定された文番号の文に無条件に実行の流れを移す(飛び越す)実行文です。goto文の一般記述形式を次に示します。
go to 文番号
continue文は、「何も実行しない」ことを指定する実行文です。通常は do文の終わりや goto文の飛び先などを示す文として使用されるため文番号をつけて用います。continue文の一般記述形式を次に示します。
文番号 continue
条件によって実行の流れを変える時には 判断 を使用します。判断には、ブロックif文、論理if文などがあります。
ブロックif は、ブロックif文で始まり endif文で終わります。ブロックif文とともに使用される文に、else文、elseif文があります。ブロックif文では、判断の条件を論理式を用いて記述します。論理式の結果は「真」か「偽」です。
ブロックifの一般記述形式は、
if(論理式) then 「論理式が真の時の処理」 else 「論理式が偽の時の処理」 endifで、
「論理式が偽の時の処理」を記述する必要の無い時は、else文と elseブロックがない記述形式で
if(論理式) then 「論理式が真の時の処理」 end ifのように記述します。論理式が偽の時は何もせずにendif文の次の文に実行を移します。
「論理式が偽の時の処理」の中で、さらに別の条件により実行の流れを変えたい時は、次のようにelseブロックの中にブロックifを入れ子にします。
if(論理式1) then 「論理式1が真の時の処理」 else if(論理式2) then 「論理式2が真の時の処理」 else 「論理式2が偽の時の処理」 endif endif
上の例は elseif文と elseifブロックを使用して次のように記述できます。
if(論理式1) then 「論理式1が真の時の処理」 else if(論理式2) then 「論理式1が偽の時で論理式2が真の時の処理」 else 「論理式1と論理式2がともに偽の時の処理」 endif
論理式は、関係式または、関係式と論理演算子で構成されます。関係演算子と関係式、論理演算子と論理式を以下の表に示します。各演算子とも、左右にピリオド . の付いた形をしています。
関係演算子 | 関係式 | 意味 (a1、a2 は算術式) |
---|---|---|
.lt. | a1.lt.a2 | a1 < a2 ならば真、そうでなければ偽 |
.le. | a1.le.a2 | a1 ≦ a2 ならば真、そうでなければ偽 |
.eq. | a1.eq.a2 | a1 = a2 ならば真、そうでなければ偽 |
.ne. | a1.ne.a2 | a1 ≠ a2 ならば真、そうでなければ偽 |
.ge. | a1.ge.a2 | a1 ≧ a2 ならば真、そうでなければ偽 |
.gt. | a1.gt.a2 | a1 > a2 ならば真、そうでなければ偽 |
論理演算子 | 論理式 | 意味 (r1、r2 は関係式) |
---|---|---|
.not. | .not.r1 | 否定:r1が真であれば偽、r1が偽であれば真 |
.and. | r1.and.r2 | 論理積:r1とr2が共に真の時は真、それ以外は偽 |
.or. | r1.or.r2 | 論理和:r1かr2のどちらかが真の時は真、r1とr2がともに偽の時は偽 |
次にブロックifの例を示します。
例1) 論理式が真の時の処理のみの場合
if(sa.gt.0) then j=j+1 end if
変数saの値が定数 0より大きい時には j=j+1 を実行します。それ以外の時は endif文の次の文に実行を移します。
例2) 論理式が真の時と偽の時の処理がある場合
if(a.lt.kugiri) then i1=i1+1 write(*,*) a, ' < ', kugiri, ' である。' else i2=i2+1 write(*,*) a, ' ≧ ', kugiri, ' である。' end if
変数aの値が変数kugiriの値より小さい時は、i1=i1+1 と write(*,*) a, ' < ',・・ を実行して endif文の次の文に実行を移します。それ以外(変数aの値が変数kugiriの値以上)の時は、i2=i2+1 と write(*,*) a, ' ≧ ',・・ を実行して endif文の次の文に実行を移します。
例3) 条件が2つある時に論理式を関係演算子(関係式)だけで記述する場合
if(nenrei.ge.20) then if(nenrei.lt.30) then [変数nenreiが20以上で30未満の時の処理] endif end if
ブロックifを入れ子にして、変数nenreiが20以上の時、変数nenreiが30未満の時について1つずつ判断します。
例4) 条件が2つある時に論理式を論理演算子も使用して記述する場合
if(nenrei.ge.20.and.nenrei.lt.30) then [変数nenreiが20以上で30未満の時の処理] end if
ブロックif文の論理式を、関係式 nenrei.ge.20 と nenrei.lt.30 を論理演算子 .and. でつなげて記述します。
論理式が真の時に実行する文が1つだけの時には、論理if文を使用できます。論理if文の一般記述形式は次のとおりです。
if(論理式) 実行文
次の論理if文
if(sa.gt.0) j=j+1
は、変数saの値が定数 0より大きい時に j=j+1 を実行します。