Percabangan dan Perulangan

Pernyataan if untuk percabangan, serta while dan for pada range dan objek yang dapat diiterasi.

Daftar isi

Percabangan memilih blok pernyataan mana yang dijalankan berdasarkan syarat, sedangkan perulangan menjalankan blok yang sama secara berulang. Topik ini membahas pernyataan if beserta variannya, operator ternary, operator short-circuit, perulangan while dan for pada range maupun koleksi, serta kendali break dan continue. Setelah topik ini dipraktikkan, alur kendali sebuah program Julia dapat disusun dengan pola-pola baku tersebut.

Percabangan dengan if, elseif, dan else#

Pernyataan if mengeksekusi sebuah blok hanya apabila syaratnya bernilai true. Bentuk lengkapnya terdiri atas satu cabang if, nol atau lebih cabang elseif, satu cabang else yang bersifat opsional, dan diakhiri kata kunci end. Syarat diperiksa dari atas ke bawah, dan hanya blok milik syarat pertama yang bernilai true yang dijalankan, sedangkan seluruh cabang setelahnya dilewati. Tanda kurung pada syarat tidak diperlukan, tetapi end wajib ada dan menutup keseluruhan pernyataan.

Contoh berikut mengklasifikasikan satu nilai ujian ke dalam predikat huruf.

julia Contoh: klasifikasi satu nilai ujian
nilai = 78

if nilai >= 85
    println("predikat A")
elseif nilai >= 70
    println("predikat B")
elseif nilai >= 60
    println("predikat C")
else
    println("predikat D")
end
text Keluaran
predikat B

Urutan penulisan syarat menentukan hasil. Apabila urutan pada contoh dibalik, syarat nilai >= 70 akan menangkap nilai 90 lebih dahulu sehingga predikatnya keliru. Diagram berikut merangkum alur pemeriksaan dari atas ke bawah tersebut.

nilainilai ≥ 85Ayanilai ≥ 70tidakByanilai ≥ 60tidakCyaDtidak
Alur pemeriksaan syarat pada if, elseif, dan else

Untuk mengamati cabang yang dieksekusi secara langsung, jalankan demo berikut, ubah nilai ujiannya, kemudian perhatikan urutan pemeriksaan syarat yang tampil pada catatan log.

Kode sumber demo
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Klasifikasi predikat nilai</title>
<style>
  body { font-family: system-ui, sans-serif; margin: 0; padding: 14px; color: #1a1a1a; background: #ffffff; }
  .baris { display: flex; gap: 8px; align-items: center; margin-bottom: 10px; flex-wrap: wrap; }
  input[type="number"] { width: 90px; padding: 6px 8px; border: 1px solid #9aa7b8; border-radius: 6px; font-size: 14px; }
  button { padding: 7px 14px; border: 0; border-radius: 6px; background: #35567e; color: #ffffff; font-size: 14px; cursor: pointer; }
  button:hover { background: #284463; }
  #hasil { font-size: 15px; margin: 6px 0 10px; min-height: 22px; }
  #log { background: #f4f6f9; border: 1px solid #d6dde7; border-radius: 6px; padding: 8px 10px; font-family: ui-monospace, monospace; font-size: 12.5px; line-height: 1.6; min-height: 96px; }
  #log b { color: #2c5f2d; }
  .predikat-a { color: #2c5f2d; font-weight: 600; }
  .predikat-b { color: #35567e; font-weight: 600; }
  .predikat-c { color: #8a6d1f; font-weight: 600; }
  .predikat-d { color: #a03d3d; font-weight: 600; }
</style>
</head>
<body>
  <div class="baris">
    <label for="nilai">Nilai ujian (0&ndash;100):</label>
    <input id="nilai" type="number" min="0" max="100" value="78">
    <button id="proses" type="button">Tentukan predikat</button>
  </div>
  <div id="hasil"></div>
  <div id="log"></div>
  <script>
    document.getElementById('proses').addEventListener('click', function () {
      var nilai = Number(document.getElementById('nilai').value);
      var hasil = document.getElementById('hasil');
      var log = document.getElementById('log');
      log.innerHTML = '';
      if (document.getElementById('nilai').value === '' || nilai < 0 || nilai > 100) {
        hasil.textContent = 'Nilai harus berada pada rentang 0 sampai 100.';
        hasil.className = 'predikat-d';
        return;
      }
      var langkah = [];
      if (nilai >= 85) {
        langkah.push('nilai &gt;= 85 &rarr; <b>benar</b>');
        hasil.innerHTML = 'Predikat <span class="predikat-a">A</span> &mdash; cabang pertama terpenuhi.';
        hasil.className = 'predikat-a';
      } else {
        langkah.push('nilai &gt;= 85 &rarr; salah');
        if (nilai >= 70) {
          langkah.push('nilai &gt;= 70 &rarr; <b>benar</b>');
          hasil.innerHTML = 'Predikat <span class="predikat-b">B</span> &mdash; cabang kedua terpenuhi.';
          hasil.className = 'predikat-b';
        } else {
          langkah.push('nilai &gt;= 70 &rarr; salah');
          if (nilai >= 60) {
            langkah.push('nilai &gt;= 60 &rarr; <b>benar</b>');
            hasil.innerHTML = 'Predikat <span class="predikat-c">C</span> &mdash; cabang ketiga terpenuhi.';
            hasil.className = 'predikat-c';
          } else {
            langkah.push('nilai &gt;= 60 &rarr; salah');
            langkah.push('selain itu &rarr; <b>cabang else</b>');
            hasil.innerHTML = 'Predikat <span class="predikat-d">D</span> &mdash; tidak ada syarat yang terpenuhi.';
            hasil.className = 'predikat-d';
          }
        }
      }
      log.innerHTML = langkah.join('<br>');
    });
  </script>
</body>
</html>

Syarat wajib bertipe Bool#

Julia tidak mengonversi angka menjadi nilai kebenaran secara implisit. Syarat pada if, while, maupun operator logika wajib bertipe Bool, yaitu true atau false. Aturan ini berbeda dari sejumlah bahasa lain yang memperlakukan bilangan nol sebagai false. Apabila sebuah angka dipakai sebagai syarat, program berhenti dengan error TypeError.

julia Contoh: angka tidak dapat menjadi syarat
try
    if 1
        println("terpenuhi")
    end
catch e
    println(typeof(e))
    println(sprint(showerror, e))
end
text Keluaran
TypeError
TypeError: non-boolean (Int64) used in boolean context

Perbandingan seperti nilai >= 85 menghasilkan Bool, sehingga aman dipakai sebagai syarat. Apabila sebuah bilangan perlu diuji, tuliskan perbandingannya secara eksplisit, misalnya x != 0 untuk menguji bahwa x bukan nol. Julia juga menyediakan perbandingan berantai seperti 0 <= nilai <= 100 yang menghasilkan Bool dan lazim dipakai sebagai syarat rentang.

Operator ternary dan short-circuit#

Operator ternary ? : merupakan bentuk ringkas percabangan dua cabang. Penulisan syarat ? nilai_a : nilai_b menghasilkan nilai_a apabila syarat bernilai true dan nilai_b apabila sebaliknya. Namanya merujuk pada tiga operannya, yaitu syarat beserta dua pilihan nilai. Operator ini tepat untuk memilih nilai, sedangkan if yang lengkap lebih tepat untuk memilih blok pernyataan.

Operator && dan || mengevaluasi operan kanannya secara selektif, perilaku yang disebut short-circuit. Operan kanan && hanya dievaluasi apabila operan kiri bernilai true, sedangkan operan kanan || hanya dievaluasi apabila operan kiri bernilai false. Pola ini lazim dipakai sebagai penjaga (guard), yaitu tindakan yang hanya dijalankan apabila syaratnya terpenuhi.

julia Contoh: operator ternary dan short-circuit
suhu = 31
status = suhu > 30 ? "panas" : "normal"
println(status)

x = 0
x == 0 && println("variabel x bernilai nol")
x > 10 || println("variabel x bernilai 10 atau kurang")
text Keluaran
panas
variabel x bernilai nol
variabel x bernilai 10 atau kurang

Ternary yang bersarang sah secara sintaks tetapi sulit dibaca. Apabila pilihannya lebih dari dua, gunakan if yang lengkap agar urutan pemeriksaannya tetap jelas.

Perulangan while#

Perulangan while menjalankan badannya selama syarat bernilai true. Syarat diperiksa ulang pada setiap putaran, sehingga ada pernyataan di dalam badan yang harus mengubah keadaan agar syarat berhenti tercapai. Contoh klasiknya adalah barisan Collatz, yaitu barisan yang suku berikutnya berupa setengah dari suku saat ini apabila genap, atau tiga kali suku saat ini ditambah satu apabila ganjil.

julia Contoh: perulangan while pada barisan Collatz
sisa = 97
langkah = 0
while sisa > 1
    global sisa = sisa % 2 == 0 ? sisa ÷ 2 : 3 * sisa + 1
    global langkah += 1
end
println("barisan 97 berhenti setelah ", langkah, " langkah")
text Keluaran
barisan 97 berhenti setelah 118 langkah

Perulangan for pada range dan koleksi#

Perulangan for mengiterasi setiap elemen dari objek yang dapat diiterasi. Objek yang paling sering dipakai adalah range, misalnya 1:5 untuk bilangan 1 sampai 5 dan 0:2:10 untuk bilangan 0 sampai 10 dengan langkah 2. Range tidak menyimpan seluruh elemennya di memori, sehingga iterasi atas range yang panjang tetap hemat memori.

julia Contoh: for pada range
for i in 1:5
    println(i)
end

for suhu in 0:2:10
    println(suhu)
end
text Keluaran
1
2
3
4
5
0
2
4
6
8
10

Array dan tuple juga dapat diiterasi tanpa pengindeksan sama sekali. Variabel perulangan mengambil nilai setiap elemen, sehingga kode tidak perlu menghitung panjang koleksinya secara manual.

julia Contoh: for pada array dan tuple
for kota in ["Bandung", "Semarang", "Medan"]
    println(length(kota), " huruf: ", kota)
end

for angka in (3, 7, 11)
    println(angka)
end
text Keluaran
7 huruf: Bandung
8 huruf: Semarang
5 huruf: Medan
3
7
11

Kata kunci in dan operator = sama-sama sah pada penulisan perulangan. Bentuk for i in 1:3 dan for i = 1:3 menghasilkan perulangan yang persis sama. Konvensi yang dipakai hampir seluruh kode Julia adalah in karena maknanya lebih jelas, yaitu variabel perulangan mengambil setiap nilai dari rentang tersebut.

julia Contoh: in dan = menghasilkan perulangan yang sama
hasil_in = ""
for i in 1:3
    global hasil_in = hasil_in * string(i)
end

hasil_eq = ""
for j = 1:3
    global hasil_eq = hasil_eq * string(j)
end

println(hasil_in, " dan ", hasil_eq)
text Keluaran
123 dan 123

break, continue, dan perulangan bersarang#

Pernyataan break menghentikan perulangan paling dalam yang melingkupinya, sedangkan continue melewati sisa badan perulangan pada putaran tersebut dan langsung melanjutkan ke putaran berikutnya. Keduanya lazim ditempatkan di dalam percabangan yang menguji kondisi khusus. Berkas berikut menggabungkan perulangan, break, continue, dan percabangan menjadi satu program klasifikasi yang utuh.

julia klasifikasi.jl
# klasifikasi.jl
# Mengklasifikasikan daftar nilai ujian ke dalam predikat huruf.
# Nilai 0 berperan sebagai penanda agar perulangan berhenti.

nilai_ujian = [92, 78, 65, 58, 81, 0]

for nilai in nilai_ujian
    if nilai == 0
        println("nilai kosong, perulangan dihentikan")
        break
    end
    if nilai < 60
        println("nilai ", nilai, ": predikat D")
        continue
    end
    if nilai >= 85
        println("nilai ", nilai, ": predikat A")
    elseif nilai >= 70
        println("nilai ", nilai, ": predikat B")
    else
        println("nilai ", nilai, ": predikat C")
    end
end
text Keluaran
nilai 92: predikat A
nilai 78: predikat B
nilai 65: predikat C
nilai 58: predikat D
nilai 81: predikat B
nilai kosong, perulangan dihentikan

Perulangan bersarang adalah perulangan yang berada di dalam badan perulangan lain. Putaran dalam menyelesaikan seluruh iterasinya untuk setiap satu putaran luar, sehingga jumlah total iterasinya adalah hasil kali banyaknya putaran keduanya.

julia Contoh: perulangan bersarang
for baris in 1:2
    for kolom in 1:2
        println("elemen (", baris, ", ", kolom, ") = ", baris * kolom)
    end
end
text Keluaran
elemen (1, 1) = 1
elemen (1, 2) = 2
elemen (2, 1) = 2
elemen (2, 2) = 4

Kesalahan umum#

Tiga kesalahan berikut paling sering muncul saat topik ini dipraktikkan.

  • Menggunakan angka sebagai syarat. Julia menolak if 1 dengan error TypeError: non-boolean (Int64) used in boolean context. Perbaikannya dengan menuliskan perbandingan secara eksplisit, misalnya if x != 0.
  • Memperbarui variabel luar tanpa global. Pada tingkat teratas skrip, pernyataan total += i di dalam perulangan membuat variabel lokal baru sehingga program berhenti dengan UndefVarError. Tambahkan kata kunci global, atau pindahkan perhitungan ke dalam fungsi karena variabel lokal fungsi dapat diperbarui tanpa kata kunci tambahan.
  • Menulis while yang syaratnya tidak pernah bernilai false. Perulangan semacam itu berjalan tanpa henti. Pastikan ada pernyataan di dalam badan yang mengubah keadaan agar syarat berhenti tercapai, misalnya memperbarui pencacahnya.

Ringkasan#

  • Pernyataan if, elseif, dan else memeriksa syarat dari atas ke bawah lalu menjalankan blok milik syarat pertama yang bernilai true, dan setiap syarat wajib bertipe Bool.
  • Operator ternary ? : memilih satu dari dua nilai, sedangkan && dan || mengevaluasi operan kanannya hanya apabila diperlukan.
  • Perulangan while berjalan selama syaratnya bernilai true, sedangkan for mengiterasi range maupun koleksi dengan break menghentikan perulangan dan continue melompat ke putaran berikutnya.
  • Pembaruan variabel luar di dalam perulangan pada tingkat teratas skrip memerlukan kata kunci global.

Referensi#