数値解析法及び演習 第六回

文字処理
  1. 今日の目標
  2. DATA文
  3. PARAMETER文
  4. 組み込み関数と関数副プログラム
  5. 文字処理
  6. 今日の宿題

[1] 今日の目標

  1. DATA文,PARAMETER文を使う
  2. 関数副プログラムを使う

[2] DATA文

変数,配列を初期化する際に用いる.配列の場合,値の格納順序に注意(下の例を参照).DATA文は変数に値を「前もって」代入するだけなので,プログラム中で変更は可能.

data文 data 変数名のリスト/値のリスト/,...

例:
       implicit none 
       integer i,j
       real*8 a(10),c(2,5),pi,e
       data pi,e/3.14159625D0,2.7182818D0/
       data a/8*0.D0,1.D0,5.D-1/
       data c/3*1.D0,7*1.D2/

       write(6,*) 'pi=',pi,'e=',e

       do i=1,10
          write(6,*) i,a(i)
       enddo

       do i=1,2
          do j=1,5
             write(6,*) i,j,c(i,j)
          enddo
       enddo

       end

[3] PARAMETER文

配列をいくつも使用していて, そのサイズをすべて一度に変えたい場合がよくある. このときはparameter文を用いる. 先ほどのDATA文との大きな違いは, DATA文は変数の中に値が入るのに体し, PARAMETER文では定数名それ自体がある定数になる, ということにある. よってPARAMETER文で設定された値は変更することはできない. 構文は以下の通り.

parameter文 parameter (定数名=定数)
例:
       implicit none
       integer md1,md2
       parameter(md1=2,md2=3)
       real*8 a(md1,md2)
parameter文は実行文よりも前になければならない. 配列のサイズを設定したい場合にはその宣言文よりも前にある必要がある.

[4] 組み込み関数と関数副プログラム

[4.1] 組み込み関数

FORTRANには以下の組み込み関数が用意されている(この授業で用いる可能性があるもののみ. ). これらの関数はいつでも使用することができる. 関数の型と引数の型に注意すること. 引数が整数型なのに倍精度実数型を代入するとエラーになる.

関数 関数の名前 関数の型 引数の型 利用法
最大値 max0 integer integer i=max0(I1,I2,..)
最大値 dmax1 real*8 real*8 d=dmax1(d1,d2,..)
最小値 min0 integer integer i=min0(I1,I2,..)
最小値 dmin1 real*8 real*8 d=dmin1(d1,d2,..)
平方根 dsqrt real*8 real*8 d=dsqrt(d1)
指数 dexp real*8 real*8 d=dexp(d1)
自然対数 dlog real*8 real*8 d=dlog(d1)
常用対数 dlog10 real*8 real*8 d=dlog10(d1)
正弦 dsin real*8 real*8 d=dsin(d1)
余弦 dcos real*8 real*8 d=dcos(d1)
正接 dtan real*8 real*8 d=dtan(d1)
逆正弦 dasin real*8 real*8 d=dasin(d1)
逆余弦 dacos real*8 real*8 d=dacos(d1)
逆正接 datan real*8 real*8 d=datan(d1)
双曲線正弦 dsinh real*8 real*8 d=dsinh(d1)
双曲線余弦 dcosh real*8 real*8 d=dcosh(d1)
双曲線正接 dtanh real*8 real*8 d=dtanh(d1)
剰余 mod integer integer i=mod(i1,i2)
剰余 dmod real*8 real*8 d=dmod(d1,d2)
絶対値 iabs integer integer i=iabs(i1)
絶対値 dabs real*8 real*8 d=dabs(d1)
符号つけ変え isign integer integer i=isign(i1)
符号つけ変え dsign real*8 real*8 d=dsign(d1)
切り捨て dint real*8 real*8 d=dint(d1)
四捨五入 dnint real*8 real*8 d=dnint(d1)
四捨五入して整数化 idnint integer real*8 i=idnint(d1)
倍精度実数型から整数型へ変換 idint integer real*8 i=idint(d1)
整数型から倍精度実数型へ変換 dble real*8 integer d=dble(i1)

練習問題1

[4.2] 関数副プログラム

フォートランにはデフォルトでいくつかの関数が用意されているが,ユーザー が独自に関数を定義して用いたい場合は「関数副プログラム」というものをつかって関数を定義することが出来る.使い方は


t function f(a1,a2,....aN)
......
f=.....
return
end
function文 f=.... 関数副プログラムの定義をおこなう
t 型宣言:real*8, integerなど
a1,a2,...aN 仮引数:型宣言をすること
プログラム中で用いる時は,

b=f(c1,c2,....cn)
のように引数を代入して行う.

たとえば, 1からnまでの総和を求める関数副プログラムは

      integer function souwa(n)
      implicit none
      integer i,n

      souwa=0
      do i=1,n
      souwa=souwa+i
      enddo
      return
      end

      implicit none
      integer souwa,n
      read(5,*) n
      write(6,*) souwa(n)
      end

注意点

練習問題2

n!を計算する関数副プログラム fact(n)を作成せよ.


[5] 文字処理

[5.1] 文字定数

アポストロフィ(')で挟まれた文字列を文字定数という. 例:'hoge'

[5.2] 文字型の宣言

文字定数を格納するためには「文字型」の変数を宣言する必要がある.

文字型宣言文 character a*10, b(2,2)*5,c
a,b,c 変数, 配列, 関数副プログラム名
*10, *5 文字数の指定

例:
       implicit none
       character a*5

       a='hoge'
       write(6,*) a
       end

[5.3] 連結

スラッシュを二つ(//)書くことで 文字型変数や定数を連結することができる.

例:
       implicit none
       character a*5,b*10

       a='hoge'
       b=a//'hoge'
       write(6,*) b
       end

[5.4] 文字列の位置

文字列の一部を指定することができる. a(m:n)によって変数aの第m文字目からn文字目を表す. 配列の場合, a(k)(m: n)とすると, k番目の配列要素のm文字目からn文字目を指定する.

例:
       implicit none
       character x*10,y*4,z(3)*5
       x='0123456789'
       y=x(3:6)
       z(1)(3:5)=x(1:3)
       write(6,*) x,' ',y,' ',z(1)
       end

[5.5] 文字型の組み込み関数

関数名 意味
char(整数) 整数値を文字に変換. I=0〜255の値から, その値に対応する文字に変換する.
ichar(文字型変数, もしくは文字定数) 文字をコード表に対応する整数値に変換.
index(a,b) 文字列a中にある文字列bの位置(整数). 文字列bが見付からない場合は0を返す.
len(文字型変数, もしくは文字定数) 文字列aの長さ(整数).

例:
      implicit none
      character a*10,b
      integer n,m,k

      a='abcdefghi'

      b=char(100)
      n=ichar('d')
      m=index(a,'de')
      k=len(a)
      write(6,*) b,n,m,k

      end

[5.6] 文字, 文字列の大小関係

文字と整数値との間にはコード表によって対応関係がある. この整数値を用いて異なる文字の間の大小関係を定める . 比較には.eq., .ne., .gt., .ge., .lt., .le.を用いる.

例:
      implicit none
      character a,b

      a='c'
      b='c'

      if(a.eq.b) write(6,*) a,b

      end

同様にして, 文字列の大小の比較が行われる. 文字列の先頭の文字が異なる場合, それらの文字同士の大小で文字列 の大小を定める. 先頭の文字が同じ場合, 二文字目以降で最初に異なる文字の大小で大小関係を定める. 文字列の長 さが異なる場合, 短い方の文字列の後ろに空白文字を付け加えて比較する. 空白文字の整数値は32で, どの英数字よ りも小さい.

例: ABA□□ < ABC□□ < ABCDE

練習問題3

  1. char()関数を用い, 0から127(=2の7乗)に対応する全ての文字をモニタに出力させよ.
  2. キーボードから10文字以内の文字を入力し, その中に含まれる小文字の数をカウントするプログラムを作成せよ .
  3. 小文字で英単語を一つキーボードから入力し, 頭の文字のみ大文字に変換してモニタに表示するプログラムを作 成せよ.

[6] 今日の宿題

練習問題3のプログラム, 答えを送ること. 〆切は11/20.


日程表へ戻る <<