文字処理、ファイル処理、書式仕様


parameter 文

 parameter文は定数に名前つける宣言文です。定数につけた名前を定数名といいます。parameter文は、次のように記述します。

      parameter ( p1=e1 [, p2=e2] , ... )

 p は定数名で、右辺の式の値 e に p という名前をつけます。e は定数式といい、定数または定数名により構成されます。定数式の中で定数名を使用する場合は、その定数名はそれ以前に parameter文で定義されていなければなりません。
 定数名は、配列宣言子の寸法の指定、data文の中、式に使用できますが、書式仕様には使用できません。プログラム中で定数名が使用されると、その名前に対応する定数が参照されます。定数名は変数ではありませんので、実行中に値を変更できません。
 宣言文は一般には指定する順番に決まりはありませんが、parameter文については他の宣言文との位置関係に注意してください。
 定数名について型宣言が必要な場合には、定数名を定義している parameter文より前に型宣言をしておかねばなりません。また data文のなかで定数名を使用している場合にはその data文より前に parameter文で定義されていなければなりません。

 次にparameter文の使用例を示します。

        integer nmax,nm,mmax
          integer a(nmax,mmax),n,m,i,j
          parameter (nmax=21,mmax=5,nm=nmax*mmax)
          data  a/nm*0/,m/3/

 初めのinteger文で nmax、nm、mmax を整数型と定義し、parameter文で、整定数 21 に nmax、整定数 5 に mmax、nmax*mmax の値に nm と名前をつけています。また、整数型配列 a の寸法を定数名 nmaxとmmax で宣言し、data文で配列の要素の数に定数名 nm を使用しています。




文字処理

 Fortranでは、文字列を ' で括った文字定数、文字型変数、文字型配列の要素などで文字を扱うことができ、文字に関わる処理を文字処理といいます。文字型変数や文字型配列はプログラムの中で使用する前に型宣言文の character 文で予め定義しておかなければなりません。character 文については型宣言文(character文)を参照してください。
 文字処理では、文字列の一部分を取り出したり、文字列を連結するなどの文字の演算が行えます。文字列を値とするデータを文字データといいます。文字データの中の1文字、1文字に、左から順に 1,2,3,...と番号をつけ、文字データの中の文字の位置をこの番号で表します。これを文字位置といいます。



・文字代入文

 文字代入文   文字変数 = 文字式   では、

   文字型変数の長さ > 文字式の値の文字列の長さ である時、
 (character文で定義されている)
                文字列の右側に空白が補われます。

   文字型変数の長さ < 文字式の値の文字列の長さ である時、
                文字列の右端から長い分だけ無視されます。
  

 次に、文字代入文の具体的な例を示します。

文字代入文文字変数mm
(長さが8)の値
mm='1999 A Happy New Year'1999
A
H
mm='New Year'New
Year
mm='New'New






・文字データの初期値設定

 数値データの場合と同様に、data文により初期値を設定できます。値の与えられ方は文字代入文と同じです。



・文字データの入出力と書式仕様

 書式仕様による文字データの編集は編集記述子の A形編集を参照してください。



・文字列の連結

 文字列と文字列を連結して、一つの文字列を作成するには文字演算子 // を使用して、次のように記述します。

              文字式1 // 文字式2

 文字式1の値の文字列の後ろに文字式2の値の文字列を連結して一つの文字列とします。次に、2つの文字列 'yamada''taro' を連結して、文字列 'yamadataro' を作成する例を示します。

             'yamada'//'taro'


・部分文字列

 文字型変数や文字型の配列要素の値の連続した部分の文字列を部分文字列といい、この部分の文字列を取り出したり、この部分に別の文字列を代入したりすることができます。部分文字列は次のように指定します。

      文字型変数名または配列要素名(e1:e2) 

 e1 は部分文字列の左端の文字位置、e2 は右端の文字位置を表す正の整数式です。e1を省略すると 1、e2 を省略すると変数の値の右端の文字位置を指します。部分文字列の指定例を示します。

  moji(1:3)  文字型変数 moji の1文字目から3文字目までの部分列
  mj(5)(2:2) 文字型配列要素mj(5)の2文字目から2文字目までの部分列(すなわち2文字目)

 次に具体的な例として、長さが20文字の文字変数mojiの値が文字列「A Happy New Year  」である時の部分文字列の指定とその値を示します。

部分文字列の指定文字数
moji(1:5)5A
Hap
moji(3:7)5Happy
moji(9:20)12New
Year
 
 
 
 
moji(13:13)1Y

 次に、文字列「hosei tarou」を「tarou hosei」に編集するプログラムの例を示します。

           (略) :
           character  moji*16,mojia*16
           data moji/'hosei tarou'/
           k1=index(moji,' ')
           k2=index(moji(k1+1:20),' ')+k1
           mojia=moji(k1+1:k2-1)//' '//moji(1:k1-1)
                  :

 まず、長さが16文字の文字型変数moji と mojia を character文により定義し、data文で文字型変数mojiに初期値として文字列「hosei tarou」を設定しておきます。変数mojiの値は hosei tarouの右側に空白が5文字分詰められます。
 変数k1に、変数mojiの中の空白の位置をindex関数を用いて求め、代入します。index関数は、ここでは変数mojiの値「hosei tarou   」の中に空白があるかどうか探し、初めに見つけた空白の位置 6 を関数の値とします。
 変数k2には、見つけた空白より後ろの部分文字列 (ここでは moji(k1+1:20) で、値は「tarou   」)について同じように空白を探し、その位置 6 に k1 を加えて変数mojiの中の文字位置にしてから代入します。
 次に、変数mojiaに、部分文字列moji(k1+1:k2-1) (値は「tarou」)と文字定数 ' ' を連結し、続いて部分文字列moji(1:k1-1) (値は「hosei」)を連結した結果を代入します。変数mojia の値は「tarou hosei   」となります。




ファイル処理

 データをキーボードから入力したり、計算結果をディスプレイに表示したりするのでは、扱う情報量が限られます。入力データが多い場合には予めファイルにデータを作成しておけば、入力時に手間がかかりませんし、入力ミスも防げます。また計算結果をファイルに出力しておけば、必要に応じて印刷したり、別のプログラムの入力データとして使用することもできます。ここではファイルからデータを読み込んだり、ファイルに出力するために必要な文とその使用法を説明します。

・open文

 open文は使用するファイルを入出力の装置(装置番号で表す)に接続し、既存のファイルならば、そのファイルの存在を確認し、新しく作成すべきファイルならば作成して、ファイルを使用できる状態にします。この操作をファイルを開くといいます。read文やwrite文では open文の装置番号を使用することでファイルと対応させます。open文は次のように記述します。

     open(装置番号,file='ファイル名'[,status={'old','new'}])

 指定子について次の表に示します。

指定子の名前指定子内容
装置指定子[unit=] u u はファイルを接続する装置番号:2桁以内の正の整数
 (0、00を除く)
file 指定子file='ファイル名' 装置番号の装置と接続するファイル名を指定
status 指定子status={'old','new'} ファイルの状態
 'old' :file指定子で指定したファイルが既存の時
 'new' :file指定子で指定したファイルを新規に作成する時
 省略 :file指定子で指定したファイルが既存であれば
     そのファイル、なければ新規ファイル
注)一般記述形式の中の { } は、括弧の中にカンマで区切って記述されている項目のどれか一つを指定する時に用いられます。[ ] は省略できることを示します。


・close文

 close文は、指定した装置番号に接続したファイルをその装置番号から切り離し、ファイルの終了処理を行います。この操作をファイルを閉じるといいます。close文は次のように記述します。

     close(装置番号) 

 装置番号については open文と全く同じです。

 次にopen文とそれに対応するread文、write文、close文の使用例を示します。

        open(11,file='seiseki.dat',status='old')
        open(18,file='seisekihantei.dat',status='new')
            read(11,101)  n
        101 format(i5)
            do 100 i=1,n
               read(11,102)  (a(i,j),j=1,m)
                        :
               write(18,202)  i, (c(i,j),j=1,m)
        100 continue
        102 format(3i6)
        202 format(i3,3i6)
            close(11)
            close(18)

 open文で、装置番号11の装置に既存ファイル seiseki.dat を開き、装置番号18の装置にファイル seisekihantei.dat を新しく作成して開きます。
 read文でファイル seiseki.dat からデータを読み込みながら処理を行い、その結果をwrite文でファイル seisekihantei.dat に出力します。
 close文で、装置番号11と18の装置のファイルを閉じます。




書式仕様

 書式は、入出力文(read、write文)の並びとファイル(キーボードやディスプレイを含む)の記録(文字列)とを結びつけるものです。入出力文の書式識別子に * を指定すると、並びの型に合わせて、入力では空白またはカンマで区切られた記録を入力し、出力では適当な桁数を空白で区切って出力します。書式を細かく指定したい時は、通常は入出力文の書式識別子に文番号を記述し、その文番号を持つ format文で定義されている書式仕様を参照します。



・format文

 format文は書式仕様を定義する文で次のように記述します。

      文番号 format 書式仕様
 format文は実行時に参照される文なので、そのプログラム単位の中であれば、どこに記述されていてもかまいません。



編集記述子

 書式仕様は編集記述子を用いて記述します。1つの編集記述子で読み書きする記録の部分を欄といい。欄の桁数(文字数)を欄の幅といいます。次の表に主な編集記述子を示します。編集記述子には、編集記述子の前に繰り返しの回数を整定数で指定できる反復可能編集記述子と指定できない反復不能編集記述子があります。この表では編集記述子に大文字(I,Fなど)を使用していますが、小文字も使用できます。

反復可能編集記述子
編集記述子内容
Iw  I 形編集は整数型のデータを編集する。
 編集記述子がi5の場合、欄の幅は5桁。
 出力は右詰
  値85  出力欄
 
 
 
85
, 値125  出力欄
 
 
125
 入力は入力欄内に記述されている整数値になる(右詰の必要なし)、
 入力欄に実数値が記述されているとエラーになる。
  入力欄
 
38
 
 
 値38
Fw.d  F 形編集は実数型のデータを編集する。
 編集記述子がf6.2の場合、欄の幅は6桁。
 出力は小数点以下2桁に丸められる。w > d + 2
  値12.5  出力欄
 
12.50
, 値-34.286  出力欄
-34.29
 入力は入力欄内に小数点などの位を表すものがなければ
      小数点以下2桁の実数、
 小数点やE 形式のデータであれば、その値の実数になる。
  入力欄
-87 248
 値-872.48 , 入力欄
2.45 3
 
 値2.453
Ew.d  E 形編集は実数型のデータを、指数部をつけて編集する。
 編集記述子がe10.3の場合、欄の幅は10桁。
 出力は小数点以下3桁に丸められる。w > d + 7
  値12.5 出力欄
 
0.125E
 
02
, 値-0.0086 出力欄
-0 .860E- 02
 入力は入力欄内に小数点などの位を表すものがなければ
      小数点以下3桁の実数、
 小数点やE 形式のデータであれば、その値の実数になる。
  入力欄
 
 
 
 
87 248
87.248 , 入力欄
 
 
 
3.56 E2
 
356.0
Aw, A  A 形編集は文字型のデータを編集する。
 編集記述子がA4の場合、欄の幅は4桁。
 編集記述子がAの場合、欄の幅は、
           入出力文の並びの文字型項目の長さになる。
 入力の場合、入力並びの項目の長さが、
    欄の幅よりも長ければ入力欄の文字の後に空白が詰められ、
    欄の幅よりも短ければ入力欄の右端の文字列が入力される。
 出力の場合、出力並びの項目の長さが、
    欄の幅よりも長ければ項目の左から欄の幅の文字列が、
    欄の幅よりも短ければ左側に空白が詰められて出力される。
   w は欄の幅(桁数)を指定するゼロでない符号なし整定数
   d は小数点以下の桁数を指定する符号なし整定数


反復不能編集記述子
編集記述子内容
nX X 形編集記述子は n 桁の桁移動を指定する。 1x は1桁移動
/  斜線編集記述子は記録の区切りを示す。
 入力では次の記録(行)を読み込むこと、
 出力ではそれまでの記録を出力(改行)することを指定する。
  /// は、3回改行する。
'文字列'  アポストロフィ編集記述子は ' で括られた空白を含む文字列を出力する。
 入力では使用できない。欄の幅は ' で括られた文字列の長さになる。
 ' 'は1文字の空白を示す。
:  コロン編集記述子は入出力の並びに項目が残っていない時は
 書式制御を終わりにし、項目が残っている時はそのまま続ける。
   n はゼロでない符号なし整定数。n は省略できない。
   / および : 編集記述子は前後の区切り文字のカンマを省略できる。


 書式仕様は次の項目をカンマで区切って並べ、全体を( )で括ったものです。

    書式仕様の例   (a12, 4(i8:,'(',f5.1,')'))


 次に、書式仕様を指定した入出力文とformat文の例を示します。


   入力の例

                 read(11,1002,end=901) no,namae,sei,shin,tai,kyoi,yy,mm,dd
          1002   format(i6,1x,a14,a1,f6.1,f5.1,f6.1,1x,3i2)
 文番号 1002のformat文の書式仕様にしたがって、変数no、namae、sei、shin、tai、kyoi、yy、mm、ddに値を読み込みます。入力並びに並べられた変数と書式仕様の編集記述子が順番に対応します。


   出力の例

                  write(6,2001) 
                  write(6,2004) heik
                    . . .
             2001 format(' ',20x,'身 体 測 定 表')
             2004 format(/' ',18x,'平  均',23x,f8.1)
 初めのwrite文は出力並びはありませんが、文番号 2001のformat文の書式仕様の編集記述子による編集を行います。
 次のwrite文は、文番号 2004のformat文の書式仕様により変数heikを出力します。