PC パソコン

Fortranサンプルコード集|三角形の面積・温度変換・二次方程式など

Fortranサンプルコード集|三角形の面積・温度変換・二次方程式など

この記事では、Fortranを学び始めた人向けに、
そのまま入力して動かせる簡単なサンプルコードをまとめています。

三角形や円の面積、摂氏・華氏の温度変換、
二次方程式、平均値、最大値・最小値、
九九、階乗、素数判定など、
基本文法を使って作れる小さなプログラムを紹介します。

各サンプルには「!」を使ったコメント(注釈)を多めに入れています。
単にコードをコピーするだけでなく、
「入力した値をどの変数へ保存するのか」
「どの式で計算しているのか」
「どの条件で分岐しているのか」
を確認しながら試してみてください。

サンプルコードの使い方

コードをテキストエディタへコピーし、
例えばsample.f90という名前で保存します。

gfortranでは次のようにコンパイルできます。

gfortran sample.f90 -o sample

Mac・Linuxでは次のように実行します。

./sample

WindowsのMSYS2では次のように実行できます。

./sample.exe

三角形の面積を求める

底辺と高さを入力し、
底辺 × 高さ ÷ 2で三角形の面積を求めます。

program triangle_area
    implicit none

    real :: base
    real :: height
    real :: area

    ! 底辺を入力します。
    print *, "底辺を入力してください。"
    read *, base

    ! 高さを入力します。
    print *, "高さを入力してください。"
    read *, height

    ! 三角形の面積を計算します。
    area = base * height / 2.0

    print *, "三角形の面積 =", area

end program triangle_area

2ではなく2.0としているのは、
実数として計算することを明確にするためです。

円の面積を求める

半径を入力し、
π × 半径²で円の面積を求めます。

program circle_area
    implicit none

    real :: radius
    real :: area

    ! 円周率は途中で変更しないためparameterを付けます。
    real, parameter :: pi = 3.14159265

    print *, "半径を入力してください。"
    read *, radius

    ! ** 2 は2乗です。
    area = pi * radius ** 2

    print *, "円の面積 =", area

end program circle_area

長方形の面積を求める

program rectangle_area
    implicit none

    real :: width
    real :: height
    real :: area

    print *, "横の長さを入力してください。"
    read *, width

    print *, "縦の長さを入力してください。"
    read *, height

    ! 長方形の面積 = 横 × 縦
    area = width * height

    print *, "長方形の面積 =", area

end program rectangle_area

摂氏から華氏へ温度変換する

摂氏温度Cから華氏温度Fへの変換には、
F = C × 9 / 5 + 32を使います。

program celsius_to_fahrenheit
    implicit none

    real :: celsius
    real :: fahrenheit

    print *, "摂氏温度を入力してください。"
    read *, celsius

    ! 摂氏から華氏へ変換します。
    fahrenheit = celsius * 9.0 / 5.0 + 32.0

    print *, "華氏温度 =", fahrenheit

end program celsius_to_fahrenheit

華氏から摂氏へ温度変換する

華氏温度Fから摂氏温度Cへの変換は、
C = (F – 32) × 5 / 9です。

program fahrenheit_to_celsius
    implicit none

    real :: fahrenheit
    real :: celsius

    print *, "華氏温度を入力してください。"
    read *, fahrenheit

    celsius = (fahrenheit - 32.0) * 5.0 / 9.0

    print *, "摂氏温度 =", celsius

end program fahrenheit_to_celsius

二次方程式を解く

二次方程式
ax² + bx + c = 0
の実数解を求めます。

判別式
D = b² – 4ac
を計算し、
Dの値によって解の個数を判定します。

program quadratic_equation
    implicit none

    real :: a
    real :: b
    real :: c
    real :: discriminant
    real :: x1
    real :: x2

    print *, "aを入力してください。"
    read *, a

    print *, "bを入力してください。"
    read *, b

    print *, "cを入力してください。"
    read *, c

    ! a = 0の場合は二次方程式ではありません。
    if (a == 0.0) then

        print *, "aは0以外を入力してください。"

    else

        ! 判別式 D = b^2 - 4ac
        discriminant = b ** 2 - 4.0 * a * c

        if (discriminant > 0.0) then

            ! 異なる2つの実数解があります。
            x1 = (-b + sqrt(discriminant)) / (2.0 * a)
            x2 = (-b - sqrt(discriminant)) / (2.0 * a)

            print *, "解1 =", x1
            print *, "解2 =", x2

        else if (discriminant == 0.0) then

            ! 重解です。
            x1 = -b / (2.0 * a)

            print *, "重解 =", x1

        else

            ! 判別式が負の場合、実数解はありません。
            print *, "実数解はありません。"

        end if

    end if

end program quadratic_equation

より厳密な数値計算では、
浮動小数点数を== 0.0で直接比較せず、
一定の誤差範囲で判定する方法もあります。
このコードは基本文法の練習用として簡潔にしています。

BMIを計算する

BMIは、
体重kg ÷ 身長m²で計算できます。

program bmi_calculation
    implicit none

    real :: height
    real :: weight
    real :: bmi

    print *, "身長[m]を入力してください。"
    read *, height

    print *, "体重[kg]を入力してください。"
    read *, weight

    ! BMI = 体重 / 身長^2
    bmi = weight / height ** 2

    print *, "BMI =", bmi

end program bmi_calculation

2つの数の四則演算をする

program calculator
    implicit none

    real :: a
    real :: b

    print *, "1つ目の数を入力してください。"
    read *, a

    print *, "2つ目の数を入力してください。"
    read *, b

    print *, "足し算 =", a + b
    print *, "引き算 =", a - b
    print *, "掛け算 =", a * b

    ! 0で割ることを避けます。
    if (b /= 0.0) then
        print *, "割り算 =", a / b
    else
        print *, "0では割れません。"
    end if

end program calculator

3つの数の平均を求める

program average_three
    implicit none

    real :: a
    real :: b
    real :: c
    real :: average

    print *, "1つ目の値を入力してください。"
    read *, a

    print *, "2つ目の値を入力してください。"
    read *, b

    print *, "3つ目の値を入力してください。"
    read *, c

    average = (a + b + c) / 3.0

    print *, "平均 =", average

end program average_three

配列の平均を求める

複数のデータを扱う場合は、
配列とsumsizeを使うと便利です。

program array_average
    implicit none

    real :: data(5)
    real :: average

    data = [10.0, 20.0, 30.0, 40.0, 50.0]

    ! sum(data)で合計、
    ! size(data)で要素数を取得します。
    average = sum(data) / real(size(data))

    print *, "平均 =", average

end program array_average

最大値と最小値を求める

program min_max
    implicit none

    real :: data(5)

    data = [12.5, 7.2, 18.4, 3.9, 10.1]

    ! maxvalで最大値を求めます。
    print *, "最大値 =", maxval(data)

    ! minvalで最小値を求めます。
    print *, "最小値 =", minval(data)

end program min_max

点数から合否を判定する

IF文の練習として、
60点以上なら合格、
それ未満なら不合格と表示します。

program pass_or_fail
    implicit none

    integer :: score

    print *, "点数を入力してください。"
    read *, score

    if (score >= 60) then

        print *, "合格です。"

    else

        print *, "不合格です。"

    end if

end program pass_or_fail

点数から評価A・B・Cを判定する

program grade
    implicit none

    integer :: score

    print *, "点数を入力してください。"
    read *, score

    if (score >= 80) then

        print *, "評価A"

    else if (score >= 60) then

        print *, "評価B"

    else

        print *, "評価C"

    end if

end program grade

偶数・奇数を判定する

modは余りを求める関数です。
2で割った余りが0なら偶数です。

program even_odd
    implicit none

    integer :: number

    print *, "整数を入力してください。"
    read *, number

    ! mod(number, 2)は2で割った余りです。
    if (mod(number, 2) == 0) then

        print *, "偶数です。"

    else

        print *, "奇数です。"

    end if

end program even_odd

1から100までの合計を求める

program sum_1_to_100
    implicit none

    integer :: i
    integer :: total

    total = 0

    do i = 1, 100

        ! 現在の合計へiを加えます。
        total = total + i

    end do

    print *, "合計 =", total

end program sum_1_to_100

入力した数までの合計を求める

program sum_to_n
    implicit none

    integer :: n
    integer :: i
    integer :: total

    print *, "正の整数を入力してください。"
    read *, n

    total = 0

    do i = 1, n
        total = total + i
    end do

    print *, "1から", n, "までの合計 =", total

end program sum_to_n

九九を表示する

DO文を2重に使う例です。

program multiplication_table
    implicit none

    integer :: i
    integer :: j

    ! iが段を表します。
    do i = 1, 9

        ! jが1~9まで変化します。
        do j = 1, 9

            print *, i, "*", j, "=", i * j

        end do

    end do

end program multiplication_table

階乗を求める

nの階乗は、
1 × 2 × 3 × … × nです。

program factorial
    implicit none

    integer :: n
    integer :: i
    integer :: result

    print *, "0以上の整数を入力してください。"
    read *, n

    ! 0!も1なので初期値を1にします。
    result = 1

    do i = 1, n

        result = result * i

    end do

    print *, n, "の階乗 =", result

end program factorial

integer型には表現できる値の上限があるため、
大きなnではオーバーフローする可能性があります。

素数かどうか判定する

2以上の整数について、
2から平方根付近まで割り切れる数があるか確認します。

program prime_check
    implicit none

    integer :: number
    integer :: i
    logical :: is_prime

    print *, "2以上の整数を入力してください。"
    read *, number

    is_prime = .true.

    if (number < 2) then

        is_prime = .false.

    else

        ! 2からsqrt(number)付近まで確認します。
        do i = 2, int(sqrt(real(number)))

            if (mod(number, i) == 0) then

                ! 割り切れたら素数ではありません。
                is_prime = .false.
                exit

            end if

        end do

    end if

    if (is_prime) then
        print *, "素数です。"
    else
        print *, "素数ではありません。"
    end if

end program prime_check

配列の要素を順番に表示する

program array_loop
    implicit none

    integer :: data(5)
    integer :: i

    data = [10, 20, 30, 40, 50]

    do i = 1, size(data)

        print *, "data(", i, ") =", data(i)

    end do

end program array_loop

配列の値を2倍する

Fortranでは配列全体をまとめて計算できます。

program double_array
    implicit none

    real :: data(5)

    data = [1.0, 2.0, 3.0, 4.0, 5.0]

    ! 配列のすべての要素を2倍します。
    data = data * 2.0

    print *, data

end program double_array

ベクトルの内積を求める

program vector_dot_product
    implicit none

    real :: a(3)
    real :: b(3)
    real :: result

    a = [1.0, 2.0, 3.0]
    b = [4.0, 5.0, 6.0]

    ! dot_productで内積を求めます。
    result = dot_product(a, b)

    print *, "内積 =", result

end program vector_dot_product

自由落下距離を求める

空気抵抗を無視し、
静止状態から落下する物体の距離を計算します。

program free_fall
    implicit none

    real :: time
    real :: distance

    real, parameter :: gravity = 9.80665

    print *, "落下時間[s]を入力してください。"
    read *, time

    ! 距離 = 1/2 × g × t^2
    distance = 0.5 * gravity * time ** 2

    print *, "落下距離[m] =", distance

end program free_fall

速度・時間から距離を求める

program distance_calculation
    implicit none

    real :: speed
    real :: time
    real :: distance

    print *, "速度[m/s]を入力してください。"
    read *, speed

    print *, "時間[s]を入力してください。"
    read *, time

    ! 等速運動では 距離 = 速度 × 時間
    distance = speed * time

    print *, "距離[m] =", distance

end program distance_calculation

密度を求める

質量と体積から密度を計算します。

program density_calculation
    implicit none

    real :: mass
    real :: volume
    real :: density

    print *, "質量を入力してください。"
    read *, mass

    print *, "体積を入力してください。"
    read *, volume

    if (volume /= 0.0) then

        ! 密度 = 質量 / 体積
        density = mass / volume

        print *, "密度 =", density

    else

        print *, "体積は0以外を入力してください。"

    end if

end program density_calculation

モル濃度を求める

物質量molと溶液体積Lからモル濃度mol/Lを求めます。

program molarity
    implicit none

    real :: amount
    real :: volume
    real :: concentration

    print *, "物質量[mol]を入力してください。"
    read *, amount

    print *, "溶液体積[L]を入力してください。"
    read *, volume

    if (volume > 0.0) then

        ! モル濃度 = 物質量 / 溶液体積
        concentration = amount / volume

        print *, "モル濃度[mol/L] =", concentration

    else

        print *, "体積は0より大きい値を入力してください。"

    end if

end program molarity

関数を使って三角形の面積を求める

同じ三角形の面積でも、
計算部分をfunctionへ分けることができます。

program triangle_function
    implicit none

    real :: base
    real :: height
    real :: area

    print *, "底辺を入力してください。"
    read *, base

    print *, "高さを入力してください。"
    read *, height

    ! 関数へ底辺と高さを渡します。
    area = triangle_area(base, height)

    print *, "面積 =", area

contains

    function triangle_area(b, h) result(a)
        implicit none

        real, intent(in) :: b
        real, intent(in) :: h
        real :: a

        a = b * h / 2.0

    end function triangle_area

end program triangle_function

サブルーチンで四則演算をまとめる

program calculator_subroutine
    implicit none

    real :: a
    real :: b
    real :: addition
    real :: subtraction
    real :: multiplication

    a = 10.0
    b = 5.0

    call calculate(a, b, addition, subtraction, multiplication)

    print *, "足し算 =", addition
    print *, "引き算 =", subtraction
    print *, "掛け算 =", multiplication

contains

    subroutine calculate(x, y, add_value, sub_value, mul_value)
        implicit none

        real, intent(in) :: x
        real, intent(in) :: y

        real, intent(out) :: add_value
        real, intent(out) :: sub_value
        real, intent(out) :: mul_value

        add_value = x + y
        sub_value = x - y
        mul_value = x * y

    end subroutine calculate

end program calculator_subroutine

計算結果をファイルへ保存する

1から10までの数と、その2乗を
result.txtへ保存します。

program save_result
    implicit none

    integer :: i
    integer :: unit_number

    ! result.txtを書き込み用で開きます。
    open(newunit=unit_number, file="result.txt", &
         status="replace", action="write")

    ! 見出しを書き込みます。
    write(unit_number, *) "number square"

    do i = 1, 10

        ! 数とその2乗を保存します。
        write(unit_number, *) i, i ** 2

    end do

    close(unit_number)

    print *, "result.txtへ保存しました。"

end program save_result

どのコードから試すとよい?

Fortranを始めたばかりなら、
次の順番で試すと文法を確認しやすくなります。

  1. 三角形の面積
  2. 温度変換
  3. 四則演算
  4. 点数の合否判定
  5. 1から100までの合計
  6. 配列の平均
  7. 二次方程式
  8. 素数判定
  9. 関数を使った計算
  10. ファイルへの保存

最初はコードをそのまま動かし、
次に数値や条件を変更してみると、
各文法がどのように動作しているのか理解しやすくなります。

サンプルコードを改造してみる

サンプルコードを読むだけでなく、
少し変更して動かすこともプログラミング学習では重要です。

例えば、次のような変更ができます。

  • 三角形の面積から台形の面積へ変更する
  • 摂氏・華氏に加えて絶対温度Kを追加する
  • 平均値だけでなく最大値・最小値も表示する
  • 合否判定をA・B・Cなど複数段階にする
  • 九九を1~20までに変更する
  • 自由落下で速度も同時に計算する
  • 計算結果を画面だけでなくファイルにも保存する

まとめ

この記事では、
Fortranの基本文法を使って作れる簡単なサンプルコードを紹介しました。

三角形や円の面積、
温度変換、
二次方程式、
平均値、
最大値・最小値、
偶数・奇数判定、
九九、
階乗、
素数判定などは、
変数、READ、PRINT、IF、DO、配列などの基本を確認する練習に適しています。

さらに、
function、subroutine、ファイル操作を組み合わせることで、
同じ計算でもより整理されたプログラムへ発展させることができます。

コードをそのまま実行するだけでなく、
入力値、計算式、条件、繰り返し回数などを変更しながら試すと、
Fortranの文法をより理解しやすくなります。