Tutorial Python untuk bukan pengatur cara/Nyahpepijat
Seterusnya, nyahpepijat.
- "Sebaik sahaja kami mula mengatur cara, kami terkejut dan mendapati bahawa tidak mudah bagi mendapat pengaturcaraan yang betul seperti kami sangkakan. Nyahpepijat perlu ditemui. Saya masih ingat waktu persis apabila saya mendapati bahawa sebahagian besar hayat saya akan diluangkan mencari kesilapan dalam atur cara saya sendiri." — Maurice Wilkes discovers debugging, 1949
Apakah itu nyahpepijat?
suntingPada ketika ini, jika anda menyemak atur cara anda, anda mungkin akan mendapati bahawa atur cara yang anda buat itu kadang-kadang tidak mengikut apa yang anda mahukan. Ini perkara biasa. Nyahpepijat (debugging) ialah satu proses memahami apa yang komputer sedang lakukan dan kemudian membuatkannya melakukan apa yang anda inginkan pula.
Bab ini akan lebih abstrak dari bab-bab terdahulu.
Apa yang sepatutnya atur cara lakukan?
suntingPerkara pertama yang perlu dilakukan ialah untuk memahami apa yang seharusnya atur cara itu lakukan jika ia berjalan dengan betul. Mari hasilkan beberapa kes ujian dan lihat apa yang berlaku. Sebagai contoh, katakan saya ada sebuah atur cara yang akan mengira perimeter segi empat (jumlah panjang setiap sisi keliling). Saya mempunyai kes ujian berikut:-
Lebar | Tinggi | Perimeter |
---|---|---|
3 | 4 | 14 |
2 | 3 | 10 |
4 | 4 | 16 |
2 | 2 | 8 |
5 | 1 | 12 |
Sekarang saya jalankan atur cara saya pada semua kes ujian dan lihat jika atur cara ini melakukan apa yang saya jangkakan. Jika ia tidak membuat apa yang saya mahukan, saya akan siasat apa yang ia lakukan.
Kebiasaanya, beberapa ujian akan berfungsi dan selebihnya tidak. Jika inilah kesnya, anda mesti mencuba menggambarkan apa yang dibuat. Sebagai contoh, ini adalah output/hasil bagi sebuah program perimeter:-
Tinggi: 3 Lebar: 4 perimeter = 15
Tinggi: 2 Lebar: 3 perimeter = 11
Tinggi: 4 Lebar: 4 perimeter = 16
Tinggi: 2 Lebar: 2 perimeter = 8
Tinggi: 5 Lebar: 1 perimeter = 8
Perhatikan bahawa ia tidak berfungsi dengan betul pada dua input yang pertama. Ia berfungsi pada dua yang seterusnya dan tidak berfungsi pada yang akhir sekali. Cuba gambarkan apa yang dibuat, cari pola. Mencari sendiri punca masalah itu adalah lebih mudah jika anda mempunyai idea apa yang mungkin silap.
Apa yang atur cara buat?
suntingPerkara seterusnya adalah melihat kod sumbernya. Salah satu daripada perkara yang terpenting ketika mengaturcara ialah membaca kod sumbernya.
Sesuatu kod berjalan dengan bermula pada baris pertama, dan bergerak ke bawah sampai atur cara habis dijalankan. Gelung while
dan penyataan if
bermaksud beberapa baris mungkin tak akan dijalankan dan sesetengahnya pula akan dijalankan banyak kali. Pada setiap baris, anda bayangkan apa yang Python buat.
Mari kita mulakan dengan atur cara perimeter mudah ini. Jangan taip ini, anda akan membacanya, bukan menjalankannya. Kod sumbernya ialah:
tinggi = input("Tinggi: ")
lebar = input("Lebar: ")
print "perimeter =", lebar + tinggi + lebar + lebar
- Soalan: Apakah baris pertama yang dijalankan Python?
- Jawapan: Baris pertama sentiasa dijalankan dahulu. Di dalam kes ini:
tinggi = input("Tinggi: ")
- Soalan: Apa yang baris itu buat?
- Jawapan: Cetak
Tinggi:
, menunggu pengguna untuk memasukkan nombor, dan memasukkannya ke dalam pemboleh ubah "tinggi".
- Soalan: Apakah baris yang dijalankan seterusnya?
- Jawapan: Secara umumnya, ia adalah baris seterusnya yang merupakan:
lebar = input("Lebar: ")
- Soalan: Apa yang baris itu buat?
- Jawapan: Cetak
Lebar:
, menunggu pengguna untuk memasukkan nombor, dan memasukkannya ke dalam pemboleh ubah "lebar".
- Soalan: Apakah baris yang dijalankan seterusnya?
- Jawapan: Jika baris seterusnya tidak diengsot lebih atau kurang daripada baris yang sedia ada, ia adalah baris yang akan dijalankan, jadi:
print "perimeter =", lebar + tinggi + lebar + lebar
(Ia boleh juga menjalankan fungsi dalam baris semasa, tetapi itu dari bab akan datang.)
- Soalan: Apa yang baris itu buat?
- Jawapan: Pertama, ia mencetak
perimeter =
, kemudian ia mencetak nilailebar + tinggi + lebar + lebar
.
- Soalan: Adakah
lebar + tinggi + lebar + lebar
mengira perimeter dengan betul? - Jawapan: Mari lihat, perimeter segi empat ialah bawah (lebar) campur sisi kiri (tinggi) campur yang atas (lebar) campur sisi kanan (hah?). Hal terakhir seharusnya panjang sebelah kanan atau ketinggiannya.
- Soalan: Adakah anda fahami mengapa sesetengah kiraan perimeter dikira dengan "betul"?
- Jawapan: Ia dikira dengan betul apabila lebar dan tinggi adalah sama.
Atur cara seterusnya yang akan kita teliti ialah untuk suatu atur cara yang sepatutnya memaparkan 5 titik pada skrin. Bagaimanapun, ini ialah apa yang atur cara outputkan:-
. . . .
Dan ini adalah kodnya.
nombor = 5
while nombor > 1:
print ".",
nombor = nombor - 1
print
Atur cara ini akan menjadi lebih kompleks untuk diteliti kerana ia mempunyai struktur kawalan (bahagian berengsot). Mari kita mulakan:
- Apakah baris pertama yang akan dijalankan?
- Baris pertama fail:
nombor = 5
- Apa yang ia buat?
- Memasukkan nombor 5 ke dalam pemboleh ubah
nombor
.
- Apakah baris seterusnya?
- Baris seterusnya ialah:
while nombor > 1:
- Apa yang ia buat?
- Penyataan
while
secara amnya melihat pada ungkapannya dan jika ia benar, komputer akan menjalankan blok kod berengsot seterusnya, jika tidak blok kod berengsot tersebut akan dilangkau.
- Apa yang sepatutnya ia buat sekarang?
- Jika
nombor > 1
benar, maka dua baris seterusnya akan berjalan.
- Jadi adakah
number > 1
? - Nilai terakhir dimasukkan kepada
nombor
ialah 5 dan 5 > 1 jadi ya.
- Jadi, apakah baris seterusnya?
- Memandangkan
while
benar, baris seterusnya ialah:print ".",
- Apa yang baris itu buat?
- Mencetak satu titik dan oleh sebab penyataan itu berakhir dengan ',' penyataan
print
seterusnya tidak akan berada di baris skrin berbeza.
- Apakah baris seterusnya?
nombor = nombor - 1
kerana ia baris seterusnya dan tiada perubahan dalam engsotan.
- Apa yang ia buat?
- Ia mengira
nombor - 1
, iaitu nilai terkininombor
(atau 5) ditolak dengan 1, dan menjadikan nilai tersebut nilau baharu buatnombor
. Jadi, pada asasnya ia menukar nilainombor
daripada 5 kepada 4.
- Apakah baris seterusnya?
- Tahap engsotan berubah, jadi kita perlu lihat apakah jenis struktur kawalan tersebut. Ia merupakan gelung while, jadi kita perlu kembali ke klausa
while
iaituwhile nombor > 1:
- Apa yang ia buat?
- Ia melihat kepada nilai
nombor
, iaitu 4, dan membandingkannya dengan 1 dan disebabkan4 > 1
, gelungwhile
terus berjalan.
- Apakah baris seterusnya?
- Oleh sebab gelung
while
masih benar, baris seterusnya ialah:print ".",
- Apa yang ia buat?
- Ia mencetak titik kedua pada baris tersebut.
- Apakah baris seterusnya?
- Tiada perbezaan engsotan, jadi:
nombor = nombor - 1
- Dan apa yang ia buat?
- Ia mengambil nilai semasa
nombor
(4), tolak 1 daripadanya, memberikan nilai 3 yang kemudian disimpan sebagai nilai terbarunombor
.
- Apakah baris seterusnya?
- Memandangkan terdapat perubahan engsotan yang disebabkan oleh gelung
while
berakhir, baris seterusnya ialah:while nombor > 1:
- Apa yang ia buat?
- Ia membandingkan nilai semasa
nombor
(3) dengan 1.3 > 1
jadi gelungwhile
akan diteruskan.
- Apakah baris seterusnya?
- Disebabkan syarat gelung
while
masih benar, baris seterusnya ialah:print ".",
- Dan apa yang ia buat?
- Titik ketiga dicetak di baris tersebut.
- Apakah baris seterusnya?
nombor = nombor - 1
- Apa yang ia buat?
- Ia mengambil nilai semasa
nombor
(3), tolak 1 daripadanya dan menyimpan 2 sebagai nilai baharunombor
.
- Apakah baris seterusnya?
- Kembali ke permulaan gelung
while
:while nombor > 1:
- Apa yang ia buat?
- Ia membandingkan nilai semasa
nombor
(2) dengan 1. Oleh sebab2 > 1
gelungwhile
akan berterusan.
- Apakah baris seterusnya?
- Oleh sebab gelung
while
diteruskan:print ".",
- Apa yang ia buat?
- Ia menemui makna kehidupan, dunia dan segalanya. Saya buat lawak. (Saya kena pastikan yang anda masih jaga). Baris itu mencetak titik ke empat pada skrin.
- Apakah baris seterusnya?
nombor = nombor - 1
- Apa yang ia buat?
- Mengambil nilai semasa
nombor
(2), tolak 1 daripadanya dan menjadikan 1 nilainombor
yang baharu.
- Apakah baris seterusnya?
- Kembali ke gelung
while
:while nombor > 1:
- Apa yang baris itu buat?
- Ia membandingkan nilai semasa
nombor
(1) dengan 1. Oleh sebab1 > 1
tidak benar (satu tidak lebih besar daripada satu), gelungwhile
ditamatkan.
- Apakah baris seterusnya?
- Disebabkan syarat gelung
while
tidak lagi benar, baris seterusnya ialah baris selepas tamatnya gelung tersebut, iaitu:print
- Apa yang baris itu buat?
- Menggerakkan skrin pergi ke baris seterusnya.
- Kenapa atur cara ini tidak mencetak 5 titik?
- Gelung itu tamat 1 titik lebih cepat.
- Bagaimana ini boleh diperbaiki?
- Buatkan supaya gelung tersebut tamat 1 titik kemudian.
- Dan bagaimana kita dapat melakukannya?
- Terdapat beberapa cara. Satu cara ialah menukar gelung
while
kepada:while nombor > 0:
. Cara lain pula ialah dengan menukar syarat kepada:nombor >= 1:
.
Bagaimana memperbaikinya?
suntingAnda perlu memahami apa yang dibuat atur cara tersebut. Anda juga perlu memahami yang yang sepatutnya ia buat. Seterusnya fahami perbezaan antara keduanya. Nyahpepijat merupakan suatu kemahiran yang perlu dilatih untuk dipelajari. Selamat berjaya.