Alur kendali menentukan pernyataan mana yang dijalankan dan berapa kali pernyataan itu diulang. Nim menyediakan percabangan if dan case, perulangan while, serta perulangan for yang mengambil nilai dari iterator. Topik ini membahas keempat bentuk tersebut beserta kata kunci break dan continue, dengan contoh tabel konversi suhu, penentu nama hari, dan pemecahan nilai melalui pembagian berulang.
Percabangan if, elif, dan else#
Pernyataan if mengeksekusi bloknya apabila kondisi bertipe boolean bernilai true. Cabang elif, singkatan dari else if, memeriksa kondisi berikutnya apabila kondisi sebelumnya tidak terpenuhi, sedangkan else menampung semua sisanya tanpa membawa kondisi. Rantai cabang diperiksa dari atas ke bawah, dan hanya blok pada kondisi pertama yang terpenuhi yang dijalankan. Cabang else tidak wajib, tetapi bermanfaat untuk menampung keadaan yang tidak terduga.
if juga dapat dipakai sebagai ekspresi yang menghasilkan nilai. Seluruh cabangnya wajib menghasilkan tipe yang sama, dan nilai cabang yang terpilih menjadi nilai ekspresi tersebut. Bentuk ini lazim dipakai untuk keputusan kecil yang langsung ditugaskan ke sebuah variabel.
let nilai = 78
let predikat = if nilai >= 80: "A" elif nilai >= 70: "B" else: "C"
echo predikat
let ganjil = if 7 mod 2 == 1: true else: false
echo ganjilB
truePotongan ini menetapkan predikat B karena 78 berada pada rentang 70 ke atas dan di bawah 80. Ekspresi kedua menghitung kelipatan melalui operator mod dan menghasilkan true. Tanpa bentuk ekspresi, keputusan yang sama membutuhkan penugasan di setiap cabang sehingga kodenya lebih panjang.
Urutan cabang menentukan hasil. Apabila kondisi 70 ke atas ditempatkan sebelum kondisi 80 ke atas, nilai 86 akan tergolong B karena cabang pertama yang cocok dipilih lebih dahulu. Kondisi yang paling ketat karenanya ditulis paling awal, dan kondisi berikutnya menyusul dengan ambang yang menurun.
Percabangan case#
Pernyataan case membandingkan satu nilai terhadap beberapa kemungkinan melalui kata kunci of. Setiap of dapat memuat beberapa nilai yang dipisah koma maupun rentang seperti 1 .. 5. Case dapat diterapkan pada nilai ordinal seperti angka maupun pada string, dan cabangnya diperiksa sampai satu cocok ditemukan.
Program berikut menerjemahkan nomor hari menjadi namanya. Cabang of 6, 7 menampung dua nilai sekaligus, sedangkan else menampung nomor di luar 1 sampai 7.
let hariKe = 3
case hariKe
of 1: echo "Senin"
of 2: echo "Selasa"
of 3: echo "Rabu"
of 4: echo "Kamis"
of 5: echo "Jumat"
of 6, 7: echo "Akhir pekan"
else: echo "hari tidak valid"RabuCase pada Nim wajib mencakup semua kemungkinan nilai. Apabila else tidak ada dan cabang yang tersedia tidak melengkapi seluruh kemungkinan, compiler menghentikan kompilasi dengan pesan Error: not all cases are covered. Case pada string selalu membutuhkan else karena kemungkinan nilai string tidak terbatas.
let perintah = "mulai"
case perintah
of "mulai": echo "program dimulai"
of "berhenti": echo "program berhenti"
else: echo "perintah tidak dikenal"program dimulaiNilai pada of berupa string, dan else menampung semua string lain. Bentuk seperti ini lazim dipakai untuk membaca perintah pendek dari masukan pengguna sebelum perintah itu diproses lebih lanjut.
Bentuk satu baris seperti of 1: echo "Senin" memuat blok satu pernyataan, sedangkan cabang dengan beberapa pernyataan ditulis menjorok pada baris berikutnya. Rentang of 1 .. 5 meringkas lima cabang menjadi satu, dan beberapa nilai yang dipisah koma seperti of 6, 7 menampung kemungkinan yang tidak berurutan. Kedua bentuk boleh dicampur dalam satu case, sebagaimana rentang dan pasangan 6, 7 pada program nama hari.
Perulangan while#
Pernyataan while mengulang bloknya selama kondisinya bernilai true. Kondisi diperiksa sebelum setiap iterasi, sehingga blok tidak dijalankan sama sekali apabila kondisi sudah false di awal. Variabel yang menjadi bagian kondisi harus berubah di dalam blok, karena perulangan tanpa perubahan tidak akan pernah berhenti. Bentuk perulangan ini paling cocok untuk kasus yang jumlah pengulangannya tidak diketahui sebelumnya, seperti memecah nilai sampai mencapai batas tertentu.
Program berikut memecah 1000 melalui pembagian bulat dua berulang sampai sisa mencapai 1. Penghitung langkah ikut bertambah pada setiap iterasi sehingga jumlahnya dapat dilaporkan.
# Memecah nilai 1000 melalui pembagian bulat dua berulang
var sisa = 1000
var langkah = 0
while sisa > 1:
sisa = sisa div 2
langkah = langkah + 1
echo "langkah: ", langkah
echo "sisa akhir: ", sisa# kompilasi dan jalankan program, hint kompilasi disembunyikan
nim c --hints:off -r pembagian_bertahap.nimlangkah: 9
sisa akhir: 1Nilai 1000 berkurang melalui sembilan kali pembagian bulat, yaitu 500, 250, 125, 62, 31, 15, 7, 3, dan akhirnya 1. Kondisi sisa > 1 berhenti tepat setelah sisa mencapai 1, sehingga pembagian tambahan tidak terjadi. Kata kunci break mampu menghentikan perulangan seperti ini lebih awal, sedangkan continue melompati sisa blok menuju iterasi berikutnya, dan keduanya juga berlaku pada perulangan for.
Perulangan for dan iterator#
Pernyataan for mengulang blok untuk setiap nilai yang dihasilkan sebuah iterator. Iterator (iterator) adalah proc khusus yang menghasilkan rangkaian nilai satu per satu selama perulangan berlangsung. Iterator countup menghasilkan angka naik dari batas pertama sampai batas kedua, dan batas kedua itu termasuk dalam rentangnya. Parameter ketiga yang opsional menetapkan besarnya langkah.
Program berikut mencetak tabel konversi suhu setiap 20 derajat Celsius. Rentangnya adalah 0 sampai 100 dengan langkah 20, sehingga perulangan berjalan enam kali.
# Tabel konversi suhu dari Celsius ke Fahrenheit
for c in countup(0, 100, 20):
let f = c.toFloat * 9.0 / 5.0 + 32.0
echo c, " C = ", f, " F"# kompilasi dan jalankan program, hint kompilasi disembunyikan
nim c --hints:off -r tabel_suhu.nim0 C = 32.0 F
20 C = 68.0 F
40 C = 104.0 F
60 C = 140.0 F
80 C = 176.0 F
100 C = 212.0 FRentang 0 .. 100 merupakan singkatan dari countup(0, 100), sedangkan 0 ..< 4 memakai template ..< yang batas atasnya tidak termasuk, sehingga menghasilkan 0 sampai 3. Iterator countdown menghasilkan angka turun, dan for juga dapat berjalan di atas string, array, dan seq.
for i in countdown(3, 1):
echo i
for i in 0 ..< 4:
echo i3
0
1
2
3Iterator countdown(3, 1) menghasilkan 3, 2, lalu 1, sehingga urutannya turun dan kedua batasnya termasuk. Rentang 0 ..< 4 menghasilkan 0 sampai 3 karena batas atasnya terbuka. Kedua perulangan pada potongan menghasilkan tujuh baris keluaran secara berurutan.
Kata kunci continue melompati sisa blok pada iterasi yang sedang berjalan. Potongan berikut hanya menampilkan bilangan ganjil dari 1 sampai 10, karena echo dilewati untuk setiap bilangan yang habis dibagi dua. Kata kunci break bekerja lebih tegas, yaitu menghentikan seluruh perulangan, bukan satu iterasinya.
for i in 1 .. 10:
if i mod 2 == 0:
continue
echo i, " ganjil"1 ganjil
3 ganjil
5 ganjil
7 ganjil
9 ganjilRingkasan#
ifmengeksekusi blok berdasarkan kondisi boolean, dan dapat dipakai sebagai ekspresi yang menghasilkan nilai.casemembandingkan nilai terhadap beberapa kemungkinan, wajib mencakup semua kemungkinan, dan selalu memerlukanelseuntuk string.whilemengulang blok selama kondisinya true, dan jumlah pengulangannya tidak perlu diketahui sebelumnya.formengambil nilai dari iterator, dengancountupyang batas atasnya termasuk,countdownuntuk hitung turun, serta..<yang batas atasnya terbuka.
Referensi#
- Nim Tutorial (Part I) — Nim Project
— Membahas if, case, while, for, rentang
..dan..<, serta iterator countup dan countdown. - Modul system — Nim Project
— Menetapkan tanda tangan iterator countup dan countdown beserta template
..<untuk rentang dengan batas atas terbuka.