13. Angka dan matematika — Solusi PR
File solusi .lua ada di
exercises/13/homework/solutions/.
Soal 1 — Luas persegi panjang
Soal. Kalikan lebar dan tinggi; cetak hasilnya dengan label.
Cara berpikirnya. Operator perkalian adalah
*. Simpan hasilnya di variabel ketiga, atau gunakan
langsung di dalam print dengan ...
Solusi.
local width = 6
local height = 4
local area = width * height
print("Area: " .. area)Kesalahan umum.
- Menulis
width x heightatauwidth times height. Keduanya bukan Lua; operator perkalian adalah*.
Soal 2 — Floor dan ceil
Soal. Tampilkan 3.7,
math.floor(3.7), dan math.ceil(3.7) di tiga
baris, plus komentar yang menjelaskan perbedaannya.
Cara berpikirnya. floor membulatkan ke
bawah; ceil membulatkan ke atas. Keduanya
mengembalikan bilangan bulat. Untuk angka positif, floor
membuang desimalnya; ceil menambah satu kecuali angkanya
sudah bulat.
Solusi.
local x = 3.7
print(x) -- 3.7
print(math.floor(x)) -- 3
print(math.ceil(x)) -- 4
-- floor membulatkan KE BAWAH ke bilangan bulat terdekat; ceil membulatkan KE ATAS. Untuk 3.7
-- keduanya berada di sisi yang berbeda: 3 dan 4.Kesalahan umum.
- Mengira
math.floorakan mengubahx. Tidak. Sepertistring.upper, fungsi ini mengembalikan nilai baru dan tidak mengubah nilai aslinya.
Soal 3 — Lempar dua dadu
Soal. Lempar dua dadu enam sisi secara terpisah. Cetak masing-masing nilai plus totalnya.
Cara berpikirnya. math.random(6)
memberikan angka dari 1 sampai 6. Panggil dua kali — sekali per dadu —
lalu jumlahkan kedua variabelnya.
Solusi.
local die1 = math.random(6)
local die2 = math.random(6)
local total = die1 + die2
print("Die 1: " .. die1)
print("Die 2: " .. die2)
print("Total: " .. total)Kesalahan umum.
- Memanggil
math.random(6)sekali lalu menggunakan angka yang sama untuk kedua dadu. Dua lemparan harus merupakan dua panggilan yang terpisah. - Heran bahwa
math.random(1, 6)danmath.random(6)memberikan hasil yang sama. Memang begitu — keduanya mencakup kedua ujungnya. Pilih salah satu dan konsisten.
Tantangan — Hipotenusa
Soal. Diberikan dua sisi pendek sebuah segitiga
siku-siku, hitung hipotenusanya dengan math.sqrt, dan cetak
ketiga nilainya dengan hipotenusa dibulatkan ke dua desimal.
Cara berpikirnya. Rumus matematikanya adalah
c = sqrt(a*a + b*b). Keduanya a*a maupun
a^2 bisa digunakan, tapi a*a tetap bertipe
integer jika a adalah integer, sedangkan ^
selalu menghasilkan float — begitu juga math.sqrt. Untuk
tampilan yang dibulatkan, gunakan string.format dengan
%.2f.
Solusi.
local a = 3
local b = 4
local c = math.sqrt(a * a + b * b)
print("a = " .. a)
print("b = " .. b)
print(string.format("c = %.2f", c))Untuk a = 3, b = 4 keluarannya adalah:
a = 3
b = 4
c = 5.00
Kesalahan umum.
- Menulis
math.sqrt(a^2 + b^2)dan mendapat5.0alih-alih5.00. Matematikanya sudah benar; pemformatan yang mengontrol jumlah desimal.%.2fselalu menampilkan dua angka desimal. - Lupa bahwa
^membuat semuanya jadi float:2 ^ 2hasilnya4.0, bukan4. Gunakana * ajika kamu butuh integer.
Selesai?
Dua bab lagi sebelum mini-proyek: Bekerja dengan teks memungkinkan kamu memotong, mencari, dan mengganti isi string, dan Menerima input mengubah keyboard menjadi nilai. Lalu proyek karakter akan menyatukan Bagian 3.