- Fortranサンプルコード集|三角形の面積・温度変換・二次方程式など
- サンプルコードの使い方
- 三角形の面積を求める
- 円の面積を求める
- 長方形の面積を求める
- 摂氏から華氏へ温度変換する
- 華氏から摂氏へ温度変換する
- 二次方程式を解く
- BMIを計算する
- 2つの数の四則演算をする
- 3つの数の平均を求める
- 配列の平均を求める
- 最大値と最小値を求める
- 点数から合否を判定する
- 点数から評価A・B・Cを判定する
- 偶数・奇数を判定する
- 1から100までの合計を求める
- 入力した数までの合計を求める
- 九九を表示する
- 階乗を求める
- 素数かどうか判定する
- 配列の要素を順番に表示する
- 配列の値を2倍する
- ベクトルの内積を求める
- 自由落下距離を求める
- 速度・時間から距離を求める
- 密度を求める
- モル濃度を求める
- 関数を使って三角形の面積を求める
- サブルーチンで四則演算をまとめる
- 計算結果をファイルへ保存する
- どのコードから試すとよい?
- サンプルコードを改造してみる
- まとめ
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
配列の平均を求める
複数のデータを扱う場合は、
配列とsum、sizeを使うと便利です。
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から100までの合計
- 配列の平均
- 二次方程式
- 素数判定
- 関数を使った計算
- ファイルへの保存
最初はコードをそのまま動かし、
次に数値や条件を変更してみると、
各文法がどのように動作しているのか理解しやすくなります。
サンプルコードを改造してみる
サンプルコードを読むだけでなく、
少し変更して動かすこともプログラミング学習では重要です。
例えば、次のような変更ができます。
- 三角形の面積から台形の面積へ変更する
- 摂氏・華氏に加えて絶対温度Kを追加する
- 平均値だけでなく最大値・最小値も表示する
- 合否判定をA・B・Cなど複数段階にする
- 九九を1~20までに変更する
- 自由落下で速度も同時に計算する
- 計算結果を画面だけでなくファイルにも保存する
まとめ
この記事では、
Fortranの基本文法を使って作れる簡単なサンプルコードを紹介しました。
三角形や円の面積、
温度変換、
二次方程式、
平均値、
最大値・最小値、
偶数・奇数判定、
九九、
階乗、
素数判定などは、
変数、READ、PRINT、IF、DO、配列などの基本を確認する練習に適しています。
さらに、
function、subroutine、ファイル操作を組み合わせることで、
同じ計算でもより整理されたプログラムへ発展させることができます。
コードをそのまま実行するだけでなく、
入力値、計算式、条件、繰り返し回数などを変更しながら試すと、
Fortranの文法をより理解しやすくなります。
