15. Menerima Masukan

Sejauh ini kamu menulis semua nilai sendiri: bisa diprediksi, tapi tidak interaktif. Bab ini memperkenalkan io.read, yang menunggu pengguna mengetik sesuatu di terminal.

io.read — baca satu baris

io.read() (tanpa argumen) menunggu pengguna mengetik satu baris dan menekan Enter, lalu mengembalikannya sebagai sebuah string tanpa karakter baris baru.

print("What is your name?")
local name = io.read()
print("Hello, " .. name)

Jalankan programnya. Program akan mencetak pertanyaan, menunggu kamu mengetik nama dan menekan Enter, mencetak salam, lalu selesai.

Buka exercises/15/01-read-name.lua dan jalankan dua kali dengan nama yang berbeda. Perhatikan bagaimana sapaannya berubah mengikuti nama yang kamu masukkan.

Prompt di baris yang sama

print selalu menambahkan baris baru. Untuk menjaga kursor tetap di baris yang sama sehingga pengguna bisa mengetik langsung setelah prompt, gunakan io.write sebagai gantinya:

io.write("What is your name? ")
local name = io.read()
print("Hello, " .. name)

io.write menulis argumennya tanpa baris baru. Perbedaannya kecil, tapi programnya terlihat lebih rapi:

What is your name? Keiko
Hello, Keiko

dibandingkan bentuk dengan print:

What is your name?
Keiko
Hello, Keiko

Gunakan salah satu. Buku ini menggunakan io.write untuk prompt mulai dari sini.

Membaca angka

io.read() selalu mengembalikan sebuah string, bahkan untuk digit angka sekalipun. Untuk melakukan perhitungan matematika, proses hasilnya melalui tonumber:

io.write("Enter a number: ")
local text = io.read()
local n = tonumber(text)
print("Twice that is " .. (n * 2))

Tanda kurung di sekitar n * 2 memastikan perkalian terjadi sebelum .. menggabungkannya ke string. Tanpa tanda kurung itu, Lua mencoba menempelkan 2 ke string lebih dulu dan jadi bingung.

Jika pengguna mengetik sesuatu yang bukan angka, tonumber mengembalikan nil, dan operasi matematika pada nil (nil * 2) akan menghasilkan error. Kamu akan memperbaiki ini di bab 16 dengan pemeriksaan if. Untuk sekarang, cukup ketik angka saja.

Membaca beberapa nilai

Untuk membaca beberapa nilai, panggil io.read sekali untuk setiap nilai:

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

Perhatikan pemanggilan bersarang: tonumber(io.read()). Pemanggilan di dalam dieksekusi lebih dulu dan mengembalikan string; yang di luar mengubahnya menjadi angka. Sama seperti print(type(x)) dari bab 11 — satu fungsi bisa langsung menerima hasil dari fungsi lain.

PR

Soal 1 — Sapa dengan nama

Buka exercises/15/homework/01-greet-by-name.lua. Buat prompt untuk nama depan menggunakan io.write, baca masukannya, lalu cetak Hello, <name>!. Tanda seru merupakan bagian dari keluaran.

Soal 2 — Jumlah dua bilangan

Buka exercises/15/homework/02-sum-of-two.lua. Buat prompt untuk dua angka (prompt terpisah), konversi masing-masing dengan tonumber, lalu cetak jumlahnya seperti ini:

a + b = c

di mana a, b, c adalah nilai yang sebenarnya.

Soal 3 — Tahun menuju pensiun

Buka exercises/15/homework/03-retirement.lua. Tanyakan umur pengguna dan hitung tahun yang tersisa hingga usia 65. Cetak:

You have N years until retirement.

(Jika seseorang sudah berusia di atas 65, angkanya akan negatif. Itu tidak masalah — belum perlu menangani kasus itu.)

Tantangan — BMI

Buka exercises/15/homework/04-bmi.lua. Tanyakan tinggi badan dalam meter (angka desimal seperti 1.78) dan berat badan dalam kilogram (seperti 72.5). Hitung Body Mass Index:

bmi = weight / (height * height)

Cetak hasilnya dibulatkan ke satu angka desimal menggunakan string.format dan %.1f. Beri label yang jelas.

Buntu atau sudah selesai? Buka halaman solusi PR.