[Fortranのはじめ方] Part10: 配列の宣言と操作

Fortran

同じ種類のデータをまとめて扱おう!

プログラミングでは、同じ種類のデータをたくさん扱う場面がよくあります。例えば、テストの点数、実験の測定値、座標などです。Fortranの「配列」を使うと、これらのデータを効率的に管理・操作できます。数値計算や科学技術計算では特に重要な機能です。💪

このセクションでは、Fortranにおける配列の基本的な宣言方法と操作方法を学びます。

1. 配列の宣言

配列を使うには、まずプログラムの宣言部で「どのような種類のデータを」「いくつ格納するか」を宣言する必要があります。宣言には主に2つの方法があります。

方法1: `DIMENSION` 属性を使う

変数宣言時に `DIMENSION` 属性を追加し、括弧 `()` 内に配列のサイズ(要素数)を指定します。

! データ型, DIMENSION(サイズ) :: 配列名
INTEGER, DIMENSION(10) :: scores      ! 整数型(INTEGER)でサイズ10の配列 scores
REAL, DIMENSION(5)    :: temperatures ! 実数型(REAL)でサイズ5の配列 temperatures
CHARACTER(LEN=20), DIMENSION(3) :: names ! 文字列型(CHARACTER)でサイズ3の配列 names

この例では、`scores` は10個の整数を、`temperatures` は5個の実数を、`names` は3個の長さ20の文字列を格納できる配列として宣言されています。

方法2: 配列名の後ろにサイズを指定する

より一般的な方法として、配列名の直後に括弧 `()` でサイズを指定する方法があります。

! データ型 :: 配列名(サイズ)
INTEGER :: counts(100)     ! 整数型(INTEGER)でサイズ100の配列 counts
REAL    :: velocity(3)     ! 実数型(REAL)でサイズ3の配列 velocity
LOGICAL :: flags(5)        ! 論理型(LOGICAL)でサイズ5の配列 flags

添字(インデックス)の範囲を指定する

デフォルトでは、配列の添字(要素を指定するための番号)は1から始まります。例えば、`INTEGER :: data(5)` と宣言した場合、`data(1)`, `data(2)`, `data(3)`, `data(4)`, `data(5)` のようにアクセスします。

しかし、添字の開始番号を1以外にしたい場合もあります。その場合は、`開始番号:終了番号` の形式で指定します。

! データ型 :: 配列名(開始番号:終了番号)
REAL :: potential(-5:5)   ! 実数型の配列。添字は-5から5まで (要素数は11個)
INTEGER :: results(0:9)   ! 整数型の配列。添字は0から9まで (要素数は10個)
注意: 添字の範囲外にアクセスしようとするとエラーが発生します。プログラムが予期せず停止する原因になるため、注意が必要です。🚫

2. 配列の初期化

配列を宣言した後、各要素に値を設定(初期化)する方法はいくつかあります。

宣言時に初期化する (配列構成子)

宣言と同時に値を設定するには、配列構成子 `(/ … /)` または `[ … ]` (Fortran 2003以降) を使用します。カンマ `,` で区切って要素の値を並べます。

! 古い形式 (/ ... /)
INTEGER, DIMENSION(5) :: initial_values = (/ 10, 20, 30, 40, 50 /)

! モダンな形式 [ ... ] (推奨)
REAL :: constants(3) = [ 3.14, 2.71, 1.61 ]
CHARACTER(LEN=5), DIMENSION(2) :: weekdays = [ "Mon", "Tue" ]

配列構成子内の要素数は、宣言した配列のサイズと一致させる必要があります。

ループを使って初期化する

`DO` ループを使って、配列の各要素に順番に値を代入することも一般的です。特に、規則性のある値を設定する場合に便利です。

PROGRAM init_array_loop
  IMPLICIT NONE
  INTEGER, PARAMETER :: array_size = 5
  INTEGER :: i
  REAL, DIMENSION(array_size) :: squares

  ! DOループで各要素に i*i を代入
  DO i = 1, array_size
    squares(i) = REAL(i * i) ! i*i は整数なので REAL() で実数に変換
  END DO

  ! 結果の表示 (WRITE文については後のStepで詳しく学びます)
  PRINT *, 'Squares:'
  DO i = 1, array_size
    PRINT *, 'squares(', i, ') = ', squares(i)
  END DO

END PROGRAM init_array_loop

配列全体への代入

配列全体に同じ値を設定したい場合は、単純に代入できます。

REAL, DIMENSION(100) :: x_coords
INTEGER :: status_flags(10)

x_coords = 0.0     ! 配列 x_coords の全要素に 0.0 を代入
status_flags = 1   ! 配列 status_flags の全要素に 1 を代入

3. 配列要素へのアクセスと操作

配列の個々の要素にアクセスするには、`配列名(添字)` という形式を使用します。添字には整数型の変数や定数、式を指定できます。

PROGRAM access_array
  IMPLICIT NONE
  INTEGER, DIMENSION(5) :: data = [ 10, 20, 30, 40, 50 ]
  INTEGER :: index, value

  ! 3番目の要素にアクセスして表示
  index = 3
  value = data(index)
  PRINT *, 'data(', index, ') = ', value  ! 出力: data( 3 ) =  30

  ! 1番目の要素の値を変更
  data(1) = 100
  PRINT *, 'data(1) after change = ', data(1) ! 出力: data(1) after change =  100

  ! 2番目の要素と4番目の要素の和を計算
  value = data(2) + data(4)
  PRINT *, 'data(2) + data(4) = ', value ! 出力: data(2) + data(4) =  60 (20 + 40)

END PROGRAM access_array

配列全体を使った演算

Fortranの強力な機能の一つは、配列全体に対する演算を簡潔に記述できることです。これにより、ループを明示的に書かなくても、要素ごとの計算を実行できます。✨

PROGRAM array_operations
  IMPLICIT NONE
  REAL, DIMENSION(3) :: a = [ 1.0, 2.0, 3.0 ]
  REAL, DIMENSION(3) :: b = [ 4.0, 5.0, 6.0 ]
  REAL, DIMENSION(3) :: c
  REAL :: scalar = 2.0

  ! 配列同士の加算 (要素ごと)
  c = a + b   ! c は [ 5.0, 7.0, 9.0 ] になる

  PRINT *, 'c = a + b: ', c

  ! 配列とスカラ値の乗算 (要素ごと)
  c = a * scalar ! c は [ 2.0, 4.0, 6.0 ] になる
  PRINT *, 'c = a * scalar: ', c

  ! 配列同士の乗算 (要素ごと)
  c = a * b   ! c は [ 4.0, 10.0, 18.0 ] になる
  PRINT *, 'c = a * b: ', c

  ! 他の配列への代入
  a = c       ! 配列 a の内容が c で上書きされる
  PRINT *, 'new a = c: ', a

END PROGRAM array_operations

このように、配列 `a` と `b` のサイズが同じであれば、`c = a + b` と書くだけで、`c(1) = a(1) + b(1)`, `c(2) = a(2) + b(2)`, `c(3) = a(3) + b(3)` が実行されます。これはコードを非常に読みやすく、書きやすくします。

配列に関する組込み関数

Fortranには、配列を操作するための便利な組込み関数がたくさん用意されています。いくつか例を挙げます。

関数名 説明 例 (a = [1.0, 2.0, 3.0])
SUM(array) 配列の全要素の合計値を返す SUM(a) は 6.0
PRODUCT(array) 配列の全要素の積を返す PRODUCT(a) は 6.0
MAXVAL(array) 配列の最大値を返す MAXVAL(a) は 3.0
MINVAL(array) 配列の最小値を返す MINVAL(a) は 1.0
SIZE(array) 配列の要素数を返す SIZE(a) は 3
MAXLOC(array) 配列の最大値がある最初の位置(添字)を返す MAXLOC(a) は [3] (添字3)
MINLOC(array) 配列の最小値がある最初の位置(添字)を返す MINLOC(a) は [1] (添字1)
PROGRAM array_intrinsics
  IMPLICIT NONE
  REAL, DIMENSION(4) :: values = [ 2.5, -1.0, 5.0, 0.5 ]
  REAL :: total, max_v, min_v
  INTEGER :: num_elements
  INTEGER, DIMENSION(1) :: max_index, min_index ! MAXLOC/MINLOCは配列を返す

  total = SUM(values)
  max_v = MAXVAL(values)
  min_v = MINVAL(values)
  num_elements = SIZE(values)
  max_index = MAXLOC(values)
  min_index = MINLOC(values)

  PRINT *, 'Array: ', values
  PRINT *, 'Sum: ', total          ! 合計
  PRINT *, 'Max value: ', max_v     ! 最大値
  PRINT *, 'Min value: ', min_v     ! 最小値
  PRINT *, 'Size: ', num_elements   ! 要素数
  PRINT *, 'Max location: ', max_index(1) ! 最大値の添字
  PRINT *, 'Min location: ', min_index(1) ! 最小値の添字

END PROGRAM array_intrinsics

まとめ

今回は、Fortranの配列の基本的な宣言方法と操作方法について学びました。

  • 配列は `DIMENSION` 属性または配列名の後の `(サイズ)` で宣言します。
  • 添字の範囲は `(開始番号:終了番号)` で指定できます(デフォルトは1から)。
  • 配列構成子 `[ … ]` やループを使って初期化できます。
  • 要素へのアクセスは `配列名(添字)` で行います。
  • 配列全体に対する演算(`+`, `-`, `*`, `/` など)が可能です。
  • `SUM`, `MAXVAL`, `SIZE` などの便利な組込み関数があります。

配列は、大量のデータを効率的に扱うための基本です。特に科学技術計算では不可欠な要素なので、しっかりと使い方をマスターしましょう。次は、複数の次元を持つ「多次元配列」について学びます。🚀

コメント

タイトルとURLをコピーしました