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))  -- float

Aritmatika

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.0

Buka 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.1415926535898

Angka acak

math.random memilih angka secara acak. Ada tiga bentuk penggunaannya:

  • math.random() mengembalikan float antara 0.0 dan 1.0.
  • math.random(n) mengembalikan bilangan bulat dari 1 sampai n (kedua ujung termasuk). math.random(6) seperti melempar dadu enam sisi.
  • math.random(a, b) mengembalikan bilangan bulat dari a sampai b, 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. 73

Lua 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)            -- 43

Jika teks tidak bisa diubah menjadi angka, tonumber mengembalikan nil:

print(tonumber("hello"))  -- nil

Kamu 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.