Topik ini membahas tiga kelompok konstruksi alur kontrol pada Fortran, yaitu blok if untuk percabangan, perulangan do dengan pernyataan cycle dan exit, serta select case untuk pemilihan cabang berganda. Dua program contoh yang dapat dijalankan menggabungkan konstruksi tersebut pada kasus rekap nilai ujian. Kedua program dibangun dari data yang dihitung di dalam program, sehingga tidak memerlukan masukan dari pengguna. Setelah topik ini diselesaikan, urutan eksekusi sebuah program dapat diarahkan mengikuti syarat yang berlaku.
Blok if, else if, dan else#
Blok if mengeksekusi serangkaian pernyataan apabila sebuah syarat bertipe logical bernilai true. Bentuk lengkapnya memuat else if untuk syarat lanjutan dan else untuk semua kasus sisanya, lalu ditutup dengan end if. Syarat dievaluasi dari atas ke bawah, dan hanya cabang pertama yang memenuhi syarat yang dieksekusi.
! tidak-dijalankan
if (suhu > 30.0) then
print *, "panas"
else if (suhu > 20.0) then
print *, "hangat"
else
print *, "sejuk"
end ifPada contoh di atas, suhu 35.0 hanya menghasilkan keluaran panas, karena cabang else if tidak lagi diperiksa setelah cabang pertama memenuhi. Cabang disusun dari rentang yang paling khusus menuju yang paling umum agar logika setiap cabang mudah diperiksa. Kata then wajib ditulis di akhir baris if dan else if, sedangkan else berdiri sendiri tanpa syarat. Fortran juga menyediakan bentuk satu baris if (syarat) pernyataan untuk kasus yang berisi satu pernyataan saja, tetapi bentuk blok lebih disukai karena pernyataan tambahan masih dapat ditambahkan tanpa mengubah bentuknya. Blok if selalu diakhiri end if, dan indentasi satu tingkat per blok digunakan agar pasangan if dan end if mudah ditemukan.
Perulangan do dengan cycle dan exit#
Perulangan do mengulang badannya untuk setiap nilai variabel kendali dari batas awal sampai batas akhir, misalnya do i = 1, 12. Langkah selain satu ditulis sebagai batas ketiga, misalnya do i = 1, 9, 2 untuk nilai ganjil. Langkah negatif juga diperbolehkan, misalnya do i = 10, 1, -1 menghitung mundur. Badan perulangan tidak dieksekusi sama sekali apabila batas awal sudah melewati batas akhir searah langkahnya.
Dua pernyataan mengubah jalannya perulangan. Pernyataan cycle melompat ke iterasi berikutnya, sedangkan exit mengakhiri perulangan sepenuhnya. Badan perulangan boleh memuat perulangan lain, dan apabila exit harus keluar dari perulangan luar, konstruksi boleh diberi nama seperti luar: do yang ditutup dengan end do luar, sehingga exit luar menunjuk perulangan yang tepat. Standar melarang mengubah nilai variabel kendali di dalam badan, karena urutan iterasi ditentukan compiler dari batas dan langkah awal.
program rekap_nilai
implicit none
integer :: i, nilai
integer :: jumlah_a, jumlah_b, jumlah_c, jumlah_remidi
jumlah_a = 0
jumlah_b = 0
jumlah_c = 0
jumlah_remidi = 0
do i = 1, 12
nilai = 40 + 6 * i
if (nilai > 100) then
exit
end if
if (nilai < 56) then
jumlah_remidi = jumlah_remidi + 1
cycle
else if (nilai < 70) then
jumlah_c = jumlah_c + 1
print *, "Nilai", nilai, "predikat C"
else if (nilai < 90) then
jumlah_b = jumlah_b + 1
print *, "Nilai", nilai, "predikat B"
else
jumlah_a = jumlah_a + 1
print *, "Nilai", nilai, "predikat A"
end if
end do
print *, "Remidi:", jumlah_remidi
print *, "C :", jumlah_c
print *, "B :", jumlah_b
print *, "A :", jumlah_a
end program rekap_nilai# kompilasi program rekap_nilai menjadi berkas executable bernama rekap_nilai
gfortran rekap_nilai.f90 -o rekap_nilai
# jalankan program hasil kompilasi
./rekap_nilai Nilai 58 predikat C
Nilai 64 predikat C
Nilai 70 predikat B
Nilai 76 predikat B
Nilai 82 predikat B
Nilai 88 predikat B
Nilai 94 predikat A
Nilai 100 predikat A
Remidi: 2
C : 2
B : 4
A : 2Program di atas merekap dua belas nilai ujian yang dihitung dari rumus 40 + 6 * i. Syarat nilai > 100 berada di awal badan, sehingga perulangan berhenti melalui exit sebelum nilai tak sah ikut diproses. Nilai di bawah 56 hanya menambah penghitung remidi, lalu pernyataan cycle melompat ke iterasi berikutnya tanpa mencetak predikat. Rantai else if mengklasifikasikan sisanya, dan empat penghitung dicetak sebagai rekap di akhir program. Keempat penghitung diberi nilai awal nol di bagian deklarasi, karena membaca variabel yang belum pernah diberi nilai menghasilkan nilai tak terdefinisi.
Pemilihan cabang dengan select case#
Konstruksi select case memilih satu cabang berdasarkan nilai sebuah ekspresi, sehingga lebih ringkas daripada rantai else if yang panjang. Setiap case menyebut nilai yang dicocokkan, baik satu nilai, daftar nilai, maupun rentang bawah : atas. Rentang terbuka ditulis tanpa salah satu batasnya, misalnya (:59) untuk semua nilai sampai 59, sedangkan case default menampung nilai yang tidak cocok dengan cabang mana pun. Dalam satu baris case, beberapa nilai atau rentang boleh digabung dengan dipisahkan koma, sehingga case (60, 70, 80) mencocokkan tiga nilai sekaligus.
program predikat
implicit none
integer :: i, nilai
do i = 1, 9, 2
nilai = 46 + 6 * i
select case (nilai)
case (:59)
print *, nilai, "predikat D"
case (60:69)
print *, nilai, "predikat C"
case (70:84)
print *, nilai, "predikat B"
case default
print *, nilai, "predikat A"
end select
end do
print *, (i * 10, i = 1, 5)
end program predikat# kompilasi program predikat menjadi berkas executable bernama predikat
gfortran predikat.f90 -o predikat
# jalankan program hasil kompilasi
./predikat 52 predikat D
64 predikat C
76 predikat B
88 predikat A
100 predikat A
10 20 30 40 50Perulangan pada program di atas berlangkah dua, sehingga i bernilai 1, 3, 5, 7, dan 9. Nilai ujian dihitung ulang pada setiap iterasi, lalu dicocokkan dengan rentang yang tersedia, dan case default menangkap nilai 88 serta 100 yang melewati rentang B. Baris terakhir program memperkenalkan implied do, yaitu perulangan tersirat yang ditulis di dalam daftar keluaran, sehingga print menulis lima hasil lipatan tanpa badan perulangan.
Ekspresi yang dicocokkan oleh select case disebut selector, dan tipenya harus integer, character, atau logical, sehingga pemilihan berdasarkan nilai real tetap ditulis dengan blok if. Ekspresi selector dievaluasi paling banyak satu kali, dan nilai pada antarcabang tidak boleh sama, sehingga urutan penulisan cabang tidak mengubah hasil. Dua aturan tersebut membuat hasil select case mudah diprediksi tanpa perlu memeriksa urutan cabangnya.
Ringkasan#
- Blok
ifmengeksekusi cabang pertama yang syaratnya true, denganelse ifuntuk syarat lanjutan danelseuntuk kasus sisanya. do i = awal, akhir, langkahmengulang badan perulangan,cyclemelompat ke iterasi berikutnya, danexitmengakhiri perulangan.select casemencocokkan selector bertipeinteger,character, ataulogicaldengan konstanta, daftar, atau rentang, dancase defaultmenampung sisanya.- Implied do seperti
(i * 10, i = 1, 5)menuliskan daftar nilai tanpa badan perulangan eksplisit.
Referensi#
- Learn Fortran — fortran-lang.org — Tutorial komunitas resmi yang mencakup kontrol alur pada Fortran modern.
- GNU Fortran manual — GNU Project
— Dokumentasi gfortran sebagai rujukan perilaku konstruksi
dodanselect case.