Alur kontrol

Blok if, perulangan do dengan cycle dan exit, serta pemilihan cabang dengan select case.

Daftar isi

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.

fortran
! tidak-dijalankan
if (suhu > 30.0) then
  print *, "panas"
else if (suhu > 20.0) then
  print *, "hangat"
else
  print *, "sejuk"
end if

Pada 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.

fortran rekap_nilai.f90
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
bash
# kompilasi program rekap_nilai menjadi berkas executable bernama rekap_nilai
gfortran rekap_nilai.f90 -o rekap_nilai
# jalankan program hasil kompilasi
./rekap_nilai
text Keluaran
 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     :           2

Program 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.

fortran predikat.f90
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
bash
# kompilasi program predikat menjadi berkas executable bernama predikat
gfortran predikat.f90 -o predikat
# jalankan program hasil kompilasi
./predikat
text Keluaran
          52 predikat D
          64 predikat C
          76 predikat B
          88 predikat A
         100 predikat A
          10          20          30          40          50

Perulangan 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 if mengeksekusi cabang pertama yang syaratnya true, dengan else if untuk syarat lanjutan dan else untuk kasus sisanya.
  • do i = awal, akhir, langkah mengulang badan perulangan, cycle melompat ke iterasi berikutnya, dan exit mengakhiri perulangan.
  • select case mencocokkan selector bertipe integer, character, atau logical dengan konstanta, daftar, atau rentang, dan case default menampung sisanya.
  • Implied do seperti (i * 10, i = 1, 5) menuliskan daftar nilai tanpa badan perulangan eksplisit.

Referensi#