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

IF文
  1. 計算の順序
  2. 二次元データの入出力
  3. IF文による条件分岐
  4. 今日の宿題

[1] 計算の順序

fortran で演算をするとき,計算が行われる順序は以下の通りとなります.

以下のプログラムを実行し,結果を検討してみよう.

      implicit none      

      write(*,*) 4 + 2 * 3
      write(*,*) 12/3*2
      write(*,*) 2**3**2
      write(*,*) (2**3)**2

      end

[2] 二次元データの入出力

[2.1]配列にデータを格納

1.D0
2.D0
3.D0
4.D0
5.D0

と縦に並んだデータをファイル(retsu.datとする)から読み, 配列a(5)に格納するプログラム例:

       implicit none 
       integer :: i
       double precision :: a(5)
       open(1,file='retsu.dat')
       do i=1,5
         read(1,*) a(i)
	 write(*,*) a(i)
       enddo
       end
1.D0 2.D0 3.D0 4.D0 5.D0

と横に並んだデータをファイル(gyou.datとする)から読み, 配列a(5)に格納するプログラム例:

      implicit none 
      double precision :: a(5)
      integer :: i

      open(1,FILE='gyou.dat')
      read(1,*) (a(i),i=1,5)
      write(*,*) (a(i),i=1,5)
      end

[2.2]二次元配列

配列の要素を指定する番号は複数あってもよい. 二つになると二次元配列となり, 三つになると三次元配列となる. FORTRANでは7次元の配列まで使用可能である.

二次元配列の宣言:
宣言文 配列名(寸法の下限:寸法の上限, 寸法の下限:寸法の上限)



例1
double precision :: a(10,10) 

a(1,1)からa(10,10)まで要素を100個持つ倍精度実数型二次元配列を宣言



例2
integer :: i(2,-1:8)

i(1,-1)からi(2,8)まで要素を20個もつ実数型二次元配列を宣言

二次元配列を使ったプログラム例:
      implicit none 
      integer :: a(5,5),b(5,5),c(5,5),n,i,j
      
      n=0

      do i=1,5
         do j=1,5

            n=n+1

            a(i,j)=0
            b(i,j)=n

         enddo
      enddo

      do i=1,5
         do j=1,5
            c(i,j)=b(i,j)
         enddo
      enddo

      do i=1,5
         write(*,*) (a(i,j),j=1,5)
      enddo
      write(*,*)

      do i=1,5
         write(*,*) (b(i,j),j=1,5)
      enddo
      write(*,*)

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




      end

[2.3]二次元データの読み取り

以下の数値をファイル matrix.dat にコピーする.それぞれの数値を二次元配列a(2,3)に格納するプログラムは以下のとおり.

1.D0 2.D0 3.D0
4.D0 5.D0 6.D0
        implicit none 
	double precision :: a(2,3)
	integer :: i, j

	open(1,file='matrix.dat')

	do i = 1, 2
           read(1,*) (a(i,j), j = 1, 3)
	end do

	do i = 1, 2
	   write(*,*) (a(i,j), j = 1, 3)
	end do

	end
  

[3] IF文による条件分岐

プログラム中で条件分岐を行いたいときはIF文を用いる. 基本の形を以下にしめす.

例1:

if(b) 実行文 

bには論理式または算術関係式がはいります(算術関係式は下に説明. 論理式は後日説明します. ).この形式だとbが真の場合にのみ実行文が行われ,それ以外だと何もせず次に制御が移ることになります.

例2:

if(b) then
実行文 
endif

基本的に上とおなじ. 実行文が二行以上になる時.

例3:

if(b) then

実行文 1

else

実行文 2

endif

上の形式では,もしbが真であれば実行文1が行われ,偽であれば実行文2が行 われます.実行文2にもあてはまらない場合をさらに場合分けしたいときはさらにブロックを重ねることができます.


例4:

if(b) then

実行文 1

else if(c) then

実行文 2

else

実行文3

endif

この場合は, もしbが真であれば実行文1が行なわれます. 偽の場合はさらにcによって条件がわかれ, 真の場合は2が, 偽の場合は3が実行されます. このif-elseブロックはいくらでも重ねることができます.

算術関係式の種類

「かつ」「または」は以下の構文で可能となる.

かっこで囲まない限り,算術関係式 > and > or の順で評価が行われる.同じ順位のものがあった場合は左から順に行われる.

サンプルプログラム1

以下のプログラムはキーボードから入力した値が10.以上ならその値を画面に表示させるプログラムである.

      implicit none      
      double precision :: a

      read(*,*) a
      if(a >= 1.D1) then
      write(*,*) a
      endif

      end

このプログラムを作成して実行してみよ.


サンプルプログラム2

以下のプログラムは,キーボードから整数を二つ(n(1)とn(2))改行して入力し,n(1)がn(2)で割り切れる場合はn(1)を画面に表示させるプログラムである.


      implicit none      
      integer :: n(2),i

      do i=1,2
         read(*,*) n(i)
      enddo

      if( mod( n(1), n(2) ) == 0 ) write(*,*) n(1)
     
      end

サンプルプログラム3

以下のプログラムは何をするだろうか? 上から4行目のread文は,スペースを挟んで横に並んだデータを読み込む時の形式である.

      implicit none      
      integer :: n(2),i

      read(*,*) (n(i),i=1,2)

      if(n(1) > n(2)) then
         write(*,*) n(1)
      else
         write(*,*) n(2)
      endif
     
      end

[4] 今日の宿題(1点)


[4] 追加の宿題(1点)〆切は11/1

次の10個の整数


4 2 4 5 7 9 10 8 1 6

をファイルにコピーし,整数データをそのファイルから配列 x(10) に読み込む.


これら10個の整数の中から,最大値と最小値を画面に表示するプログラムを作成せよ.

[5] 発展問題(2点)〆切は11/1

さきほどの10個の整数を左から大きい順に並び変えモニタに一行で表示するプログラムを作成せよ.


〆切は11/1. プログラムを添付ファイルで送付すること(結果はいらない).


日程表へ戻る <<