04. Menelusuri program dengan tangan
Ada dua cara untuk mengetahui apa yang dilakukan suatu program. Jalankan dan amati, atau jadilah komputer: baca satu baris dalam satu waktu, berurutan, mengerjakan setiap baris di atas kertas. Keterampilan kedua itulah yang disebut tracing, hal paling berguna dalam bagian buku ini. Programmer yang bisa menelusuri kode bisa membacanya, memprediksinya, dan menemukan bug — tanpa pernah menekan run.
Menjadi komputer, perlahan-lahan
Kembali di Bab 01 kamu belajar bahwa komputer melakukan persis apa yang diperintahkan, berurutan, dari atas ke bawah. Tracing adalah pekerjaan yang sama dengan tangan. Baris per baris. Jangan melewati ke depan. Jangan berasumsi. Ketika sebuah baris mengubah sebuah nilai, coret nilai lama dan tulis yang baru.
Yang membuat ini dapat diandalkan adalah sebuah trace table: kisi dengan satu kolom per variable dan satu baris untuk setiap perubahan. Kamu mengisinya saat membaca.
Tracing yang dikerjakan
Berikut adalah program pendek. Jangan jalankan. Baca baris per baris, sambil memelihara tabel.
a = 5
b = 3
total = a + b
a = a + 1
print(total)
print(a)Sebuah baris assignment seperti x = ... membuat nama dan
memasukkan nilai ke dalamnya, atau memperbarui nilai yang sudah ada.
Tabelnya, satu baris dalam satu waktu:
| Baris | a | b | total |
|---|---|---|---|
a = 5 |
5 | ||
b = 3 |
5 | 3 | |
total = a + b |
5 | 3 | 8 |
a = a + 1 |
6 | 3 | 8 |
Pada print(total), tabel mengatakan total
adalah 8. Pada print(a), ia mengatakan a
adalah 6. Jadi keluarannya adalah:
8
6
Tangkapannya: total dihitung sekali,
pada baris ketiga, ketika a masih 5. Mengubah
a setelahnya tidak mengulang
total. Tabel membuat itu jelas — total tidak
pernah berubah setelah baris yang menyetelnya. Tracing mengungkap ini;
menebak menyembunyikannya.
Menelusuri loop
Loop menjalankan baris yang sama beberapa kali, jadi tabel mendapat beberapa baris untuk satu variable. Lacak ini:
n = 4
result = 1
for i in range(1, n + 1):
result = result * i
print(result)Loop berjalan dengan i sebagai 1, lalu 2, 3, 4. Setiap
kali, tubuh mengalikan result dengan i saat
ini:
Putaran (i) |
result sebelum | result sesudah |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 6 |
| 4 | 6 | 24 |
Setelah loop, result adalah 24, jadi program mencetak
24. (Kamu baru saja menelusuri 1×2×3×4. Jawaban itu punya
nama — "4 faktorial" — tapi kamu tidak perlu tahu itu untuk
menelusurinya.)
Menelusuri decision
Untuk sebuah if, kamu tidak mengisi tabel — kamu
mengikuti satu jalur yang pertanyaannya benar. Lacak ini dengan
score 72:
score = 72
if score >= 90:
print("A")
elif score >= 70:
print("B")
else:
print("C")Baca dengan keras: apakah 72 setidaknya 90? Tidak, lewati. Apakah
72 setidaknya 70? Ya — cetak B, lewati sisanya.
Keluarannya adalah B. Hanya cabang pertama yang benar yang
berjalan; sisanya tidak pernah dilihat.
Di atas kertas, ubah baris pertama dari contoh loop menjadi
n = 5. Tambahkan satu baris lagi ke trace table dan hitung
nilai cetak yang baru. (Kamu seharusnya mendapatkan angka lima kali
lebih besar dari sebelumnya.)
Mengapa menelusuri sama sekali?
- Ia menemukan bug sebelum kamu menjalankan. Sebagian besar bug adalah baris yang melakukan sesuatu yang sedikit berbeda dari yang kamu bayangkan. Tracing memaksamu membaca apa yang sebenarnya dikatakan setiap baris.
- Ia membaca kode orang lain. Segera kamu akan menempelkan contoh Roblox dari internet. Tracing adalah cara kamu memahaminya daripada berharap.
- Ia membuatmu melambat di mana penting. Trace table membosankan untuk diisi, dan itulah intinya — kebosanan adalah otakmu yang menolak untuk melewati baris yang sulit.
Pekerjaan Rumah
Kertas lagi. Tidak ada komputer. Untuk setiap soal, buat trace table (atau ikuti cabangnya) dan tuliskan keluaran akhir. Hanya setelah kamu berkomitmen pada sebuah jawaban baru boleh kamu memeriksanya, setelah kamu mencapai bab yang memungkinkan kamu menjalankan kode.
Soal 1 — Jumlah hitungan mundur
Lacak program ini dan tuliskan nilai yang dicetak.
s = 0
for i in range(5, 0, -1):
s = s + i
print(s)(Petunjuk: loop menghitung mundur — i adalah 5,
lalu 4, 3, 2, 1.)
Soal 2 — Membangun string
Lacak ini dan tuliskan persis apa yang dicetak.
word = "ha"
out = ""
for i in range(3):
out = out + word
print(out)+ menggabungkan dua potong teks. out
dimulai kosong.
Soal 3 — Pertukaran
Lacak ini dengan tabel dua kolom untuk a dan
b. Tuliskan baris keluaran akhir.
a = 2
b = 7
temp = a
a = b
b = temp
print(a, b)Jelaskan dalam satu kalimat pekerjaan apa yang dilakukan variable
temp.
Tantangan — Temukan kejutannya
Lacak ini dan tuliskan nilai yang dicetak. Kebanyakan orang menebak salah pada bacaan pertama, jadi lakukan dengan perlahan dan percayai tabelnya.
price = 100
discount = 20
final = price - discount
discount = 50
print(final)Kemudian tuliskan satu kalimat yang menjelaskan mengapa mengubah
discount pada baris kedua-dari-terakhir memengaruhi atau
tidak memengaruhi final.
Bingung atau sudah selesai? Buka halaman solusi pekerjaan rumah.