20. Pola-pola perulangan

Hampir semua perulangan punya salah satu dari empat bentuk. Kalau kamu sudah hafal keempat bentuk itu, kamu tidak perlu menciptakan logika perulangan dari awal setiap kali — tinggal pilih yang paling cocok. Keempatnya adalah akumulasi, penghitungan, pencarian, dan penanda, masing-masing punya satu tugas kecil. Contoh-contohnya memakai rentang angka, tapi bentuk-bentuk ini berlaku untuk apapun yang bisa kamu iterasi.

1. Akumulasi — membangun hasil secara bertahap

Pegang sebuah variabel dan ubah nilainya di setiap putaran. Kasus paling klasik adalah menjumlahkan total:

local sum = 0
for i = 1, 10 do
    sum = sum + i
end
print(sum)       -- 55

Bentuknya selalu sama: tentukan nilai awal sebelum perulangan, perbarui di dalam, lalu gunakan sesudah. Pola ini juga bisa membangun string (mulai dari "", sambung potongan di setiap putaran) dan mencari nilai maksimum (mulai dari nilai rendah, naikkan kalau kamu menemukan yang lebih besar).

2. Penghitungan — berapa banyak yang cocok?

Penghitung adalah akumulator yang bertambah satu, tapi hanya ketika sebuah tes berhasil. "Berapa banyak angka dari 1 sampai 30 yang habis dibagi 3?"

local hits = 0
for i = 1, 30 do
    if i % 3 == 0 then
        hits = hits + 1
    end
end
print(hits)      -- 10

if di dalam perulangan adalah tesnya; hits = hits + 1 adalah pencacahnya.

3. Pencarian — temukan kecocokan pertama lalu berhenti

Kalau kamu hanya butuh nilai pertama yang sesuai, gunakan break begitu kamu menemukannya — tidak ada gunanya terus berjalan:

local first
for i = 1, 100 do
    if i * i > 50 then
        first = i
        break
    end
end
print(first)     -- 8   (because 8 × 8 = 64, the first square over 50)

first dimulai sebagai nil. Kalau tidak ada yang cocok, nilainya tetap nil — jawaban "tidak ditemukan" yang praktis dan bisa kamu tes dengan if.

4. Penanda — apakah ada putaran yang cocok?

Kadang kamu hanya butuh ya/tidak, bukan nilainya: "apakah ada angka dari 1 sampai 20 yang habis dibagi 7?" Simpan sebuah boolean yang dimulai dari false dan berubah jadi true begitu kamu menemukan kecocokan:

local found = false
for i = 1, 20 do
    if i % 7 == 0 then
        found = true
    end
end
print(found)     -- true   (7 and 14 are in range)

Kalau kamu hanya peduli apakah ada yang cocok, tambahkan break saat penanda berubah — itu mengubahnya menjadi pencarian. Penanda dan pencarian adalah sepupu.

Buka exercises/20/01-patterns.lua. Di sana sudah ada kode yang mengakumulasi jumlah 1 sampai 20. Tambahkan pola penghitungan di bawahnya untuk mencetak berapa banyak angka dalam rentang itu yang genap.

Menggabungkan pola-pola

Program nyata menggabungkan pola-pola ini. Satu kali jalan bisa mengakumulasi total, menghitung berapa yang memenuhi aturan, dan menandai apakah sesuatu yang spesial muncul, semuanya sekaligus:

local total = 0
local evens = 0
local has_multiple_of_5 = false

for i = 1, 10 do
    total = total + i                       -- accumulate
    if i % 2 == 0 then evens = evens + 1 end -- count
    if i % 5 == 0 then has_multiple_of_5 = true end  -- flag
end

print("total", total)              -- 55
print("evens", evens)              -- 5
print("multiple of 5?", has_multiple_of_5)  -- true

Satu perulangan, tiga pola, tiga jawaban.

PR

File PR ada di exercises/20/homework/.

Soal 1 — Faktorial

Buka exercises/20/homework/01-product.lua. Gunakan pola akumulasi untuk mengalikan angka 1 sampai 5 bersamaan, lalu cetak hasilnya. (Petunjuk: hasil kali dimulai dari 1, bukan 0 — apapun dikali nol hasilnya nol.)

Soal 2 — Hitung kelipatan

Buka exercises/20/homework/02-count-multiples.lua. Gunakan pola penghitungan untuk mencetak berapa banyak angka dari 1 sampai 50 yang habis dibagi 7.

Soal 3 — Kuadrat besar pertama

Buka exercises/20/homework/03-first-big.lua. Gunakan pola pencarian untuk menemukan dan mencetak angka pertama yang kuadratnya lebih dari 200, periksa mulai dari 1 ke atas dan berhenti dengan break.

Tantangan — Statistik rentang dalam satu jalan

Buka exercises/20/homework/04-stats.lua. Dalam satu perulangan dari 1 sampai 20, hitung dan cetak tiga hal: totalnya (akumulasi), berapa yang genap (penghitungan), dan apakah ada angka yang habis dibagi 9 (penanda).

Macet atau sudah selesai? Buka halaman solusi PR.