SPM KMK 2216 study materials
SPM KMK 2216 study resources

Purata kelas kedua yang menjadi 153.7

SPM KMK 2216 · Put your knowledge to work in context.

All case studies

Purata kelas kedua yang menjadi 153.7

Program penilaian markah sekolah mengira purata dua kelas: 5 Amanah (30 pelajar, jumlah markah 2,400) dan 5 Bestari (28 pelajar, jumlah markah 2,212). Atur cara menggunakan pemboleh ubah global jumlah yang dimulakan dengan 0 sebelum fungsi pertama dipanggil:

set jumlah = 0
function tambahMarkah(markah)
    set jumlah = jumlah + markah
    return jumlah
end function

function kiraPurata(markah, bilangan)
    set bilangan = 30
    return jumlah / bilangan
end function

Purata 5 Amanah betul (80.0), tetapi purata 5 Bestari dipaparkan sebagai 153.7. Guru menukar argumen dalam pemanggilan kiraPurata(jumlahBestari, 28), tetapi keputusan tidak berubah. Dia juga cuba gred = paparGred(75) dan mendapat ralat kerana paparGred ditulis sebagai procedure. Program ini akan digunakan untuk 6 kelas, jadi pembetulan mesti dibuat pada struktur modul dan bukan dengan menukar nombor satu per satu.

1. Kesan punca purata 5 Bestari menjadi 153.7. Tunjukkan pengiraan dan jelaskan mengapa markah pelajar bukan puncanya.

Read the worked answer

jumlah ialah pemboleh ubah global yang tidak ditetapkan semula antara kelas. Selepas 5 Amanah, jumlah = 2,400. Apabila markah 5 Bestari ditambah melalui tambahMarkah, fungsi itu menambah kepada nilai sedia ada: 2,400 + 2,212 = 4,612. kiraPurata kemudian membahagi 4,612 dengan 30 (bukan 28), menghasilkan 153.73.

Jadi dua pepijat bergabung: keadaan global yang tertinggal antara panggilan, dan pembahagi yang tersalah. Markah pelajar tidak salah sama sekali - 2,212 / 28 = 79.0 adalah betul, dan itulah nilai yang sepatutnya dipaparkan.

Pembetulan struktur: jadikan fungsi tulen (pure) - hantar jumlah dan bilangan sebagai parameter, pulangkan hasil tanpa menyentuh pemboleh ubah global:

function kiraPurata(jumlahMarkah, bilanganPelajar)
    if bilanganPelajar = 0 then return 0
    return jumlahMarkah / bilanganPelajar
end function

Jika jumlah terpaksa dikekalkan, set semula jumlah = 0 sebelum setiap kelas - tetapi ini mudah terlupa apabila kelas ke-7 ditambah, jadi elakkan keadaan global sepenuhnya.

2. Mengapa menukar argumen 28 dalam pemanggilan tidak memberi sebarang kesan? Terangkan konsep skop yang terlibat dan pembetulannya.

Read the worked answer

Dalam kiraPurata(markah, bilangan), bilangan ialah parameter, iaitu pemboleh ubah lokal yang menerima nilai daripada pemanggil. Baris pertama badan fungsi, set bilangan = 30, menulis ganti nilai itu serta-merta. Argumen 28 sampai ke fungsi tetapi dibuang sebelum digunakan, jadi menukar 28 kepada 27 atau 30 pada pemanggilan tidak mengubah apa-apa. Ini juga menerangkan mengapa purata 5 Amanah kelihatan betul: kebetulan bilangannya memang 30.

Pembetulan: buang set bilangan = 30 dan gunakan parameter tersebut. Jangan masukkan kiraan pelajar sebagai pemalar dalam fungsi; kiraan harus datang daripada data, contohnya bilangan = panjang(senaraiMarkah), kerana bilangan pelajar berubah setiap tahun dan setiap kelas.

Amalan baik: jangan sekali-kali menetapkan semula parameter di dalam fungsi. Jika benar-benar perlukan pemboleh ubah sementara, gunakan nama berbeza (contoh bilanganSementara) supaya semakan kod dapat mengesan 'parameter yang tidak digunakan' dan pembaca nampak dengan jelas nilai mana yang sebenarnya digunakan.

3. Bezakan function dan procedure, dan betulkan `gred = paparGred(75)` dengan menerangkan kesan setiap pilihan terhadap program 6 kelas ini.

Read the worked answer

Function mengembalikan satu nilai dan dipanggil di dalam ungkapan (purata = kiraPurata(...)); ia mesti mempunyai return. Procedure melakukan tindakan (memaparkan, menulis fail, mengemas kini) dan dipanggil sebagai satu pernyataan; ia tidak mengembalikan nilai. paparGred ditulis sebagai procedure, jadi gred = paparGred(75) tidak sah - tiada nilai untuk diberikan kepada gred, dan sesetengah bahasa memberi ralat 'fungsi tidak mengembalikan nilai'.

Dua pembetulan yang mungkin:

  1. Tukar kepada function jika gred diperlukan kemudian: function tentukanGred(markah) ... return 'B', kemudian gred = tentukanGred(75).
  2. Kekalkan procedure dan panggil sebagai pernyataan: paparGred(75), yang terus mencetak 'B'.

Pilihan yang lebih baik untuk 6 kelas: asingkan logik daripada output - tentukanGred() sebagai function yang memulangkan gred, dan paparGred(gred) sebagai procedure yang mencetak. Dengan cara ini gred boleh dijumlahkan, disimpan ke fail dan disemak semula tanpa bergantung pada output skrin, dan format laporan boleh diubah tanpa menyentuh logik penggredan.