Fortran, C, Pascalはいずれも、プログラム言語としては手順立て型という
同じグループに属しますから、概念は相互に対応しています。
1996年当時、情報基礎科目でPascal を経験している人が多かったので、
Pascalとの対応をつけながらFortran文法の要点を説明しておきます。
プログラミング言語 Fortran と Pascal の文法の比較
ここでは、いわゆるFortran 77(注)の文法のうち、
増田の教材でまず必要になる部分の説明をする。
また、Pascalとの対比を添える。
なお、Fortranには新しい90および95標準があり、
大規模な数値計算をする人には使われているが、
ここでは、GNU g77などのフリーのコンパイラに合わせて、
77標準に多少の新しい要素を追加した文法を紹介する。
また、サブルーチン(Pascalでのprocedureに対応)
や関数サブプログラムに関することは、今回は省略し、
別の記事で紹介する。
注「Fortran 77」:
ANSI=アメリカ国定標準 1978年、JIS=日本工業規格 1982年制定の標準であるが、
原案の最終版が書かれた年にちなんでこう呼ばれる。一つ前の標準はFortran 66
である。
◎文字の種類
- Fortran
- Fortranプログラム中で意味を持つ文字は、アルファベット、数字、空白と
記号 + - * / = ( ) , . : ' & $ である。大文字と小文字の区別はない。
ただし、文字列および文字型変数の値としては、もっと多種類の文字が許され、
大文字と小文字が区別されるのがふつうである。
- Pascal
- Pascalで意味を持つ文字はFortranよりやや多い ( ; { } [ ] < > ^ など)。
Pascalでも大文字と小文字の区別はない。
- 注:
- Cなど、比較的新しいプログラム言語では、大文字と小文字を区別するもの
が多い。
◎行と文
*行
- Fortran
- Fortranプログラムは行からなっている。
- Pascal
- Pascalでは改行は空白と同等であり、行という構造を特別に意識しない。
*注釈(コメント)
注釈とは、人間のための覚えや、プログラムの見かけをよくするために
挿入されるもので、機械語には翻訳されない。
- Fortran
- 次のような行は注釈行である。
- 第1桁が文字 C である行
- 第1桁が文字 * (星、アステリスク)である行
- すべて空白である行
行の一部が注釈になることは、77標準にはない。
(それぞれのコンパイラで拡張された約束があることが多い。)
- Pascal
- 次のような部分は注釈である。
- { } に囲まれた部分。
- (* *) に囲まれた部分。
行の一部が注釈であったり、一つの注釈が複数の行にまたがったりする。
*文
- Fortran
- 注釈以外の文は、次のいずれかの形で書かれる。
- 1行のうちにおさまる。
- 複数の行にまたがる。このとき2行め以後の行を継続行といい、その印に、
第6桁に、「空白と 0 以外の任意の文字」を置く。
複数の文が1つの行にあることは77標準にはない。
- Pascal
- 文が複数の行にまたがってもよいし、同じ行に複数の文があっても
よい。文と文の境には、セミコロン(;)を置く。
*複合文
- Fortran
- Fortranでは複数の文の組み合わせで複合文ができるという考え方はしない。
ただし、文のブロックという考えはある。(IF, DOの項)。
- Pascal
- Pascalでは、複数の文を BEGIN ... END でくくったものは複合文とみなされ、
一つの文が来るべきところに置くことができる。
◎変数名などの字数
- Fortran
- Fortran 77では、6文字までとなっている。
実際のコンパイラでは、もっと長い変数名を許すことが多いが、7文字め以降で
初めて区別されるような名前は避けたほうがよい。
DEC Fortranでは、31文字までとなっている。
- Pascal
- Pascal (ANSI 1983年標準)では変数名の字数の制限はない。
DEC Pascalでは、
頭から31文字までが区別され、その先の違いは無視される。
◎宣言文と実行文
FortranでもPascalでも、プログラムを構成する文は、機械に仕事の手順を指示する
実行文と、それに使う変数の名前や種類などを決める宣言文とがある。プログラム
(Fortranの場合、正確には「プログラム単位」)の前のほうに宣言文をまとめて
置き、実行文はそのあとに置く。
宣言文相互の間に順序の指定がある場合もあるが、ここでは詳しくは述べない。
- Fortran
- Fortranでは、宣言部と実行部の境目に特別な印はない。注釈行をはさむのがよい。
- Pascal
- Pascalでは、実行部の初めに BEGIN を置く。
プログラムの最後の END. と呼応する。
◎主要な宣言文
*定数宣言
- Fortran
- PARAMETER文(Fortran 66にはなかった)
PARAMETER(定数名=値, 定数名=値, ...)
例、PARAMETER(nmax=100)
- Pascal
- CONST宣言
CONST 定数名=値, 定数名=値, ...
例、CONST nmax=100;
*変数の型宣言
- Fortran
- 型名で始まる宣言
型名 変数名, 変数名, ...
例、INTEGER ix, iy
REAL*8 v
宣言を省略すると、次のようになる。
- I,J,K,L,M,N で始まる変数は、INTEGER
- その他の変数は REAL
変数はなるべく宣言したほうがよい。
(77標準ではないが、最近の多くの
コンパイラでは、)
IMPLICIT NONE と書いておくと、変数を
全部宣言しなければならなくなる。
- Pascal
- VAR宣言
VAR 変数名, 変数名...: 型名
例、VAR ix, iy: INTEGER;
v: REAL;
Pascalでは変数の宣言を省略できない。
*配列の宣言
(配列変数の意味については、
例文で実際に使う回で補足する。)
- Fortran
- 変数の型宣言文で兼ねる。(専用のDIMENSION文を使うこともある。)
変数名のあとに丸カッコで寸法を書く。
例、REAL*8 a(nmax), b(0:nmax)
添え字の下限は、省略すると、1 。
- Pascal
- 変数の型の指定中でARRAYというキーワードを使う。
例、VAR a: ARRAY[1..nmax] OF REAL;
b: ARRAY[0..nmax] OF REAL;
Pascalでは添え字の下限は省略できない。
- 注:
- Cでは添字の下限は0、Basicでは省略すると 0。
◎代入文
- Fortran
- 代入記号は「=」(「等しい」は「.EQ.」)
変数名 = 式
例、a(1) = ix * v + iy
- Pascal
- 代入記号は「:=」(「等しい」は「=」)
変数名 := 式
例、a[1] := ix * v + iy;
◎制御構造
*順次処理
- Fortran
- 続けて実行する文は、次の行に置く。
- Pascal
- 続けて実行する文は、; で区切って置く。
*条件分岐
- Fortran
- ブロック IF 文を使う。(66標準にはなかった。)
THENやELSEのあとで改行する(つまり、別の文にする)ことに注意。
IF (論理式1) THEN
<THENブロック>
ELSE
<ELSEブロック>
END IF
各ブロックには、(改行で区切られた)複数の文を含めることができる。
ELSE文とELSEブロックがないこともある。
- Pascal
- IF ... THEN ... ELSE 構文を使う。
IF 論理式 THEN <文1> ELSE <文2>
ただし、<文1>、<文2>のところに、
BEGIN ... END でくくられた複合文が
来ることができる。
- Fortran
- 多方面の分岐を扱えるELSE IF文もある。
- Pascal
- PascalではELSE IFは特別な構文ではなく、
IF構文の文2のところにIF文が来たもの。
- Fortran
- ELSEが必要なく、またTHENブロックの文が1つだけのときは、次のよう
な「論理IF文」(THENがない)も使える。
IF (論理式) <文>
- Pascal
- ELSEのない次の形もある。<文>のところに複合文が来てもよい。
IF 論理式 THEN <文>
- Fortran
- Fortran 77標準にはPascalのCASEのような構文はない。(90標準にはある。)
- Pascal
- 多方面の分岐を扱う CASE 文もある。
*回数の決まったくりかえし
- Fortran
- DO 文を使う。
DO 文番号 制御変数 = 初期値, 終端値, 刻み
<DO ブロック>
文番号 CONTINUE
文番号のついた文を"DOの終端文"と言う。正しくは、これもDOブロックに含める。
まぎらわしいので、終端文は必ずCONTINUEという、何もしない文にしておくのがよい。
DOブロックには複数の文を含めることができ、別のDOブロックやIFブロックを
含んでもよい。
刻みは省略でき、省略すると1とみなされる。
最近の多くのコンパイラや、90標準では、次の形を許す。
DO 制御変数 = 初期値, 終端値, 刻み
<DO ブロック>
END DO
- Pascal
- FOR構文を使う。
FOR 制御変数 := 初期値 TO 終端値 DO <文>
<文>は複合文でもよい。
- 刻みは 1 または -1 に限られる。-1 の場合は、TOの代わりにDOWNTOを使う。
*回数が前もってわからないくりかえし
- Fortran
- Fortran 77 にはこのための構文がない。次のように、GO TOを使って構成する。
文番号1 IF (終了条件) GO TO 文番号2
<くりかえす内容>
GO TO 文番号1
文番号2 CONTINUE
- 90標準やDEC Fortranでは次の形を使える。
DO WHILE (くりかえし条件)
<DO ブロック>
END DO
- Pascal
- WHILE構文を使う。
WHILE くりかえし条件 DO <文>
また、REPEAT ... UNTIL 構文もある。
REPEAT <文> UNTIL 終了条件
◎入出力文 (テキストファイル関係のみ)
*読む
- Fortran
- READ文
READ (装置番号, 書式指定) 入力変数並び
- 装置番号は整数値で、OPEN文で割り当てられる。
ただし、* は標準入力で、OPEN文不要。
- 書式指定はFORMAT文の文番号(または文字列)。
ただし、* は入力変数並びを見て適当な書式を仮定する。
- 入力変数並びは変数名をコンマで区切って書く。
- Pascal
- readlnまたはread手続き
readln(ファイル変数, 入力変数並び);
ファイル変数は TEXT型またはFILE型で、
reset手続きで割り当てられる。
ファイル変数は省略でき、省略した場合、
標準入力から読む。
*書く
- Fortran
- WRITE文
WRITE (装置番号, 書式指定) 出力式並び
- 装置番号は整数値で、OPEN文で割り当てられる。
ただし、* は標準出力で、OPEN文不要。
- 書式指定はFORMAT文の文番号(または文字列)(今回は説明を省略)。
ただし、* は出力式並びを見て適当な書式を仮定する。
- 出力式並びは値をもつ式をコンマで区切って書く。
- Pascal
- writelnまたはwrite手続き
writeln(ファイル変数, 出力式並び);
ファイル変数は TEXT型またはFILE型で、
rewrite手続きで割り当てられる。
ファイル変数は省略でき、省略した場合、
標準出力に書く。
書式指定のうち、数値の桁数は、出力
変数のそれぞれにコロンつきで指定する。
Fortranのテキストファイル入出力では、READ/WRITE文は、前に実行したREAD/WRITE
の対象の行の続きではなく、新しい行を読み書きする。Pascalでは1行の内容を複数
のread/write文で読み書きすることがあるが、Fortranでは一括してREAD/WRITEする
ようにプログラミングする。
1996-04-29; 2000-04-18; 2003-05-29
増田 耕一
目次へ