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 height atau width 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.floor akan mengubah x. Tidak. Seperti string.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) dan math.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 mendapat 5.0 alih-alih 5.00. Matematikanya sudah benar; pemformatan yang mengontrol jumlah desimal. %.2f selalu menampilkan dua angka desimal.
  • Lupa bahwa ^ membuat semuanya jadi float: 2 ^ 2 hasilnya 4.0, bukan 4. Gunakan a * a jika 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.