13. Angka dan Matematika
Angka dalam Lua hadir dalam dua bentuk, mendukung operasi aritmatika biasa, dan dilengkapi dengan library kecil berisi fungsi-fungsi pembantu. Bab ini membahas apa yang kamu butuhkan untuk logika permainan: pembulatan, angka acak, dan matematika dasar.
Integer dan float
Lua memiliki dua jenis angka:
- Integer. Bilangan bulat tanpa bagian desimal:
0,7,-42. - Float. Bilangan dengan titik desimal:
3.14,0.5,-1.0.
Sebagian besar waktu kamu tidak perlu pusing membedakannya.
7 adalah integer, 7.0 adalah float, dan Lua
mencampurnya dengan bebas. Dua integer menghasilkan integer; apa pun
yang melibatkan float akan menghasilkan float.
type() melaporkan keduanya sebagai
"number". Untuk membedakannya, gunakan
math.type():
print(math.type(7)) -- integer
print(math.type(7.0)) -- float
print(math.type(3.14)) -- floatAritmatika
Operator-operator yang sudah familiar semuanya ada di sini, ditambah dua yang kurang umum dalam matematika sehari-hari:
| Operator | Nama | Contoh | Hasil |
|---|---|---|---|
+ |
penjumlahan | 3 + 2 |
5 |
- |
pengurangan | 7 - 4 |
3 |
* |
perkalian | 6 * 7 |
42 |
/ |
pembagian float | 7 / 2 |
3.5 |
// |
pembagian integer | 7 // 2 |
3 |
% |
modulo (sisa bagi) | 7 % 3 |
1 |
^ |
pangkat | 2 ^ 8 |
256.0 |
Ada tiga yang perlu diperhatikan lebih dekat:
Pembagian float / selalu menghasilkan
float, bahkan ketika hasilnya adalah bilangan bulat. 6 / 3
menghasilkan 2.0, bukan 2.
Pembagian integer // membuang semua
angka setelah titik desimal. 7 // 2 adalah 3.
-7 // 2 adalah -4, karena ia membulatkan ke
arah negatif tak terhingga, bukan ke arah nol.
Modulo % adalah sisa dari pembagian
integer. 7 % 3 adalah 1 karena
7 = 2 * 3 + 1. Ini adalah cara standar untuk memeriksa
"apakah angka ini genap?" — n % 2 adalah 0
untuk bilangan genap dan 1 untuk bilangan ganjil.
print(7 / 2) -- 3.5
print(7 // 2) -- 3
print(7 % 2) -- 1
print(2 ^ 8) -- 256.0Buka exercises/13/01-arithmetic.lua. Prediksi setiap
hasil cetak sebelum menjalankannya, lalu jalankan dan periksa apakah
tebakanmu benar.
Library math
Library math milik Lua menyediakan fungsi-fungsi
pembantu yang paling sering dipakai:
| Fungsi | Kegunaannya |
|---|---|
math.floor(x) |
Integer terbesar yang tidak melebihi x.
floor(3.7) -> 3. |
math.ceil(x) |
Integer terkecil yang tidak kurang dari x.
ceil(3.2) -> 4. |
math.abs(x) |
Nilai absolut. abs(-5) -> 5. |
math.sqrt(x) |
Akar kuadrat. |
math.min(a, b) |
Yang lebih kecil dari dua angka. |
math.max(a, b) |
Yang lebih besar dari dua angka. |
math.pi |
Konstanta 3.1415... (sebuah nilai, bukan fungsi). |
Panggil seperti fungsi lainnya:
print(math.floor(3.7)) -- 3
print(math.ceil(3.2)) -- 4
print(math.sqrt(16)) -- 4.0
print(math.min(7, 3)) -- 3
print(math.pi) -- 3.1415926535898Angka acak
math.random memilih angka secara acak. Ada tiga bentuk
penggunaannya:
math.random()mengembalikan float antara0.0dan1.0.math.random(n)mengembalikan bilangan bulat dari1sampain(kedua ujung termasuk).math.random(6)seperti melempar dadu enam sisi.math.random(a, b)mengembalikan bilangan bulat dariasampaib, kedua ujung termasuk.math.random(1, 100)menghasilkan angka 1 sampai 100.
print(math.random()) -- e.g. 0.6238...
print(math.random(6)) -- e.g. 4
print(math.random(1, 100)) -- e.g. 73Lua 5.4 secara otomatis menyemai generator angka acaknya setiap kali
interpreter dijalankan, jadi kamu tidak perlu memanggil
math.randomseed sendiri. Versi Lua yang lebih lama (dan
beberapa yang tertanam) membutuhkan penyemaian sebelum angka acak
benar-benar acak.
Mengubah teks menjadi angka
Ketika suatu nilai datang sebagai string tapi kamu perlu melakukan
perhitungan dengannya, gunakan tonumber:
local text = "42"
local n = tonumber(text)
print(n + 1) -- 43Jika teks tidak bisa diubah menjadi angka, tonumber
mengembalikan nil:
print(tonumber("hello")) -- nilKamu akan sering menggunakan tonumber di bab berikutnya,
di mana program membaca masukan dari keyboard. Apa pun yang diketik
pengguna datang sebagai string, meskipun mereka mengetik angka.
PR
Soal 1 — Luas persegi panjang
Buka exercises/13/homework/01-rectangle-area.lua. Dua
variabel menyimpan width (lebar) dan height
(tinggi) sebuah persegi panjang. Hitung luasnya dan cetak dengan label,
misalnya Area: 24.
Soal 2 — Floor dan ceil
Buka exercises/13/homework/02-floor-and-ceil.lua. Sebuah
variabel menyimpan float 3.7. Cetak apa adanya, setelah
math.floor, dan setelah math.ceil. Tambahkan
satu baris komentar yang menjelaskan perbedaan antara floor dan
ceil.
Soal 3 — Lempar dua dadu
Buka exercises/13/homework/03-roll-two-dice.lua.
"Lempar" dua dadu enam sisi dan cetak hasilnya seperti ini:
Die 1: 4
Die 2: 6
Total: 10
Gunakan math.random untuk lemparan. Lempar setiap dadu
secara terpisah agar kedua nilainya independen.
Tantangan — Hipotenusa
Buka exercises/13/homework/04-hypotenuse.lua. Dua
variabel menyimpan dua sisi pendek segitiga siku-siku (a
dan b). Hitung dan cetak hipotenusa c
menggunakan teorema Pythagoras:
c = sqrt(a^2 + b^2)
Cetak ketiga nilai dengan label. Bulatkan hipotenusa ke dua angka
desimal menggunakan string.format dan placeholder
%.2f dari bab 12.
Mentok atau sudah selesai? Buka halaman solusi PR.