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.
nilai = 78
if nilai >= 85
println("predikat A")
elseif nilai >= 70
println("predikat B")
elseif nilai >= 60
println("predikat C")
else
println("predikat D")
endpredikat BUrutan 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.
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–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 >= 85 → <b>benar</b>');
hasil.innerHTML = 'Predikat <span class="predikat-a">A</span> — cabang pertama terpenuhi.';
hasil.className = 'predikat-a';
} else {
langkah.push('nilai >= 85 → salah');
if (nilai >= 70) {
langkah.push('nilai >= 70 → <b>benar</b>');
hasil.innerHTML = 'Predikat <span class="predikat-b">B</span> — cabang kedua terpenuhi.';
hasil.className = 'predikat-b';
} else {
langkah.push('nilai >= 70 → salah');
if (nilai >= 60) {
langkah.push('nilai >= 60 → <b>benar</b>');
hasil.innerHTML = 'Predikat <span class="predikat-c">C</span> — cabang ketiga terpenuhi.';
hasil.className = 'predikat-c';
} else {
langkah.push('nilai >= 60 → salah');
langkah.push('selain itu → <b>cabang else</b>');
hasil.innerHTML = 'Predikat <span class="predikat-d">D</span> — 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.
try
if 1
println("terpenuhi")
end
catch e
println(typeof(e))
println(sprint(showerror, e))
endTypeError
TypeError: non-boolean (Int64) used in boolean contextPerbandingan 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.
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")panas
variabel x bernilai nol
variabel x bernilai 10 atau kurangTernary 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.
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")barisan 97 berhenti setelah 118 langkahPerulangan 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.
for i in 1:5
println(i)
end
for suhu in 0:2:10
println(suhu)
end1
2
3
4
5
0
2
4
6
8
10Array dan tuple juga dapat diiterasi tanpa pengindeksan sama sekali. Variabel perulangan mengambil nilai setiap elemen, sehingga kode tidak perlu menghitung panjang koleksinya secara manual.
for kota in ["Bandung", "Semarang", "Medan"]
println(length(kota), " huruf: ", kota)
end
for angka in (3, 7, 11)
println(angka)
end7 huruf: Bandung
8 huruf: Semarang
5 huruf: Medan
3
7
11Kata 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.
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)123 dan 123break, 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.
# 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
endnilai 92: predikat A
nilai 78: predikat B
nilai 65: predikat C
nilai 58: predikat D
nilai 81: predikat B
nilai kosong, perulangan dihentikanPerulangan 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.
for baris in 1:2
for kolom in 1:2
println("elemen (", baris, ", ", kolom, ") = ", baris * kolom)
end
endelemen (1, 1) = 1
elemen (1, 2) = 2
elemen (2, 1) = 2
elemen (2, 2) = 4Kesalahan umum#
Tiga kesalahan berikut paling sering muncul saat topik ini dipraktikkan.
- Menggunakan angka sebagai syarat. Julia menolak
if 1dengan errorTypeError: non-boolean (Int64) used in boolean context. Perbaikannya dengan menuliskan perbandingan secara eksplisit, misalnyaif x != 0. - Memperbarui variabel luar tanpa
global. Pada tingkat teratas skrip, pernyataantotal += idi dalam perulangan membuat variabel lokal baru sehingga program berhenti denganUndefVarError. Tambahkan kata kunciglobal, atau pindahkan perhitungan ke dalam fungsi karena variabel lokal fungsi dapat diperbarui tanpa kata kunci tambahan. - Menulis
whileyang syaratnya tidak pernah bernilaifalse. 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, danelsememeriksa syarat dari atas ke bawah lalu menjalankan blok milik syarat pertama yang bernilaitrue, dan setiap syarat wajib bertipeBool. - Operator ternary
? :memilih satu dari dua nilai, sedangkan&&dan||mengevaluasi operan kanannya hanya apabila diperlukan. - Perulangan
whileberjalan selama syaratnya bernilaitrue, sedangkanformengiterasi range maupun koleksi denganbreakmenghentikan perulangan dancontinuemelompat ke putaran berikutnya. - Pembaruan variabel luar di dalam perulangan pada tingkat teratas skrip memerlukan kata kunci
global.
Referensi#
- Control Flow — The Julia Language — Menetapkan perilaku if, while, for, break, continue, operator ternary, dan short-circuit.
- Scope of Variables — The Julia Language — Menjelaskan cakupan lokal perulangan serta kebutuhan kata kunci global pada skrip.