例題10では入出力(read,write)文の装置や書式を指定する方法と内部ファイルについて取り上げます。
|
入出力文(read文、write文)と補助入出力文のopen文は一般的に次のように書きます。 read( 制御情報並び ) 入力並び write( 制御情報並び ) 出力並び open(open情報並び)制御情報並びの代表的なもの(よく使用されるもの)には、[unit=]u, [fmt=]f, err=s, end=s があります。また、open情報並びの代表的なものは、[unit=]u, file=fin です。 [unit=]u は装置指定子、u は外部装置識別子または内部ファイル識別子です。 [fmt=]f は書式指定子、f は書式識別子です。 err=s は誤り指定子で入出力の実行中にエラーがあった場合には指定された文番号 s の実行文に制御を移します。 end=s はファイル終了指定子で、ファイルの終了を検出したときに指定された文番号 s の実行文に制御を移します。 file=fin は装置と接続するファイル名を指定します。 各情報並びには、指定子をカンマ , で区切って並べます。 入出力文、補助入出力文には装置指定子 [unit=]u を必ず指定します。各指定子の指定の順番は任意ですが、[unit=]u を指定子の並びの先頭に指定した場合にはunit=を省略できます。また、書式指定子 [fmt=]f を unit= を省略した装置指定子の次に指定する場合は fmt= を省略できます。
例題10 1-a) では、例題10 1-a) のプログラムを見てみましょう。
例題10 1-a)のプログラム例について説明します。 5行目と6行目は型宣言文です。 5行目 character name*20 6行目 integer num,eng,math 5行目のcharacter文で、変数 name を長さが20文字の文字変数と宣言しています。6行目のinteger文で、変数 num,eng,math を整数型変数と宣言しています。 7行目と8行目でファイルを開きます。 7行目 k=13 8行目 open(k,file='tokuten.d',status='old') 7行目で k に整数 13 を代入して、8行目の open文で、外部装置識別子に k を指定しています。このように外部装置識別子には整数式または * を指定します。 open(unit=k,file='tokuten.d',status='old') open(file='tokuten.d',status='old',unit=k) 9行目から15行目は10人分のデータを読んで書き出す部分です。 9行目 i=0 10行目 1001 continue 11行目 read(k,102) num,name,eng,math 12行目 i=i+1 13行目 write(*,202) i,num,name,eng,math 14行目 if(i.lt.10) go to 1001 15行目 close(k) : 17行目 102 format(i4,18x,a20,3x,2i4) 18行目 202 format(i5,i9,1x,a20,3x,2i4) 9行目の read(unit=k,fmt=102) num,name,eng,math read(fmt=102,unit=k) num,name,eng,math
例題10 1-b) 例題10 1-b) のプログラムの例を示します。
例題10 1-b)のプログラムで例題10 1-a)と異なる部分を説明します。 5行目の character文に、長さが30文字の文字変数 fmt を追加します。この変数は書式を指定する文字列を代入するために用意したものです。 5行目 character name*20, fmt*30 7行目と8行目でファイルを開きます。 7行目 k=11 8行目 open(k,file='tokuten.d',status='old') 7行目で k に整数 11 を代入して、外部装置識別子 k を 11 にしています。 9行目 fmt='(i5,i9,1x,a20,3x,2i4)' では、文字変数 fmt に文字列 10行目から16行目は10人分のデータを読んで書き出す部分です。プログラムの構成は例題10 1-a)と変わりませんが、read文と write文の書き方に注意してください。 10行目 i=0 11行目 1001 continue 12行目 read(k,'(i4,18x,a20,3x,2i4)') num,name,eng,math 13行目 i=i+1 14行目 write(*,fmt) i,num,name,eng,math 15行目 if(i.lt.10) go to 1001 16行目 close(k) 12行目の read文で、外部装置識別子 k のファイルから変数 num, name, eng, math に書式識別子
内部ファイルは内部メモリ間でデータを転送したり変換したりするのに用いられる。変数の値を画面に表示する代わりに、その文字列をそのまま内部メモリに記憶させることを内部ファイルに出力するという。また逆に、内部ファイルに記憶されている文字列を(キーボードから入力するように)変数に読み込むことを内部ファイルから入力するという。
例題10 2-a) では、例題10 2-a) のプログラムを見てみましょう。内部ファイルの read文を使用した例です。
例題10 2-a)のプログラムで、例題10 1-b)と異なる部分を説明します。 5行目の character文の fmt*30 を取り除き、長さが65文字の文字変数 data1 を追加します。この変数はデータファイル tokuten.d の1レコードを記憶するために用意したものです。read文、write文の書式仕様は、例題10 1-a) と同じように format文を使用するため、変数 fmt は必要ないので除きます。 5行目 character name*20, data1*65 7行目と8行目でファイルを開きます。 7行目 k=12 8行目 open(k,file='tokuten.d',status='old') 7行目で k に整数 12 を代入して、外部装置識別子 k を 12 にしています。 9行目から16行目は10人分のデータを読んで書き出す部分です。プログラムの構成は例題10 1-a,b)と変わりませんが、read文に内部ファイルを使用しています。 9行目 i=0 10行目 1001 continue 11行目 read(k,101) data1 12行目 read(data1,102) num,name,eng,math 13行目 i=i+1 14行目 write(*,202) i,num,name,eng,math 15行目 if(i.lt.10) go to 1001 16行目 close(k) : 18行目 101 format(a65) 19行目 102 format(i4,18x,a20,3x,2i4) 20行目 202 format(i5,i9,1x,a20,3x,2i4) 11行目の read文で、外部装置識別子 k のファイルから変数 data1 に18行目の文番号 101 の format文の書式仕様
例題10 2-b) では、例題10 2-b) のプログラムを見てみましょう。内部ファイルの write文を使用した例です。
例題10 2-b)のプログラムで、例題10 2-a)と異なる部分を説明します。 5行目の character文に、長さが70文字の文字変数 data2 を追加します。この変数は画面に出力する文字列を、内部ファイルに一旦出力するために用意したものです。 5行目 character name*20, data1*65, data2*70 9行目から17行目は10人分のデータを読んで書き出す部分です。プログラムの構成は例題10 1-a,b)、2-a)と変わりませんが、write文で内部ファイルを使用しています。 9行目 i=0 10行目 1001 continue 11行目 read(k,101) data1 12行目 read(data1,102) num,name,eng,math 13行目 i=i+1 14行目 write(data2,202) i,num,name,eng,math 15行目 write(*,201) data2 16行目 if(i.lt.10) go to 1001 17行目 close(k) : 19行目 101 format(a65) 20行目 102 format(i4,18x,a20,3x,2i4) 21行目 201 format(a70) 22行目 202 format(i5,i9,1x,a20,3x,2i4) 9行目から13行目までは 例題10 2-a)とまったく同じです。 |
例題 10 1)と2)では、書式仕様を format文を使用せずに文字式で指定する方法と、内部ファイルの使用法を説明してきました。この例題では何故このような使用法が便利なのかは示されていません。 |
|
例題10 3-a) 次に示す例題10 3-a) のプログラムは、二項係数の次数が5の場合のパスカルの三角形を出力したものです。
例題10 3-a)のプログラム例について説明します。 4行目と5行目は宣言文です。 4行目 parameter (js=12) 5行目 integer a(0:js), b(0:js) 4行目は parameter文で、整定数 12 に js と名前を付けています。5行目の integer文で寸法が 0 から js の一次元配列 a と b を宣言しています。 6行目では、次数 0 の係数 1 を配列要素 a(0)に代入しておきます。 6行目 a(0) = 1 8行目では、変数 njs に求める二項係数の次数を定めます。ここでは5にしました。 8行目 njs=5 10行目から22行目までの doループでは、次数 0 から njs まで係数を求めながら出力します。 10行目 do 100 j=0,njs : 22行目 100 continue 12行目から15行目までは、次数 j の係数を求めます。 12行目 b(j) = 1 13行目 do 200 i=1, j-1 14行目 b(i) = a(i) + a(i-1) 15行目 200 continue 12行目で配列要素 b(j)に次数 j の j番目の係数1を入れ、13行目から15行目までの doループで、配列要素 b(i) から b(j-1) に前の係数 a(i) と a(i-1) の和を求め代入します。 17行目で次数 j の係数を出力します。 17行目 200 write(*,'( 1x, 13i6)') (b(i),i=0,j) 17行目の write文は do型並びの配列要素b(0)からb(j)を装置 * (ここではディスプレイ)に書式仕様 19行目から21行目までは、次の次数の係数を求めるため、配列 b の内容を配列 a に入れ替えます。 19行目 do 300 i=1, j 20行目 a(i) = b(i) 21行目 300 continue 例題10 3-a)の出力結果は次のようになります。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 17行目の write文の書式仕様 例題10 3-b) 例題10 3-b) のプログラムの例を示します。
例題10 3-b)のプログラムで、例題10 3-a)と異なる部分を説明します。 6行目に、character文を追加します。 5行目 character fmt*40 変数 fmt を長さが40文字の文字変数と宣言しています。この変数は書式仕様を定義するために用意したもので、この文字変数を内部ファイルとして書式仕様の文字列をwrite文で書き込みます。 9行目から15行目は、例題10 3-a) の8行目の 9行目 1010 continue 10行目 write(*,*) ' Input 二項係数の次数 =' 11行目 read(*,*) njs 12行目 if(njs.gt.js) then 13行目 write(*,*) '*** 次数が大きすぎます ***' 14行目 go to 1010 15行目 end if 12行目から15行目の ifブロックでは読み込んだ次数 njs が 12 より大きければもう一度次数を読み込み直すようにしています。配列 a と b の寸法が 0〜12 であるため、次数が 13 以上の計算はできないからです。次数 12 は、ディスプレイ表示の一行文が折り返さない範囲です。 24行目から26行目は、二項係数の一行分の出力の部分です。 24行目 ii=(njs-j)*3 25行目 write(fmt,'(a1,i2,a8)') '(', ii,'x, 13i6)' 26行目 write(*,fmt) (b(i),i=0,j) 24行目で、出力する行の先頭の桁移動の数を、整変数 ii に計算しています。j が 0 のときには njs×3、1 のときには (njs-1)×3、2 のときには (njs-2)×3 のように桁移動の桁数が3桁づつ減っていきます。 例題10 3-c) 例題10 3-c) では、文字部分列を使用して書式仕様を変更するプログラムの例を示します。
例題10 3-c)のプログラムで、例題10 3-b)と異なる部分を説明します。 7行目で文字変数 fmt に書式仕様の元となる文字列を代入します。 7行目 fmt='( ??x, 13i6)' 文字変数 fmt の初期値を、ここでは代入文で与えていますが、data文で定義しても構いません。 25行目から27行目は、例題10 3-b) と同様に(1行分ずれていますが)、二項係数の一行分の出力の部分です。 25行目 ii=(njs-j)*3 26行目 write(fmt(3:4),'(i2)') ii 27行目 write(*,fmt) (b(i),i=0,j) 26行目の write文では内部ファイル fmt(3:4) に整変数 ii を書式仕様 例題10 3-b,c)の出力結果は次のようになります。 Input 二項係数の次数 = 3 1 1 1 1 2 1 1 3 3 1 次数が12の場合 Input 二項係数の次数 = 12 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 1 12 66 220 495 792 924 792 495 220 66 12 1 |