はじめに
do loopを使用してごり押しで書くことも可能だが以下の方法を使用すると簡単に実装できる。
方法:any関数を使う
書き方
any("要素" == 配列)
例 (Array of integer)
program inc
use, intrinsic :: iso_fortran_env
implicit none
real(real64) :: list(5) = [1, 2, 3, 4, 5]
if (any(1 == list)) then
print *, "1はlistに含まれています。"
else
print *, "1はlistに含まれていません。"
end if
if (any(6 == list)) then
print *, "6はlistに含まれています。"
else
print *, "6はlistに含まれていません。"
end if
end program inc
出力
1はlistに含まれています。
6はlistに含まれていません。
例2(Array of strings)
program inc2
use, intrinsic :: iso_fortran_env
implicit none
character(len=10), dimension(2) :: string_list
string_list = [character(len=10) :: "abc", "def"] !明示的な型変換
if (any("abc " == string_list)) then
print *, "abcはlistに含まれています。"
else
print *, "abcはlistに含まれていません。"
end if
if (any("abcdefghijk" == string_list)) then
print *, "abcdefghijkはlistに含まれています。"
else
print *, "abcdefghijkはlistに含まれていません。"
end if
end program inc2
出力
abcはlistに含まれています。
abcdefghijkはlistに含まれていません。
Array of stringsについては
https://fortran-lang.org/learn/quickstart/arrays_strings/#array-of-strings
解説
配列の一括操作とany関数による配列のreductionを組み合わせている。
any関数についての説明はこちら
https://fortran-lang.org/learn/intrinsics/array/#any
簡単に説明するとany(mask)でmaskにはlogical型の配列が入る。
いずれかの要素が.true.
の場合は.true.
を返し、すべての要素が.false.
の場合は.false.
となる。
program inc3
use, intrinsic :: iso_fortran_env
implicit none
print *, 1 == [1, 2, 3, 4, 5] ! T F F F F
print *, [1, 1, 1, 1, 1] == [1, 2, 3, 4, 5] ! T F F F F
print *, any(1 == [1, 2, 3, 4, 5]) ! T
print *, any([1, 1, 1, 1, 1] == [1, 2, 3, 4, 5]) ! T
print *, any([.true., .false., .false., .false., .false.]) !T
end program inc3
上記の例では1 == [1, 2, 3, 4, 5]
が配列の一括操作により[1, 1, 1, 1, 1] == [1, 2, 3, 4, 5]
と展開されてlogical型の配列[.true., .false., .false., .false., .false.]
が返る。
それをany関数に入れることで、要素が含まれている場合はlogical型.true.
が返る。