Gelung markah yang tidak berhenti dan cabang yang tidak tercapai
Guru Sains Komputer menguji atur cara yang mengira bilangan pelajar cemerlang bagi 42 pelajar Tingkatan 5. Atur cara membaca markah satu per satu dan sepatutnya berhenti apabila pengguna memasukkan -1:
input markah
while markah >= 0:
jumlah = jumlah + markah
if markah > 50:
lulus = lulus + 1
else if markah >= 80:
cemerlang = cemerlang + 1
Selepas markah pertama dimasukkan, atur cara tidak pernah meminta markah kedua. Ia terus menambah markah yang sama berulang kali sehingga guru menekan Ctrl+C selepas beberapa saat, dan jumlah yang dipaparkan menjadi sangat besar. Apabila guru membetulkan gelung itu secara sementara, laporan menunjukkan 42 pelajar lulus tetapi 0 pelajar cemerlang, walaupun 9 pelajar memperoleh markah antara 81 dan 97. Seorang pelajar yang mendapat tepat 50 markah pula tidak dikira dalam mana-mana kategori. Atur cara ini akan digunakan untuk 3 kelas lagi minggu depan, jadi ia mesti berhenti sendiri selepas data terakhir dan mengelaskan setiap markah dengan betul.
1. Terangkan mengapa atur cara tidak pernah meminta markah kedua, dan tulis pembetulan yang juga mengendalikan kes nilai pertama ialah -1.
Read the worked answer
input markah hanya ditulis sekali, sebelum gelung. Dalam badan gelung, markah tidak pernah dikemas kini, jadi syarat markah >= 0 kekal benar untuk nilai yang sama dan gelung menjadi tak terhingga. Atur cara sebenarnya tidak 'meminta markah ke-43'; ia menambah markah pertama berulang kali, dan itulah sebabnya jumlah membesar dengan pantas sebelum guru menekan Ctrl+C. Sentinel -1 tidak pernah dibaca, jadi syarat berhenti tidak pernah tercapai.
Pembetulan (corak baca-primer):
input markah
while markah >= 0:
jumlah = jumlah + markah
bilangan = bilangan + 1
input markah // baca nilai seterusnya di akhir badan gelung
Kes tepi yang mesti diuji: jika nilai pertama ialah -1, badan gelung tidak berjalan, bilangan = 0, dan purata = jumlah / bilangan menyebabkan pembahagian dengan sifar. Tambah semakan if bilangan > 0 sebelum mengira purata, atau gunakan gelung repeat ... until markah = -1 jika sekurang-kurangnya satu markah dijamin ada.
2. Mengapa `cemerlang` sentiasa 0 walaupun 9 pelajar mendapat markah 81 hingga 97? Betulkan susunan syarat dan terangkan bagaimana markah tepat 50 patut dikendalikan.
Read the worked answer
Syarat disemak dari atas ke bawah dan cabang pertama yang benar dilaksanakan, kemudian seluruh rantaian else if dilangkau. Bagi markah 85, markah > 50 sudah benar, jadi cemerlang tidak pernah ditambah - baris else if markah >= 80 ialah kod yang tidak boleh dicapai (unreachable). Sebab itu laporan menunjukkan 42 lulus dan 0 cemerlang. Markah tepat 50 pula gagal kedua-dua syarat (50 > 50 palsu, 50 >= 80 palsu) dan tidak dikira dalam mana-mana kategori, jadi ia hilang daripada jumlah keseluruhan.
Pembetulan - susun dari ambang tertinggi ke terendah dan tutup dengan else:
if markah >= 80:
cemerlang = cemerlang + 1
else if markah >= 50:
lulus = lulus + 1
else:
gagal = gagal + 1
Prinsipnya: julat mesti saling eksklusif dan lengkap. Jika 'lulus' perlu merangkumi cemerlang, tambah lulus dalam kedua-dua cabang atas atau gunakan pemboleh ubah berasingan, bukan syarat yang bertindih. Markah di luar 0 hingga 100 patut ditolak sebelum penggredan.
3. Cadangkan empat nilai ujian sempadan untuk mengesahkan pembetulan, dan jelaskan mengapa nilai tengah seperti 65 tidak mencukupi.
Read the worked answer
Uji sempadan setiap ambang: 80 dan 79 (sempadan cemerlang), 50 dan 49 (sempadan lulus), -1 (sentinel mesti berhenti tanpa menambah sebarang markah), dan 0 serta 100 (hujung julat sah). Tambah 101 untuk mengesahkan input tidak sah ditolak, dan kes input pertama -1 untuk mengesahkan tiada pembahagian dengan sifar apabila tiada markah langsung.
Nilai tengah seperti 65 hanya mengesahkan laluan biasa: ia benar untuk > mahupun >= dan untuk susunan syarat yang betul atau salah. Ralat yang sebenarnya berlaku dalam atur cara ini semuanya berada di sempadan - 80 dikelaskan sebagai lulus kerana cabang pertama menangkapnya, dan 50 tidak dikelaskan langsung. Ujian sempadan direka untuk mendedahkan perbezaan satu unit pada operator perbandingan, iaitu tempat kebanyakan pepijat pemilihan berlaku.