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")
endKesalahan yang sering terjadi.
- Menulis
if n % 2 = 0. Tanda=tunggal adalah penugasan (assignment); untuk mengecek perlu==. - Lupa
tonumber.n % 2pada 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.")
endKegagalan 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 menggunakananddanor. - Lupa bahwa
not has_keyartinya 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")
endKesalahan yang sering terjadi.
- Mengurutkan kondisi dari rendah ke tinggi. Meletakkan
score >= 60paling 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)
endTelusuri untuk a = 7, b = 12,
c = 12:
a >= b?7 >= 12bernilai false. Cabang pertama dilewati.b >= c?12 >= 12bernilai true. Mencetak12.
Untuk a = 12, b = 12,
c = 5:
a >= b?12 >= 12bernilai true.a >= c?12 >= 5bernilai true.- Keduanya true, jadi cetak
a, yaitu12. Selesai.
Kesalahan yang sering terjadi.
- Menggunakan
>bukan>=. Dengan tiga angka yang sama, tidak ada cabang yang cocok dan program jatuh keprint(c)meskiayang 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.