SPM KMK 2216 study materials
SPM KMK 2216 study resources

Inventori dua array yang tidak lagi sepadan

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

All case studies

Inventori dua array yang tidak lagi sepadan

Kelab Robotik menyimpan inventori dalam dua array selari: namaAlat[12] dan kuantiti[12]. Pada mulanya kesemua 12 petak digunakan. Apabila penasihat memadam alat pada kedudukan ke-4, dia mengalihkan nama dari kedudukan 4 hingga 11 satu langkah ke kiri dan menetapkan bilangan = bilangan - 1, tetapi tidak berbuat demikian pada array kuantiti. Selepas itu, alat bernama 'pemutar skru' muncul dengan kuantiti 7 sedangkan kuantiti sebenar ialah 2, dan alat terakhir tidak dapat dipaparkan - atur cara berhenti dengan ralat 'index out of range' apabila gelung menggunakan for i = 1 to bilangan dengan bilangan = 12. Carian inventori menggunakan gelung dari 0 hingga 11 dan berhenti pada padanan pertama; kelab mempunyai dua entri 'sensor', satu daripadanya sudah tiada stok (kuantiti 0). Ahli kelab perlu membetulkan atur cara sebelum mesyuarat tahunan dan sebelum menambah 8 alat baharu tahun depan.

1. Terangkan mengapa kuantiti tidak lagi sepadan dengan nama alat selepas pemadaman, dan tulis semula langkah pemadaman yang betul.

Read the worked answer

Dua array selari hanya berfungsi jika indeks yang sama merujuk item yang sama. Penasihat mengalihkan namaAlat tetapi bukan kuantiti, jadi selepas pemadaman namaAlat[3] ialah 'pemutar skru' (asalnya indeks 4) manakala kuantiti[3] masih 7, iaitu kuantiti alat yang telah dipadam. Pasangan nama-kuantiti beralih satu langkah untuk semua item selepas kedudukan 4, dan bilangan dikurangkan, jadi ralat tidak dapat dikesan daripada bilangan sahaja.

Pemadaman yang betul (kedua-dua array, arah menaik):

for i = 3 to bilangan - 2:
    namaAlat[i] = namaAlat[i + 1]
    kuantiti[i] = kuantiti[i + 1]
bilangan = bilangan - 1
namaAlat[bilangan] = ''
kuantiti[bilangan] = 0

Arah gelung penting: semasa memadam kita bergerak dari kiri ke kanan (indeks menaik); semasa memasukkan ke tengah, kita mesti bergerak dari kanan ke kiri supaya data tidak ditimpa sebelum disalin. Mengosongkan petak terakhir menghalang data lama daripada 'hidup semula' apabila bilangan bertambah.

2. Mengapa ralat 'index out of range' berlaku walaupun hanya 12 petak digunakan? Kaitkan dengan asas indeks dan tulis gelung yang betul.

Read the worked answer

Ralat itu berlaku kerana dua konvensyen bercampur. Array dalam kebanyakan bahasa (Python, Java, C) bermula pada indeks 0, jadi array bersaiz 12 mempunyai indeks sah 0 hingga 11. Gelung for i = 1 to bilangan dengan bilangan = 12 melawat indeks 1 hingga 12; indeks 12 berada di luar julat dan menyebabkan 'index out of range'. Pada masa yang sama, indeks 0 tidak pernah dipaparkan, jadi alat pertama senyap-senyap hilang daripada laporan - ini lebih berbahaya daripada ralat itu sendiri kerana tiada mesej ralat langsung.

Gelung yang betul: for i = 0 to bilangan - 1, atau while i < bilangan. Jika pseudocode rasmi kursus menggunakan 1-based, tetapkan satu konvensyen sahaja dan gunakan bilangan sebagai kiraan, bukan sebagai indeks terakhir.

Uji dengan bilangan = 1 dan bilangan = 0: kedua-dua kes mendedahkan ralat sempadan dengan segera, kerana bilangan = 1 akan cuba mencetak petak kosong dan bilangan = 0 tidak sepatutnya mencetak apa-apa.

3. Kelab bercadang menambah 8 alat baharu tahun depan. Bandingkan dua array selari dengan satu senarai rekod (`alat = [{nama, kuantiti}, ...]`). Cadangkan satu pilihan dan berikan justifikasi berdasarkan operasi kelab.

Read the worked answer

Cadangan: senarai rekod.

Justifikasi berdasarkan operasi kelab:

  • Setiap operasi (tambah, padam, isih, cari, kemas kini stok) mesti mengemas kini kedua-dua array secara serentak. Satu gelung yang tertinggal menghasilkan tepat masalah yang berlaku sekarang, dan ralat itu tidak menghasilkan mesej - ia hanya memaparkan nombor yang salah.
  • Menyusun mengikut nama memerlukan pertukaran pada kedua-dua array; dengan rekod, menukar satu elemen mengekalkan pasangan nama-kuantiti secara automatik.
  • Kelab mahu menambah 8 alat baharu; senarai boleh membesar secara dinamik tanpa mengisytiharkan semula saiz 12, manakala array bersaiz tetap memerlukan pengiraan semula dan boleh melimpah.
  • Kos: sintaks lebih panjang sedikit dan perlu akses medan (.nama, .kuantiti), serta carian perlu membandingkan medan tertentu dan bukan indeks.

Array selari masih boleh diterima jika data kecil, tetap dan hanya dibaca (contoh: nama bulan dan bilangan hari), kerana ia ringkas dan pantas. Untuk inventori yang berubah setiap bulan, senarai rekod jauh lebih selamat.