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

1から10までの和
  1. 基本のルール
  2. データの入出力
  3. DOループによる反復処理
  4. 今日の宿題

今日の目標

  1. 基本的なルールを覚える
  2. ファイルからデータの入出力の復習
  3. DOループによる反復処理

今日のディレクトリ, 141009を作成してください.


基本のルール

[1.1]プログラムの基本的なルール

以下は先週コンパイルしたプログラムです.これをまず分析します.

c     program 14/10/09
      implicit none
      real*8 a,b,c 
     
      a=1.D0
      b=2.D0
      c=a+b

      write(*,*) a,b,c
      
      end

まず覚えてほしいフォートランのきまり:

[1.2]定数, 変数の型

FORTRANでは定数(1.D0などの具体的な数)および変数(a, bなど定数を格納できる文字:英字から始まる6文字以内の任意の英数字)には型が定められています. 常に型を意識して変数および定数を使用してください. 当面登場する型は次の三つです. そのうち使用するのは始めの二つとなります.

注意:宣言文はプログラムの先頭に置いてください! 次のプログラムを実行してください.

c     program 2  14/10/09
      implicit none
      real*8 a,b
      real c
      integer n

      a=2.1D0
      b=2.1
      c=2.1
      n=2.1

      write(*,'(D24.16,1x,D24.16,1x,D24.16)') a,b,c
      write(*,'(I3)') n
      end

モニタ上の表示はどうなったでしょうか? 何桁目まで正しく表示されていますか? nの表示はどうなっていますか?

再度注意点をまとめると:

以上二点をいつも守るように心がけて下さい.

[1.3]書式の指定

write(*,*)の右の*の部分には本来「書式指定子」と呼ばれるものが入る. 書式を指定すると,計算結果の出力を自分の都合に合わせてカスタマイズできる. 使用頻度が高い形式の例を二つ挙げておく. 以上の記号を, '( )'で囲んで記述してください. 複数ある場合は ,(コンマ)で続けて 下さい.

[2] データの入出力

[2.1]read文とwrite文

前節では画面に結果を出力させました.キーボードから入力もしたいと思います.入力は read文を使って行われます.先ほどのプログラムを


c     program 2  14/10/09
      implicit none
      real*8 a,b,c,d 
     
      a=1.D0
      b=2.D0
      c=a+b

      read(5,*) d
      write(6,*) d


      write(6,*) a,b,c
      
      end
と変更して実行してみよう.

[2.2]ファイルに入出力

計算させた結果は別のファイルに書き出すことがよくあります.そのためにはプログラムの 宣言文(real*8等)の次に
open(1,FILE='test.dat')
を追加してください. こうするとその後write(1,*)とすることによりtest.datに結果が 出力されます.番号に6(モニタ),5(キーボード)は使ってはいけない.これは標準入出力の番号です.

まず, 内容が次のファイル141009_1.datを作成してください.

2.1D0 5.4D0

注意:5.4D0の後で改行してください.しないと読み込みでエラーになります.

次のプログラムを書いてみよう.

      implicit none
      real*8 a,b,c

      open(1,FILE='141009_1.dat')
      open(2,FILE='141009_2.dat')

      read(1,*) a,b
      c=a+b
      write(2,*) c 

      end

以上二つのファイルが作成できたらコンパイル後実行してください.

プログラムから数値を読み込む場合, 通常はファイルから読み込ませます. キーボードから読み込ませることもできますが, そうすると入力した数値が後で判らなくなってしまうことが多いからです. また, 計算結果も通常はファイルに書き込ませます. ファイルを開くには上の例のようにopen文を用います. 書式は次の通り.

open文 open(n,FILE='ファイル名')
n 外部装置識別子(5,6を除いた整数を使う)

つづくread, write文では, 対応する番号で開かれたファイルからの読み込み, 書き込みが行われることになる.

[3] DOループによる反復処理

次のプログラムを書いてみよう.

      implicit none
      real*8 a,c
      integer n,i

      a=1.D0
      c=0.D0
      n=10
     
      do i=1,n
          c=c+a
      enddo
   
      write(*,*) c,n
     
      end

これは,整数iを1からnまで一つづつ増やしつつenddo文までを反復しなさいというプログラムである.フォートランでは反復計算をDOループを用いて行なう. 基本的な書き方は次の通り:

DOループ do i=m1,m2,m3
..........
enddo
i 制御変数(整数型を使う)
m1 制御変数の初期値
m2 制御変数の終値
m3 制御変数の増分(省略すると1になる)

増分を1以外の数にとったのが次の例:

      implicit none
      integer i

      do i=0,11,2

           write(*,*) i

      enddo
      end
別の例:
      implicit none
      integer i

      do i=10,0,-1

           write(*,*) i

      enddo
      end

DOループは重ねてつかうことができる. 例として:

      implicit none
      integer i,j

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

プログラムを作成し実行せよ. iとjがどのように増えていくか着目すること.


[4] 今日の宿題

  1. 1から10までの和を求めるプログラムを作成せよ.(ヒント:和を求めるために整数型の変数を一つ用意する.第3章初めのプログラム参照.)
  2. 1×1+2×2+3×3...+10×10を求めるプログラムを作成せよ.
  3. 1×2×3×... ×10 を求めるプログラムを作成せよ.
  4. 1+10+100+..を行い,画面に以下のとおりに数字が表示されるプログラムを作成せよ.(フォートランでは,10のn乗はプログラム中では10**nと書く.)
     1
     11
     111
     1111
     11111
     111111
     1111111
     11111111
     111111111
     1111111111
    

問題のプログラム及び解答(数値)を城野,諸田,野上(アドレス変更です.nogami.tatsuhiko@g.mbox.nagoya-u.ac.jp )にメールで送ること.

〆切:10月14日(火曜日)


日程表へ戻る <<