18. Perulangan

Cara lain untuk menghindari pengulangan kode adalah dengan perulangan: sebuah blok kode yang berjalan berulang kali. Lua punya tiga bentuk perulangan, semuanya dibahas di sini, plus break untuk berhenti lebih awal.

while — ulangi selama kondisi masih benar

while adalah perulangan yang paling umum. Ia memeriksa kondisi, menjalankan blok jika benar, lalu memeriksa lagi — terus berulang sampai kondisinya salah.

local count = 10
while count > 0 do
    print(count)
    count = count - 1
end
print("Blast off!")

Urutan eksekusi:

  1. Periksa count > 0. Nilainya 10, jadi benar.
  2. Cetak 10, set count ke 9.
  3. Kembali ke langkah 1. count adalah 9, masih benar. Cetak, kurangi.
  4. Ulangi sampai count adalah 0. Kondisi gagal, perulangan keluar, dan print("Blast off!") berjalan sekali.

Di dalam blok perulangan, ubah nilai yang menjadi dasar kondisi, atau perulangan tidak akan pernah berhenti. Perulangan tak terbatas mengunci terminal. Hentikan dengan Ctrl + C.

repeat ... until — jalankan blok dulu, baru periksa

repeat adalah kebalikan dari while. Ia menjalankan blok minimal satu kali, lalu memeriksa kondisi, dan berhenti ketika kondisinya menjadi benar — kebalikan dari while.

local count = 1
repeat
    print(count)
    count = count + 1
until count > 5

Keluaran:

1
2
3
4
5

Gunakan repeat ketika perulangan harus berjalan minimal sekali — seperti mengajukan pertanyaan dan mengajukannya lagi jika jawaban tidak valid. Kamu akan menggunakannya di mini-proyek Bagian 4.

for — ulangi sejumlah kali yang sudah diketahui

Perulangan ketiga adalah for numerik — alat yang tepat untuk menjalankan sesuatu sejumlah kali yang sudah diketahui. Bentuknya:

for i = start, stop do
    -- body
end

i adalah variabel baru yang hanya hidup di dalam perulangan. Lua mengisinya dengan nilai start, menambah 1 setiap putaran, dan berhenti begitu nilainya melewati stop. Kedua ujung termasuk dalam perulangan.

for i = 1, 5 do
    print(i)
end

Keluaran:

1
2
3
4
5

Langkah (step)

Nilai ketiga setelah stop adalah langkah — seberapa banyak i berubah setiap putaran. Defaultnya adalah 1; ubah untuk melompat atau menghitung mundur:

for i = 0, 100, 10 do      -- 0, 10, 20, ... 100
    io.write(i .. " ")
end
print()                    -- a blank line at the end

for i = 10, 1, -1 do       -- 10, 9, 8, ... 1
    io.write(i .. " ")
end
print()

Langkah harus punya tanda yang tepat — positif untuk naik, negatif untuk turun. Langkah 0 menghasilkan perulangan tak terbatas, dan Lua akan memberitahumu.

Buka exercises/18/01-for-table.lua. Program ini mencetak tabel perkalian 7, dari 7 * 1 sampai 7 * 10. Ubah supaya mencetak tabel perkalian angka lain.

break — keluar dari perulangan lebih awal

Ketiga jenis perulangan bisa dihentikan lebih awal dengan break, yang langsung melompat ke kode setelah perulangan.

local n = 1
while true do
    if n * n > 100 then
        break
    end
    n = n + 1
end
print("First number whose square is over 100 is " .. n)

while true do ... end tidak punya jalan keluar bawaan; satu-satunya cara keluar adalah break (atau error). Gunakan ini ketika kondisi keluarnya terlalu rumit untuk satu perbandingan di atas.

PR

Soal 1 — Hitung sampai 20

Buka exercises/18/homework/01-count-to-20.lua. Gunakan perulangan while untuk mencetak 1 sampai 20, masing-masing di baris tersendiri.

Soal 2 — Tabel perkalian 7

Buka exercises/18/homework/02-mult-table-7.lua. Gunakan perulangan for numerik untuk mencetak tabel perkalian 7, dari 7 * 1 sampai 7 * 12, dalam bentuk ini:

7 * 1 = 7
7 * 2 = 14
...
7 * 12 = 84

Soal 3 — Berhenti di ambang batas

Buka exercises/18/homework/03-stop-at-threshold.lua. Lakukan perulangan dari 1, tambahkan setiap angka ke total yang berjalan. Hentikan begitu total melebihi 100, lalu cetak total dan nilai penghitung saat itu.

Tantangan — Jumlahkan 1..N

Buka exercises/18/homework/04-sum-1-to-n.lua. Minta masukan berupa bilangan bulat positif n. Hitung 1 + 2 + 3 + ... + n dengan perulangan for dan total yang berjalan. Cetak:

Sum from 1 to N is S

Lalu cetak rumus n * (n + 1) / 2 di baris berikutnya — jawaban bentuk tertutup. Keduanya harus sama.

Bingung atau sudah selesai? Buka halaman solusi PR.