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