18. Perulangan — Solusi PR

File solusi .lua ada di exercises/18/homework/solutions/.

Soal 1 — Hitung sampai 20

Soal. Cetak angka 1 sampai 20 menggunakan perulangan while.

Cara berpikir. Perulangan while butuh nilai awal, kondisi berhenti, dan pembaruan. Mulai dari 1, berhenti setelah 20, tambah 1 di setiap putaran.

Solusi.

local i = 1
while i <= 20 do
    print(i)
    i = i + 1
end

Kesalahan umum.

  • Lupa menulis i = i + 1. Kondisinya akan selalu benar, sehingga perulangan tidak pernah berhenti.
  • Menggunakan i < 20, sehingga angka 20 tidak ikut tercetak. <= menyertakan batas akhirnya.

Soal 2 — Tabel perkalian 7

Soal. Cetak 7 * i = hasil untuk i dari 1 sampai 12.

Cara berpikir. Ini cocok untuk for numerik klasik. Setiap putaran mencetak satu baris dari i dan 7 * i.

Solusi.

for i = 1, 12 do
    print("7 * " .. i .. " = " .. (7 * i))
end

Tanda kurung di sekitar 7 * i tidak wajib (perkalian lebih kuat ikatannya daripada ..) tapi membantu memperjelas maksud.

Kesalahan umum.

  • Menulis for i = 1, 12, 1 do. Argumen langkah sudah default ke 1, jadi ini cuma menambah kebisingan. Hapus saja.
  • Bingung antara 7 * i (yang dicetak) dengan i (penghitungnya).

Soal 3 — Berhenti di ambang batas

Soal. Tambahkan 1, 2, 3, ... ke sebuah total. Berhenti begitu totalnya melebihi 100. Cetak nilai penghitung dan totalnya.

Cara berpikir. Dua variabel: penghitung yang bertambah 1 setiap putaran, dan total yang bertambah sebesar nilai penghitung. Kondisi keluar, total > 100, diletakkan di dalam sebagai if ... break, yang cocok dipakai bersama while true do.

Solusi.

local i = 1
local total = 0

while true do
    total = total + i
    if total > 100 then
        break
    end
    i = i + 1
end

print("Stopped at i = " .. i .. " with total = " .. total)

Untuk i = 1..14, jumlah 1+2+...+14 = 105 adalah total pertama yang melewati 100:

Stopped at i = 14 with total = 105

Kesalahan umum.

  • Menambah i = i + 1 sebelum menambah ke total. Itu artinya yang ditambahkan adalah i berikutnya, bukan yang sekarang. Urutkan dengan sengaja.
  • Meletakkan break setelah i = i + 1. Maka i yang tercetak akan satu angka lebih dari nilai yang sebenarnya mendorong total melewati 100. Keduanya bisa berjalan; pastikan kamu melakukannya dengan sadar.

Tantangan — Jumlahkan 1..N

Soal. Baca n, jumlahkan 1..n dengan perulangan for, lalu bandingkan dengan rumus tertutup n * (n + 1) / 2.

Cara berpikir. Perulangan for dari 1 sampai n menambahkan setiap penghitung ke total. Rumus tertutup untuk n bilangan bulat positif pertama adalah n * (n + 1) / 2, trik Gauss. Cetak keduanya, pastikan hasilnya sama.

Solusi.

io.write("Enter a positive whole number n: ")
local n = tonumber(io.read())

local total = 0
for i = 1, n do
    total = total + i
end

print("Sum from 1 to " .. n .. " is " .. total)
print("Formula gives " .. (n * (n + 1) / 2))

Operator / menghasilkan bilangan desimal, jadi baris kedua akan menampilkan .0 di akhir. Itu memang sudah benar.

Kesalahan umum.

  • Lupa menyetel total ke 0 sebelum perulangan. Kalau dimulai dari nil maka hasilnya nil + 1, yang akan menyebabkan error.
  • Menulis rumusnya sebagai n * n + 1 / 2. Urutan operasi penting: tanda kurung di sekitar (n + 1) diperlukan.

Selesai?

Sekarang kamu sudah bisa mengulang pekerjaan dengan semua jenis perulangan. Selanjutnya, Perulangan bersarang menumpuk perulangan untuk membangun grid, dan Pola perulangan menamai tugas-tugas yang paling sering dikerjakan oleh perulangan. Lalu mini-proyek Bagian 4 — sebuah Permainan Tebak Angka dan Batu-Gunting-Kertas — menggabungkan keputusan dan pengulangan.