15. Mendapatkan input — Solusi PR

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

Soal 1 — Sapa berdasarkan nama

Soal. Tampilkan prompt dengan io.write, baca jawaban dengan io.read, lalu sapa dengan tanda seru.

Cara berpikir. Tiga baris: tulis promptnya, baca jawabannya, cetak sapaannya. Tanda seru masuk ke dalam string, setelah variabelnya.

Solusi.

io.write("First name: ")
local name = io.read()
print("Hello, " .. name .. "!")

Kesalahan umum.

  • Lupa spasi di akhir prompt. "First name:" membuat kursor menempel langsung ke titik dua; "First name: " adalah cara yang benar.

Soal 2 — Jumlah dua angka

Soal. Baca dua angka; cetak a + b = c.

Cara berpikir. Dua prompt, dua kali baca, masing-masing dibungkus dengan tonumber. Susun keluarannya dari tiga angka menggunakan ...

Solusi.

io.write("First number:  ")
local a = tonumber(io.read())
io.write("Second number: ")
local b = tonumber(io.read())

local c = a + b
print(a .. " + " .. b .. " = " .. c)

Kesalahan umum.

  • Melewati tonumber. Nilainya tetap berupa string, jadi a + b gagal dengan error attempt to perform arithmetic on a string value.
  • Membungkus tonumber di sekitar prompt, bukan jawabannya. tonumber("First number: ") menghasilkan nil, sehingga bugnya baru muncul satu baris kemudian.

Soal 3 — Tahun menuju pensiun

Soal. Hitung 65 - age dan cetak kalimat dengan label.

Cara berpikir. Prompt, baca, kurangi, cetak. Perhatikan urutannya: 65 - age, bukan age - 65.

Solusi.

io.write("Your current age: ")
local age = tonumber(io.read())

local years_left = 65 - age
print("You have " .. years_left .. " years until retirement.")

Kesalahan umum.

  • Menulis age - 65, yang akan mencetak angka negatif untuk semua orang yang belum berusia 65 tahun. Pengurangan tidak komutatif — urutan itu penting.

Tantangan — BMI

Soal. Minta masukan tinggi dan berat badan (desimal), hitung BMI, cetak hasilnya dengan satu angka di belakang koma.

Cara berpikir. Dua prompt, dua kali baca, keduanya melalui tonumber. weight / (height * height) menghasilkan bilangan desimal; string.format("%.1f", bmi) menampilkan satu angka setelah koma.

Solusi.

io.write("Height in metres (e.g. 1.78): ")
local height = tonumber(io.read())
io.write("Weight in kg (e.g. 72.5):     ")
local weight = tonumber(io.read())

local bmi = weight / (height * height)

print(string.format("BMI: %.1f", bmi))

Kesalahan umum.

  • Lupa tanda kurung di height * height. Tanpa kurung, weight / height * height berjalan dari kiri ke kanan: dibagi dengan tinggi, lalu dikalikan lagi — keduanya saling menghapus dan hasilnya kembali ke nilai berat badan.
  • Memasukkan tinggi dalam sentimeter (seperti 178) bukan dalam meter (1.78). BMI menggunakan meter, sesuai yang tertulis di prompt awal.

Selesai?

Semua bab di Bagian 3 sudah selesai. Mini-proyek — Character Sheet — menggunakan semua konsep dari bab 11 sampai 15.