Kamis, 28 Mei 2026

Belajar Pemrograman Scratch. Bab 9

9
List

Program yang telah kita tulis sejauh ini telah menggunakan variabel biasa untuk menyimpan satu bagian data. Namun, variabel seperti itu tidak begitu berguna ketika Anda ingin menyimpan sejumlah nilai, seperti nomor telepon teman Anda, nama buku, atau pembacaan suhu selama sebulan. Misalnya, jika Anda ingin program Anda mengingat nomor telepon 20 teman Anda, Anda akan membutuhkan 20 variabel! Tentu saja, menulis dan memelihara program dengan 20 variabel akan membosankan. Dalam bab ini, kita akan menjelajahi tipe data bawaan lain, yang disebut list, yang menawarkan cara mudah untuk mengelompokkan nilai-nilai yang terkait. Berikut yang akan kita bahas:

  • Cara membuat dan memanipulasi daftar
  • Menginisialisasi dan mengakses elemen individual dalam daftar
  • Teknik pengurutan dan pencarian dasar
  • Menggunakan daftar untuk membuat aplikasi yang ampuh

Pertama, saya akan menjelaskan cara membuat daftar di Scratch, mendemonstrasikan perintah yang dapat Anda gunakan dengannya, dan menunjukkan cara mengisi daftar dengan data yang dimasukkan oleh pengguna. Kemudian kita akan membahas daftar numerik dan operasi umum yang dilakukan padanya, seperti menemukan nilai minimum, maksimum, dan rata-rata elemennya. Setelah itu, kita akan mempelajari satu algoritma untuk mengurutkan elemen dalam daftar. Kita akan mengakhiri dengan beberapa contoh program yang mendemonstrasikan beberapa aplikasi daftar di dunia nyata.

Daftar di Scratch
Daftar seperti wadah tempat Anda dapat menyimpan dan mengakses banyak nilai. Anda dapat menganggapnya sebagai lemari dengan banyak laci, dengan setiap laci menyimpan satu barang. Saat Anda membuat daftar, Anda memberinya nama seperti halnya variabel. Anda kemudian dapat mengakses elemen-elemen individual dari daftar menggunakan posisi penyimpanannya dalam daftar. Gambar 9-1, misalnya, menggambarkan sebuah daftar bernama dayList yang menyimpan nama-nama tujuh hari dalam seminggu.

Anda dapat merujuk ke item yang terdapat dalam daftar menggunakan indeks penyimpanannya (atau posisinya). Di Scratch, item pertama memiliki indeks 1, item kedua adalah 2, dan seterusnya. Misalnya, karena Selasa berada di urutan ketiga dalam daftar, maka indeksnya adalah 3. Oleh karena itu, Anda dapat merujuk ke elemen ketiga dari dayList kita menggunakan perintah berbentuk “item 3 dari dayList.”

Mari kita langsung mulai dan membuat beberapa daftar di Scratch. Kita juga akan melihat perintah-perintah yang memungkinkan kita untuk mengelola dan memanipulasi daftar dalam program kita dan mempelajari bagaimana Scratch merespons perintah daftar yang tidak valid.

Membuat Daftar
Membuat daftar hampir identik dengan membuat variabel. Pilih palet Data dan klik Buat Daftar untuk memunculkan dialog pada Gambar 9-2 (kanan).


Selanjutnya, masukkan nama daftar (kita akan menggunakan dayList) dan tentukan cakupannya. Memilih opsi Untuk semua sprite akan membuat daftar global yang dapat diakses oleh sprite mana pun di aplikasi Anda, sedangkan opsi Hanya untuk sprite ini akan membuat daftar lokal yang dimiliki oleh sprite yang saat ini dipilih. Daftar lokal hanya dapat dibaca (dan ditulis) oleh sprite pemilik.

Saat Anda mengklik OK untuk mengkonfirmasi input Anda, Scratch akan membuat daftar kosong baru dan menampilkan blok terkait daftar, seperti yang diilustrasikan pada Gambar 9-3. Ini mirip dengan apa yang akan Anda lihat saat membuat variabel baru. Daftar kosong adalah daftar yang tidak berisi item apa pun.

Anda dapat menggunakan perintah baru ini untuk memanipulasi isi daftar Anda saat skrip Anda berjalan. Anda dapat menambahkan item baru, menyisipkan item pada posisi tertentu, menghapus item tertentu, atau mengganti nilai item yang sudah ada.




Gambar 9-2: Membuat daftar di Scratch mirip dengan membuat variabel.

Gambar 9-3: Blok perintah dan fungsi yang dapat Anda gunakan dengan daftar

Saat daftar baru dibuat, Scratch juga menampilkan monitor daftar di Stage, seperti yang diilustrasikan pada Gambar 9-4. Daftar awalnya akan kosong, sehingga panjangnya dimulai dari 0. Anda dapat menggunakan blok monitor ini untuk menambahkan entri ke daftar Anda saat Anda mendesain program.

Gambar 9-4: Monitor dari daftar yang baru dibuat ditampilkan di Stage.

Jika Anda mengetahui data yang ingin Anda simpan dalam daftar (seperti halnya untuk dayList kita), Anda dapat menambahkannya ke daftar pada titik ini. Gambar 9-5 menunjukkan bagaimana Anda dapat menambahkan hari ke dayList menggunakan monitornya.

Gambar 9-5: Mengisi dayList

Klik tanda plus di sudut kiri bawah tujuh kali untuk membuat tujuh entri dan kemudian masukkan hari dalam seminggu di dalam setiap kotak edit. Gunakan tombol tab untuk menavigasi item daftar. Menekan tombol Tab sekali akan menyorot item daftar berikutnya dengan garis tepi kuning. Menekan tombol Tab sekali lagi akan menyorot teks yang dapat diedit dari item yang dipilih dan menghilangkan garis tepi kuning. Jika Anda mengklik tanda plus saat item yang saat ini dipilih dikelilingi oleh garis tepi kuning, item daftar baru akan ditambahkan setelah item saat ini; jika tidak, item tersebut akan ditambahkan sebelum item saat ini. Cobalah menavigasi daftar!

coba 9-1
Isi dayList dengan nama-nama hari dalam seminggu, seperti yang ditunjukkan pada Gambar 9-5.

Perintah Daftar
Gambar 9-3 menjelaskan semua blok yang ditambahkan Scratch saat kita membuat dayList kita. Di bagian ini, kita akan melihat lebih dekat blok-blok ini untuk lebih memahami fungsinya.

Tambah dan Hapus
Perintah tambah menempatkan item baru di akhir daftar, sedangkan perintah hapus menghapus item yang sudah ada.


Gambar 9-6: Daftar sebelum dan sesudah penambahan dan penghapusan digunakan untuk mengubah isinya

Perintah penambahan cukup mudah, tetapi mari kita periksa perintah penghapusan lebih dekat. Anda dapat mengetik indeks elemen yang ingin Anda hapus langsung ke slot parameter blok, atau Anda dapat mengklik panah tarik-turun. Menu tarik-turun (lihat Gambar 9-6) menunjukkan tiga pilihan: 1, terakhir, dan semua. Pilih 1 untuk menghapus item pertama (“Apple”) dari daftar, pilih terakhir untuk menghapus item terakhir (“Mango”), atau pilih semua untuk menghapus semua item dari daftar.

Sisipkan dan Ganti
Katakanlah Anda ingin menyimpan nama dan nomor telepon teman Anda secara alfabetis dalam sebuah daftar, seperti daftar kontak di ponsel Anda. Saat Anda membuat daftar Anda, Anda perlu memasukkan informasi kontak setiap teman pada posisi yang tepat. Kemudian, jika seorang teman mendapatkan nomor telepon baru, Anda perlu mengedit daftar untuk memasukkannya. Perintah sisipkan dan ganti dapat membantu Anda dengan tugas-tugas ini. Gambar 9-7 menunjukkan contoh penggunaan perintah sisipkan dan ganti dengan daftar telepon kita.


Gambar 9-7: Menggunakan perintah sisipkan dan ganti untuk memperbarui daftar nomor telepon

Perintah ganti menimpa string saat ini di slot nomor 3 dengan nomor telepon baru Kim. Perintah sisipkan menempatkan nomor telepon teman baru, Mark, di slot nomor 4 dalam daftar. Perhatikan bahwa elemen yang ada bergeser ke bawah satu slot untuk memberi ruang bagi entri baru.

Mengklik panah bawah nomor item di perintah ganti dan sisipkan akan menampilkan menu tarik-turun dengan tiga pilihan: 1, terakhir, dan acak (lihat Gambar 9-7). Jika Anda memilih acak, perintah yang dipilih akan memilih nomor item secara acak. Anda akan melihat beberapa aplikasi yang berguna dari fitur ini nanti di bab ini.

Mengakses Elemen Daftar 
Seperti yang telah kami sebutkan sebelumnya, Anda dapat mengakses elemen apa pun dalam daftar menggunakan indeks elemen tersebut. Misalnya, skrip pada Gambar 9-8 menunjukkan penggunaan blok `item of` untuk mengakses elemen-elemen dari `dayList` kita. Skrip ini menggunakan variabel bernama `pos` (singkatan dari `position`) untuk mengulang setiap item dalam daftar, menampilkan isinya melalui perintah `say`.


Gambar 9-8: Skrip ini menyebabkan sprite menampilkan tujuh hari dari `dayList` kita.

Skrip menginisialisasi nilai `pos` menjadi 1 sehingga dapat mengakses elemen pertama dalam `dayList`, dan kemudian skrip memasuki perulangan. Jumlah pengulangan perulangan diatur menjadi 7, jumlah elemen dalam daftar kita. Pada setiap putaran, perulangan akan menyebutkan item daftar dengan indeks yang sama dengan `pos` dan menambah nilai `pos` untuk mengakses elemen berikutnya. Dengan kata lain, kita menggunakan `pos` sebagai indeks untuk menentukan elemen tertentu dalam daftar.


Cobalah 9-2
Ganti angka literal 7 dalam perulangan `repeat` dengan panjang blok `dayList`.


Inilah yang biasanya Anda lakukan untuk menelusuri daftar jika Anda tidak tahu berapa banyak item yang ada di dalamnya. Selain itu, pilih acak dari menu tarik-turun pertama di blok item. Ini akan menyebabkan skrip menampilkan item dari daftar secara acak.

Blok Contains
Anda dapat memeriksa apakah string tertentu ada dalam daftar dengan menggunakan contains, sebuah blok Boolean yang mengembalikan nilai true atau false berdasarkan apakah daftar tersebut berisi string Anda atau tidak. Skrip yang ditunjukkan pada Gambar 9-9 mengilustrasikan salah satu penggunaan blok ini. Karena dayList berisi string "Jumat", perintah say di dalam blok if akan dieksekusi.

Catatan: Blok contains tidak peka huruf besar/kecil. Blok dayList contains friDAY, misalnya, juga akan bernilai true.


Gambar 9-6: Daftar sebelum dan sesudah penambahan dan penghapusan digunakan untuk mengubah isinya

Perintah penambahan cukup mudah, tetapi mari kita periksa perintah penghapusan lebih dekat. Anda dapat mengetik indeks elemen yang ingin Anda hapus langsung ke slot parameter blok, atau Anda dapat mengklik panah tarik-turun. Menu tarik-turun (lihat Gambar 9-6) menunjukkan tiga pilihan:

1, terakhir, dan semua. Pilih 1 untuk menghapus item pertama (“Apple”) dari daftar, pilih terakhir untuk menghapus item terakhir (“Mango”), atau pilih semua untuk menghapus semua item dari daftar.

Sisipkan dan Ganti
Katakanlah Anda ingin menyimpan nama dan nomor telepon teman Anda secara alfabetis dalam sebuah daftar, seperti daftar kontak di ponsel Anda. Saat Anda membuat daftar Anda, Anda perlu memasukkan informasi kontak setiap teman pada posisi yang tepat. Kemudian, jika seorang teman mendapatkan nomor telepon baru, Anda perlu mengedit daftar untuk memasukkannya. Perintah sisipkan dan ganti dapat membantu Anda dengan tugas-tugas ini. Gambar 9-7 menunjukkan contoh penggunaan perintah sisipkan dan ganti dengan daftar telepon kita.


Gambar 9-7: Menggunakan perintah sisipkan dan ganti untuk memperbarui daftar nomor telepon

Perintah ganti menimpa string saat ini di slot nomor 3 dengan nomor telepon baru Kim. Perintah sisipkan menempatkan nomor telepon teman baru, Mark, di slot nomor 4 dalam daftar. Perhatikan bahwa elemen yang ada bergeser ke bawah satu slot untuk memberi ruang bagi entri baru.

Mengklik panah bawah nomor item di perintah ganti dan sisipkan akan menampilkan menu tarik-turun dengan tiga pilihan: 1, terakhir, dan acak (lihat Gambar 9-7). Jika Anda memilih acak, perintah yang dipilih akan memilih nomor item secara acak. Anda akan melihat beberapa aplikasi yang berguna dari fitur ini nanti di bab ini.

Mengakses Elemen Daftar
Seperti yang telah kami sebutkan sebelumnya, Anda dapat mengakses elemen apa pun dalam daftar menggunakan indeks elemen tersebut. Misalnya, skrip pada Gambar 9-8 menunjukkan penggunaan blok `item of` untuk mengakses elemen-elemen dari `dayList` kita. Skrip ini menggunakan variabel bernama `pos` (singkatan dari `position`) untuk mengulang setiap item dalam daftar, menampilkan isinya melalui perintah `say`.


Gambar 9-8: Skrip ini menyebabkan sprite menampilkan tujuh hari dari `dayList` kita.

Skrip menginisialisasi nilai `pos` menjadi 1 sehingga dapat mengakses elemen pertama dalam `dayList`, dan kemudian skrip memasuki perulangan. Jumlah pengulangan perulangan diatur menjadi 7, jumlah elemen dalam daftar kita. Pada setiap putaran, perulangan akan menyebutkan item daftar dengan indeks yang sama dengan `pos` dan menambah nilai `pos` untuk mengakses elemen berikutnya. Dengan kata lain, kita menggunakan `pos` sebagai indeks untuk menentukan elemen tertentu dalam daftar.


Cobalah 9-2 
Ganti angka literal 7 dalam perulangan `repeat` dengan panjang blok `dayList`.


Inilah yang biasanya Anda lakukan untuk menelusuri daftar jika Anda tidak tahu berapa banyak item yang ada di dalamnya. Selain itu, pilih acak dari menu tarik-turun pertama di blok item. Ini akan menyebabkan skrip menampilkan item dari daftar secara acak.


Blok Contains
Anda dapat memeriksa apakah string tertentu ada dalam daftar dengan menggunakan contains, sebuah blok Boolean yang mengembalikan nilai true atau false berdasarkan apakah daftar tersebut berisi string Anda atau tidak. Skrip yang ditunjukkan pada Gambar 9-9 mengilustrasikan salah satu penggunaan blok ini. Karena dayList berisi string "Jumat", perintah say di dalam blok if akan dieksekusi.

Catatan: Blok contains tidak peka huruf besar/kecil. Blok dayList contains friDAY, misalnya, juga akan bernilai true.

Gambar 9-9: Menggunakan blok contains untuk memeriksa apakah sebuah string ada dalam daftar

Pemeriksaan Batas 
Keempat blok daftar (delete, insert, replace, dan item of) memerlukan parameter input yang menentukan indeks item yang ingin Anda akses.


Misalnya, untuk menghapus elemen ketujuh dari dayList kita, kita menggunakan `delete 7` dari dayList. Tetapi menurut Anda apa yang akan terjadi jika Anda menggunakan indeks yang tidak valid dengan salah satu blok ini? Misalnya, bagaimana Scratch akan merespons jika Anda memintanya untuk menghapus elemen kedelapan dari dayList kita (yang hanya berisi tujuh elemen)?

Mencoba mengakses elemen di luar batas daftar, secara teknis, adalah kesalahan. Namun, alih-alih menampilkan pesan kesalahan atau menghentikan program Anda secara tiba-tiba, Scratch diam-diam mencoba melakukan sesuatu yang masuk akal dengan blok yang bermasalah. Karena alasan ini, tidak adanya pesan kesalahan tidak selalu berarti tidak adanya kesalahan. Masalah mungkin masih ada dalam kode Anda, dan ketika itu terjadi, Anda masih perlu memperbaikinya. Scratch tidak akan mengeluh tentang indeks yang tidak valid dalam blok Anda, tetapi hasilnya biasanya tidak akan seperti yang Anda inginkan.

Tabel 9-1 menunjukkan apa yang dapat terjadi ketika Anda mencoba mengakses dayList menggunakan indeks di luar rentang.


Tabel 9-1: Hasil yang Tidak Terduga dari Indeks Daftar yang Buruk



Contoh-contoh dalam Tabel 9-1 menunjukkan bahwa, meskipun blok Scratch berusaha melakukan sesuatu yang masuk akal ketika inputnya tidak valid, mereka belum tentu melakukan hal yang benar. Anda harus memberikan program Anda input yang tepat agar berfungsi sesuai keinginan Anda. Sampai saat ini, contoh-contoh kita telah menggunakan daftar sederhana yang kita buat secara manual menggunakan monitornya. Pertanyaannya sekarang adalah: Bagaimana jika Anda tidak mengetahui isi daftar saat Anda menulis program Anda? Misalnya, Anda mungkin perlu membuat daftar angka yang dimasukkan pengguna atau mengisi daftar dengan nilai acak setiap kali program dijalankan. Kita akan membahas masalah ini selanjutnya.


Daftar Dinamis
Daftar sangat ampuh karena dapat tumbuh atau menyusut secara dinamis saat program berjalan. Misalnya, katakanlah Anda sedang menulis aplikasi buku nilai, di mana guru dapat memasukkan nilai ujian siswa untuk diproses lebih lanjut. (Guru mungkin perlu mencari nilai maksimum, minimum, rata-rata, median, dan sebagainya untuk suatu kelas.) Namun, jumlah siswa mungkin berbeda untuk setiap kelas. Guru mungkin perlu memasukkan 20 nilai untuk Kelas 1, 25 nilai untuk Kelas 2, dan seterusnya. Bagaimana program Anda dapat mengetahui bahwa guru telah selesai memasukkan nilai? Bagian ini akan menjawab pertanyaan itu.

Pertama, kita akan memperkenalkan dua cara untuk mengisi daftar dengan data dari pengguna.

Kemudian kita akan menjelajahi daftar numerik dan melihat beberapa operasi umum yang dilakukan padanya. Setelah Anda memahami konsep-konsep fundamental, Anda akan siap untuk mengadaptasi teknik-teknik ini ke aplikasi Anda sendiri.

Mengisi Daftar dengan Input Pengguna
Ada dua cara umum untuk mengisi daftar dengan data yang dimasukkan oleh pengguna. Dalam metode pertama, program Anda dimulai dengan menanyakan berapa banyak entri yang akan ada dan kemudian memulai perulangan untuk mengumpulkan input pengguna.


Sebuah skrip yang mendemonstrasikan teknik ini ditunjukkan pada Gambar 9-10.

Setelah pengguna memberi tahu skrip ini berapa banyak skor yang diharapkan, skrip memulai perulangan dengan jumlah pengulangan yang sama dengan masukan pengguna. Setiap iterasi dari perulangan kemudian meminta pengguna untuk memasukkan skor baru dan menambahkan nilai tersebut ke dalam daftar, yang disebut scoreList.

Cara kedua untuk mengisi daftar secara dinamis adalah dengan meminta pengguna memasukkan nilai khusus (dikenal sebagai sentinel) untuk menandai akhir daftar. Tentu saja, Anda harus memilih sentinel yang tidak akan disalahartikan sebagai anggota dari daftar. Jika Anda mengharapkan daftar nama atau angka positif, misalnya, sentinel –1 adalah pilihan yang baik. Sebaliknya, jika pengguna akan memasukkan nilai negatif, maka –1 bukanlah sentinel yang baik. Menggunakan nilai penanda –1 akan berfungsi untuk scoreList kita, dan skrip yang ditunjukkan pada Gambar 9-11 menggunakan penanda ini untuk mengetahui kapan pengguna selesai memasukkan nilai.


Gambar 9-10: Menanyakan kepada pengguna berapa banyak skor yang akan dimasukkan


Gambar 9-11: Menggunakan penanda untuk mengontrol pertumbuhan daftar

Pada setiap iterasi loop, skrip meminta pengguna untuk memasukkan angka dan membandingkan nilai tersebut dengan penanda. Perhatikan bahwa skrip menentukan penanda (–1 dalam hal ini) dalam perintahnya kepada pengguna. Jika pengguna memasukkan –1, maka skrip berhenti karena mengetahui pengguna telah selesai memasukkan skor.

Jika tidak, nilai input ditambahkan ke daftar, dan pengguna diminta untuk memasukkan entri lain. Gambar 9-11 menunjukkan bagaimana scoreList seharusnya terlihat jika pengguna memasukkan tiga skor diikuti oleh penanda.


Membuat Bagan Batang
Sebagai contoh praktis pengumpulan input pengguna dengan daftar, mari kita buat aplikasi yang menggambar bagan batang (juga disebut histogram) dari angka-angka pengguna. Untuk kesederhanaan, kita hanya akan menerima lima angka antara 1 dan 40. Setelah program menerima kelima angka tersebut, program akan menggambar lima batang dengan tinggi proporsional dengan nilai yang dimasukkan. Antarmuka pengguna untuk pembuat bagan kita diilustrasikan pada Gambar 9-12.


Gambar 9-12: Aplikasi Bagan Batang

Aplikasi ini berisi tiga sprite. Sprite Driver mengontrol alur aplikasi; sprite ini berisi skrip yang menerima input pengguna, mengisi daftar, dan memberi tahu sprite Painter untuk mulai menggambar. Sprite Painter adalah sprite tak terlihat yang menggambar bagan batang. Sprite Frame murni kosmetik; sprite ini menyembunyikan bagian bawah setiap batang agar terlihat rata; tanpanya, bagian bawah batang vertikal akan memiliki ujung yang membulat. Nilai numerik untuk kelima batang ditampilkan menggunakan lima variabel, bernama n1 hingga n5, yang monitornya terletak di posisi kanan pada Stage. Saat Anda mengklik ikon bendera hijau untuk memulai aplikasi, sprite Driver menjalankan skrip yang ditunjukkan pada Gambar 9-13.



Gambar 9-13: Skrip utama untuk sprite Pengemudi

Pertama, sprite Pengemudi muncul di Panggung dan menghapus semua tanda pena sebelumnya u. Dengan begitu, jika sudah ada grafik batang, grafik tersebut akan dihapus sebelum grafik batang baru digambar. Skrip kemudian membersihkan numList sehingga kita dapat menggunakannya untuk mengumpulkan entri baru dari pengguna dan memanggil ShowValues ​​v untuk mengatur n1 hingga n5 sehingga monitor mereka akan kosong.

Ketika Panggung siap, skrip memasuki loop pengulangan w, yang berulang lima kali. Di dalam loop, Pengemudi meminta pengguna untuk memasukkan angka dan menambahkan angka tersebut ke numList. Setelah mengumpulkan kelima angka dari pengguna dan menyimpannya di numList, sprite Pengemudi menyembunyikan dirinya x untuk memberi ruang bagi grafik batang. Kemudian ia memanggil ShowValues ​​lagi untuk memperbarui n1 hingga n5 dengan nilai baru pengguna dan menyiarkan Draw sehingga sprite Pelukis akan menggambar kelima batang tersebut.


Sebelum memeriksa bagaimana Painter menggambar batang-batang tersebut, mari kita lihat prosedur ShowValues yang ditunjukkan pada Gambar 9-14.


ShowValues ​​hanya mengatur variabel n1 hingga n5 sama dengan entri yang sesuai dalam numList. Karena panggilan pertama ke ShowValues ​​dilakukan segera setelah mengosongkan numList, kelima variabel akan berisi string kosong setelah panggilan ini. Hal ini mengakibatkan pengosongan kelima monitor di Stage,


Gambar 9-14: Prosedur ShowValues yang persis seperti yang kita inginkan. Ketika numList berisi data dari pengguna, memanggil ShowValues ​​akan menampilkan data di monitor yang sama.


Sekarang mari kita jelajahi prosedur Draw, yang dieksekusi ketika sprite Painter menerima pesan Draw. Anda dapat melihat skrip ini pada Gambar 9-15.


Gambar 9-15: Skrip Draw dari sprite Painter

Sprite pertama-tama mengatur warna pena. Kemudian, ukuran pena diatur ke nilai besar untuk menggambar batang tebal. Untuk mempersiapkan menggambar lima batang vertikal, sprite menunjuk ke arah atas u.

Skrip memulai perulangan untuk menggambar lima batang v. Kita sudah mengetahui posisi x setiap batang sebelumnya, jadi kita membuat daftar bernama xPos untuk menyimpan nilai-nilai tersebut (juga ditunjukkan pada gambar). Selama setiap iterasi perulangan, sprite Painter bergerak ke posisi x untuk batang saat ini, meletakkan penanya, lalu bergerak ke atas untuk menggambar garis vertikal.

Tinggi setiap garis sebanding dengan nilai yang sesuai dalam numList. Area grafik kita di Stage memiliki tinggi 224 piksel, dan karena 40 adalah nilai tertinggi, input 40 seharusnya memiliki batang setinggi grafik. Untuk menemukan tinggi (dalam piksel) untuk angka apa pun dalam numList, kita perlu mengalikan angka tersebut dengan 5,6 (yaitu, 224/40).


Gambar 9-16 menunjukkan output dari aplikasi setelah mendapatkan beberapa data dari pengguna. 

Perhatikan bahwa sprite Frame menutupi ujung bulat dari pena gambar lebar sehingga batang-batangnya terlihat datar di bagian bawah.


Gambar 9-16: Contoh output dari aplikasi Bagan Batang



Cobalah 9-3
Jalankan aplikasi ini beberapa kali untuk memahami cara kerjanya. Ubah skrip agar setiap batang digambar dengan warna yang berbeda. Petunjuk: Buat daftar baru, bernama warna, untuk sprite Painter yang menyimpan nomor warna dari kelima batang dan gunakan perintah berikut sebelum menggambar setiap batang:


Daftar Numerik
Daftar angka muncul dalam banyak aplikasi praktis. Kita dapat memiliki daftar nilai ujian, pengukuran suhu, harga produk, dan banyak lagi. Di bagian ini, kita akan menjelajahi beberapa operasi umum yang mungkin ingin Anda lakukan pada daftar numerik. Secara khusus, kita akan menulis prosedur untuk menemukan nilai maksimum atau minimum dan untuk menemukan rata-rata angka yang disimpan dalam daftar.

Menemukan Min dan Max
Misalkan Anda seorang guru dan Anda perlu mengetahui nilai tertinggi dari ujian terakhir yang diambil kelas Anda. Anda dapat menulis program untuk membandingkan semua nilai ujian tersebut dan menemukan nilai maksimum. Contoh pertama kita, yang ditunjukkan pada Gambar 9-17, menemukan angka tertinggi dalam daftar bernama nilai.

Prosedur FindMax dimulai dengan mengatur nilai variabel maxScore sama dengan angka pertama dalam daftar. Kemudian, prosedur ini memulai perulangan untuk membandingkan angka-angka yang tersisa dalam daftar dengan nilai maxScore saat ini. Setiap kali menemukan nilai yang lebih besar dari maxScore, prosedur ini mengatur maxScore sama dengan nilai tersebut. Ketika perulangan berakhir, nilai yang tersimpan dalam maxScore akan menjadi nilai terbesar yang terdapat dalam daftar.


Gambar 9-17: Menemukan angka maksimum dalam sebuah daftar

Menemukan nilai minimum dalam sebuah daftar mengikuti algoritma yang serupa. Kita mulai dengan mengasumsikan bahwa elemen pertama dalam daftar adalah elemen terkecil, lalu menggunakan perulangan untuk memeriksa elemen-elemen yang tersisa. Setiap kali kita menemukan nilai yang lebih kecil, kita memperbarui variabel yang menyimpan nilai minimum.


Cobalah 9-4
Gunakan apa yang telah Anda pelajari di bagian ini untuk membuat prosedur bernama FindMin yang menemukan nilai minimum dari daftar skor.


Mencari Rata-Rata
Dalam contoh berikutnya, kita akan menulis prosedur yang menghitung rata-rata skor dari angka-angka yang tersimpan dalam daftar skor kita. Anda dapat menemukan rata-rata dari urutan N angka dengan terlebih dahulu mencari jumlahnya dan kemudian membagi totalnya dengan N. Prosedur yang ditunjukkan pada Gambar 9-18 melakukan hal yang sama persis.


Gambar 9-18: Mencari nilai rata-rata dari daftar angka

Prosedur FindAverage menggunakan perulangan untuk menelusuri skor yang tersimpan dalam daftar, menjumlahkannya, dan menyimpan hasilnya dalam variabel bernama sum. (Variabel ini diinisialisasi ke 0 sebelum dimulainya perulangan.) Ketika perulangan berakhir, skrip menghitung rata-rata dengan membagi sum dengan jumlah skor, dan menyimpan hasilnya dalam variabel bernama average.

Perhatikan baik-baik cara kita mengakumulasikan variabel sum di dalam perulangan. Pola ini, yang dikenal sebagai pola akumulator, sering muncul dalam pemrograman.

Di bagian selanjutnya, kita akan mempelajari cara mencari dan mengurutkan daftar, dua masalah umum dalam pemrograman. Saya juga akan memandu Anda melalui beberapa algoritma sederhana untuk melakukan setiap operasi.


Cobalah 9-5
Gabungkan FindAverage, FindMax, dan FindMin ke dalam satu prosedur (disebut ProcessList) yang akan menampilkan nilai rata-rata, maksimum, dan minimum untuk daftar skor secara bersamaan.


Pencarian dan Pengurutan Daftar 
Misalkan Anda memiliki daftar kontak yang tidak dalam urutan tertentu. Jika Anda ingin mengatur kontak, Anda dapat mengurutkannya berdasarkan abjad berdasarkan nama mereka. Jika Anda perlu mengetahui nomor telepon seseorang dan Anda memiliki nama belakangnya, Anda perlu mencari di daftar untuk melihat apakah daftar tersebut berisi informasi kontak orang tersebut. Tujuan bagian ini adalah untuk memperkenalkan teknik pemrograman dasar untuk mencari dan mengurutkan daftar.

Pencarian Linier
Blok contains Scratch menyediakan cara mudah untuk memeriksa apakah suatu daftar berisi item tertentu. Jika, selain itu, kita ingin mengetahui posisi item yang dicari dalam suatu daftar, maka kita harus melakukan pencarian sendiri.

Bagian ini akan menjelaskan satu metode untuk mencari dalam daftar, yang disebut pencarian linier (atau pencarian berurutan). Metode ini mudah dipahami dan diimplementasikan, dan berfungsi pada daftar apa pun, baik yang diurutkan maupun tidak. Namun, karena pencarian linier membandingkan nilai target dengan setiap elemen dalam daftar, proses ini dapat memakan waktu lama jika daftar Anda besar.

Sebagai ilustrasi, misalkan Anda mencari item tertentu dalam daftar bernama buah. Jika daftar tersebut berisi item yang Anda cari, Anda juga perlu mengetahui posisi pasti item tersebut. Prosedur SearchList yang ditunjukkan pada Gambar 9-19 melakukan pencarian linier pada daftar buah untuk memberi kita jawaban yang kita cari.


Gambar 9-19: Prosedur SearchList

Dimulai dengan elemen pertama, SearchList membandingkan buah-buahan dalam daftar kita, satu per satu, dengan buah yang kita cari, yang diwakili oleh parameter target. Prosedur berhenti jika menemukan nilai atau mencapai akhir daftar. Jika skrip menemukan nilai yang kita inginkan, variabel pos akan berisi lokasi di mana item tersebut ditemukan. Jika tidak, prosedur mengatur pos ke nilai yang tidak valid (–1 dalam kasus ini) untuk menunjukkan bahwa item target tidak ada dalam daftar. Gambar 9-20 menunjukkan contoh pemanggilan prosedur ini dan output yang sesuai.


Gambar 9-20: Menggunakan prosedur SearchList

Memeriksa nilai pos memberi tahu pemanggil dua hal: (a) apakah item yang kita cari ada dalam daftar atau tidak dan (b) jika item tersebut ada, posisi tepatnya. Menjalankan skrip ini mengatur pos menjadi 4, menunjukkan bahwa “Peach” ditemukan di posisi keempat dalam daftar buah.


Frekuensi Kemunculan
Misalkan sekolah Anda melakukan survei tentang kualitas makanan kantinnya. Siswa menilai rasa pada skala 1 hingga 5 (1 = buruk, 5 = sangat baik).

Semua suara telah dimasukkan ke dalam daftar, dan Anda diminta untuk menulis program untuk memproses data ini. Untuk saat ini, sekolah hanya ingin mengetahui berapa banyak siswa yang sama sekali tidak menyukai makanan tersebut (yaitu, berapa banyak yang memberikan peringkat 1).

Bagaimana Anda akan menulis program seperti itu?

Jelas, program Anda membutuhkan prosedur yang menghitung berapa kali angka 1 muncul dalam daftar. Untuk mensimulasikan suara siswa, mari kita gunakan daftar yang berisi 100 suara acak. Prosedur yang mengisi daftar ditunjukkan pada Gambar 9-21.


Prosedur ini menambahkan 100 angka acak antara 1 dan 5 ke dalam daftar yang disebut survei.

Sekarang kita memiliki daftar suara, kita dapat menghitung seberapa sering peringkat tertentu muncul dalam daftar tersebut. Kita akan melakukan ini dengan prosedur GetItemCount, yang ditunjukkan pada Gambar 9-22.


Gambar 9-21: Prosedur FillList


Gambar 9-22: Menghitung berapa kali suatu item muncul dalam daftar

Parameter target mewakili item yang dicari, sedangkan variabel itemCount melacak jumlah kali item target ditemukan. Prosedur dimulai dengan mengatur itemCount menjadi 0, dan kemudian memulai perulangan loop untuk mencari nilai yang ditentukan dalam target dalam daftar. Selama setiap iterasi loop, prosedur memeriksa item daftar pada lokasi yang diindeks oleh penghitung loop, n. Jika item tersebut sama dengan target, skrip akan menambah itemCount sebanyak 1. Untuk memberikan informasi kepada kepala sekolah tentang rasa jijik terhadap makanan kantin, kita hanya perlu memanggil GetItemCount dengan argumen 1, seperti yang ditunjukkan pada Gambar 9-23.


Gambar 9-23: Menggunakan prosedur GetItemCount

coba 9-6
Setelah Anda memberikan jawaban atas pertanyaan ini, kepala sekolah tiba-tiba menjadi penasaran tentang berapa banyak siswa yang memberikan peringkat sangat baik untuk kantin. Kepala sekolah juga ingin mengetahui berapa banyak siswa yang berpartisipasi dalam survei. Ubah program dan jalankan lagi untuk memberikan informasi tambahan kepada kepala sekolah.


Pengurutan Gelembung (Bubble Sort)
Jika Anda memiliki sekumpulan nama, skor permainan, atau hal lain yang ingin Anda tampilkan dalam urutan tertentu—alfabetis, dari terbesar ke terkecil, dan dan seterusnya—Anda harus mengurutkan daftar Anda. Ada banyak cara untuk mengurutkan daftar, dan pengurutan gelembung adalah salah satu algoritma yang paling sederhana. (Nama tersebut mengacu pada bagaimana nilai-nilai “menggelembung” ke atas melalui daftar ke posisi yang benar.) Di bagian ini, kita akan mempelajari tentang pengurutan gelembung dan menulis program Scratch untuk melakukan jenis pengurutan ini untuk kita.

Katakanlah kita perlu mengurutkan daftar angka [6 9 5 7 4 8] dalam urutan menurun. Langkah-langkah berikut menggambarkan cara kerja algoritma pengurutan gelembung.

1. Kita akan mulai dengan membandingkan dua elemen pertama dalam daftar. Karena 9 lebih besar dari 6, kita dapat menukar posisinya, seperti yang ditunjukkan di bawah ini.

2. Sekarang kita dapat membandingkan elemen kedua dan ketiga, yaitu 6 dan 5. Karena 6 lebih besar dari 5, kedua angka tersebut sudah berurutan, dan kita dapat melanjutkan ke pasangan berikutnya.

3. Kita akan mengulangi proses ini untuk membandingkan elemen ketiga dan keempat, keempat dan kelima, dan akhirnya elemen kelima dan keenam. Lihatlah daftar setelah tiga perbandingan ini, yang ditunjukkan di bawah ini.

4. Tahapan pengurutan gelembung ini selesai, tetapi daftar kita masih belum dalam urutan yang benar. Kita perlu melakukan tahapan kedua, dimulai dari langkah pertama. Sekali lagi, kita akan membandingkan setiap pasangan elemen dan menukarnya jika perlu.

Berikut daftar setelah tahapan kedua:

5. Kita akan mengulangi proses pengurutan gelembung hingga tidak ada angka yang tertukar selama satu tahapan, yang berarti daftar kita sudah berurutan. Tiga tahapan terakhir dari algoritma tersebut ditunjukkan di bawah ini:


Setelah Anda melihat cara kerja bubble sort, mari kita implementasikan di Scratch. Skrip, yang ditunjukkan pada Gambar 9-24, memiliki dua loop. Loop dalam berputar melalui daftar, membandingkan dan menukar sesuai kebutuhan, dan mengatur flag (bernama done) menjadi 0 ketika diperlukan putaran berikutnya. Loop luar berulang selama flag done bernilai 0, karena nilai tersebut berarti kita belum selesai mengurutkan.

Jika loop dalam menyelesaikan satu putaran tanpa menukar elemen, loop luar akan keluar, mengakhiri prosedur.

Mari kita jelajahi prosedur ini secara lebih detail. Karena kita belum melakukan pengurutan, maka done diatur menjadi 0. Loop luar menggunakan blok repeat until untuk melewati daftar hingga diurutkan (yaitu, hingga done menjadi 1). Pada awal setiap putaran, loop ini mengatur done menjadi 1 (yaitu, mengasumsikan bahwa kita tidak akan melakukan pertukaran). Loop ini juga mengatur pos menjadi 1 untuk memulai pengurutan dengan angka pertama.


Loop dalam kemudian membandingkan setiap pasangan elemen dalam daftar. Loop ini perlu melakukan N – 1 perbandingan x, di mana N adalah jumlah item dalam daftar.

Jika item pada indeks pos+1 lebih besar dari item pada pos y, keduanya perlu ditukar. Jika tidak, prosedur menambahkan 1 ke pos sehingga dapat membandingkan pasangan item berikutnya. Jika kita perlu menukar, prosedur ini melakukannya dengan bantuan variabel sementara bernama temp z.

Setelah proses saat ini melalui daftar berakhir, loop dalam mengatur done kembali ke 0 jika telah menukar angka atau membiarkan done=1 jika tidak ada perubahan. Loop luar akan berlanjut hingga daftar diurutkan.


Gambar 9-24: Prosedur BubbleSort


Cobalah 9-7
Buat daftar nama, bukan angka, dan gunakan skrip bubble sort untuk mengurutkan daftar tersebut. Apakah pengurutan masih berfungsi sebagaimana mestinya? Selain itu, perubahan apa yang perlu Anda lakukan pada prosedur agar dapat diurutkan dalam urutan menaik?


Mencari Median
Sekarang kita tahu cara mengurutkan daftar, kita dapat dengan mudah menemukan nilai median dari urutan angka apa pun. Ingatlah bahwa median adalah nilai tengah dalam kumpulan angka yang telah diurutkan. Jika kita memiliki jumlah item ganjil, kita cukup mengambil angka tengah. Jika kita memiliki jumlah item genap, median adalah rata-rata dari dua angka tengah. Kita dapat menggambarkan median untuk daftar yang telah diurutkan yang terdiri dari N item sebagai berikut:

Prosedur yang melakukan perhitungan ini ditunjukkan pada Gambar 9-25. Prosedur ini mengasumsikan daftar tersebut sudah diurutkan.


Gambar 9-25: Menemukan nilai median dari daftar angka yang diurutkan

Prosedur ini menggunakan blok if/else untuk menangani dua kasus daftar genap dan ganjil. Jika jumlah item dalam daftar habis dibagi 2 tanpa sisa (yaitu, daftar memiliki jumlah item genap) u, variabel median dihitung sebagai rata-rata dari dua angka tengah v. Jika tidak, daftar memiliki jumlah item ganjil w, dan variabel median ditetapkan sama dengan angka di tengah daftar x.

Kita telah membahas banyak hal sejauh ini, jadi sekarang saatnya untuk menerapkan pengetahuan baru kita ke sesuatu yang lebih menantang. Bagian selanjutnya dari bab ini akan membahas beberapa contoh yang menunjukkan cara menggunakan daftar dalam aplikasi yang lebih kompleks.

Proyek Scratch
Di bagian ini, Anda akan menjelajahi proyek Scratch praktis yang menyoroti berbagai aspek daftar. Saya juga akan memperkenalkan beberapa ide dan teknik baru yang dapat Anda gunakan dalam kreasi Anda sendiri.


Sang Penyair
Mari kita mulai proyek bab ini dengan generator puisi. Penyair buatan kita memilih kata-kata secara acak dari lima daftar (artikel, kata sifat, kata benda, kata kerja, dan preposisi) dan menggabungkannya sesuai dengan pola tetap. Untuk memberikan tema sentral pada puisi kita, semua kata dalam daftar ini entah bagaimana berhubungan dengan cinta dan alam. (Tentu saja, kita mungkin masih mendapatkan beberapa puisi konyol, tetapi itu sama menyenangkannya!)


Gambar 9-26: “Menulis” baris pertama sebuah puisi

Skrip ini memilih kata acak dari daftar artikel dan menyimpannya di baris1.

Kemudian skrip menambahkan spasi, kata acak dari daftar kata sifat, spasi lain, dan kata acak dari daftar kata benda. Akhirnya, sprite penyair mengucapkan baris lengkapnya. Saya tidak menunjukkan prosedur untuk dua baris puisi lainnya di sini karena sangat mirip, tetapi Anda dapat membuka Poet.sb2 untuk melihatnya.

Berikut adalah dua puisi yang dibuat oleh penyair mesin kami: setiap jalan yang glamor seekor ikan bergerak di belakang setiap rumah putih kolam biru yang tenang setiap tetes es sebuah hati menatap di bawah setiap gerbang yang menakutkan ratu yang pemalu dan pendiam

cobalah 9-8
Buka Poet.sb2 dan jalankan beberapa kali untuk melihat kemampuan penyair mesin ini dalam menulis puisi. Kemudian ubah program sehingga menggunakan tiga sprite, dengan setiap sprite bertanggung jawab atas satu baris puisi, memungkinkan Anda untuk membaca seluruh puisi di Panggung sekaligus.


Permainan Klasifikasi Segi Empat
Proyek kami selanjutnya adalah permainan sederhana yang akan membantu Anda menjelajahi berbagai jenis segi empat. Permainan ini menampilkan salah satu dari enam bentuk (jajar genjang, belah ketupat, persegi panjang, persegi, trapesium, atau layang-layang) di Panggung dan meminta pemain untuk mengklasifikasikan bentuk tersebut dengan mengklik tombol yang benar, seperti yang diilustrasikan pada Gambar 9-27.


Gambar 9-27: Antarmuka pengguna untuk permainan klasifikasi segi empat

Permainan ini berisi tujuh sprite: enam untuk tombol jawaban dan yang ketujuh (bernama Driver) yang berisi skrip utama. Seperti yang ditunjukkan pada Gambar 9-27, sprite Driver memiliki enam kostum yang sesuai dengan enam segi empat dalam permainan. Saat ikon bendera hijau diklik, sprite Pengemudi akan menjalankan skrip yang ditunjukkan pada Gambar 9-28 untuk memulai permainan.

Pertama, sprite Pengemudi bergerak ke lapisan gambar teratas u sehingga tidak ada tombol yang akan menghalanginya. Dalam loop utama permainan v, skrip akan menampilkan segiempat acak pada setiap putaran dengan ShowShape w. Setelah menampilkan segiempat, skrip akan mengatur variabel global choice menjadi 0 untuk menunjukkan bahwa pengguna belum menjawab x.

Skrip kemudian menunggu y hingga choice berubah menjadi angka bukan nol, yang akan terjadi ketika pemain mengklik salah satu dari enam tombol jawaban. Ketika pemain menebak bentuk, skrip akan memanggil CheckAnswer z untuk memberi tahu pemain apakah jawaban tersebut benar atau salah.

Sekarang setelah Anda mengetahui cara kerja skrip utama, mari kita lihat prosedur ShowShape, yang ditunjukkan pada Gambar 9-29.

Pertama, ShowShape memindahkan sprite Pengemudi ke tengah panggung dan menunjukkannya ke arah acak u. Ia menetapkan variabel bentuk dengan nilai acak dari 1 hingga 6 dan mengganti kostum sprite v untuk menampilkan segi empat agar pemain dapat mengidentifikasinya.


Gambar 9-28: Skrip utama sprite Pengemudi


Gambar 9-29: Prosedur ShowShape pada sprite Pengemudi

Untuk menjaga agar grid latar belakang tetap terlihat, ShowShape mengatur tingkat transparansi w ke nilai acak antara 25 dan 50. Untuk memberikan ilusi bahwa ia menghasilkan bentuk baru setiap putaran, prosedur ini juga mengatur efek warna ke nilai acak untuk mengubah warna kostum x dan mengubah ukuran sprite menjadi 80%, 90%, ..., atau 150% dari ukuran aslinya y.

Selanjutnya, kita akan melihat secara singkat skrip untuk enam sprite tombol, yang ditunjukkan pada Gambar 9-30. Skrip tersebut identik kecuali untuk nilai yang ditetapkan pada variabel pilihan.


Gambar 9-30: Skrip untuk sprite tombol

Skrip satu baris ini masing-masing mengatur nilai pilihan ke angka yang berbeda tergantung pada tombol mana yang ditekan pemain. Setelah pilihan berisi jawaban pemain, prosedur CheckAnswer, yang diilustrasikan pada Gambar 9-31, dapat membandingkannya dengan nilai shape, yang menentukan jenis segiempat yang digambar.

Jika pilihan dan shape sama, maka jawaban pemain benar.

Jika tidak, jawabannya salah, dan sprite akan menyebutkan bentuk yang benar.

CheckAnswer menggunakan variabel shape sebagai indeks ke daftar bernama quadName, yang juga ditunjukkan pada Gambar 9-31, untuk mendapatkan nama yang benar dari bentuk yang ditampilkan.


Cobalah 9-9
Buka QuadClassify.sb2 dan jalankan beberapa kali untuk memahami cara kerjanya. Seperti yang tertulis, permainan ini berjalan selamanya. Ubah program untuk menambahkan kriteria akhir permainan.

Juga, catat jumlah jawaban pemain yang benar dan salah.


Penyihir Matematika
Aplikasi ini mendemonstrasikan dua cara untuk membuat daftar menjadi lebih bermanfaat.

Kita akan mengeksplorasi cara menggunakan daftar untuk menyimpan catatan yang tidak seragam (yaitu, catatan dengan ukuran yang berbeda) serta cara menggunakan satu daftar sebagai indeks untuk daftar lainnya. Sebuah catatan hanyalah kumpulan data terkait tentang seseorang, tempat, atau benda. Dalam kasus kita, setiap catatan terdiri dari jawaban teka-teki beserta instruksi untuk teka-teki tersebut. Meskipun setiap teka-teki memiliki satu jawaban, jumlah instruksi bervariasi dari satu teka-teki ke teka-teki lainnya. Penyihir matematika kita meminta pengguna untuk memikirkan angka "rahasia" dan melakukan serangkaian operasi matematika padanya (menggandakan angka, mengurangi 2, membagi jawaban dengan 10, dan seterusnya). Pada akhirnya, setelah pemain melakukan semua perhitungan ini, penyihir menggunakan kekuatan magis untuk memberi tahu pengguna angka apa yang dimilikinya, meskipun penyihir tidak mengetahui angka awal pengguna. Tabel 9-2 mengilustrasikan cara kerja permainan ini.

Setelah instruksi terakhir, penyihir akan memberi tahu Anda bahwa mengikuti instruksi tersebut telah memberi Anda angka 4, meskipun permainan tidak mengetahui bahwa Anda memulai dengan angka 2. Cobalah teka-teki ini dengan angka yang berbeda untuk mengetahui trik penyihir!

Antarmuka aplikasi ditunjukkan pada Gambar 9-32.

Penyihir Matematika
Aplikasi ini mendemonstrasikan dua cara untuk membuat daftar menjadi lebih bermanfaat.

Kita akan mengeksplorasi cara menggunakan daftar untuk menyimpan catatan yang tidak seragam (yaitu, catatan dengan ukuran yang berbeda) serta cara menggunakan satu daftar sebagai indeks untuk daftar lainnya. Sebuah catatan hanyalah kumpulan data terkait tentang seseorang, tempat, atau benda. Dalam kasus kita, setiap catatan terdiri dari jawaban teka-teki beserta instruksi untuk teka-teki tersebut. Meskipun setiap teka-teki memiliki satu jawaban, jumlah instruksi bervariasi dari satu teka-teki ke teka-teki lainnya.

Penyihir matematika kita meminta pengguna untuk memikirkan angka "rahasia" dan melakukan serangkaian operasi matematika padanya (menggandakan angka, mengurangi 2, membagi jawaban dengan 10, dan seterusnya). Pada akhirnya, setelah pemain melakukan semua perhitungan ini, penyihir menggunakan kekuatan magis untuk memberi tahu pengguna angka apa yang dimilikinya, meskipun penyihir tidak mengetahui angka awal pengguna. Tabel 9-2 mengilustrasikan cara kerja permainan ini.

Setelah instruksi terakhir, penyihir akan memberi tahu Anda bahwa mengikuti instruksi telah memberi Anda angka 4, meskipun permainan tidak mengetahui bahwa Anda memulai dengan angka 2. Cobalah teka-teki ini dengan angka yang berbeda untuk mengetahui trik penyihir! Antarmuka aplikasi ditunjukkan pada Gambar 9-32.


Gambar 9-32: Antarmuka pengguna untuk aplikasi Math Wizard

Aplikasi ini berisi tiga sprite: sprite Penyihir, yang memberikan instruksi kepada pemain, dan sprite OK dan Baru, masing-masing untuk tombol OK dan Permainan Baru. Aplikasi ini juga menggunakan dua daftar yang diilustrasikan pada Gambar 9-33.


Gambar 9-33: Dua daftar yang digunakan oleh sprite Penyihir

Daftar instruksi (kanan) berisi 11 catatan teka-teki. Setiap catatan mencakup: (a) jawaban teka-teki, (b) instruksi, dan (c) elemen kosong untuk menandai akhir catatan tersebut. Entri dalam daftar di sebelah kiri (disebut indeks) mengidentifikasi indeks awal setiap teka-teki dalam daftar instruksi. Misalnya, elemen kedua dalam daftar indeks adalah 9, yang berarti rekaman teka-teki kedua dimulai pada posisi kesembilan dalam daftar instruksi, seperti diilustrasikan pada Gambar 9-33. Mari kita uraikan strategi untuk mengembangkan game ini:

1. Saat pengguna memulai game baru, pilih angka acak antara 1 dan 11 (karena game kita saat ini berisi 11 teka-teki).

2. Lihat daftar indeks untuk posisi awal rekaman teka-teki yang dipilih. Misalnya, jika teka-teki kedua dipilih, daftar indeks memberi tahu kita bahwa rekaman teka-teki ini dimulai pada indeks 9 dalam daftar instruksi.

3. Akses daftar instruksi pada indeks yang ditemukan pada Langkah 2. Elemen pertama pada indeks tersebut diinterpretasikan sebagai jawaban teka-teki. Elemen-elemen berikutnya mewakili instruksi yang akan diucapkan oleh wizard.

4. Biarkan penyihir mengucapkan instruksi teka-teki satu per satu hingga menemukan elemen kosong, yang menandakan instruksi terakhir. Penyihir harus menunggu pengguna menekan tombol OK sebelum mengucapkan instruksi baru.

5. Ungkapkan jawaban teka-teki. Sekarang kita tahu bagaimana permainan seharusnya bekerja secara garis besar, mari kita lihat skrip untuk kedua tombol, yang ditunjukkan pada Gambar 9-34.


Gambar 9-34: Skrip untuk kedua sprite tombol

Tombol New Game menyiarkan pesan NewGame saat diklik. Saat tombol OK diklik sebagai respons terhadap instruksi, sprite mengatur clicked menjadi 1 untuk memberi tahu sprite Penyihir bahwa pemain telah selesai dengan instruksi yang diminta untuk dilakukannya. Saat sprite Penyihir menerima pesan NewGame, ia menjalankan skrip yang ditunjukkan pada Gambar 9-35.


Gambar 9-35: Skrip NewGame dari sprite Penyihir


NewGame dimulai dengan menghapus gelembung ucapan dari teka-teki sebelumnya (jika ada) dan menginisialisasi variabel clicked menjadi 0 u. Kemudian menyimpan nomor teka-teki yang dipilih secara acak dalam variabel bernama puzzleNum v. Setelah itu, membaca posisi awal teka-teki yang dipilih dari daftar indeks dan menyimpannya dalam variabel pos w. Skrip kemudian menggunakan pos untuk membaca jawaban dari teka-teki tersebut dan menyimpannya dalam puzzleAnswer x. Selanjutnya, skrip menambahkan 1 ke pos sehingga menunjuk ke instruksi teka-teki pertama, dan memulai perulangan repeat until untuk mengucapkan instruksi teka-teki secara berurutan y. Setelah mengucapkan setiap instruksi, skrip menunggu variabel clicked diatur ke 1 sebelum beralih ke instruksi berikutnya z. Ketika perulangan menemukan elemen kosong, ia keluar, dan skrip mengucapkan jawaban teka-teki {.


Cobalah 9-10
Jika Anda menghapus salah satu teka-teki atau mengubah jumlah instruksi untuk beberapa teka-teki, maka Anda perlu membangun kembali daftar indeks agar sesuai dengan daftar instruksi.

Tulis prosedur yang secara otomatis mengisi daftar indeks berdasarkan isi daftar instruksi saat ini. Kuncinya adalah mencari string kosong dalam daftar instruksi, karena ini menunjukkan akhir dari satu catatan dan awal dari catatan berikutnya.

Kuis Anatomi Bunga
Di bagian ini, saya akan menggunakan kuis tentang bagian-bagian bunga untuk mendemonstrasikan cara membuat kuis sederhana di Scratch. Gambar 9-36 menunjukkan antarmuka aplikasi contoh kami di awal kuis dan setelah program memeriksa jawaban pengguna. Siapa pun yang mengikuti kuis akan memasukkan huruf untuk mencocokkan bagian-bagian bunga yang diberi label dan kemudian mengklik tombol Periksa untuk memeriksa jawabannya. Program membandingkan jawaban pengguna dengan jawaban yang benar dan memberikan umpan balik menggunakan tanda centang hijau dan ikon X merah di sebelah setiap jawaban. 


Gambar 9-36: Antarmuka pengguna untuk kuis bunga

Kuis ini menggunakan tiga daftar. Daftar pertama (bernama correctAns) berisi huruf-huruf yang sesuai dengan jawaban yang benar untuk sembilan bagian kuis. Daftar kedua (bernama ans) berisi masukan pengguna, dan daftar ketiga (bernama cellYCenter) berisi 11 posisi vertikal yang digunakan oleh sprite Huruf dan YesNo (agar mereka tahu di mana mereka harus menempelkan kostum mereka). Ketika pengguna mengklik mouse di atas salah satu kotak jawaban, sprite Stage mendeteksi klik mouse dan meminta jawaban. Sprite Stage memperbarui elemen yang sesuai dari daftar ans agar sesuai dengan apa yang dimasukkan pengguna dan menempelkan huruf tersebut di atas kotak jawaban. Buka FlowerAnatomy.sb2 untuk membaca skrip yang membaca dan menampilkan jawaban pengguna.

Ketika pengguna mengklik tombol Periksa, sprite YesNo, yang memiliki kostum untuk gambar tanda centang dan X, menjalankan skrip yang ditunjukkan pada Gambar 9-37.


Gambar 9-37: Prosedur Pemeriksaan pada sprite YesNo

Skrip membandingkan elemen-elemen dari daftar correctAns dan ans satu per satu. Jika kedua nilai tersebut sama, skrip akan memberi tanda centang untuk menyatakan bahwa pengguna benar. Jika tidak, skrip akan memberi tanda X merah di tempat jawaban pengguna salah. Dalam kedua kasus, Pemeriksaan akan memeriksa daftar cellYCenter untuk mendapatkan posisi yang tepat untuk memberi tanda pada gambar. Lihat Coba 9-11 di halaman sebaliknya.


Aplikasi Lainnya
Sumber daya tambahan yang Anda unduh dari situs web buku (http:// nostarch.com/learnscratch/) berisi tiga aplikasi lagi yang dapat Anda jelajahi sendiri, dengan penjelasan lengkap. Aplikasi pertama adalah permainan dua pemain tentang mengurutkan pecahan dan desimal. Setiap pemain mendapatkan 5 kartu acak dari setumpuk 31 kartu. Setiap pemain kemudian dibagikan satu kartu dari set yang tersisa. Anda dapat membuang kartu baru atau menyeretnya ke salah satu dari lima kartu Anda saat ini, mengganti kartu yang lama. Siapa pun yang menyusun lima kartu dalam urutan menaik terlebih dahulu akan memenangkan permainan.


Cobalah 9-11
Buka aplikasi ini dan ujilah. Kemudian, pikirkan kuis lain dalam berbagai bidang studi yang dapat Anda buat dan implementasikan. Satu contoh, yang ditunjukkan di bawah ini, disediakan dalam file USMapQuiz.sb2. Buka file ini dan lengkapi bagian yang hilang agar kuis ini berfungsi.

Aplikasi kedua adalah program yang mengeja bilangan bulat. Program ini meminta pengguna untuk memasukkan angka dan kemudian mengucapkan angka tersebut dalam kata-kata. Jika pengguna memasukkan 3526, misalnya, program akan mengatakan “tiga ribu lima ratus dua puluh enam.” Idenya adalah untuk memecah angka, dari kanan ke kiri, menjadi kelompok tiga digit. Setiap kelompok kemudian dieja dengan kata pengali (ribuan, jutaan, dan seterusnya), jika diperlukan.

Program ketiga mendemonstrasikan saringan Eratosthenes, sebuah algoritma untuk menemukan semua bilangan prima kurang dari 100.

Ringkasan
Daftar sangat berguna dalam pemrograman, dan menyediakan cara yang mudah untuk menyimpan banyak elemen. Dalam bab ini, kita telah menjelajahi pembuatan daftar di Scratch, mempelajari perintah yang dapat kita gunakan untuk menanganinya, dan berlatih mengisi daftar secara dinamis dengan data yang dimasukkan oleh pengguna.

Kita juga telah memeriksa daftar numerik dan mendemonstrasikan cara menemukan nilai minimum, maksimum, dan rata-rata elemennya. Setelah itu, kita mempelajari algoritma sederhana untuk mencari dan mengurutkan daftar. Kita menyimpulkan bab ini dengan beberapa program yang mendemonstrasikan penggunaan daftar dalam aplikasi praktis.

Soal
1. Buat daftar yang berisi 10 bilangan prima pertama. Tulis skrip untuk menampilkan angka-angka ini menggunakan blok say.

2. Buat tiga daftar untuk menyimpan catatan pribadi. Daftar pertama menyimpan nama, daftar kedua menyimpan tanggal lahir, dan daftar ketiga menyimpan nomor telepon.

Tulis program yang meminta pengguna untuk memasukkan nama orang yang informasi kontaknya dibutuhkan. Jika nama orang tersebut ada dalam daftar pertama, program akan menyebutkan tanggal lahir dan nomor telepon orang tersebut.

3. Buat dua daftar untuk menyimpan barang-barang yang dijual di toko kelontong dan harga yang sesuai. Tulis program yang meminta pengguna untuk memasukkan nama barang dan kemudian menampilkan harga barang tersebut, jika ditemukan dalam daftar.

4. Apa yang disimpan dalam numList setelah menjalankan skrip yang ditunjukkan pada halaman berikutnya? Buat ulang prosedur dan jalankan untuk memeriksa jawaban Anda.

5. Tulis program untuk menggandakan setiap elemen yang disimpan dalam daftar numerik.

6. Tulis program yang meminta pengguna untuk memasukkan nama dan nilai siswa dan menyimpan input ini dalam dua daftar. Berhenti mengumpulkan data ketika pengguna memasukkan –1 untuk nama siswa.

7. Tulis program yang meminta pengguna untuk memasukkan suhu tertinggi dan terendah untuk 12 bulan dalam setahun. Simpan nilai input dalam dua daftar.

8. Tulis program yang meminta pengguna untuk memasukkan 10 bilangan bulat. Simpan setiap angka yang dimasukkan ke dalam daftar hanya jika angka tersebut bukan duplikat dari angka yang telah dimasukkan sebelumnya.

9. Tulis program yang memproses daftar 20 nilai pada tes dengan 100 soal dan menemukan jumlah siswa yang mendapat nilai antara 85 dan 90.