16. if / elseif / else — Solusi PR

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

Soal 1 — Genap atau ganjil

Soal. Baca sebuah angka; cetak even atau odd.

Cara berpikirnya. n % 2 menghasilkan 0 untuk genap dan 1 untuk ganjil (angka negatif menghasilkan -1 atau 1, tapi == 0 tetap berfungsi). Cukup satu if/else.

Solusi yang dikerjakan.

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

if n % 2 == 0 then
    print("even")
else
    print("odd")
end

Kesalahan yang sering terjadi.

  • Menulis if n % 2 = 0. Tanda = tunggal adalah penugasan (assignment); untuk mengecek perlu ==.
  • Lupa tonumber. n % 2 pada string akan menghasilkan error.

Soal 2 — Gerbang level Roblox

Soal. Pesan yang berbeda tergantung syarat mana yang gagal dipenuhi oleh pemain.

Cara berpikirnya. Dua boolean menghasilkan empat kombinasi, tapi hanya tiga yang buruk. Tuliskan masing-masing dengan elseif:

  • keduanya terpenuhi → masuk
  • level rendah, kunci ada → "Level too low."
  • level cukup, kunci tidak ada → "Missing the key."
  • keduanya tidak terpenuhi → "Level too low and missing the key."

Urutan cabang penting: tangani kegagalan yang paling spesifik terlebih dahulu.

Solusi yang dikerjakan.

local level = 12
local has_key = true

if level >= 10 and has_key then
    print("You can enter the dungeon.")
elseif level < 10 and not has_key then
    print("Level too low and missing the key.")
elseif level < 10 then
    print("Level too low.")
else
    print("Missing the key.")
end

Kegagalan gabungan dicek sebelum kegagalan tunggal. Kalau elseif level < 10 diletakkan lebih dulu, ia akan menelan kasus gabungan, sehingga pesan tersebut tidak pernah muncul.

Kesalahan yang sering terjadi.

  • Menggunakan && atau ||. Lua menggunakan and dan or.
  • Lupa bahwa not has_key artinya kunci tidak ada. Coba ucapkan dengan keras: "tidak punya kunci".

Soal 3 — Huruf nilai

Soal. Nilai huruf standar A/B/C/D/F berdasarkan batas-batas tertentu.

Cara berpikirnya. Setiap cabang mengecek batas tertinggi yang belum tertangkap. Dengan elseif, begitu satu cabang cocok, cabang berikutnya dilewati.

Solusi yang dikerjakan.

io.write("Score (0-100): ")
local score = tonumber(io.read())

if score >= 90 then
    print("Grade: A")
elseif score >= 80 then
    print("Grade: B")
elseif score >= 70 then
    print("Grade: C")
elseif score >= 60 then
    print("Grade: D")
else
    print("Grade: F")
end

Kesalahan yang sering terjadi.

  • Mengurutkan kondisi dari rendah ke tinggi. Meletakkan score >= 60 paling atas akan menangkap semua nilai yang lulus, termasuk 95, dan semuanya mendapat D.
  • Menggunakan > bukan >=. Nilai tepat 90 seharusnya mendapat A, bukan B.

Tantangan — Terbesar dari tiga angka

Soal. Tiga angka, tanpa math.max, tanpa perulangan. Cetak yang terbesar.

Cara berpikirnya. Bandingkan berpasangan. a >= b dan a >= c berarti a adalah yang terbesar, atau seri dengannya. >= (bukan >) menangani seri: jika a == b, cabang pertama menang dan mencetak a.

Solusi yang dikerjakan.

local a = 7
local b = 12
local c = 12

if a >= b and a >= c then
    print(a)
elseif b >= c then
    print(b)
else
    print(c)
end

Telusuri untuk a = 7, b = 12, c = 12:

  • a >= b? 7 >= 12 bernilai false. Cabang pertama dilewati.
  • b >= c? 12 >= 12 bernilai true. Mencetak 12.

Untuk a = 12, b = 12, c = 5:

  • a >= b? 12 >= 12 bernilai true.
  • a >= c? 12 >= 5 bernilai true.
  • Keduanya true, jadi cetak a, yaitu 12. Selesai.

Kesalahan yang sering terjadi.

  • Menggunakan > bukan >=. Dengan tiga angka yang sama, tidak ada cabang yang cocok dan program jatuh ke print(c) meski a yang menyimpan nilai terbesar. Hasilnya benar secara kebetulan, tapi logikanya salah.

Sudah selesai?

Bab berikutnya, Logika boolean secara mendalam, membahas apa yang sebenarnya dilakukan and, or, dan not. Setelah itu ada perulangan — cara lain membuat program melakukan sesuatu yang berbeda setiap kali dijalankan.