04. Penelusuran program secara manual

Ada dua cara untuk mengetahui apa yang dilakukan sebuah program. Jalankan dan perhatikan, atau jadilah komputernya: baca satu baris setiap kali, berurutan, kerjakan tiap baris di atas kertas. Kemampuan kedua itulah yang disebut penelusuran, hal paling berguna di bagian buku ini. Programmer yang bisa menelusuri kode bisa membacanya, memprediksinya, dan menemukan bugnya — tanpa pernah menekan tombol run.

Menjadi komputer, pelan-pelan

Di Bab 01 kamu belajar bahwa komputer melakukan persis apa yang diperintahkan, berurutan, dari atas ke bawah. Penelusuran adalah pekerjaan yang sama, dilakukan dengan tangan. Baris per baris. Jangan pernah melompat. Jangan berasumsi. Ketika sebuah baris mengubah nilai, coret nilai lama dan tulis yang baru.

Yang membuat ini bisa diandalkan adalah tabel penelusuran: sebuah tabel dengan satu kolom per variabel dan satu baris untuk setiap perubahan. Kamu mengisinya sambil membaca.

Penelusuran yang dikerjakan bersama

Berikut adalah sebuah program singkat. Jangan dijalankan. Baca baris per baris, sambil membuat tabel.

local a = 5
local b = 3
local total = a + b
a = a + 1
print(total)
print(a)

Baris local x = ... membuat sebuah nama dan menyimpan nilai di dalamnya. Baris x = ... biasa mengubah nilai yang sudah ada. Tabelnya, satu baris setiap kali:

Baris a b total
local a = 5 5
local b = 3 5 3
local total = a + b 5 3 8
a = a + 1 6 3 8

Pada print(total), tabel mengatakan total adalah 8. Pada print(a), tabel mengatakan a adalah 6. Jadi keluarannya adalah:

8
6

Yang perlu diperhatikan: total dihitung sekali saja, pada baris ketiga, saat a masih 5. Mengubah a setelahnya tidak menghitung ulang total. Tabel membuat hal itu jelas — total tidak pernah berubah setelah baris yang menetapkannya. Penelusuran mengungkap ini; menebak-nebak menyembunyikannya.

Menelusuri sebuah perulangan

Sebuah perulangan menjalankan baris yang sama beberapa kali, sehingga tabel mendapat beberapa baris untuk satu variabel. Telusuri ini:

local n = 4
local result = 1
for i = 1, n do
    result = result * i
end
print(result)

Perulangan berjalan dengan i sebagai 1, lalu 2, 3, 4. Setiap kali, bagian dalam perulangan mengalikan result dengan i saat itu:

Putaran (i) result sebelum result sesudah
1 1 1
2 1 2
3 2 6
4 6 24

Setelah perulangan, result adalah 24, sehingga program mencetak 24. (Kamu baru saja menelusuri 1×2×3×4. Jawaban itu punya nama — "faktorial 4" — tapi kamu tidak perlu tahu itu untuk menelusurinya.)

Menelusuri sebuah kondisi

Untuk sebuah if, kamu tidak mengisi tabel — kamu mengikuti satu jalur yang pertanyaannya bernilai benar. Telusuri ini dengan score sebesar 72:

local score = 72
if score >= 90 then
    print("A")
elseif score >= 70 then
    print("B")
else
    print("C")
end

Baca dengan lantang: apakah 72 paling tidak 90? Tidak, lewati. Apakah 72 paling tidak 70? Ya — cetak B, lewati sisanya. Keluarannya adalah B. Hanya cabang pertama yang benar yang dijalankan; sisanya tidak pernah dilirik.

Di atas kertas, ubah baris pertama contoh perulangan menjadi local n = 5. Tambahkan satu baris lagi ke tabel penelusuran dan hitung nilai yang dicetak. (Kamu seharusnya mendapat angka lima kali lebih besar dari sebelumnya.)

Kenapa perlu menelusuri?

  • Menemukan bug sebelum dijalankan. Kebanyakan bug adalah sebuah baris yang melakukan sesuatu yang sedikit berbeda dari yang kamu bayangkan. Penelusuran memaksamu membaca apa yang sebenarnya dikatakan tiap baris.
  • Membaca kode orang lain. Sebentar lagi kamu akan menempel contoh-contoh Roblox dari internet. Penelusuran adalah cara kamu memahaminya alih-alih sekadar berharap.
  • Membuatmu melambat di tempat yang penting. Mengisi tabel penelusuran itu membosankan, dan itulah maksudnya — kebosanan adalah otakmu yang menolak untuk melewatkan baris yang sulit.

PR (Pekerjaan Rumah)

Kertas lagi. Tanpa komputer. Untuk setiap soal, buat tabel penelusuran (atau ikuti cabangnya) dan tuliskan keluaran akhirnya. Hanya setelah kamu yakin dengan jawabanmu boleh kamu memeriksanya, setelah kamu sampai di bab yang mengizinkan menjalankan kode.

Soal 1 — Jumlah hitung mundur

Telusuri program ini dan tuliskan nilai yang dicetak.

local s = 0
for i = 5, 1, -1 do
    s = s + i
end
print(s)

(Petunjuk: perulangan menghitung munduri adalah 5, lalu 4, 3, 2, 1.)

Soal 2 — Membangun sebuah string

Telusuri ini dan tuliskan persis apa yang dicetak.

local word = "ha"
local out = ""
for i = 1, 3 do
    out = out .. word
end
print(out)

.. menyambung dua potongan teks. out dimulai kosong.

Soal 3 — Penukaran

Telusuri ini dengan tabel dua kolom untuk a dan b. Tuliskan baris keluaran akhirnya.

local a = 2
local b = 7
local temp = a
a = b
b = temp
print(a, b)

Jelaskan dalam satu kalimat apa pekerjaan variabel temp.

Tantangan — Temukan kejutannya

Telusuri ini dan tuliskan nilai yang dicetak. Kebanyakan orang menebak salah pada bacaan pertama, jadi lakukan dengan pelan dan percayai tabelnya.

local price = 100
local discount = 20
local final = price - discount
discount = 50
print(final)

Lalu tuliskan satu kalimat yang menjelaskan mengapa mengubah discount pada baris kedua dari bawah memengaruhi atau tidak memengaruhi final.

Mentok atau sudah selesai? Buka halaman solusi PR.