火曜日3,4限

環境・建設計算機実習T


アルゴリズムの基礎(FORTRAN演習)  ファイル入出力
 

    1.FORMAT文

      データの位置制御と編集
      FORMAT文の例
      FORMATの一般形
      データの位置制御
      データの位置制御プログラム例

    2.OPEN文

    3.CLOSE文

    4.READ文

    5.WRITE文

    6.プログラム例

    7.課 題


 

1.FORMAT(書式付き入出力)文

 

データの位置制御と編集
 今までデータの入出力位置の設定や編集の仕方は、全て並びによる入出力文が自動的におこない、データの入出力位置やその編集に気を使う必要はなかった。

 しかし、様式の定まったデータを入力したり、画面に形式を定めて結果を出力したり、あるいは対話的に入出力をおこなう等の実行は、今までの方法だけでは不可能である。これを可能にする入出力文が、書式付入出力文である。

 この入出力文においては、プログラム作成者がデータの入出力位置、データの桁数、ページ替え、データの空読みなどを指定しなければならないが、その変わりに細かい入出力が可能となる。

 書式付き入出力文を用いるに当たり、プログラム作成者は一般に次の2点に配慮しなければならない。

(1)データの位置制御

 データの入力に際しては、何行目のデータの何桁目の位置のデータを入力するのか、また出力に際してはディスプレイ画面の何行目の何桁目の位置に結果を出力するのか。

(2)データの編集

 どのようにデータの編集をするのか。例えば、入力はデータを整数型にするのか、出力は実数型にするのか等。

 このようなデータの位置制御やデータの編集の指示はFORMAT文という非実行文で与えられる。書式付き入出力文はFORMAT文に与えられた入出力の書式に従い入出力をおこなう。

 

書式付き入出力(FORMAT)文の例

(1)並びによる出力文の例

WRITE(6,*) 'ヨコハマ',26,-23.97

 

(2)書式付き出力文の例

  WRITE(6,100) 'ヨコハマ',26,-23.97

100 FORMAT(1H0,A4,I5,F10.2)

    ヨコハマ|...26|....-23.97

 1H0:行送り(行方向の制御位置)

  A4:文字型データ 'ヨコハマ'を4桁で出力

  I5:整数型データ(26)を5桁で出力

F10.2:実数型データ(-23.97)を10桁で出力

書式付き出力文はFORMAT文を伴っている。FORMAT文はREAD文またはWRITE文で入出力をおこなう際の書式を指定する。書式付き出力文では、並びによる出力文中の星印*が文番号100に置き換わっており、当該文番号はFORMAT文の持つ文番号と同じになっている。この文番号によって、書式付き出力文はFORMAT文と連係する。FORMAT文中に記載されている1H0,A4,I8,F10.2はそれぞれ編集記述子と呼ばれ、それらがデータの位置制御とデータの編集を行う。

 

 

書式付き入出力(FORMAT)文の一般形

 書式付き入出力文の一般形を示す。

(1)入力文

 READ(5,k) iolist

k FORMAT(flist)

または

 READ(5,k,END=n ) iolist

k FORMAT(flist)

(2)出力文

 WRITE(6,k) iolist

k FORMAT(flist)

kは文番号であり、kを介して入出力文とFORMAT文が連係する。(flist)は書式仕様と呼ばれる。入出力文はFORMAT文の持つ書式仕様に従って、データの位置制御とデータの編集をおこなう。FORMAT文は非実行文であり、PROGRAM文とEND文の間であれば、どこに記述しても構わない。READ文とWRITE文の一般形はそれぞれ4.READ文、5.WRITE文で詳述する。

 

 

 データの位置制御

 データを所定のカードの位置から入力し、結果を定められた位置に出力するには、行方向と列方向の位置を正しく制御しなければならない。

 

(1)列方向の制御

(i)書式制御

 列方向の制御は、入出力の並び項目と書式仕様中の編集記述子によって行われる。これを書式制御という。書式制御の例を例に示す。

  WRITE(6,100) M,X,N,NAME

100 FORMAT(1H0,I5,F8.1,I6,A6)

  |...28|....48.3|..2863|.トウキョウ|

  | 5桁 |  8桁 | 6桁 | 6桁 |

  | M |  X | N | NAME |

 まず、書式仕様中の編集記述子が左から右へ移動し、それに対応している並び項目の各要素の各データが当該編集記述子によって編集される。その時の出力桁数は編集記述子が持つ欄の幅、例でいえばI5の5、F8.1の8等が出力欄の幅(出力桁数)である。出力位置はそれまでの出力桁数を順次累計した値+1の値が出力の先頭位置となる。例えばNAMEのデータは20桁目から出力される。

 なお、書式仕様中の1H0は行方向の制御であり、次項で説明する。

 

(ii)編集記述子

 次の入出力欄の位置を、現在の位置を起点として、右にn(正整数)文字進める。

入力の場合にはデータの読み飛ばし、出力の場合には空白の挿入が可能となる。

・次のデータ並びがあったとする。

ABC,DE, 567813789.4

・データ並びを入力する例を示す。

  CHARACTER C*3

  READ(5,100) C,I,A

100 FORMAT(A3, 4X, I4, 3X, F4.1)

入力欄  編集記述子

  ABC    A3  →  C

  ,DE,   4X     読み飛ばし

 5678    I4  →  I

  137    3X     読み飛ばし

 89.4   F4.1 →  A

・上例のC,I,Aの内容を出力する

  WRITE(6,100) C, I, A

100 FORMAT(1H0,5X,A3,3X,I5,3X,F4.1)

|.....|ABC|...|.5678|...|89.4|

| 5X | A3| 3X| I5 | 3X|F4.1|

 

(2)行方向の制御

 行方向の制御では、1つの入力文で1行のデータ、1つの出力文で1つの行を制御することが基本である。

 入力の場合、入力文の実行回数が画面入力の行数に対応する。次の例では20行のデータを読み込む。

  DO 10 I=1,20

   READ(5,100) (M(I,J),J=1,3)

100 FORMAT(I10,3X,I5,2X,I2)

20 CONTINUE

 出力の場合、結果をディスプレイ画面のどこの位置に出力するかは書式仕様の最初で指示する。これを行送りの指示という。

記述子    意味

1H1      次のページの最初の行に送る

1H0      2行送る

1H_(スペース)   1行送る

1H+      行送りをしない

表 行送りの編集記述子

  WRITE(6,100) 'トウキョウ'

100 FORMAT(1H1,A5)

  WRITE(6,101) 'ヨコハマ'

101 FORMAT(1H0,A4)

  WRITE(6,102) ' ウラワ'

102 FORMAT(1H+,A13)

トウキョウ        ← 改ページ第1行目

          ←     第2行目

ヨコハマ     ウラワ  ←     第3行目

表 プログラム例と出力結果


  データの位置制御プログラム例


      program pcture

c  ---- 型宣言 ----

      parameter( ii=35,jj=10)
      dimension area(-ii:ii,-jj:jj)
      character*1 area

c  ---- 軸入力 ----
c   全体に空白

      do 10 i= -ii,ii
        do 11 j= -jj,jj
          area(i,j)=' '
   11   continue
   10 continue

c   横軸に"−"

      do 12 i= -ii,ii
        area(i,0)='-'
   12 continue

c   縦軸に"I"

      do 13 i= -jj,jj
        area(0,i)='I'
   13 continue

c  ---- 数値計算 ----
c   座標に*

      a1= real(ii)/2.
      a2= real(jj)
      cvalue=5./3.
      do 20 t=0.,2.*3.14,0.01
        r1=a1*cos(2.*t)
        r2=a2*cos(2.*t)
        ix=r1*cos(t)*cvalue
        iy=r2*sin(t)
        area(ix,iy)='*'
   20 continue

c  ---- 図形描画 ----

      do 30 j=-jj,jj
        write(6,100) (area(i,-j),i=-ii,ii) 
  100 format(81a1) 
   30 continue
c
      stop
      end

 例 方程式の軌跡を表示させる

 

    トップ・メニューへ

 

2.OPEN文

 OPEN文は、ファイルを開き、それを装置に接続する。

 OPEN文の一般形

 

OPEN(olist)

olistは次の指定子の並び

[UNIT=]u

IOSTAT=ios

ERR=s

FILE=fin

STATUS=sta

ACCESS=acc

FORM=fm

  

@[UNIT=]u

(装置指定子)

ファイルを接続する外部装置の番号

※1.外部装置の番号はゼロ以上でなければならない

2.キーボードからの入力のための外部装置番号は5である

3.画面への出力のための外部装置番号は6である

AIOSTAT=ios

(入出力状態指定子)

iosは整数型の変数または配列要素である。この指定子は装置を開いたときの状態を示すコードを得るもので、誤りがなければiosにはゼロが代入される。もし誤りがあれば処理系によって定められた正の値が代入される。

BERR=s

(誤り指定子)

装置を開いたときに、誤りが検出されれば、番号sの文に飛んで、そこから実行を続けることを示す。

CFILE=fin

(ファイル指定子)

装置uに接続したいファイルの名前を文字式finで指定する。この指定を省略したときにには、処理系で定められたファイルが接続される。

DSTATUS=sta

ファイルの状態に関する指定をする。文字式staは次のいずれかである。

'NEW'  :これから新しいファイルを作成する

'OLD'  :既存のファイルに対して処理を開始する

'SCRATCH':プログラムで一時的に使用するファイル

'UNKNOWN':処理系で定められた状態にある

※1.この指定がないと'UNKNOWN'が想定される

2.'OLD'又は'NEW'を指定するときにはFILE指定子を書く

3.名前付きファイルに対して'SCRATCH'は指定しない

EACCESS=acc

ファイルの記録をアクセスする方法を指定する。Accは文字式'SEQUENTIAL'あるいは'DIRECT'である。磁気テープに代表されるように、記録を1次元に配置したものを遂次アクセスファイル('SEQUENTIAL')という。一方、各記録に番号を付け、それを指定して記録をアクセスするファイルを直接アクセスファイル('DIRECT')という。

FFORM=fm

ファイル中の各記録が書式指定に従った文字の列として構成されるのか(書式付記録)、あるいは処理系によって定められる内部表現形式に従った値の列として構成されるのか(書式なし記録)を文字式fmで指定する。

'FORMATTED' :書式付記録

'UNFORMATTED':書式なし記録

※この指定子を省略した場合、遂次アクセスの場合には'FORMATTED'が想定される

    トップ・メニューへ

 

 

3.CLOSE文

CLOSE文は、装置とファイルの接続を解除し、そのあとのファイルの状態を指示する。

CLOSE(clist)

Clistは次の指定子の並び

[UNIT=]u

IOSTAT=s

ERR=s

STATUS=sta

  

@[UNIT=]u

(装置指定子)

接続解除の対象となる外部ファイルと接続する装置を指定したり、または内部ファイルを参照する。uは外部装置識別子または内部ファイル識別子である。

※装置指定子を並びの最初に記述する場合は'UNIT='省略可

AIOSTAT=ios

(入出力状態指定子)

Sは整数型の変数または配列要素である。

(1)誤りが検出されず、またファイル終了条件も成立していないときにはゼロ

(2)誤りが検出された場合は処理系が定めた正の整数値

(3)ファイル終了条件が検出され、誤りが検出されない場合には、処理系が定めだ負の整数値

BERR=s

(誤り指定子)

入力中に誤りが検出されたとき、番号sの文に飛ぶことを指定する。

CSTATUS=sta

接続を解除したファイルを保存('KEEP')しておくか、消去('DELETE')するかを指定する。

    トップ・メニューへ

 

 

 

4.READ文

 

READ(clist)[iolist]

   Clist:制御情報並び

   Iolist:入力並び

Clistは次の指定子の並び

[UNIT=]u

[FMT=]f

IOSTAT=s

ERR=s

END=s

  

@[UNIT=]u

(装置指定子)

入力の対象となる外部ファイルと接続する装置を指定したり、または内部ファイルを参照する。uは外部装置識別子または内部ファイル識別子である。

※装置指定子を並びの最初に記述する場合は'UNIT='省略可

AFMT=f

(書式指定子)

入力のときに用いる書式を指定するもので、fは書式識別子である。

※1.書式付き記録を読み込む場合には必ず指定をする。

 2.文字列'FMT='は制御情報並びの最初の項目に'UNIT='を省略して装置指定子を書き、2番目の項目に書式指定子を書くときに限って省略可能。今までのプログラムはこの規則に従い、'UNIT='と'FMT='を省略してきた。

BIOSTAT=ios

(入出力状態指定子)

Sは整数型の変数または配列要素である。

(1)誤りが検出されず、またファイル終了条件も成立していないときにはゼロ

(2)誤りが検出された場合は処理系が定めた正の整数値

(3)ファイル終了条件が検出され、誤りが検出されない場合には、処理系が定めだ負の整数値

CERR=s

(誤り指定子)

入力中に誤りが検出されたとき、番号sの文に飛ぶことを指定する。

DEND=s

(ファイル終了指定子)

ファイルの終了条件が成立したとき、番号sの文に飛ぶことを指定する。

なお、ファイル終了条件は次のいずれかの場合に成立。

(1)遂次アクセスファイルを読んでいる最中に、ファイルの終了を示す特別な記録(ファイル終了記録)を検出した場合

(2)内部ファイルの終わりを越えて記録を読み込もうとした場合

    トップ・メニューへ

 

 

5.WRITE文

 

WRITE(clist)[iolist]

   Clist:制御情報並び

   Iolist:出力並び

Clistは次の指定子の並び

[UNIT=]u

[FMT=]f

IOSTAT=s

ERR=s

  

@[UNIT=]u

(装置指定子)

出力の対象となる外部ファイルと接続する装置を指定したり、または内部ファイルを参照する。uは外部装置識別子または内部ファイル識別子である。

※装置指定子を並びの最初に記述する場合は'UNIT='省略可

AFMT=f

(書式指定子)

出力のときに用いる書式を指定するもので、fは書式識別子である。

※1.書式指定子を書くと書式付記録が書き出され、ないと書式なし記録が書き出される。

2.文字列'FMT='は制御情報並びの最初の項目に'UNIT='を省略して装置指定子を書き、2番目の項目に書式指定子を書くときに限って省略可能。今までのプログラムはこの規則に従い、'UNIT='と'FMT='を省略してきた。

 

BIOSTAT=ios

(入出力状態指定子)

Sは整数型の変数または配列要素である。

(1)誤りが検出されず、またファイル終了条件も成立していないときにはゼロ

(2)誤りが検出された場合は処理系が定めた正の整数値

(3)ファイル終了条件が検出され、誤りが検出されない場合には、処理系が定めだ負の整数値

CERR=s

(誤り指定子)

出力中に誤りが検出されたとき、番号sの文に飛ぶことを指定する。

    トップ・メニューへ

 

 

6.プログラム例

   program maibo
c  ----- 型宣言 ----
   parameter(ix=10,iy=2)
   dimension data(ix,iy)
   dimension name(ix)
   character*15 name
   character ans
   integer data
c  ---- データ入力 ----
   i=0
  10 continue
   i=i+1
   write(6,*) ' Input Name '
   read(5,100) name(i)
   write(6,*) ' Input SEX (1.MAN,2,WOMAN) (in I1)'
   read(5,101) data(i,1)
   write(6,*) ' Input BIRTHDAY (ex.19841001) (in I8)'
   read(5,102) data(i,2)
  11 continue
   write(6,*) ' Read NEXT? (y/n)'
   read(5,103) ans
   if(ans.eq.'y') then
    go to 10
   else if(ans.eq.'n') then
    ninsu=i
    go to 20
   else
    go to 11
   end if
100 format(a15)
101 format(i1)
102 format(i8)
103 format(a1)
c  ---- ファイル・オープン ----
  20 continue
   open(10,file='result.dat')
c  ---- データ出力 ----
   write(10,*) ' NAME , SEX , BIRTH'
   do 30 i=1,ninsu
    if(data(i,1).eq.1) then
     write(10,200) name(i),(data(i,j),j=1,iy)
    else if(data(i,1).eq.2) then
     write(10,201) name(i),(data(i,j),j=1,iy)
    end if
  30 continue
c  ---- ファイル・クローズ ----
   close(10)
200 format(a15,',',i1,': MAN,',2x,i8)
201 format(a15,',',i1,':WOMAN,',2x,i8)
c
   stop
   end
例 名前・性別・生年月日を入力し、ファイルに保存する


    トップ・メニューへ



  7.課題

     本講義はFortranの初級コースであり、Fortranでプログラムを作成するために必要最低限と思われる内容について説明をおこなった。今後諸君は研究室または社会に出て様々なプログラムに遭遇すると考えられる。場合によっては取り付き難いと思われるプログラムもあるかもしれないが、結局はこれらの基本を多用するに過ぎない。じっくり考えれば必ず理解できるはずである。
    今回の課題で本講義は終了である。内容は将来諸君が技術者として社会に出たときに最多に遭遇すると思われる問題例を採用した。これが出来る事が技術者としては望ましいと教官は考える。

    計算機実習T最終課題


     プログラム技術は言語と一緒で所詮は必要に迫られないと修得できないものであり、講義時間内だけの実習で理解・修得するのは無理である。よって今回は『こういうこともあった』程度に記憶しておいてもらえれば十分であり、将来必要になり本格的に勉強をする際に『ああ、こういうこともあったな』と少しでも思い出してもらえれば幸いである。






質問・意見等
    940-2188 新潟県長岡市上富岡町1603-1 長岡技術科学大学 環境・建設系
    環境・建設計算機実習T 一部担当
    犬飼 直之 (内線 9624) inu@nagaokaut.ac.jp

GLESCO
( GLobe, EStuary and COast )

Copyright
Hydrauric Engineering Lab. Nagaoka University of Technology