Alur Kendali

Pernyataan if, while, repeat, for numerik, dan for generik dalam Lua.

Daftar isi

Topik ini membahas pernyataan kendali Lua, yaitu percabangan dengan if, perulangan while dan repeat, perulangan for numerik maupun generik, serta keluar dini dengan break. Setelah menyelesaikannya, struktur kendali dapat dipilih sesuai bentuk masalahnya dan aturan pengujian kondisi pada setiap struktur dapat dijelaskan.

Percabangan dengan if#

Pernyataan if menguji satu kondisi dan menjalankan bloknya apabila kondisi benar. Bentuk lengkapnya menggabungkan kata if, ekspresi kondisi, kata then, blok pernyataan, serangkaian cabang elseif, satu blok else, dan penutup end. Kondisi diuji dari atas ke bawah, blok pertama yang kondisinya benar dijalankan, sedangkan blok else menjadi jalan terakhir apabila seluruh kondisi palsu.

Kata elseif ditulis serangkai dan tidak memerlukan end tambahan, sehingga seluruh rangkaian cabang tetap menjadi satu pernyataan. Lua tidak menyediakan pernyataan switch, dan rangkaian elseif mengambil perannya. Tanda kurung di sekeliling kondisi bersifat opsional, dan pengujian mengikuti aturan nilai kebenaran, yaitu hanya nil dan false yang palsu.

Diagram berikut menggambarkan urutan pengujian pada pernyataan if, elseif, dan else, dengan cabang pertama yang benar memutus percabangan.

kondisi 1benarblok 1salahkondisi 2benarblok 2salahblok else
Urutan pengujian pernyataan if, elseif, dan else

Berkas berikut mengonversi skor ujian menjadi predikat. Kondisi diurutkan dari batas tertinggi, sehingga urutan pengujian menentukan hasilnya dan satu blok saja yang pernah dijalankan.

lua penilaian.lua
-- Konversi skor ujian menjadi predikat dengan if, elseif, dan else
local skor = 86

if skor >= 90 then
  print("A")
elseif skor >= 80 then
  print("B")
elseif skor >= 70 then
  print("C")
else
  print("D")
end
text Keluaran
B

Keluaran B berasal dari kondisi kedua, karena 86 >= 90 palsu dan 86 >= 80 benar. Memutar urutan kondisi, misalnya menempatkan skor >= 70 lebih dahulu, menghasilkan predikat yang keliru untuk skor yang sama, sehingga penataan batas dari tinggi ke rendah menjadi bagian dari logika percabangan.

Perulangan while dan repeat#

while menguji kondisi sebelum setiap putaran dan menjalankan bloknya selama kondisi benar, sehingga perulangan yang kondisinya langsung palsu tidak pernah berjalan. Bentuknya terdiri atas kata while, ekspresi kondisi, kata do, blok, dan penutup end. Kondisi harus dapat berubah di dalam badan, biasanya melalui penugasan atas variabel yang diuji, agar perulangan berakhir.

lua Contoh: pemotongan sisa dengan while
-- while memotong sisa 30 pada setiap putaran sampai kondisinya palsu
local sisa = 100
while sisa >= 30 do
  sisa = sisa - 30
end
print(sisa)
text Keluaran
10

repeat menjalankan badan terlebih dahulu, kemudian menguji kondisi yang mengikuti kata until. Perulangan berhenti pada saat kondisi benar, sehingga badan dijalankan minimal satu kali bahkan apabila kondisi sudah benar sejak awal. Berbeda dari banyak bahasa lain, variabel lokal yang dideklarasikan di dalam badan repeat tetap terlihat pada ekspresi until, sehingga kondisi berhenti dapat menghitung nilai yang baru dibentuk oleh badannya.

lua Contoh: repeat tetap berjalan satu kali meski kondisi sudah benar
-- repeat tetap menjalankan badan satu kali meskipun kondisi sudah benar di awal
local sisa = 0
repeat
  sisa = sisa - 30
  print(sisa)
until sisa <= 0
text Keluaran
-30

Keluaran -30 menunjukkan badan tetap dijalankan satu kali meskipun kondisi 0 <= 0 sudah benar sejak awal, sehingga pemotongan tetap terjadi sebelum kondisi baru diuji.

lua Contoh: variabel lokal badan terlihat pada ekspresi until
-- Variabel lokal badan repeat tetap terlihat pada ekspresi until
local angka = 3
repeat
  local kuadrat = angka * angka
  print(kuadrat)
  angka = angka - 1
until kuadrat == 1
text Keluaran
9
4
1

Keluaran memperlihatkan kuadrat, yang dideklarasikan di dalam badan, sah dibaca oleh until pada setiap putaran. Perulangan ini berhenti begitu nilai terakhirnya mencapai 1, sebagaimana diuji kondisi berhentinya.

Perulangan for numerik#

Perulangan for numerik mengeksekusi blok dengan jumlah putaran yang ditentukan tiga ekspresi, yaitu nilai awal, nilai akhir, dan langkah. Bentuknya for variabel = awal, akhir, langkah do dan ditutup dengan end, dengan langkah bernilai 1 apabila tidak ditulis. Variabel kontrol mengambil nilai awal, berubah sebesar langkah pada setiap putaran, dan perulangan berakhir apabila nilainya melewati nilai akhir.

lua Contoh: penandaan jadwal piket lima hari
-- for numerik menandai lima hari pertama jadwal piket
for hari = 1, 5 do
  print("Hari " .. hari .. ": piket kelas")
end
text Keluaran
Hari 1: piket kelas
Hari 2: piket kelas
Hari 3: piket kelas
Hari 4: piket kelas
Hari 5: piket kelas

Dua aturan for numerik sering luput dari perhatian. Batas dan langkah dinilai sekali di awal, sehingga perubahan nilai variabel lain di dalam badan tidak memperpanjang perulangan. Variabel kontrol merupakan variabel lokal badan, sehingga penugasan ke atasnya tidak mengubah langkah berikutnya.

lua Contoh: batas perulangan dinilai sekali di awal
-- Batas perulangan dinilai sekali di awal, bukan pada setiap putaran
local batas = 3
for i = 1, batas do
  batas = 10
  print(i)
end
print(batas)
text Keluaran
1
2
3
10

Keluaran tetap menampilkan tiga putaran meskipun batas diubah menjadi 10 di dalam badan, karena nilai akhir sudah terkunci pada saat perulangan dimulai. Langkah negatif membuat perulangan menghitung mundur, dan perulangan dengan langkah negatif tidak pernah berjalan apabila nilai akhirnya lebih besar daripada nilai awalnya.

lua Contoh: hitung mundur dengan langkah negatif
-- Langkah negatif menghitung mundur dari nilai awal menuju nilai akhir
for detik = 5, 1, -1 do
  print(detik)
end
text Keluaran
5
4
3
2
1
lua Contoh: penugasan pada variabel kontrol tidak mengubah langkah
-- Variabel kontrol adalah lokal badan, penugasan ke atasnya tidak mengubah langkah
for i = 1, 3 do
  i = i * 10
  print(i)
end
text Keluaran
10
20
30

Keluaran 10, 20, 30 menunjukkan bahwa penugasan i = i * 10 hanya memengaruhi nilai yang dibaca badan pada putaran itu, sedangkan urutan putaran tetap ditentukan oleh mekanisme perulangannya.

Perulangan for generik#

Perulangan for generik menjalankan blok untuk setiap nilai yang dihasilkan sebuah fungsi iterator (iterator), yaitu fungsi yang mengembalikan elemen berikutnya pada setiap panggilan. Bentuknya for daftarVariabel in ekspresi do, dengan daftar variabel yang menerima keluaran iterator pada setiap putaran, dan perulangan berakhir ketika keluaran pertamanya bernilai nil. Dua iterator bawaan yang paling sering digunakan adalah ipairs dan pairs.

ipairs menelusuri bagian table yang berperan sebagai array, yaitu kunci bilangan mulai dari 1 hingga kunci pertama yang tidak ada. Iterator ini memberikan pasangan indeks dan nilai yang berurutan, sehingga cocok untuk deret nilai yang urutannya bermakna.

lua Contoh: penelusuran urutan skor dengan ipairs
-- ipairs menelusuri bagian array sebuah table berurutan dari indeks 1
local nilai = {88, 92, 79}
for indeks, isi in ipairs(nilai) do
  print(indeks, isi)
end
text Keluaran
1	88
2	92
3	79

pairs menelusuri seluruh pasangan kunci-nilai yang ada dalam table, termasuk kunci bernama, tanpa menjamin urutan kunjungan. Untuk menghitung isi tanpa memedulikan urutan, pairs dipasangkan dengan penghitung sederhana.

lua Contoh: menghitung seluruh pasangan kunci-nilai dengan pairs
-- pairs mengunjungi setiap pasangan kunci-nilai tanpa menjamin urutan
local stok = { pensil = 24, buku = 10, penghapus = 8 }
local cacah = 0
for kunci, isi in pairs(stok) do
  cacah = cacah + 1
end
print(cacah)
text Keluaran
3

Apabila keluaran perlu teratur, kunci dikumpulkan ke dalam satu table, diurutkan dengan table.sort dari pustaka standar, lalu ditelusuri kembali dengan ipairs. Nama _ pada posisi variabel merupakan konvensi untuk nilai yang sengaja diabaikan.

lua Contoh: keluaran pairs yang diurutkan lewat table.sort
-- Kunci hasil pairs dikumpulkan dan diurutkan agar keluaran teratur
local stok = { pensil = 24, buku = 10, penghapus = 8 }
local daftarKunci = {}
local cacah = 0
for kunci, _ in pairs(stok) do
  cacah = cacah + 1
  daftarKunci[cacah] = kunci
end
table.sort(daftarKunci)
for _, kunci in ipairs(daftarKunci) do
  print(kunci, stok[kunci])
end
text Keluaran
buku	10
penghapus	8
pensil	24

Keluar dini dengan break#

Pernyataan break menghentikan perulangan paling dalam yang memuatnya, dan eksekusi berlanjut pada pernyataan setelah perulangan tersebut. Penggunaan yang lazim adalah keluar segera begitu sasaran pencarian ditemukan, sehingga putaran sisanya tidak dikerjakan percuma.

lua Contoh: pencarian skor tinggi yang berhenti dengan break
-- break menghentikan perulangan paling dalam begitu sasaran ditemukan
local daftar = {35, 42, 78, 91, 64}
for posisi, isi in ipairs(daftar) do
  if isi >= 90 then
    print("Skor tertinggi ada pada posisi " .. posisi)
    break
  end
end
text Keluaran
Skor tertinggi ada pada posisi 4

Keluaran memperlihatkan pencarian berhenti pada posisi keempat begitu nilai 91 ditemukan, padahal table masih memuat satu nilai lagi. Lua tidak menyediakan pernyataan continue untuk melompati satu putaran, sehingga pola penggantinya berupa pengujian bersyarat di awal badan yang mengabaikan sisa badan pada putaran yang tidak memenuhi syarat.

Ringkasan#

  • if menguji kondisi dari atas ke bawah dengan elseif yang ditulis serangkai, dan blok else dijalankan apabila seluruh kondisi palsu.
  • while menguji kondisi sebelum badan, sedangkan repeat...until mengujinya setelah badan, sehingga badan dijalankan minimal satu kali dan variabel lokalnya terlihat pada ekspresi until.
  • for numerik menilai batas dan langkah sekali di awal, menggunakan variabel kontrol yang lokal pada badan, dan mendukung langkah negatif untuk menghitung mundur.
  • for generik berpasangan dengan ipairs untuk bagian array dan pairs untuk seluruh pasangan kunci-nilai, sedangkan break menghentikan perulangan paling dalam.

Referensi#