Batas yang bergeser satu langkah
Elemen terakhir tidak punya tetangga sesudahnya, dan lupa itu adalah kesalahan paling umum di seluruh pemrograman.
Sebaiknya baca lebih dulu: Menghitung sampai berhenti.
Sebanyak apa pagar untuk lima papan?
Menjumlahkan setiap elemen dengan elemen sesudahnya adalah soal papan pagar. Array berisi tiga angka menghasilkan dua jumlah, bukan tiga. Batas atas loopnya bukan panjang array, melainkan panjang dikurangi satu.
IngatSetiap kali kode menyentuh elemen sesudahnya, batas atasnya berkurang satu. Setiap kali menyentuh elemen sebelumnya, batas bawahnya bertambah satu.
Melihat indeks melewati ujung
SET hasil = [] SET i = 0 WHILE i < LENGTH(numbers) SET hasil = hasil + [numbers[i] + numbers[i + 1]] SET i = i + 1 END
Indeks dimulai dari nol. Panjang arraynya tiga, jadi indeks yang sah nol, satu, dan dua.
Apa yang terjadi sesudahnya bergantung pada bahasanya, dan tidak satu pun akibatnya menyenangkan. Ada bahasa yang menghentikan program. Ada yang mengembalikan nilai kosong lalu menjumlahkannya menjadi angka yang tidak berarti. Ada yang justru diam saja dan memasukkan sesuatu yang bukan angka ke dalam hasil. Ketiganya lebih buruk daripada berhenti, sebab dua yang terakhir menghasilkan jawaban yang tampak lengkap.
Batas yang benar
Batas sepanjang array
WHILE i < LENGTH(numbers) SET hasil = hasil + [numbers[i] + numbers[i + 1]] SET i = i + 1 END
Batas dikurangi satu
WHILE i < LENGTH(numbers) - 1 SET hasil = hasil + [numbers[i] + numbers[i + 1]] SET i = i + 1 END
Bedanya dua karakter. Kolom kanan berhenti pada indeks kedua terakhir, yaitu elemen terakhir yang benar benar punya tetangga sesudahnya. Perhatikan bahwa kolom kiri tetap menghasilkan dua jumlah yang benar sebelum gagal, jadi memeriksa keluaran pertama saja tidak akan menemukan apa pun.
Array yang terlalu kecil
Dua ukuran array yang wajib diuji, dan keduanya sering dilupakan justru karena terlihat terlalu sepele.
- Array kosong: tidak ada pasangan, jadi hasilnya array kosong. Batas nol dikurangi satu bernilai negatif satu, dan kondisi 0 < -1 sudah salah sejak pemeriksaan pertama sehingga badan tidak pernah berjalan.
- Array berisi satu elemen: juga tidak ada pasangan, hasilnya array kosong. Batasnya satu dikurangi satu bernilai nol, dan 0 < 0 salah.
- Array berisi satu elemen inilah kasus terkecil yang membedakan batas benar dari batas yang bergeser. Dengan batas yang salah, kasus ini langsung membaca indeks yang tidak ada.
Perhatikan bahwa batas yang benar menangani keduanya tanpa satu pun cabang tambahan. Ini pola yang berulang di seluruh pemrograman: batas yang dihitung benar biasanya membuat kasus tepi hilang dengan sendirinya, sedangkan batas yang salah menuntut deretan penjaga untuk menambal akibatnya.
Periksa pemahaman
numbers berisi enam angka. Berapa banyak jumlah tetangga yang dihasilkan, dan indeks tertinggi yang dibaca?
Ringkasan
- N elemen membentuk N dikurangi satu pasangan bertetangga.
- Kode yang menyentuh elemen sesudahnya menurunkan batas atas satu langkah.
- Kesalahan ini menghasilkan beberapa keluaran yang benar lebih dulu, jadi pengujian sebagian tidak menemukannya.
- Akibat membaca indeks yang tidak ada berbeda antar bahasa, dan yang paling berbahaya adalah yang tidak melapor apa pun.
- Uji array kosong dan array berisi satu elemen. Yang kedua adalah kasus terkecil yang dapat membedakan benar dari salah.