数値解析法及び演習 第十四回

文字処理
  1. 今日の目標
  2. DATA文
  3. PARAMETER文
  4. 文字処理
  5. 今日の宿題

[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 n
      parameter (n=10)
      real*8 a(n)
      data a/10*1.D0/


      call sub(a,n)

      end

      subroutine sub(a,n)
      implicit none
      integer i,n
      real*8 a(n)
         do i=1,n
           write(6,*) i,a(i)
         enddo
      return
      end

parameter文は実行文よりも前になければならない. 配列のサイズを設定したい場合にはその宣言文よりも前にある必要がある.

[4] 文字処理

[4.1] 文字定数

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

[4.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

[4.3] 連結

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

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

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

[4.4] 文字列の位置

文字列の一部を指定することができる. a(m:n)によって変数aの第m文字目からn文字目を表す. 配列の場合, a(k)(m:n)とすると, k番目の配列要素のm文字目からn文字目を指定する. mが省略された場合は1となる.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

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

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

例:
      implicit none
      character a*20,b,d
      integer n,m,k,i

      a='mpqccpqwqzjpqyycvbpq'

      d='a'

      b=char(100)
      n=ichar('d')
      m=ichar(d)
      k=index(a,'pq')
      i=len(a)

      write(6,*) b,n,m,k,i

      end

[4.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

練習問題

  1. char()関数を用い, 0から127(=2の7乗)に対応する全ての文字をモニタに出力させよ.
  2. キーボードから10文字以内の文字を入力し, その中に含まれる小文字の数をカウントするプログラムを作成せよ .
  3. 小文字で英単語を一つキーボードから入力し, 頭の文字のみ大文字に変換してモニタに表示するプログラムを作 成せよ.
  4. 文字列 ''mpqccpqwqzjpqyycvbpq の中には 'pq'という文字列が複数含まれている.全ての'pq'を検索し,それぞれ頭から何文字目にあるか表示させよ.ヒント:文字列aにおいてa(i:)と指定すると,i文字目から末尾までを指定することになる.

[6] 今日の宿題

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


日程表へ戻る <<