...

数値解析基礎・演習 Fortran90-(2) do 文の使い方 ver.2011.05

by user

on
Category: Documents
10

views

Report

Comments

Transcript

数値解析基礎・演習 Fortran90-(2) do 文の使い方 ver.2011.05
数値解析基礎・演習 Fortran90-(2) do 文の使い方 ver.2011.05
情報環境学専攻(社会・環境系) 斎藤隆泰
1.
はじめに
前回は Fortran の基本的な使い方を学ぶために、
終える必要がある。2 行目の implicit none は、現
状ではとにかく 1 行目の program 文の後に必ず記
10 行程度の初歩的なプログラムを実際にエディ
述する癖をつけよう。3 行目の integer::i はプログ
タで作成し、コンパイルを実行して結果を出力す
ラム中で整数変数 i を使いますよという宣言であ
ることを行った。Fortran は科学技術計算を実行
る。4 行目はなにも書かれていない。慣れてきた
するためのプログラミング言語である。数学の世
ら、記述したプログラムが自分で見やすいように
界では、総和を取る計算はΣの記号を用いて表現
何も書かない行を設けて見るとよい。一方、5 行
するのが便利であるが、そのような総和を求める
目の右辺は 1 から 5 までの整数の和を取っている。
計算等を行う場合、Fortran ではどのように扱え
Fortran では等号(イコール)は右辺の計算結果を
ばよいかを考えてみよう。講義でも同じようなこ
左辺に代入するという意味であった。従って、5
とを述べるが、聞き逃した点、疑問点など、この
行目では右辺の総和の結果を左辺の整数変数 i に
補足資料をよく読んで復習しておくこと。
代入していることがわかる。6 行目は write 文で
あり、write(*,*)’
2.1
和の計算
例えば、1 から 5 までの整数の和を求める計算
を Fortran で行う場合、どのようにすればよいで
‘と書くと、’
‘で囲んだ部分
をそのまま画面上に出力することができる。続け
て i を書いて、6 行目の時点での整数変数 i の値を
出力している。
あろうか?補足資料 Fortran90-(1)で説明した知
このプログラムを実行すれば、確かに1から 5
識だけを用いれば、次のようなプログラムを記述
までの整数の和を求めることができる。しかし、
する以外に上手な方法はないであろう。
これではわざわざプログラムを用いるメリットは
ない。実際、1 から 1000 までの総和を求めよと言
------------------------------------------------------------------
われて、5 行目の和の計算を 1000 まで実際に記述
1
program sigma
する人はまずいないであろう。こういう時のため
2
implicit none
に、Fortran では次節で述べる do 文というものが
3
integer::i
存在する。
5
i=1+2+3+4+5
2.2
6
write(*,*)’result’,i
4
7
8
do 文による和の計算
do 文の使用例を次に示す。1 行ずつ、何が行わ
れているかを考えながらプログラムを眺めると上
end program sigma
達も早いであろう。
----------------------------------------------------------------------------------------------------------------------------------1
program sigma2
1 行目の sigma はプログラム名である。プログラ
2
implicit none
ム名は任意に決められるが、プログラムの最後は、
3
integer::i,j
end program sigma のように同じプログラム名で
4
さて、復習も兼ねて各行の意味を説明しておく。
5
j=0
プログラムを扱う場合、7 行目で利用する j という
6
do i=1,5,1
整数変数を他の場所で利用している可能性がある。
7
j=j+i
当然、その場合は整数変数 j がゼロであるとは限
8
end do
らないため、あくまでも j が最初にゼロでなけれ
9
write(*,*)’result’,j
ば正しく1から 5 までの総和を求めることができ
10
11
ないためである。
さて、このように do 文を用いると、1から 1000
end program sigma2
------------------------------------------------------------------
までの整数の総和を求める場合はどうすればよい
か考えて欲しい。もうおわかりであろう。6 行目
先のプログラムのように、1から 5 までの和を具
の do i=1,5,1 を do i=1,1000,1 と変更し、コンパイ
体的に 1+2+3+4+5 と書いていないことに注意す
ルすればよい。これならば、do 文の威力を思い知
る。
代わりに 6 行目から 8 行目に渡る do 文を記述
ることができるであろう。わざわざ 1+2+・・・・
している。その do 文について説明しよう。
+1000 と記述しなくても、do i=1,1000,1 と記述す
do 文は必ず、do i=1,5,1 のように始まり、end do
るだけで総和の計算が出来てしまうのである。
で終了する。この場合の do 文の意味は、整数変数
ざっと do 文の使用例について説明したが、do
i を 1 から 5 まで1ずつ増加させながら end do ま
文で指定する do 変数(この場合は do i の i)は必
でを繰り返すという意味である。なお、do i=1,5
ず整数でなければならないことに注意する。その
のように最後の 1 は省略することができる。省略
ため、例えば、do a=1.2, 1.9, 0.1 等のように 1.2
した場合は自動的に i の増加分は 1 として扱われ
から始めて 1.9 まで 0.1 ずつというような記述の
る。do i=1,5,2 と書けば、i を 1 から 5 まで2ずつ
仕方はしてはならない。数学で用いるΣ記号の添
増加させながらという意味になる。順を追って見
字も、通常は整数を用いる。それと同じである。
て行こう。6 行目に到達した時点で、まず i=1 が
代入される。この時点で j は 5 行目よりゼロが代
2.3
入されているため、7 行目の右辺は j+i,つまり 0+1
総和計算以外で用いる do 文の使用例
do 文は、何も和を求めるためだけに使う訳では
となり、0+1 の値が左辺の j に代入される。そし
ない。応用すれば様々な使い方が考えられる。
て 8 行目の end do で再び 6 行目に戻る。i は 1 か
例えば、適当な整数をキーボードから入力し、そ
ら 5 まで1ずつ増加するので、次に i は2となり
れを画面に出力することを 10 回繰り返すプログ
再び 7 行目の計算を実行する。このとき、i は 2
ラムを作る場合はどのようにすればよいか考えて
が代入されており、j は先の 0+1 の結果、つまり 1
みよう。
が代入されているので 7 行目の左辺は 1+2 の値が
左辺の j へと代入される。再び end do に辿りつい
------------------------------------------------------------------
たら、今度は i=3 として 7 行目を実施し、以後、
1
program inout
i=5 までこの操作を繰り返す。
2
implicit none
理解できたであろうか?理解できた人は、5 行
3
integer::i,k
目の j=0 の意味も考えて欲しい。このように、do
4
文である変数の総和を取る前にその変数にゼロを
5
do i=1,10
代入しておくことを初期化と呼ぶ。ここで示した
6
write(*,*)’how many times?’,i
プログラムはたった 11 行であるが、数千行に及ぶ
7
read(*,*)k
8
write(*,*)k
9
end do
10
3
do 文利用のまとめ
今回は、do 文の利用方法について簡単にまとめ
11 end program inout
た。プログラム中で次のようなことを実行したく
------------------------------------------------------------------
なったら、do 文の利用を考えよう。
数式をプログラムに起こす場合で総和を求める
1,2,3 行目や 11 行目等の意味がわからない読者は
必要がある場合
もう一度本文を読み直して欲しい。理解できてい
同じような動作を何度も繰り返す必要がある場
る人は 5~9 行目の do 文で何が行われているかを
合
考えよう。
このように do 文の利用方法を理解したら、実際
5 行目では do i=1,10 としている。do 文中の i
に自分で do 文を使った様々なプログラムを利用
を 1 から 10 まで 1 ずつ変化させる。ただし、2.2
してみると良い。例えば、n!を求める場合やテー
のプログラム 6 行目と異なるのは、i の増分が 1
ラー展開の第 n 項までの総和を求める必要がある
であるので do i=1,10,1 の最後の 1 を省略している
場合等に do 文を利用できる。また、do 文は次回
ことに注意する。
5 行目の do 文は 9 行目の end do
説明する if 文や、配列を用いるとさらに様々なプ
と必ず対で利用する。do と end do 文で挟まれた
ログラムを記述することができる。特に、配列を
部分を、i を 1 ずつ変化させながら実行している。
扱う場合は do 文も必ずといっていいほど登場す
6 行目で出力する i はそれぞれ do 文が end do ま
る。いまのうちに、do 文をしっかりとマスターし
で何回繰り返しているかを示すために記述してい
ておくことが重要である。
る。7 行目で、適当な整数を画面から読み込み、
それを k とし、その k の値を 8 行目で出力してい
るのである。
Appendix コンパイルの補足
コンパイル後に生成される実行ファイルについ
この計算は数式の総和を求めるわけではないが、 て補足しておこう。Fortran90-(1)では、例え
このように同じような動作を何度も繰り返す時に
も do 文は利用する。例えば、あるプログラム中で、
ば test.f90 というプログラムをコンパイル
する場合、
Tokyo Institute of Technology を 100 回画面に出
力しようと考えた場合、プログラム中に
do i=1,100
write(*,*)’Tokyo Institute of Technology’
end do
とすれば、do と end do で挟まれた部分は 100 回
繰り返され、画面に出力されることとなる。この
場合、do 変数の i は単に回数を数えるためだけに
gfortran test.f90
とすることを説明した。この時生成される
実行ファイルは、プログラムを作成する環
境やコ ンパイラに もよるが、 test.exe や
a.exe である。もし、生成される実行ファイ
ルにも名前を付けたい場合、例えば実行フ
ァイルを result.exe とするなら次のように
-o result を付け加えればよい。
用いていることに注意しよう。当然、数式を扱っ
ている訳ではないので、2.2 のプログラムの 5 行
目のような初期化は必要ない。
gfortran –o result test.f90
Fly UP