FORTRANプログラミング入門 8回 入出力におけるDO型の反復,配列(1)

木村拓馬
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