木村拓馬 FORTRAN プログラミング入門 –第 8 回 入出力における DO 型の反復,配列 (1)– 木村拓馬 2014 年 6 月 3 日 13:24 FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 1/13 木村拓馬 . 本日は . . 入出力 DO 形反復 配列(一次元) FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 2/13 木村拓馬 入出力 DO 形反復 入出力(READ 文,WRITE 文など)における DO 型の反復 例えば,I = 1, 2, · · · , 10 について変数 I と I の 2 乗を出力する場合, DO 構文を用いて記述すると以下のようになる. . 例 8.1:DO 構文で 1 から 10 までの 2 乗を表示 . . DO i = 1, 10 WRITE(*,*) i, i*i END DO この場合は,以下のように記述することもできる. . 例 8.2:DO 構文を使わないで 1 から 10 までの 2 乗を表示 . !改行しないで 1 行で表示 WRITE(*,*) (i, i*i, i=1, 10) !改行して表示(\n は改行コード(¥n)) WRITE(*,*) (i, i*i, ’\n’, i=1, 10) !5 桁右詰めで改行 WRITE(*,’(2I5)’) (i, i*i, i=1, 10) . FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 3/13 木村拓馬 入出力 DO 形反復 . 例 8.2:DO 構文を使わないで 1 から 10 までの 2 乗を表示 . !改行しないで 1 行で表示 . WRITE(*,*) (i, i*i, i=1, 10) !5 桁右詰めで改行 WRITE(*,’(2I5)’) (i, i*i, i=1, 10) 入出力 DO 形反復は,以下のように書けばよい. . ( . 入出力する項目 1, 入出力する項目 2, ... , 変数=初期値, 終値 [, 増分値]) . .(i, i*i, i =1 , 10 [, 1]) 注意:必ず ( ) で囲む必要がある. あとで紹介する「配列」と組み合わせると便利 FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 4/13 木村拓馬 入出力 DO 形反復 入出力 DO 形反復は入れ子にできる. . 例 8.3a: . program dodo implicit none integer::i,j write(*,*) ((10*i+j, j=1,4),’\n’, i=1,3) . end . 例 8.3b: . program dodo implicit none integer::i,j write(*,’(4i3)’) ((10*i+j, j=1,4), i=1,3) . end . 実行すると . 11 12 13 14 21 22 23 24 . 31 32 33 34 FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 5/13 木村拓馬 配列(一次元) これまでは「1 データを 1 変数」でプログラムを作成してきたが,これでは 扱うデータが多くなると変数の数も増え,プログラムが煩雑となってしまう. また,同じ内容のデータ (例えば,テストの点数など) を扱う場合,1 つの変数 名でまとめて扱うことができると,直感的に分かりやすく,非常に便利になる. そのようなときは,配列を使用すると便利. 配列のイメージ:データを入れる箱(変数)を連結 図 1: スカラー変数1 図 2: 一次元配列 1 今まで扱ってきた「変数」は,配列と比較するとき「スカラ変数」と呼ばれるもの. 線形代数で,ベクトルや行列でないのをスカラと呼ぶ感じ. FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 6/13 木村拓馬 配列の宣言 配列を使うには,今までに扱ってきた変数と同様に,まず配列の宣言をする. . 配列の宣言 . 型名,␣DIMENSION([下限:] 上限)␣::␣配列名 または 型名 ␣::␣配列名 ([下限:] 上限) . 下限は省略可能.省略した場合下限は 1 となる. FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 7/13 木村拓馬 配列の宣言 . 例 8.4:型宣言の例1 . real, dimension(100) :: height, weight integer, dimension(-10:10) :: value . . 例 8.5:型宣言の例2 . real :: height(100), weight(100) integer :: value(-10:10) . 上の例のように記述すると, height(1), height(2),· · · , height(99), height(100) という 100 個の変数, weight(1), weight(2),· · · , weight(99), weight(100) という 100 個の変数, value(-10), value(-9),· · · , value(0), · · · , value(9), value(10) という変数, が用意される. height(1), weight(2), value(-10) などの ( ) の中の数字を添字(index)という. FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 8/13 木村拓馬 初期値設定 配列の宣言と同時に値を設定することができる.これは次のように記述する. . 型名, DIMENSION([下限:] 上限) :: 配列名=(/定数, ..., 定数/) 型名 :: 配列名 ([下限:] 上限)=(/定数, ..., 定数/) . . 例 8.6: . PROGRAM VEC INTEGER, DIMENSION(5) :: A=(/80, 60, 100, 40, 60/) INTEGER :: B(-1:3)=(/80, 60, 100, 40, 60/) INTEGER :: C(5)=(/ (I, I = 1, 5) /), D(5)=(/ (I, I = 2, 10, 2) /) WRITE(*,*) A WRITE(*,*) B WRITE(*,*) C WRITE(*,*) D END PROGRAM . . 実行すると . 80 60 100 40 60 上の例を実行すると右のように画面に表示される. 80 60 100 40 60 4 行目のように,DO 型の反復も使用できる. 1 2 3 4 5 . 2 4 6 8 10 FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 9/13 木村拓馬 代入と演算 配列への値の代入と算術演算は,配列要素を指定して行う. 配列要素を指定しない場合は,ベクトル演算となる (同じ形 (大きさ・次元) の配列でなければならない). . 例 8.7a: . integer :: a(3) a(1) = 2 a(2) = 4 a(3) = a(1) + a(2) . !a は 2, 4, 6 となる. . 例 8.7b: . integer :: a(3) = (/2, 4, 6/), b(3) = (/1, 2, 3/), c(3) c(1) = a(1)*b(1) c(2) = a(2)*b(2) c(3) = a(3)*b(3) write(*,*) c !c は 2, 8, 18 となる. ! 上の3つの掛け算をまとめて書くと c = a * b write(*,*) c !c は 2, 8, 18 となる. . FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 10/13 木村拓馬 部分配列 配列の一部を参照・演算することもできる. 配列の一部を参照・演算するには,配列の添字に以下のような 下限,上限,刻みを指定する. . [.下限]:[上限][:刻み] 下限を省略した場合は配列の下限が設定される. 上限を省略した場合は配列の上限が設定される. 刻みを省略した場合は 1 が設定される. . 例 8.8: . INTEGER :: A(5) A = 0 ! A(1) から A(5) の順に 0, 0, 0, A(1:3) = 9 ! A(1) から A(5) の順に 9, 9, 9, A(:) = 8 ! A(1) から A(5) の順に 8, 8, 8, A(:2) = 7 ! A(1) から A(5) の順に 7, 7, 8, A(4:) = 6 ! A(1) から A(5) の順に 7, 7, 8, A(1:5:2) = 0 ! A(1) から A(5) の順に 0, 7, 0, . FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 0, 0, 8, 8, 6, 6, 0 0 8 8 6 0 となる となる となる となる となる となる 11/13 木村拓馬 入出力 配列の入出力は以下のように行う. . 例 8.9: . PROGRAM IO INTEGER :: A(5) INTEGER :: I READ(*,*) A ! 値の区切りはスペースまたは改行. WRITE(*,*) A ! 値は 1 行に出力される. READ(*,*) (A(I), I=1, 5) ! 値の区切りはスペースまたは改行 WRITE(*,*) (A(I), I=1, 5) ! 値は 1 行に出力される. DO I = 1, 5 READ(*,*) A(I) ! 値の区切りは改行のみ. END DO ! 5 行に出力させるには書式指定を行うか DO 構文. WRITE(*,’(I5)’) A ! 値は 5 行に出力される. DO I = 1, 5 WRITE(*,*) A(I) ! 値は 5 行に出力される. END DO .END PROGRAM FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 12/13 木村拓馬 参考文献 [1] JIS X 3001-1:2009 (プログラム言語 Fortran – 第 1 部:基底言語) [2] 戸川隼人:ザ・Fortran90/95,サイエンス社(1999) FORTRAN プログラミング入門,–第 8 回 入出力における DO 型の反復,配列 (1)– 13/13
© Copyright 2024 Paperzz