Ralat off-by-one bermaksud gelung berjalan sekali terlalu banyak atau sekali terlalu sedikit. Ia antara kesalahan paling biasa dalam soalan algoritma, dan tugasan peperiksaan sering memberi gelung yang salah dan meminta pembaikan.
Pelajaran ini dibina atas menjejak gelung terkawal bilangan dan terkawal syarat dalam pengulangan dan tatasusunan. Ia penting lagi sebaik sahaja tatasusunan muncul.
Bagaimana mencari baris yang salah?
Bekerja mengikut urutan ini:
- Nyatakan apa yang patut dilakukan gelung, dalam nombor. Contohnya, “tambah 10 nombor bulat pertama, jadi 10 pusingan, jawapan 55”.
- Jejak pusingan pertama dan pusingan terakhir.
- Kira bilangan pusingan yang benar-benar dibuat oleh kod.
- Bandingkan. Jika kod membuat satu pusingan terlalu sedikit atau terlalu banyak, periksa nilai awal, nilai akhir dan tanda perbandingan.
Contoh penyelesaian
Seorang pengaturcara mahu jumlah nombor bulat 1 hingga 10.
Total ← 0
FOR i ← 1 TO 9
Total ← Total + i
NEXT i
OUTPUT Total
Nilai gelung ialah 1 hingga 9, iaitu 9 pusingan. Tugasan memerlukan 10 pusingan.
| i | Total selepas |
|---|---|
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 15 |
| 6 | 21 |
| 7 | 28 |
| 8 | 36 |
| 9 | 45 |
Outputnya 45, tetapi jumlah 1 hingga 10 ialah 55. Nilai yang tertinggal ialah 10, dan 45 + 10 = 55. Pembaikannya ialah menukar nilai akhir:
FOR i ← 1 TO 10
Gelung WHILE boleh menyembunyikan kesalahan yang sama dalam syaratnya. Versi ini sepatutnya mencetak empat gandaan 3 yang pertama, iaitu 3, 6, 9 dan 12.
Count ← 0
WHILE Count <= 4 DO
Count ← Count + 1
OUTPUT Count * 3
ENDWHILE
Ujian benar bagi Count = 0, 1, 2, 3 dan 4, jadi ada 5 pusingan. Ia mencetak 3, 6, 9, 12 dan 15. Menukar syarat kepada Count < 4 memberi pusingan untuk Count = 0, 1, 2 dan 3. Itu mencetak 3, 6, 9 dan 12, yang betul.
Kesilapan yang perlu diawasi
Kesilapan biasa ialah membaiki output dan bukan gelung.
Pembetulan yang salah: “Jumlahnya 45 dan patut 55, jadi tulis
OUTPUT Total + 10.”Ini memberi 55 untuk input ini sahaja. Gelung masih tertinggal nilai terakhir, dan sebarang nilai akhir lain akan gagal.
Pembetulannya ialah menukar had gelung supaya ia membuat bilangan pusingan yang betul. Kemudian jejak satu kes kecil yang kedua, seperti nombor 1 hingga 3 (jumlah 6), untuk mengesahkan.
Semak sendiri
1. Tatasusunan Score[1:5] menyimpan lima nilai. Kodnya ialah FOR i ← 0 TO 4. Apakah yang salah, dan apakah pembaikannya?
Lihat jawapan
Kedudukan tatasusunan bermula dari 1 hingga 5. Kedudukan 0 tidak wujud, dan kedudukan 5 tidak pernah dilawati. Pembaikannya ialah FOR i ← 1 TO 5.
2. Berapa pusingan yang dibuat oleh FOR i ← 5 TO 12?
Lihat jawapan
Nilainya ialah 5, 6, 7, 8, 9, 10, 11, 12, iaitu 8 pusingan. Semakan: 12 - 5 + 1 = 8.
3. Gelung ini sepatutnya mengeluarkan 2, 4 dan 6 sahaja. Ia mengeluarkan 2, 4, 6 dan 8. Berikan pembaikannya.
n ← 0
WHILE n < 8 DO
n ← n + 2
OUTPUT n
ENDWHILE
Lihat jawapan
Ujian benar bagi n = 0, 2, 4 dan 6, jadi empat pusingan berlaku dan output terakhir ialah 8. Tukar syarat kepada WHILE n < 6. Maka n = 0, 2 dan 4 lulus ujian dan outputnya ialah 2, 4 dan 6.
Seterusnya
Seterusnya, gunakan gelung yang betul untuk mengimbas senarai dalam mencari nilai maksimum dalam senarai. Pelatih jejak pseudokod membolehkan anda melangkah melalui gelung yang salah dan melihat pusingan pertama dan terakhir.
Seorang guru dalam tuisyen Computer Science boleh membawa gelung salah yang baharu dan meminta anda menerangkan pembaikan sebelum anda menulisnya.