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.