1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Fortran 要素が配列に含まれるかどうかを確認する

Last updated at Posted at 2024-05-20

はじめに

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.が返る。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?