Array dan List
5.1 Tipe Nilai dan Tipe Referensi
KONSEP: Tipe
Data dalam C# dan .NET Framework dikategorikan menjadi dua: tipe nilai dan tipe
referensi.
Pada bab ini, Anda sekali lagi akan
mendapatkan pengalaman bekerja dengan objek. Khususnya, Anda akan bekerja
dengan array dan koleksi, yang merupakan objek-objek yang menyimpan grup-grup
data. Sebelum secara detil melihat bagaimana menciptakan dan bekerja dengan
objek-objek itu, akan sangat membantu bila Anda memahami bagaimana objek-objek
disimpan di memori. Pada bagian ini, Anda akan mempelajari sejumlah cara
bagaimana objek-objek berbeda disimpan secara internal oleh .NET Framework.
Hasilnya, Anda akan lebih memahami konsep-konsep yang disajikan pada bab ini,
dan bab-bab setelahnya.
Semua tipe data dalam C# dan .NET Framework
dikategorikan ke dalam dua kelompok: tipe
nilai dan tipe referensi. Semua
data yang telah Anda pelajari sejauh ini adalah tipe nilai: int, double, decimal, dan bool.
Ketika Anda mendeklarasikan sebuah variabel
tipe nilai, kompiler akan menyediakan sepotong memori yang cukup besar untuk
variabel itu. Sebagai contoh, lihat pada deklarasi-deklarasi variabel berikut:
int bilangaBulat;
double bilanganRiil;
decimal bilanganUang;
Ingat bahwa sebuah int menggunaakn 32 bit memori (4 byte), sebuah double menggunakan 64 bit memori (8 byte), dan sebuah decimal menggunakan 128 bit memori (16
byte). Statemen-statemen deklarasi ini menyebabkan memori dialokasikan seperti
ditunjukkan pada Gambar 5.1.
Gambar 5.1 Memori dialokasikan
Memori yang dialokasikan untuk sebuah
variabel tipe nilai adalah lokasi aktual yang akan menampung setiap nilai yang
ditugaskan kepada variabel itu. Sebagai contoh, dimisalkan Anda menggunakan
statemen-statemen berikut untuk menugaskan nilai-nilai kepada variabel-variabel
yang ditunjukkan pada Gambar 5.1:
bilanganBulat = 99;
bilanganRiil = 123.45;
bilanganUang = 800.0m;
Gambar 5.2 menunjukkan bagaimana nilai-nilai
yang ditugaskan disimpan di dalam lokasi memoeri dari tiap variabel.
Gambar 5.2 Nilai-nilai ditugaskan kepada
variabel-variabel
Seperti yang dapat Anda lihat dari ilustrasi
ini, tipe nilai cukup sederhana. Ketika Anda bekerja dengan sebuah tipe nilai,
Anda menggunakan sebuah variabel yang memuat sepotong data. Ini berbeda dari
bagaiman tipe referensi digunakan. Ketika Anda bekerja dengan sebuah tipe
referensi, Anda sedang menggunakan dua hal:
·
Sebuah objek yang diciptakan di dalam memori.
·
Sebuah variabel yang mereferensi objek itu.
Gambar 5.3 Dua objek direferensi oleh variabel-variabel
Objek yang diciptakan di dalam memori memuat
data tertentu dan dapat melakukan operasi-operasi tertentu. (Apa data dan
operasi-operasi itu tergantung dari jenis objek). Agar dapat bekerja dengan
objek pada kode, Anda memerlukan suatu cara untuk mengaksesnya. Di sinilah
variabel berguna. Variabel tersebut tidak memuat potongan data aktual yang
dapat digunakan. Tetapi, ia memuat suatu nilai spesial yang dikenal dengan referensi, yang menghubungkan variabel
ke objek. Ketika Anda ingin bekerja (atau menggunakan) objek, Anda dapat
menggunakan variabel yang mereferensinya.
Sebuah variabel yang dipakai untuk
mereferensi sebuah objek dikenal dengan variabel
referensi. Variabel referensi dapat
dipakai hanya untuk mereferensi objek. Gambar 5.3 mengilustrasikan dua objek
yang telah diciptakan di dalam memori, masing-masing direferensi oleh sebuah
variabel.
Untuk memahami bagaimana variabel referensi
dan objek digunakan, Anda bisa mengingat layang-layang. Untuk menerbangkan
layang-layang, Anda memerlukan benang yang terikat dengan layang-layang itu.
Ketika layang-layang telah terbang, Anda memerlukan benang untuk terhubung ke
layang-layang dan mengendalikannya. Ini sama dengan relasi antara objek dan
variabel yang mereferensi objek itu. Seperti ditunjukkan pada Gambar 5.4, objek
seperti layang-layang, dan variabel yang mereferensi objek seperti benang.
Gambar 5.4 Metafora layang-layang dan benar
Penciptaan suatu objek tipe referensi umumnya
memerlukan dua langkah berikut:
1. Anda mendeklarasikan
sebuah variabel referensi.
2. Anda mendeklarasikan
objek dan menghubungkannya dengan variabel referensi itu.
Setelah Anda melakukan kedua langkah ini,
Anda dapat menggunakan variabel referensi untuk bekerja dengan objek. Lihat
contoh berikut yang telah Anda pelajari sebelumnya untuk menciptakan objek Random. Kelas Random dapat Anda pakai untuk membangkitkan nilai-nilai acak.
Berikut adalah sebuah contoh bagaimana Anda menciptakan sebuah objek dari kelas
Random:
Random rand = new Random();
Lihat bagian-bagian dari statemen ini:
·
Bagian pertama dari statemen, ditempatkan di sisi kiri dari operator =,
adalah Random rand. Ini mendeklarasikan sebuah variabel dengan nama rand yang dapat dipakai untuk
mereferensi sebuah objek dengan tipe Random.
·
Bagian kedua dari statemen, ditempatkan di sisi kanan dari operator =,
adalah new Random(). Operator new menciptakan sebuah objek di dalam memori dan
menghasilkan sebuah referensi ke objek itu. Jadi ekspresi new Random() menciptakan sebuah objek dari kelas Random dan menghasilkan sebuah
referensi ke objek itu.
·
Operator = menugaskan referensi yang telah dihasilkan dari operator new kepada variabel rand.
Setelah statemen ini dieksekusi, variabel rand mereferensi sebuah objek Random, seperti ditunjukkan pada Gambar
5.5. Variabel rand kemudian dapat
dipakai untuk melakukan operasi-operasi pada objek itu, seperti membangkitkan
nilai-nilai acak.
Gambar 5.5 Variabel rand mereferensi sebuah objek Random
5.2 Dasar-Dasar Array
KONSEP: Array
dapat dipakai untuk menyimpan sekelompok item dengan tipe data sama di dalam
memori. Pemrosesan item dalam jumlah besar di dalam suatu array umumnya lebih
mudah daripada disimpan pada variabel-variabel secara terpisah.
Pada program-program yang telah Anda tuliskan
sejauh ini, Anda telah menggunakan variabel-variabel untuk menyimpan data di
memori. Cara paling sederhana dalam menyimpan suatu nilai di dalam memori
adalah dengan menyimpannya di dalam suatu variabel. variabel dapat digunakan
pada banyak situasi, tetapi ia memiliki keterbatasan. Sebagai contoh, ia hanya
dapat memuat satu nilai pada suatu waktu. Perhatikan deklarasi variabel
berikut:
int nilai = 99;
Statemen ini mendeklarasikan sebuah variabel int dengan nama nilai, yang diinisialisasi dengan nilai 99. Perhatikan apa yang
terjadi jika statemen berikut diberikan selanjutnya pada program:
nilai
= 5;
Statemen ini menugaskan nilai 5 kepada nilai, yang mengganti 99 yang
sebelumnya disimpan di sana. Karena nilai
adalah suatu variabel biasa, ia hanya dapat memuat satu nilai pada suatu waktu.
Karena variabel hanya dapat menyimpan satu
nilai, adalah melelahkan di dalam program bila ingin memproses data dalam
jumlah besar. Sebagai contoh, dimisalkan bahwa Anda diminta untuk menuliskan
sebuah program yang memuat nama dari 50 karyawan. Bayangkan pendeklarasian 50
variabel untuk menampung semua nama itu:
string
karyawan1;
string
karyawan2;
string karyawan3;
…
string
karyawan50;
Kemudian, bayangkan bagaimana menuliskan kode
untuk memproses semua 50 nama. Sebagai contoh, jika Anda ingin menampilkan isi
dari tiap variabel pada sebuah ListBox, Anda bisa menuliskan kode seperti ini:
kotakListKaryawan.Items.Add(karyawan1);
//Menampilkan karyawan 1
kotakListKaryawan.Items.Add(karyawan2);
//Menampilkan karyawan 2
kotakListKaryawan.Items.Add(karyawan3);
//Menampilkan karyawan 3
.
. .
kotakListKaryawan.Items.Add(karyawan50);
//Menampilkan karyawan 50
Seperti yang dapat Anda lihat, variabel tidak
cocok untuk menyimpan dan memproses data. Setiap variabel merupakan suatu item
terpisah yang harus dideklarasikan dan diproses satu per satu.
Untunglah, Anda dapat menggunakan array
sebagai cara alternatif dalam menyimpan dan memproses data dalam jumlah besar.
Array adalah sebuah objek yang dapat memuat sejumlah nilai yang masing-masing
bertipe data sama. Anda dapat memiliki array yang memuat nilai-nilai int, array yang memuat nilai-nilai double, dan array yang memuat
nilai-nilai decimal, atau array yang
memuat nilai-nilai string, tetapi
Anda tidak dapat menyimpan tipe data berlainan di dalam suatu array. Setelah
Anda menciptakan sebuah array, Anda dapat menuliskan kode sederhana dan efisien
untuk memproses nilai-nilai yang disimpan di dalamnya. Array merupakan objek
tipe referensi. Ingat dari Bagian 5.1 bahwa dua langkah diperlukan untuk
menciptakan dan menggunakan sebuah objek tipe referensi:
1. Anda mendeklarasikan
sebuah variabel referensi.
2. Anda mendeklarasikan
objek dan menghubungkannya dengan variabel referensi itu.
Dimisalkan bahwa Anda ingin menciptakan
sebuah array yang dapat memuat nilai-nilai int.
Berikut adalah salah satu contoh bagaimana Anda dapat mendeklarasikan sebuah
variabel referensi untuk array:
int[]
arrayNilai;
Statemen ini mendeklarasikan sebuah variabel
referensi dengan nama arrayNilai.
Perhatikan bahwa statemen ini tampak seperti sebuah deklarasi variabel int biasa kecuali untuk kurung siku
([]) yang ditempatkan setelah katakunci int.
Ekspresi int[] mengindikasikan bahwa
variabel ini adalah sebuah referensi ke suatu array int. Jadi, Anda tidak bisa menggunakan variabel ini untuk menyimpan
sebuah nilai int. Tetapi, Anda dapat
menggunakannya untuk mereferensi sebuah array int.
Langkah selanjutnya pada proses adalah
menciptakan objek array dan mengaitkannya dengan variabel arrayNilai. Statemen berikut menunjukkan salah satu contoh:
arrayNilai = new int[6];
Seperti disebutkan sebelumnya, katakunci new menciptakan sebuah objek di memori.
Ekspresi yang ditempatkan setelah katakunci new menetapkan tipe objek yang diciptakan. Pada kasus ini, ekspresi
int[6] menetapkan bahwa objek
tersebut adalah sebuah array yang cukup besar untuk memuat enam nilai int. Nilai yang ada di dalam kurung
siku adalah deklarator ukuran. Ia mengindikasikan banyak nilai yang dapat
dimuat oleh array.
Katakunci new juga menghasilkan sebuah referensi ke objek yang diciptakan.
Pada statemen yang ditunjukkan sebelumnya, katakunci new menciptakan sebuah array int
dan menghasilkan sebuah referensi ke array itu. Operator = menugaskan referensi
itu kepada variabel arrayNilai.
Setelah statemen ini dieksekusi, variabel arrayNilai
akan mereferensi sebuah array int
yang dapat memuat enam nilai int.
Ini ditunjukkan pada Gambar 5.6.
Pada contoh sebelumnya, Anda telah
menggunakan dua statemen untuk (1) mendeklarasikan sebuah variabel referensi
dan (2) menciptakan sebuah objek array. Kedua langkah ini dapat digabungkan
menjadi satu statemen, seperti ditunjukkan di sini:
int[]
arrayNilai = new int[6];
Anda dapat menciptakan array yang memuat
sembarang data. Berikut merupakan deklarasi-deklarasi array yang valid:
double[]
suhu = new double[100];
decimal[]
harga = new decimal[50];
string[]
arrayNama = new string[1200];
Deklarator ukuran dari array harus berupa
sebuah ekspresi integer tak-negatif. Ia dapat berupa suatu nilai literal,
seperti ditunjukkan pada contoh-contoh sebelumnya, atau suatu variabel.
Direkomendasikan untuk menggunakan suatu konstanta bernama sebagai deklarator
ukuran. Berikut adalah salah satu contohnya:
const
int UKURAN = 6;
int[]
arrayNilai = new int[UKURAN];
Dengan ini, program dapat lebih mudah dibaca.
Seperti yang nanti akan Anda lihat pada bab ini, banyak teknik pemrograman yang
mengharuskan Anda untuk menggunakan ukuran array. Ketika Anda menggunakan suatu
konstanta bernama sebagai deklarator ukuran dari array, Anda dapat menggunakan
konstanta itu untuk menetapkan ukuran array pada algoritma Anda. Jika Anda
perlu memodifikasi program sehingga array memiliki ukuran yang berbeda, Anda
hanya perlu mengubah nilai dari konstanta bernama itu.
Elemen Array dan Subskript
Lokasi-lokasi penyimpanan di dalam array
dikenal sebagai elemen-elemen. Dalam memori, elemen-elemen array disimpan pada
lokasi-lokasi yang bertetangga. Setiap elemen di dalam suatu array ditugasi nilai
unik yang dikenal dengan subskript atau indeks. Indeks dipakai untuk
mengidentifikasi elemen tertentu di dalam array. Elemen pertama ditugasi
subskript 0, elemen kedua ditugasi subskript 2, dan seterusnya. Sebagai contoh,
dimisalkan bahwa sebuah program memiliki deklarasi-deklarasi berikut:
const int UKURAN = 5;
int[] arrayNilai = new int[UKURAN];
Seperti ditunjukkan pada Gambar 5.7, array
yang direferensi oleh arrayNilai
memiliki lima elemen. Elemen-elemen itu ditugasi subskript 0 sampai 4. (Karena
subskript selalu diawali dari 0, subskript dari elemen terakhir di dalam suatu
array adalah ukuran array dikurangi satu).
Elemen Array dan Nilai Default
Perhatikan bahwa Gambar 5.7 menunjukkan
setiap elemen array memuat nilai 0. Ketika Anda menciptakan suatu array numerik
dalam C#, elemen-elemennya ditetapkan menjadi nilai 0 secara default. Ingat,
Anda dapat menciptakan suatu array untuk memuat nilai tipe data apapun. Adalah
dimungkinkan untuk menciptakan sebuah array yang memuat objek-objek tipe
referensi. Jika Anda menciptakan sebuah array yang memuat objek-objek tipe
referensi, maka setiap elemen array berperilaku seperti suatu variabel
referensi. Secara default, elemen-elemen array referensi itu ditetapkan dengan
nilai spesial null. Nilai null
mengindikasikan bahwa suatu variabel referensi belum ditetapkan untuk menunjuk
ke sebuah objek valid dan tidak dapat dipakai untuk tujuan apapun.
Bekerja dengan Elemen-Elemen Array
Anda mengakses elemen-elemen di dalam suatu
array menggunakan subskriptnya. Sebagai contoh, kode berikut menciptakan sebuah
array int dengan lima elemen dan
menugaskan nilai-nilai kepada tiap elemen tersebut:
const int UKURAN = 5;
int[] arrayNilai = new int[UKURAN];
arrayNilai[0] = 20;
arrayNilai[1] = 30;
arrayNilai[2] = 40;
arrayNilai[3] = 50;
arrayNilai[4] = 60;
Kode ini menugaskan nilai 20 kepada elemen 0,
nilai 30 kepada elemen 1, dan seterusnya. Gambar 5.8 menunjukkan isi array
setelah statemen-statemen ini dieksekusi.
Kode berikut menunjukkan contoh lain. Ia
menciptakan sebuah array string
dengan tiga elemen dan menugaskan string-string kepada elemen-elemen array:
const int UKURAN = 3;
string[] nama = new string[UKURAN];
nama[0] = “Kris”;
nama[1] = “Lori”;
nama[2] = “Joe”;
Kode berikut menunjukkan bagaimana
nilai-nilai dapat ditugaskan dari kontrol-kontrol TextBox kepada elemen-elemen array. Diasumsikan bahwa form aplikasi
memiliki tiga kontrol TextBox dengan
nama teksNilai1, teksNilai2, dan teksNilai3 dan bahwa user telah memasukkan sebuah nilai numerik
pada masing-masing kontrol TextBox.
Kode berikut menciptakan sebuah array decimal dengan nama arrayNilai dan menugaskan nilai masukan pada tiap kontrol TextBox kepada sebuah elemen array:
const int UKURAN = 3;
decimal[] arrayNilai = new decimal[UKURAN];
arrayNilai[0] = decimal.Parse(teksNilai1.Text);
arrayNilai[1] = decimal.Parse(teksNilai2.Text);
arrayNilai[2] = decimal.Parse(teksNilai3.Text);
Lihat program utuh berikut yang
mendemonstrasikan bagaimana menugaskan nilai-nilai kepada suatu array dan
kemudian menampilkan nilai-nilai yang ada di dalam array. Gambar 5.9
menunjukkan form aplikasi.
Berikut adalah kode untuk event handler tombolBaca_Click:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private void
tombolBaca_Click(object sender, EventArgs e)
{
//Menciptakan sebuah array untuk memuat
tiga string
const int UKURAN = 3;
string[] nama = new string[UKURAN];
//Membaca nama
nama[0] = teksNama1.Text;
nama[1] = teksNama2.Text;
nama[2] = teksNama3.Text;
//Menampilkan nama
MessageBox.Show(nama[0]);
MessageBox.Show(nama[1]);
MessageBox.Show(nama[2]);
}
|
Jalankan aplikasi, masukkan sebuah nama ke
dalam tiap kontrol TextBox, dan
kemudian klik pada tombol Baca Nama. Aksi-aksi berikut terjadi:
·
Pada baris 5, sebuah array untuk memuat tiga string diciptakan.
· Pada baris 8-10, nama-nama yang telah Anda masukkan ke dalam
kontrol-kontrol TextBox ditugaskan kepada elemen-elemen array.
·
Pada baris 13-15, setiap elemen array ditampilkan pada suatu kotak
pesan.
Aplikasi Tampil
Elemen menampilkan isi dari sebuah
array string. Karena setiap elemen array adalah sebuah string, Anda dapat
melewatkannya secara langsung kepada metode MessageBox.Show tanpa perlu konversi tipe data. Jika Anda ingin
melewatkan suatu elemen array numerik kepada metode MessageBox.Show,
maka Anda perlu memanggil metode ToString
dari elemen tersebut. Kode berikut mendemonstrasikannya:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//Menciptakan sebuah array untuk
memuat tiga integer
const int UKURAN = 3;
int[] nilaiKu = new int[UKURAN];
//Menugaskan nilai-nilai kepada
elemen-elemen array
nilaiKu[0] = 10;
nilaiKu[1] = 20;
nilaiKu[2] = 30;
//Menampilkan elemen-elemen
array
MessageBox.Show(nilaiKu[0].ToString());
MessageBox.Show(nilaiKu[1].ToString());
MessageBox.Show(nilaiKu[2].ToString());
|
Inisialisasi Array
Ketika Anda menciptakan sebuah array, Anda
dapat secara opsional menginisialisasinya dengan sekelompok nilai. Berikut
adalah contohnya:
const int UKURAN = 5;
int[] arrayNilai = new int[UKURAN] {10, 20, 30, 40, 50};
Sejumlah nilai yang ada di dalam kurung
kurawal dan yang dipisahkan dengan koma itu disebut dengan daftar inisialisasi.
Nilai-nilai ini disimpan di dalam elemen-elemen array dengan urutan yang sama
seperti pada daftar itu. (Nilai pertama, 10, disimpan di dalam arrayNilai[0], nilai kedua, 20,
disimpan di dalam arrayNilai[1], dan
seterusnya).
Ketika Anda menyediakan sebuah daftar
inisialisasi, deklarator ukuran dapat diabaikan. Kompiler akan menentukan
ukuran array dari banyak item yang ada pada daftar inisialisasi. Berikut adalah
salah satu contohnya:
int[] arrayNilai = new int[UKURAN] {10, 20, 30, 40, 50};
Pada contoh ini, kompiler menentukan bahwa
array memiliki lima elemen karena lima nilai didapati pada daftar inisialisasi.
Anda juga dapat mengabaikan operator new dan ekspresi yang mengikutinya
ketika daftar inisialisasi disediakan. Berikut adalah salah satu contohnya:
int[] arrayNilai = {10, 20, 30, 40, 50};
Berikut adalah tiga contoh terpisah yang
mendeklarasikan dan menginisialisasi sebuah array string dengan nama hari.
Setiap contoh ini menghasilkan array yang sama:
//Contoh 1
const int UKURAN = 7;
string[] hari = new string[UKURAN] {“Minggu”, “Senin”,
“Selasa”, “Rabu”, “Kamis”,
“Jumat”, “Sabtu”};
// Contoh 2
const int UKURAN = 7;
string[] hari = new string[] {“Minggu”, “Senin”,
“Selasa”, “Rabu”, “Kamis”,
“Jumat”, “Sabtu”};
//Contoh 3
const int UKURAN = 7;
string[] hari = {“Minggu”, “Senin”,
“Selasa”, “Rabu”, “Kamis”,
“Jumat”, “Sabtu”};
Menggunakan Loop Untuk Menjejak Array
Anda dapat menyimpan suatu nilai pada sebuah
variabel int dan kemudian
menggunakan variabel itu sebagai indeks. Ini akan memungkinkan Anda untuk
menggunakan loop untuk menjejak array, dengan melakukan operasi yang sama pada
tiap elemen array. Sebagai contoh, lihat pada kode berikut:
1
2
3
4
5
6
7
8
9
|
//Menciptakan sebuah array untuk
memuat tiga integer
const int UKURAN = 3;
int[] nilaiKu = new int[UKURAN];
//Menugaskan 99 kepada tiap
elemen array
for (int indeks = 0; indeks < UKURAN; indeks++)
{
nilaiKu[indeks] = 99;
}
|
Baris 3 menciptakan sebuah array int dengan nama nilaiKu yang memuat tiga elemen. Loop for yang diawali pada baris 6 menggunakan sebuah variabel int dengan nama indeks sebagai pencacahnya. Variabel indeks diinisialisasi dengan nilai 0 dan diinkremen pada tiap
iterasi loop. Loop beriterasi sepanjang indeks
bernilai kurang dari 3. Jadi, loop akan beriterasi tiga kali. Ketika ia
beriterasi, variabel indeks ditugasi
nilai 0, 1, dan 2.
Di dalam loop, statemen pada baris 8
menugaskan nilai 99 kepada sebuah elemen array, menggunakan variabel indeks sebagai subskript. Inilah apa
yang terjadi ketika loop beriterasi:
·
Pertama kali loop beriterasi, indeks
ditetapkan menjadi 0, jadi 99 ditugaskan kepada nilaiKu[0].
·
Kedua kali loop beriterasi, indeks
ditetapkan menjadi 1, jadi 99 ditugaskan kepada nilaiKu[0].
·
Pertama kali loop beriterasi, indeks
ditetapkan menjadi 2, jadi 99 ditugaskan kepada nilaiKu[0].
Subskript Tak Valid
Ketika bekerja dengan array, adalah penting
bahwa Anda tidak menggunakan subskript yang tak valid. Anda tidak dapat
menggunakan subskript yang bernilai kurang dari 0 atau lebih besar dari ukuran
array dikurangi satu. Sebagai contoh, dimisalkan bahwa sebuah array memuat 100
elemen. Subskript valid untuk array ini adalah integer 0 sampai 99. Jika Anda
mencoba menggunakan sembarang nilai di luar rentang ini, suatu eksepsi akan
dilemparkan saat aplikasi dijalankan. Kode berikut mendemonstrasikan bagaimana
sebuah loop yang tidak secara hati-hati ditulis dapat menyebabkan eksepsi
semacam itu dilemparkan:
1
2
3
4
5
6
7
8
9
|
//Menciptakan sebuah array untuk
memuat tiga integer
const int UKURAN = 3;
int[] nilaiKu = new int[UKURAN];
//apakah loop ini menyebabkan
eksepsi?
for (int indeks = 0; indeks <= SIZE; indeks++)
{
nilaiKu[indeks] = 99;
}
|
Perhatikan bahwa loop for beriterasi sepanjang indeks
bernilai kurang dari atau sama dengan 3. Selama iterasi terakhir, indeks ditetapkan 3, jadi statemen pada
baris 8 mencoba membuat penugasan kepada nilaiKu[3].
Tidak ada elemen di dalam array dengan subskript 3, jadi eksepsi akan
dilemparkan.
Properti Length
Dalam C#, semua array memiliki properti Length yang ditetapkan sebesar banyak
elemen di dalam array. Sebagai contoh, perhatikan suatu array yang diciptakan
oleh statemen berikut:
double[] suhu = new double[25];
Properti Length
dari array suhu akan ditetapkan menjadi 25. Jika Anda mengeksekusi statemen
berikut, ia akan menampilkan pesan “Array suhu memiliki 25 elemen”:
MessageBox.Show(“Array suhu memiliki “ +
temperatures.Length + “ elemen.”);
Properti Length
dapat berguna ketika memproses isi keseluruhan array menggunakan loop.
Subskript dari elemen terakhir adalah properti Length dari array dikurangi dari 1. Berikut adalah contohnya:
for (int indeks = 0; indeks < suhu.Length; indeks++)
{
MessageBox.Show(suhu[indeks].ToString());
}
Pada Tutorial 5.1, Anda akan menciptakan
sebuah aplikasi yang membangkitkan sejumlah nilai acak. Nilai-nilai itu
disimpan di dalam suatu array.
Tutorial 5.1: Menggunakan Sebuah Array Untuk Memuat
Nilai-Nilai Acak
Pada tutorial
ini, Anda akan menciptakan sebuah aplikasi yang secara acak membangkitkan
nilai-nilai acak. Form aplikasi ditampilkan pada Gambar 5.10. Ketika tombol Bangkitkan Nilai diklik, aplikasi akan membangkitkan lima integer dua-dijit
dan menyimpannya di dalam suatu array. Isi array kemudian ditampilkan pada
kontrol-kontrol Label.
Langkah 1: Awali Visual Studio (atau Visual Studio Express).
Langkah 2: Buka form Form1
pada mode Designer. Klik ganda pada
kontrol tombolBangkitkan. Ini akan
membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan
nama tombolBangkitkan_Click.
Sempurnakan event handler tersebut dengan menuliskan kode yang ditunjukkan pada
baris 22-41 pada Program 5.1. Amati kode lebih dekat:
Baris 23: Statemen ini mendeklarasikan sebuah konstanta int
dengan nama UKURAN, yang ditetapkan menjadi nilai 5. Ini dipakai sebagai
deklarator ukuran array.
Baris 24: Statemen ini menciptakan sebuah array int dengan nama nilaiAcak dengan lima elemen.
Baris 27: Statemen ini menciptakan sebuah objek Random, yang direferensi oleh suatu
variabel dengan nama rand.
Baris 31: Loop for ini
menggunakan sebuah variabel int
dengan nama indeks sebagai
pencacahnya. Variabel indeks
diinisialisasi dengan nilai 0 dan diinkremen pada tiap iterasi loop. Loop
beriterasi sepanjang indeks bernilai
kurang dari nilaiAcak.Length (yaitu
5). Jadi, loop akan beriterasi lima kali. Ketika loop beriterasi, variabel indeks ditugasi nilai 0, 1, 2, 3, dan
4.
Baris 33: Statemen ini mendapatkan suatu nilai acak dalam rentang
0 sampai 99 dan menugaskannya kepada nilaiAcak[indeks].
Pertama kalinya loop beriterasi, statemen ini menugaskan suatu nilai acak
kepada nilaiAcak[0]. Kedua kalinya
loop beriterasi, statemen ini menugaskan suatu nilai acak kepada nilaiAcak[1]. Ini berlanjut sampai loop
selesai beriterasi. Pada saat itu, setiap elemen di dalam array ditugasi sebuah
nilai acak.
Baris 37-41: Statemen-statemen ini menampilkan elemen-elemen array
pada kontrol labelPertama, labelKedua, labelKetiga, labelKeempat,
dan labelKelima.
Langkah 3: Kembali ke mode Designer
dan klik ganda pada kontrol tombolKeluar.
Pada editor kode, Anda akan melihat sebua event handler kosong dengan nama tombolKeluar_Click. Sempurnakan event
handler ini dengan mengetikkan kode yang ditunjukkan pada baris 46-47 pada
Program 5.1.
Langkah 4: Simpan projek dan jalankan aplikasi. Ketika aplikasi
dijalankan, klik pada tombol Bangkitkan
Nilai. Aplikasi akan menampilkan
lima nilai acak dua-dijit pada kontrol-kontrol Label. Klik tombol itu beberapa kali untuk mendapatkan nilai-nilai
acak yang berbeda. Setelah selesai, klik tombol Keluar untuk mengakhiri aplikasi.
Program 5.1 Kode utuh untuk form Form1 pada aplikasi Nilai
Acak
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Nilai_Acak
{
public
partial class Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
private
void tombolBangkitkan_Click(object sender, EventArgs e)
{
//Menciptakan sebuah array untuk memuat nilai-nilai int
const
int UKURAN = 5;
int[]
nilaiAcak = new int[UKURAN];
//Menciptakan sebuah objek Random
Random rand = new Random();
//Mengisi array dengan nilai-nilai acak, di dalam rentang
//dari 0 sampai 99
for
(int indeks = 0; indeks < nilaiAcak.Length; indeks++)
{
nilaiAcak[indeks] = rand.Next(100);
}
//Menampilkan elemen-elemen array pada kontrol-kontrol Label
labelPertama.Text = nilaiAcak[0].ToString();
labelKedua.Text = nilaiAcak[1].ToString();
labelKetiga.Text = nilaiAcak[2].ToString();
labelKeempat.Text = nilaiAcak[3].ToString();
labelKelima.Text = nilaiAcak[4].ToString();
}
private
void tombolKeluar_Click(object sender, EventArgs e)
{
//Menutup form
this.Close();
}
}
}
|
Error Yang Sering Dilakukan
Karena subskript array diawali dari 0 bukan
dari 1, Anda perlu hati-hati dalam hal ini. Error semacam ini terjadi. Sebagai
contoh, lihat pada contoh kode berikut:
1
2
3
4
5
6
7
8
9
|
//Menciptakan sebuah array untuk
memuat 100 integer
const int UKURAN = 100;
int[] nilaiKu = new int[UKURAN];
//Menugaskan nilai 99 kepada
tiap elemen array
for (int indeks = 1; indeks <
nilaiKu.Length; indeks++)
{
nilaiKu[indeks] = 99;
}
|
Tujuan dari kode ini adalah untuk menciptakan
sebuah array int dengan 100 elemen
dan menugaskan nilai 99 kepada tiap elemen array. Namun, kode ini memiliki
error. Selama eksekusi loop, variabel indeks ditugasi nilai 1 sampai 99 ketika
ia seharusnya ditugasi nilai 0 sampai 99. Hasilnya, elemen pertama, yaitu pada
subskript 0, dilompati.
Menggunakan Loop foreach pada Array
C# menyediakan sebuah loop spesial yang, pada
banyak situasi, menyederhanakan pemrosesan array. Loop ini dikenal sebagai loop
foreach. Ketika Anda menggunakan
loop foreach pada suatu array, loop
itu secara otomatis beriterasi satu kali untuk tiap elemen array. Sebagai
contoh, jika Anda menggunakan loop foreach
pada suatu array delapan-elemen, loop itu akan beriterasi delapan kali. Karena
loop foreach secara otomatis
mengetahui banyak elemen di dalam array, Anda tidak perlu menggunakan pencacah
untuk mengendalikan iterasinya.
Loop foreach
didesain untuk diterapkan pada variabel read-only temporer yang dikenal sebagai
variabel iterasi. Setiap kali loop foreach
beriterasi, ia menyalin sebuah elemen array ke variabel iterasi. Sebagai
contoh, pertama kali loop beriterasi, variabel iterasi akan memuat nilai dari
elemen 0, kedua kalinya loop beriterasi, variabel iterasi akan memuat nilai
dari elemen 1, dan seterusnya.
Berikut adalah bentuk umum dari loop foreach:
foreach(Tipe_data
NamaVariabel in NamaArray)
{
statemen;
statemen;
dan seterusnya.
}
Statemen-statemen yang ada di dalam kurung
kurawal adalah tubuh loop. Ini merupakan statemen-statemen yang dieksekusi
setiap kali loop beriterasi. Sama seperti struktur kendali, kurung kurawal
bersifat opsional jika tubuh loop hanya memuat satu statemen, seperti
ditunjukkan pada bentuk umum berikut:
foreach(Tipe_data
NamaVariabel in NamaArray)
statemen;
Amati lebih dekat pada item-item yang ada di
dalam kurung:
·
Tipe_data adalah tipe data
dari nilai-nilai di dalam array.
·
NamaVariabel adalah nama dari
variabel iterasi.
·
in adalah sebuah
katakunci yang harus ada setelah NamaVariabel.
·
NamaArray adalah nama dari
array.
Dimisalkan bahwa Anda memiliki deklarasi
array berikut:
int[]
angka = { 3, 6, 9 };
Anda dapat menggunakan loop foreach berikut untuk menampilkan isi
dari array angka:
foreach
(int nil in angka)
{
MessageBox.Show(nil.ToString());
}
Karena array angka memiliki tiga elemen, loop
ini akan beriterasi tiga kali. Pertama kalinya ia beriterasi, nil akan memuat nilai dari angka[0], jadi suatu kotak pesan akan
menampilkan nilai 3. Selama iterasi kedua, nil
akan memuat nilai dari angka[1],
jadi suatu kotak pesan akan menampilkan nilai 6. Selama iterasi ketiga, nil akan memuat nilai dari angka[2], jadi suatu kotak pesan akan
menampilkan nilai 9.
Menugaskan Kembali Variabel Referensi
Array
Adalah dimungkinkan untuk menugaskan kembali
sebuah variabel referensi array ke suatu array yang berbeda, seperti
didemonstrasikan pada kode berikut:
1
2
3
4
5
|
//Menciptakan sebuah array yang
direferensi oleh variabel angka
int[] angka = new int[6];
//Menugaskan kembali variabel
angka ke suatu array baru
angka = new int[3];
|
Statemen pada baris 2 menciptakan sebuah
array int enam-elemen. Suatu
referensi yang menunjuk ke array itu ditugaskan kepada variabel angka. Gambar 5.11 menunjukkan
bagaimana variabel angka mereferensi
array enam-elemen setelah statemen ini dieksekusi.
Kemudian, statemen pada baris 5 menciptakan
sebuah array int tiga-elemen yang
baru. Sebuah referensi ke array baru ditugaskan kepada variabel angka. Ketika baris 5 dieksekusi,
referensi yang disimpan di dalam variabel angka
akan diganti oleh sebuah referensi yang menunjuk ke array tiga-elemen. Setelah
statemen ini dieksekusi, variabel angka akan mereferensi array tiga-elemen,
bukan ke array enam-elemen. Ini diilustrasikan pada Gambar 5.12.
Perhatikan pada Gambar 5.12 bahwa array
enam-elemen masih ada di dalam memori, tetapi tidak lagi direferensi oleh
variabel apapun. Karena ia tidak lagi direferensi, ia tidak dapat diakses.
Ketika sebuah objek tidak lagi direferensi, ia menjadi kandidat untuk dibuang
melalui proses pengumpulan sampah, yang menghapus semua objek yang tidak
direferensi dari memori.
5.3 Bekerja dengan File dan Array
KONSEP: Untuk
beberapa permasalahan, file dan array dapat digunakan secara bersamaan dengan
efektif. Anda dapat dengan mudah menuliskan suatu loop yang menyimpan isi dari
sebuah array ke dalam file, dan sebaliknya.
Sejumlah pekerjaan bisa jadi mengharuskan
Anda untuk menyimpan isi array ke dalam sebuah file sehingga data dapat dipakai
di waktu yang akan datang. Sama halnya, pada beberapa situasi bisa jadi
mengharuskan Anda untuk membaca data dari sebuah file ke dalam suatu array.
Sebagai contoh, dimisalkan Anda memiliki sebuah file yang memuat sejumlah nilai
dan Anda ingin membalikkan urutan dari nilai-nilai itu. Salah satu teknik dalam
melakukannya adalah dengan membaca nilai-nilai dari file ke dalam suatu array
dan kemudian menuliskan nilai-nilai di dalam array kembali ke dalam file dari
akhir sampai awal array.
Menuliskan Isi Array Ke dalam File
Penulisan isi array ke dalam suatu file
merupakan proseder yang sederhana: Buka file dan gunakan sebuah loop untuk
menjejak setiap elemen array dan menuliskan isi array ke dalam file. Sebagai
contoh, lihat pada projek dengan nama Array
Ke File. Ketika Anda mengklik tombol OK, aplikasi akan menuliskan isi dari
sebuah array int ke dalam suatu file. Kode berikut menunjukkan event handler
untuk tombol OK:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
private void tombolOK_Click(object
sender, EventArgs e)
{
try
{
//Menciptakan sebuah array dengan nilai-nilai
int[] angka = { 10, 20, 30, 40, 50 };
//Mendeklarasikan sebuah variabel StreamWriter
StreamWriter fileKeluaran;
//Menciptakan file dan membaca objek StreamWriter
fileKeluaran = File.CreateText(“Nilai.txt”);
//Menuliskan isi array ke dalam file
for (int indeks = 0; indeks < angka.Length; indeks++)
{
fileKeluaran.WriteLine(angka[indeks]);
}
//Menutup file
fileKeluaran.Close();
//Memberitahu user bahwa proses telah selesai
MessageBox.Show(“Selesai”);
}
catch (Exception ex)
{
//Menampilkan pesan error
MessageBox.Show(ex.Message);
}
}
|
Statemen try-catch menangani semua error yang
berelasi dengan file. Berikut adalah simpulan kode yang ada di dalam blor try:
·
Baris 6 menciptakan sebuah array int
dengan lima elemen, yang diinisialisasi dengan nilai 10, 20, 30, 40, dan 50.
·
Baris 9 mendeklarasikan sebuah variabel StreamWriter dengan nama fileKeluaran.
(Anda tidak melihatnya pada contoh
kode ini, tetapi direktif using
System.IO; ditempatkan di atas file. Ini diperlukan untuk deklarasi StreamWriter pada baris 9).
· Baris 12
menciptakan sebuah file dengan nama Nilai.txt
untuk operasi penulisan. Setelah statemen dieksekusi, variabel fileKeluaran akan mereferensi sebuah
objek StreamWrietr yang terhubung
dengan file itu.
· Baris 15
merupakan awal dari sebuah loop for.
Loop ini beriterasi satu kali untuk tiap elemen dari array. Selama
iterasi-iterasi loop, variabel indeks
ditugasi nilai 1, 2, 3, 4, dan 5.
·
Di dalam loop, baris 17 menuliskan elemen array angka[indeks] ke dalam file.
·
Baris 21 menutup file.
· Baris 24 menampilkan sebuah kotak pesan yang memberitahu user bahwa
operasi penulisan file telah selesai dilakukan.
Gambar 5.13 menunjukkan isi dari file Nilai.txt, yang dibukan dalam Notepad,
setelah tombol OK diklik.
Membaca
Nilai-Nilai dari Sebuah File dan Menyimpannya di dalam Array
Pembacaan isi dari sebuah file ke dalam suatu
array cukup sederhana: Membuka file, menggunakan suatu loop untuk membaca
setiap item dari file, dan menyimpan setiap item di dalam sebuah elemen array.
Loop akan beriterasi sampai array terisi penuh atau sampai akhir file. Sebagai
contoh, Anda akan menemukan sebuah projek dengan nama File Ke Array. Ketika Anda mengklik tombol Baca Nilai, aplikasi
akan membaca nilai-nilai dari sebuah file dengan nama Nilai.txt ke dalam sebuah array int. Isi array kemudian ditampilkan
pada suatu kotak list. Kode berikut menunukkan event handler Click untuk tombol Baca Nilai:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
private void tombolBacaNilai_Click(object
sender, EventArgs e)
{
try
{
//Menciptakan sebuah array untuk memuat item-item yang dibaca
dari array
const int UKURAN
= 5;
int[] angka = new int[UKURAN];
//Variabel pencacah untuk digunakan di dalam loop
int indeks = 0;
//Mendeklarasikan sebuah variabel StreamReader
StreamReader fileMasukan;
//Membuka file dan membaca objek StreamReader
fileMasukan = File.OpenText(“Nilai.txt”);
//Membaca isi file ke dalam array
while (indeks < angka.Length && !fileMasukan.EndOfStream)
{
angka[indeks] = int.Parse(fileMasukan.ReadLine());
indeks++;
}
//Menutup file
fileMasukan.Close();
//Menampilkan elemen-elemen array pada kotak list
foreach (int nilai in angka)
{
kotakListKeluaran.Items.Add(nilai);
}
}
catch (Exception ex)
{
//Menampilkan pesan error
MessageBox.Show(ex.Message);
}
}
|
Statemen try-catch
menangani semua error yang berkaitan dengan file. Berikut adalah simpulan dari
kode yang ada di dalam blok try:
·
Baris 6 dan baris 7 menciptakan sebuah array int dengan lima elemen.
· Baris 10 mendeklarasikan sebuah variabel int dengan nama indeks,
yang diinisialisasi dengan nilai 0. Variabel ini akan dipakai di dalam sebuah
loop yang memuat nilai-nilai subskript.
· Baris 13 mendeklarasikan sebuah variabel StreamReader dengan nama fileMasukan.
(Anda tidak melihatnya pada kode ini, tetapi direktif using.System.IO; ditampilkan di atas file. Ini diperlukan untuk
deklarasi StreamReader pada baris
13).
·
Baris 16 membuka sebuah file dengan nama Nilai.txt untuk operasi pembacaan. Setelah statemen ini dieksekusi,
variabel fileMasukan mereferesi
sebuah objek StreamReader yang
berkaitan dengan file ini.
· Baris 19 merupakan awal dari loop while
yang membaca item-item dari file dan menugaskannya elemen-elemen dari array angka. Perhatikan bahwa loop ini
menguji dua ekspresi Boolean yang terhubung oleh operator &&. Ekspresi
pertama adalah indeks < angka.Length.
Tujuan dari ekspresi ini adalah untuk mencegah loop dari penulisan melebihi
akhir array. Ketika array penuh, loop akan berhenti. Ekspresi kedua adalah !fileMasukan.EndOfStream. Tujuan dari
ekspresi ini adalah untuk mencegah loop dari pembacaa melebihi akhir file.
Ketika tidak ada lagi nilai yang dibaca dari file, loop akan berhenti.
· Di dalam loop, baris 21 membaca sebuah baris teks dari file,
mengkonversinya menjadi sebuah int,
dan menugaskan int kepada angka[indeks].
Kemudian, baris 22 menginkremen indeks.
·
Baris 26 menutup file.
· Loop foreach pada baris 29-32
menampilkan elemen-elemen array pada kontrol kotakListKeluaran.
5.4 Melewatkan Array Sebagai Argumen Kepada
Metode
KONSEP:
Sebuah array dapat dilewatkan sebagai argumen kepada metode. Untuk melewatkan
array, Anda melewatkan variabel yang mereferensi array.
Kadangkala Anda ingin menuliskan suatu metode
yang menerima kesuluruhan isi array sebagai argumen dan melakukan operasi pada
array itu. Sebagai contoh, kode berikut menunjukkan suatu metode dengan nama TampilArray. Metode ini menerima sebuah
array string sebagai suatu argumen dan menampilkan setiap elemennya pada suatu
kotak pesan.
1
2
3
4
5
6
7
|
private void TampilArray(string[]
strArray)
{
foreach (string str in strArray)
{
MessageBox.Show(str);
}
}
|
Perhatikan pada baris 1 bahwa metode memiliki
sebuah variabel parameter dengan nama strArray
dan bahwa tipe data dari parameter itu adalah string[]. Ekspresi string[]
mengindikasikan bahwa variabel parameter ini adalah suatu referensi yang
menunjuk ke sebuah array string.
Ketika Anda memanggil metode ini, Anda perlu melewatkan sebuah array string
sebagai argumen.
Ketika Anda memanggil sebuah metode dan
melewatkan suatu array sebagai argumen, Anda hanya perlu melewatkan variabel
yang mereferensi array. Kode berikut menunjukkan sebuah contoh bagaimana metode
TampilArray dapat dipanggil:
1
2
3
4
5
|
//Menciptakan sebuah array
string
string[] orang = {“Ahok”,
“Jono”, “Poltak”, “Ketut”};
//Melewatkan array kepada metode
TampilArray
TampilArray(orang);
|
Baris 2 menciptakan sebuah array string
dengan nama orang dan
menginisialisasinya dengan empat string. Baris 5 memanggil metode TampilArray yang melewatkan array orang sebagai argumennya.
Ingat bahwa array selalu dilewatkan dengan
referensi. Ketika Anda melewatkan suatu array sebagai argumen, apa yang
dilewatkan kepada variabel parameter adalah referensi ke array itu. Ini
diilustrasikan pada Gambar 5.15. Seperti ditunjukkan pada gambar, variabel orang memuat suatu referensi ke sebuah
array. Ketika variabel orang dilewatkan kepada metode TampilArray, referensi ke array dilewatkan kepada variabel
parameter strArray. Gambar 5.16
menunjukkan bahwa ketika metode TampilArray
dieksekusi, variabel orang dan
variabel parameter strArray akan
mereferensi array yang sama di dalam memori.
Karena array selalu dilewatkan dengan
referensi, metode yang menerima array tersebut sebagai argumen memiliki akses
terhadap array aktual (bukan salinan array). Sebagai contoh, Anda akan
menemukan sebuah projek dengan nama Argumen
Array. Gambar 5.17 form aplikasi
setelah user mengklik tombol Go.
Kode berikut menunjukka event handler Click
untuk tombol Go, dan sebuah metode
dengan nama TetapkanJadiNol:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
//Event handler Click untuk
kontrol tombolGo
private void tombolGo_Click(object
sender, EventArgs e)
{
//Menciptakan sebuah array int
int[] angka = { 1, 2, 3 };
//Menampilkan array pada kotak list
kotakListKeluaran.Items.Add(“Isi awal array:”);
foreach (int nilai in angka)
{
kotakListKeluaran.Items.Add(nilai);
}
//Melewatkan array kepada metode TetapkanJadiNol
TetapkanJadiNol(angka);
//Menampilkan array pada kotak list lagi
kotakListKeluaran.Items.Add(“”);
kotakListKeluaran.Items.Add(“Setelah memanggil TetapkanJadiNol:”);
foreach (int nilai in angka)
{
kotakListKeluaran.Items.Add(nilai);
}
}
//Metode TetapkanJadiNol menerima sebuah array int sebagai
//argumen dan menetapkan elemen-elemennya menjadi 0
private void TetapkanJadiNol(int[] iArray)
{
for (int indeks = 0; indeks < iArray.Length; indeks++)
{
iArray[indeks] = 0;
}
}
|
Amati kode event handler tombolGo_Click lebih dekat:
·
Baris 5 menciptakan sebuah array int
dengan nama angka, yang
diinisialisasi dengan 1, 2, dan 3.
·
Baris 8 menampilkan string “Isi awal array: “pada kontrol kotakListKeluaran.
· Loop foreach pada baris 9-12
menampilkan isi array angka pada
kontrol kotakListKeluaran. Lihat
pada Gambar 5.17 dan perhatikan bahwa nilai-nilai array adalah 1, 2, dan 3.
·
Baris 15 memanggil metode TetapkanJadiNol,
yang melewatkan array angka sebagai argumen.
· Baris 18 menampilkan sebaris kosong pada kontrol kotakListKeluaran, dan baris 19 menampilkan string “Setelah
memanggil TetapkanJadiNol: “.
· Loop foreach pada baris 9-12 menampilkan isi
dari array angka pada kontrol kotakListKeluaran. Lihat pada Gambar 5.17 dan perhatikan bahwa
nilai-nilai array sekarang adalah 0, 0, dan 0.
Seperti yang dapat dilihat pada Gambar 5.17,
metode TetapkanJadiNol mengubah
nilai-nilai yang disimpan di dalam array angka.
Lihat pada metode TetapkanJadiNol:
· Perhatikan
pada baris 28 bahwa metode ini menerima sebuah array int sebagai argumen. Nama dari variabel parameter adalah iArray.
· Baris 30
merupakan awal dari loop for yang
menjejak array. Ketika loop beriterasi, variabel indeks ditugasi nilai 0, 1, 2, dan seterusnya. Loop beriterasi
sepanjang indeks bernilai kurang
dari i.Array.Length.
·
Statemen pada
baris 32 menugaskan 0 kepada elemen array iArray[indeks].
Karena parameter iArray merupakan sebuah referensi ke array yang dilewatkan sebagai
argumen, statemen pada baris 32 menugaskan 0 kepada sebuah elemen dari array angka.
Menggunakan ref dan out pada
Parameter Array
Anda telah melihat pada contoh sebelumnya
bahwa array selalu dilewatkan dengan referensi. Ketika Anda melewatkan suatu
array sebagai argumen kepada metode, metode itu memiliki akses langsung ke
array melalui variabel parameter. Namun, metode tidak dapat mengakses variabel
referensi asli yang dipakai untuk melewatkan array. Sebagai contoh, Anda akan
mendapati suatu projek dengan nama Ubah
Array 1. Gambar 5.18 menunjukkan
form aplikasi setelah user mengklik tombol Go.
Kode berikut menunjukkan event handler Click
untuk tombol Go dan sebuah metode
dengan nama UbahArray:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
private void tombolGo_Click(object
sender, EventArgs e)
{
//Menciptakan sebuah array int
int[] angka = { 1, 2, 3 };
//Menampilkan array pada kotak list
kotakListKeluaran.Items.Add(“Isi awal array:”);
foreach (int nilai in angka)
{
kotakListKeluaran.Items.Add(nilai);
}
//Melewatkan array kepada metode UbahArray
UbahArray(angka);
//Menampilkan array pada kotak list lagi
kotakListKeluaran.Items.Add(“Setelah memanggil UbahArray:”);
foreach (int nilai in angka)
{
kotakListKeluaran.Items.Add(nilai);
}
}
private void UbahArray(int[]
iArray)
{
const int UKURAN_BARU
= 5;
//Membuat iArray
mereferensi array yang berbeda
iArray = new
int[UKURAN_BARU];
//Menetapkan elemen-elemen array baru
menjadi 99
for (int indeks = 0; indeks <
iArray.Length; indeks++)
{
iArray[indeks] = 99;
}
}
|
Amati kode event handler tombolGo_Click lebih dekat:
·
Baris 4 menciptakan sebuah array int
dengan nama angka, yang
diinisialisasi dengan 1, 2, dan 3.
·
Baris 7 menampilkan string “Isi awal array: “pada kontrol kotakListKeluaran.
· Loop foreach pada baris 8-11
menampilkan isi array angka pada
kontrol kotakListKeluaran. Lihat
pada Gambar 5.18 dan perhatikan bahwa nilai-nilai array adalah 1, 2, dan 3.
·
Baris 14 memanggil metode UbahArray,
yang melewatkan array angka sebagai
argumen.
· Loop foreach pada baris 17-21 menampilkan isi dari array angka pada kontrol kotakListKeluaran. Lihat pada Gambar 5.18 dan perhatikan bahwa nilai-nilai array masih
tetap sama 1, 2, dan 3. Metode ini tidak mengubah isi array.
Seperti yang dapat dilihat pada Gambar 5.18,
metode UbahArray mengubah
nilai-nilai yang disimpan di dalam array angka.
Lihat pada metode TetapkanJadiNol:
· Perhatikan
pada baris 24 bahwa metode
ini menerima sebuah array int
sebagai argumen. Nama dari variabel parameter adalah iArray. Ingat bahwa ketika Anda memanggil metode ini pada baris 14 yang
melewatkan angka sebagai argumen,
parameter iArray dan variabel angka mereferensi array yang sama di
dalam memori.
·
Baris 26 mendeklarasikan sebuah konstanta int dengan nama UKURAN_BARU,
yang ditetapkan nilai 5.
· Baris 29 menciptakan sebuah array int
baru di dalam memori dengan lima elemen. Suatu referensi ke array ditugaskan
kepada variabel parameter iArray.
Seperti ditunjukkan pada Gambar 5.19, ini menyebabkan variabel parameter iArray tidak lagi mereferensi array
yang sebelumnya dilewatkan sebagai argumen. Jadi, parameter iArray mereferensi array baru.
· Loop for pada baris 32-35
menugaskan nilai 99 kepada tiap elemen array yang direferensi oleh iArray. Ini tidak memengaruhi array angka.
Ketika Anda menggunakan katakunci ref atau out pada parameter array, metode penerima tidak hanya dapat
mengakses array, tetapi ia juga memiliki akses terhadap variabel referensi yang
dipakai untuk melewatkan array. Sebagai contoh, projek Ubah Array 2 identik dengan projek Ubah Array 1, kecuali bahwa parameter iArray dideklarasikan dengan katakunci ref pada metode UbahArray. Kode berikut menunjukkan
event handler Click untuk tombol Go, dan metode UbahArray.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
private void tombolGo_Click(object
sender, EventArgs e)
{
//Menciptakan sebuah array int
int[] angka = { 1, 2, 3 };
//Menampilkan array pada kotak list
kotakListKeluaran.Items.Add(“Isi awal array:”);
foreach (int nilai in angka)
{
kotakListKeluaran.Items.Add(nilai);
}
//Melewatkan array kepada metode UbahArray
UbahArray(ref angka);
//Menampilkan array pada kotak list lagi
kotakListKeluaran.Items.Add(“Setelah memanggil UbahArray:”);
foreach (int nilai in angka)
{
kotakListKeluaran.Items.Add(nilai);
}
}
private void UbahArray(ref int[]
iArray)
{
const int UKURAN_BARU
= 5;
//Membuat iArray
mereferensi array yang berbeda
iArray = new
int[UKURAN_BARU];
//Menetapkan elemen-elemen array baru
menjadi 99
for (int indeks = 0; indeks <
iArray.Length; indeks++)
{
iArray[indeks] = 99;
}
}
|
Perhatikan pada baris 24 parameter iArray dideklarasikan dengan katakunci ref, dan pada baris 14 katakunci ref dipakai untuk melewatkan angka sebagai argumen kepada metode UbahArray. Pada kode ini, parameter iArray mereferensi variabel angka.
Apa yang dilakukan pada parameter iArray akan dilakukan pada variabel angka. Gambar 5.20 menunjukkan
bagaimana baris 29 menyebabkan variabel angka
mereferensi array limae-elemen yang baru.
Gambar 5.21 menunjukkan form aplikasi setelah
user mengklik tombol Go. Perhatikan
dari keluaran program bahwa setelah metode UbahArray
telah dipanggil, variabel angka
mereferensi sebuah array lima-elemen, dan setiap nilai elemen adalah 99.
5.5 Beberapa Algoritma Array yang Berguna
Pencarian
Sekuensial
Program-program umum perlu melakukan
pencarian data yang disimpan di dalam suatu array. Sejumlah teknik yang dikenal
sebagai algoritma-algoritma pencarian telah dikembangkan untuk melakukan
pencarian terhadap item spesifik di dalam sebuah koleksi data berukuran besar,
seperti array. Pada bagian ini, Anda akan mempelajari algoritma pencarian yang
paling sederhana, yaitu pencarian sekuensial. Algoritma pencarian sekuensial
menggunakan suatu loop untuk secara sekuensial menjejak sebuah array, dimulai
dari elemen pertama. Ia membandingkan tiap elemen dengan nilai yang sedang
dicari dan berhenti ketika nilai itu ditemukan atau ketika akhir array telah
dijumpai.
Lihat pada contoh berikut. Anda akan
menemukan sebuah projek dengan nama Propinsi
Indonesia. Aplikasi ini merupakan suatu permainan untuk menguji
pengetahuan tentang wilayah Indonesia. Seperti ditunjukkan pada Gambar 5.22,
form aplikasi menampilkan sebuah daftar propinsi pada kontrol ListBox. Hanya salah satu yang ada pada
ListBox yang merupakan propinsi di
Indonesia. Anda memilih satu yang Anda percayai sebagai propinsi di Indonesia
dan mengklik tombol OK untuk melihat
apakah jawaban Anda benar atau salah.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
//Metode PencarianSekuensial melakukan pencarian pada sebuah
array string
//terhadap suatu nilai tertentu. Jika nilai ditemukan,
//posisinya akan dihasilkan. Jika tidak, -1 dihasilkan
private int PencarianSekuensial(string[] sArray, string nil)
{
bool ditemukan = false; //Bendera yang
mengindikasikan hasil pencarian
int indeks = 0; //Dipakai untuk menjejak array
int posisi = −1; //Posisi dari nil, jika ditemukan
//Pencarian pada array
while (!ditemukan && indeks
< sArray.Length)
{
if (sArray[indeks] == nil)
{
ditemukan = true;
posisi = indeks;
}
indeks++;
}
//Nilai balik
return posisi;
}
private void tombolOK_Click(object sender, EventArgs e)
{
string seleksi; //Untuk memuat seleksi
user
//Menciptakan sebuah array dengan
nama-nama propinsi
string[] propinsi = { “Sumatera Utara”,
“Aceh”, “Sulawesi Utara”,
“Maluku Utara”, “Kalimantan Utara”, “Papua
Barat”,
“Nusa Tenggara Timur”, “Banten”, “Jambi”,
“Lampung”, “Riau”, “Papua”,
“Jawa Timur” };
if (kotakListSeleksi.SelectedIndex !=
−1)
{
//Membaca item terseleksi
seleksi = kotakListSeleksi.SelectedItem.ToString();
//Menentukan apakah item ada di dalam
array
if (PencarianSekuensial(propinsi, seleksi)
!= -1)
{
MessageBox.Show(“Ya, ia
merupakan salah satu propinsi di Indonesia.”);
}
else
{
MessageBox.Show(“Tida, ia bukan
salah satu propinsi di Indonesia.”);
}
}
}
|
Metode PencarianSekuensial,
yang diawali pada baris 4, melakukan pencarian pada sebuah array string terhadap suatu nilai spesifik.
Ia menerima sebuah array string dan
sebuah nilai pencarian string
sebagai argumen. Jika nilai yang dicari ditemukan di dalam array, metode ini
akan menghasilkan indeks dari nilai itu. Jika nilai yang dicari tidak ditemukan
di dalam array, metode akan menghasilkan nilai -1. Amati kode ini lebih dekat:
· Baris 6 mendeklarasikan sebuah variabel bool dengan nama ditemukan.
Variabel ditemukan dipakai sebagai
bendera. Pengaturan ditemukan
menjadi false mengindikasikan bahwa
nilai yang dicari tidak ditemukan. Pengaturan ditemukan menjadi true
mengindikasikan bahwa nilai yang dicari telah ditemukan. Perhatikan bahwa ditemukan diinisialisasi dengan false.
· Baris 7 mendeklarasikan sebuah variabel int dengan nama indeks
yang akan dipakai untuk menjejak elemen-elemen array. Perhatikan bahwa indeks diinisialisasi dengan nilai 0.
· Baris 8 mendeklarasikan sebuah variabel int dengan nama posisi.
Jika nilai yang dicari ditemukan di dalam array, Anda menyimpan indeksnya pada
variabel posisi. Perhatikan bahwa
variabel posisi diinisialisasi
dengan nilai -1.
· Loop while yang diawali pada
baris 11 melakukan pencarian pada array untuk menemukan nilai tertentu. Ia
beriterasi sepanjang ditemukan tidak
bernilai true dan indeks bernilai lebih kecil dari
panjang array.
· Statemen if pada baris 13
menentukan apakah sArray[indeks]
bernilai sama dengan nil. Jika ya,
maka nilai yang dicari telah ditemukan di dalam array. Pada kasus itu, baris 15
akan menetapkan ditemukan menjadi true, dan baris 16 menugaskan indeks kepada posisi.
·
Baris 19 menginkremen indeks.
· Ketika loop selesai dieksekusi, baris 23 menghasilkan nilai dari
variabel posisi. Jika nilai yang
dicari ditemukan di dalam array, variabel posisi
akan memuat indeks dari nilai. Jika nilai yang dicari tidak ditemukan di dalam
array, variabel posisi akan
ditetapkan -1.
Event handler Click untuk tombol OK diawali pada baris 26. Amati kode event
handler ini lebih dekat:
·
Baris 28 mendeklarasikan sebuah variabel string dengan nama seleksi.
Variabel ini akan memuat item yang diseleksi dari kontrol ListBox.
· Baris 31-35 mendeklarasikan sebuah array string dengan nama propinsi.
Array ini diinisialisasi dengan nama-nama propinsi di Indonesia.
· Statemen if yang diawali pada
baris 37 menentukan apakah sebuah item telah diseleksi pada kontrol kotakListSeleksi. Jika sebuah item
telah diseleksi, aksi-aksi berikut akan terjadi:
·
Baris 40 membaca item terseleksi dan menugaskannya kepada variabel seleksi.
·
Statemen if pada baris 43
memangil metode PencarianSekuensial,
yang melewatkan array propinsi dan
variabel seleksi sebagai argumen.
Jika nilai dari variabel seleksi
ditemukan di dalam array propinsi,
metode ini akan menghasilkan nilai selain -1 dan baris 45 akan menampilkan sebuah kotak pesan yang
memberitahu user bahwa item terseleksi merupakan salah satu propinsi. Namun,
jika nilai dari variabel seleksi
tidak ditemukan di dalam array propinsi,
maka metode ini akan menghasilkan nilai -1, dan baris 49 akan menampilkan suatu
kotak pesan yang memberitahu user bahwa item terseleksi bukanlah salah satu
propinsi di Indonesia.
Menyalin Array
Karena array adalah objek, ada perbedaan
antara array dan variabel yang mereferensinya. Array dan variabel referensi
adalah dua entitas yang berbeda. Ini penting untuk diingat ketika Anda ingin
menyalin isi dari satu array ke array lain. Anda akan tergoda untuk mencoba menuliskan
sesuatu seperti kode berikut, berpikir bahwa Anda sedang menyalin sebuah array:
int[] array1 = { 2, 4, 6, 8, 10 };
int[] array2 = array1; //Ini
tidak menyalin array1
Statemen pertama menciptakan sebuah array
yang direferensi oleh variabel array1.
Statemen kedua menugaskan array1
kepada array2. Ini tidak melakukan
penyalinan array yang direferensi oleh array1.
Tetapi, ia menugaskan referensi yang menunjuk ke array1 kepada array2.
Setelah statemen ini dieksekusi, kedua variabel array1 dan array2 akan
mereferensi array yang sama. Tipe operasi penugasan ini dinamakan dengan penyalinan referensi. Hanya suatu referensi yang menunjuk ke sebuah objek yang
disalin, bukan isi dari objek array yang disalin. Ini diilustrasikan pada
Gambar 5.23.
Jika Anda melakukan penyalinan suatu array, Anda perlu menciptakan array kedua di dalam memori dan kemudian menyalin elemen-elemen individual dari array pertama ke array kedua. Ini sebaiknya dilakukan dengan loop, seperti berikut:
1
2
3
4
5
6
7
8
|
const int UKURAN = 5;
int[] arrayPertama = { 5, 10,
15, 20, 25 };
int[] arrayKedua = new int[UKURAN];
for (int indeks = 0; indeks< arrayPertama.length;
indeks++)
{
arrayKedua[indeks] = arrayPertama[indeks];
}
|
Loop pada kode ini menyalin setiap elemen
dari arrayPertama ke elemen terkait
pada arraykedua.
Membandingkan Array
Anda tidak dapat menggunakan operator ==
untuk membandingkan dua variabel referensi array dan menentukan apakah kedua
array sama atau tidak. Sebagai contoh, kode berikut dimaksudkan untuk
membandingkan dua array, tetapi pada kenyataannya tidak.
1
2
3
4
5
6
7
8
9
10
11
|
int[] arrayPertama = { 5, 10,
15, 20, 25 };
int[] arrayKedua = { 5, 10, 15,
20, 25 };
if (arrayPertama == arrayKedua)
//Ini kesalahan
{
MessageBox.Show(“Kedua array sama.”);
}
else
{
MessageBox.Show(“Kedua array tidak sama.”);
}
|
Ketika Anda menggunakan operator == pada
variabel referensi, operator ini membandingkan referensi yang dimuat variabel,
bukan isi dari objek yang direferensi oleh variabel. Karena variabel arrayPertama dan arrayKedua pada contoh ini mereferensi objek-objek yang berbeda di
dalam memori, hasil dari ekspresi Boolean arrayPertama
== arrayKedua adalah false, dan kode melaporkan bahwa kedua array tidak sama.
Untuk membandingkan isi dari dua array, Anda
perlu membandingkan elemen-elemen dari kedua array tersebut. Sebagai contoh,
lihat pada kode berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
int[] arrayPertama = { 2, 4, 6,
8, 10 };
int[] arrayKedua = { 2, 4, 6, 8,
10 };
boolean arraySama = true; //Variabel
bendera
int indeks = 0; //Untuk memuat indeks array
//Pertama menentukan apakah
kedua array berukuran sama
if (arrayPertama.Length != arrayKedua.Length)
{
arraySama = false;
}
//Selanjutnya, menentukan apakah
elemen-elemen memuat data sama
while (arraySama && indeks
< arrayPertama.Length)
{
if (arrayPertama[indeks] != arrayKedua[indeks])
{
arraySama = false;
}
indeks++;
}
if (arraySama)
{
MessageBox.Show(“Kedua array sama.”);
}
else
{
MessageBox.Show(“Kedua array tidak sama.”);
}
|
Kode ini menentukan apakah arrayPertama dan arrayKedua (yang dideklarasikan pada baris 1 dan baris 2) memuat
nilai-nilai yang sama atau tidak. Sebuah variabel bendera Boolean, arraySama, dideklarasikan dan
diinisialisasi dengan true pada
baris 3. Variabel arraySama dipakai
untuk memberitahu apakah kedua array sama. Variabel lain, indeks, dideklarasikan dan diinisialisasi dengan 0 pada baris 4.
Variabel indeks dipakai di dalam
loop untuk menjejak array.
Pertama, statemen if pada baris 7 menentukan apakah kedua array berukuran sama. Jika
keduanya tidak berukuran sama, maka variabel bendera arraySama akan ditetapkan false pada baris 9. Kemudian loop while diawali pada baris 13. Loop
dieksekusi sepanjang arraySama
bernilai true dan variabel indeks bernilai kurang dari arrayPertama.Length. Pada tiap iterasi,
ia membandingkan ia membandingkan elemen-elemen terkait pada kedua array.
Ketika ia menemukan bahwa dua elemen terkait memiliki nilai yang berbeda,
variabel bendera arraySama akan
ditetapkan false.
Setelah loop selesai dieksekusi, sebuah
statemen if akan memeriksa variabel arraySama pada baris 22. Jika variabel
bernilai true, maka kedua array sama
dan sebuah pesan yang mengindikasikannya akan ditampilkan pada baris 24. Jika
tidak, kedua array tidak sama, jadi pesan yang berbeda akan ditampilkan pada
baris 28.
Mentotal Nilai-Nilai di dalam Sebuah
Array
Untuk menghitung total dari nilai-nilai di
dalam sebuah array numerik, Anda menggunakan sebuah loop dengan suatu variabel
akumulator. Pertama, akumulator diinisialisasi dengan 0. Kemudian, loop
menjejak array, menambahkan nilai dari tiap elemen array pada akumulator.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//Menciptakan sebuah array int
int[] angka = { 2, 4, 6, 8, 10
};
//Mendeklarasikan dan
menginisialisasi suatu variabel akumulator
int total = 0;
//Menjejak array, menambahkan
tiap elemen pada
//akumulator
for (int indeks = 0; indeks <
angka.Length; indeks++)
{
total += angka[indeks];
}
//Menampilkan total
MessageBox.Show(“Total sebesar “ + total);
|
Mereratakan Nilai-Nilai di dalam Sebuah Array
Langkah pertama dalam menghitung rerata dari
semua nilai pada sebuah array numerik adalah dengan mendapatkan total dari
semua nilai. Langkah kedua adalah dengan membagi total tersebut dengan banyak
elemen pada array. Kode berikut menunjukkannya:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//Menciptakan sebuah array
double[] skor = { 92.5, 81.6,
65.7, 72.8 }
//Mendeklarasikan dan
menginisialisasi sebuah variabel akumulator
double total = 0.0;
//Mendeklarasikan sebuah variabel untuk memuat
rerata
double rerata;
//Menjejak array, menambahkan
tiap elemen pada
//akumulator
for (int indeks = 0; indeks <
skor.Length; indeks++)
{
total += skor[indeks];
}
//Menghitung rerata
rerata = total / skor.Length;
//Menampilkan rerata
MessageBox.Show(“Rerata sebesar
“ + rerata);
|
Ketika kode ini dieksekusi, variabel rerata akan memuat rerata dari
nilai-nilai yang ada di dalam array skor.
Perhatikan bahwa statemen terakhir, yang membagi total dengan skor.Length,
tidak berada di dalam loop. Statemen ini dieksekusi satu kali, setelah loop
selesai dieksekusi.
Mencari Nilai Tertinggi dan Nilai Terendah di dalam Array
Sejumlah pekerjaan pemrograman mengharuskan
Anda untuk mencari nilai tertingg pada suatu himpunan data. Contoh-contoh
tersebut mencakup program-program yang melaporkan jumlah penjualan tertinggi
pada periode tertentu, skor ujian tertinggi pada sejumlah skor ujian, suhu
tertinggi pada beberapa hari, dan seterusnya.
Algoritma dalam mencari nilai tertinggi di dalam suatu array diterapkan seperti ini: Anda menciptakan sebuah variabel untuk memuat nilai tertinggi (contoh berikut menamai variabel ini dengan tertinggi). Kemudian, Anda menugaskan nilai pada elemen 0 kepada variabel tertinggi. Selanjutnya, Anda menggunakan sebuah loop untuk menjejak elemen-elemen array yang lain, diawali pada elemen 1. Setiap kali loop beriterasi, ia membandingkan sebuah elemen array dengan variabel tertinggi. Jika elemen array tersebut lebih besar dari variabel tertinggi, maka nilai pada elemen array tersebut ditugaskan kepada variabel tertinggi. Ketika loop selesai dieksekusi, variabel tertinggi akan memuat nilai tertinggi pada array. Diagram alir pada Gambar 5.24 mengilustrasikan logika ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//Menciptakan sebuah array int
int[] angka = { 8, 1, 12, 6, 2
};
//Mendeklarasikan sebuah
variabel untuk memuat nilai tertinggi, dan
//menginisialisasinya dengan
nilai pertama di dalam array
int tertinggi = angka[0];
//Menjejak elemen-elemen array
yang lain, diawali dari
//elemen 1. Ketika sebuah nilai
yang lebih besar dari tertinggi
//ditemukan, tugaskan nilai itu
kepada tertinggi
for (int indeks = 1; indeks <
angka.Length; ind indeks++)
{
if (angka[indeks] > tertinggi)
{
tertinggi = angka[indeks];
}
}
//Menampilkan nilai tertinggi
MessageBox.Show(“Nilai tertinggi adalah “ + tertinggi);
|
Pada beberapa program, Anda mungkin lebih tertarik dalam mencari nilai terendah daripada nilai tertinggi pada suatu himpunan data. Sebagai contoh, dimisalkan bahwa Anda sedang menuliskan suatu program yang menyimpan sejumlah skor golf di dalam suatu array dan Anda perlu mencari skor terbaik. Dalam golf, semakin rendah skor semakin baik, jadi Anda memerlukan sebuah algoritma yang mencari nilai terendah di dalam array.
Algoritma dalam mencari nilai terendah di dalam suatu array sangat mirip dengan algoritma untuk mencari nilai tertinggi. Algoritma ini bekerja seperti berikut: Anda menciptakan sebuah variabel untuk memuat nilai terenda (contoh berikut menamai variabel ini dengan terendah). Kemudian, Anda menugaskan nilai pada elemen 0 kepada variabel terendah. Selanjutnya, Anda menggunakan sebuah loop untuk menjejak elemen-elemen array yang lain, diawali pada elemen 1. Setiap kali loop beriterasi, ia membandingkan sebuah elemen array dengan variabel terendah. Jika elemen array tersebut lebih kecil dari variabel terendah, maka nilai pada elemen array tersebut ditugaskan kepada variabel terendah. Ketika loop selesai dieksekusi, variabel terendah akan memuat nilai tertinggi pada array. Diagram alir pada Gambar 5.25 mengilustrasikan logika ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//Menciptakan sebuah array int
int[] angka = { 8, 1, 12, 6, 2
};
//Mendeklarasikan sebuah
variabel untuk memuat nilai terendah, dan
//menginisialisasinya dengan
nilai pertama di dalam array
int terendah = angka[0];
//Menjejak elemen-elemen array
yang lain, diawali dari
//elemen 1. Ketika sebuah nilai
yang lebih kecil dari terendah
//ditemukan, tugaskan nilai itu
kepada terendah
for (int indeks = 1; indeks <
angka.Length; ind indeks++)
{
if (angka[indeks] < terendah)
{
terendah = angka[indeks];
}
}
//Menampilkan nilai terendah
MessageBox.Show(“Nilai terendah adalah “ + terendah);
|
Array Terisi Sebagian
Kadangkala Anda ingin menyimpan sejumlah item
di dalam suatu array, tetapi Anda tidak mengetahui banyak item secara persis.
Hasilnya, Anda tidak mengetahui banyak elemen persis yang diperlukan untuk
array. Salah satu solusinya adalah dengan membuat array cukup besar untuk
memuat banyak item terbesar yang mungkin dimilikinya. Ini akan menyebabkan
masalah lain. Jika banyak item aktual yang disimpan di dalam array kurang dari
banyak elemen array, maka array akan terisi hanya sebagian. Ketika Anda
memproses sebuah array yang terisi sebagian, Anda hanya perlu memproses
elemen-elemen yang memuat item-item data yang valid.
Sebuah array yang terisi sebagian biasanya
digunakan ditemani dengan suatu variabel integer yang memuat banyak item yang
secara aktual disimpan di dalam array. Jika array kosong, maka 0 disimpan di
dalam variabel ini karena tidak ada item di dalam array. Setiap kali sebuah
item ditambahkan pada array, variabel itu akan diinkremen. Ketika kode menjejak
elemen-elemen array, nilai dari variabel ini digunakan menggantikan ukuran
array untuk menentukan indeks maksimum.
Sebagai contoh, Anda akan menjumpai sebuah
projek dengan nama Array Terisi Sebagian.
Ketika Anda mengklik tombol Go,
aplikasi akan membaca 100 nilai dari sebuah file dengan nama Nilai.txt dan menyimpannya ke dalam
sebuah array int 100-elemen. Jika
file memuat lebih sedikit dari 100 nilai, aplikasi akan mengisi sebagian saja
dari array. Isi array akan ditampilkan pada sebuah kotak list. Gambar 5.26
menunjukkan form aplikasi setelah user mengklik tombol Go. Kode berikut menunjukkan event handler Click untuk tombol Go.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
private void tombolGo_Click(object
sender, EventArgs e)
{
try
{
//Menciptakan sebuah array untuk memuat item-item yang dibaca
dari file
const int UKURAN = 100;
int[] angka = new int[UKURAN];
//Variabel untuk memuat banyak item yang disimpan di dalam
//array
int hitung = 0;
//Mendeklarasikan sebuah variabel StreamReader
StreamReader fileMasukan;
//Membuka file dan membaca sebuah objek StreamReader
fileMasukan = File.OpenText(“Nilai.txt”);
//Membaca isi file ke dalam array sampai
//akhir file dijumpai, atau sampai array penuh
while (!fileMasukan.EndOfStream && hitung < angka.Length)
{
//Membaca item selanjutnya dari file
angka[hitung] = int.Parse(fileMasukan.ReadLine());
//Menginkremen hitung
hitung++;
}
//Menutup file
fileMasukan.Close();
//Menampilkan elemen-elemen array pada kotak list
kotakListKeluaran.Items.Add(“File memuat sebanyak “ + hitung +
“ item:”);
for (int indeks = 0; indeks < hitung; indeks++)
{
kotakListKeluaran.Items.Add(angka[indeks]);
}
}
catch (Exception ex)
{
//Menampilkan pesan error
MessageBox.Show(ex.Message);
}
}
|
Amati kode lebih detil:
· Baris 3 merupakan awal dari statemen try-catch yang menangani sembarang error yang bisa terjadi ketika
membaca data dari file.
·
Baris 6 mendeklarasikan sebuah konstanta UKURAN, yang diinisialisasi dengan nilai 100.
· Baris 7 mendeklarasikan sebuah array int dengan nama angka
menggunakan UKURAN sebagai deklarator
ukuran. Hasilnya, array dapat memuat 100 elemen.
· Baris 11 mendeklarasikan sebuah variabel int dengan nama hitung, yang memuat banyak item yang disimpan di
dalam array angka. Perhatikan bahwa hitung diinisialisasi dengan 0 karena belum ada nilai yang disimpan di
dalam array.
· Baris 14
mendeklarasikan sebuah variabel StreamReader
dengan nama fileMasukan. (Anda tidak
melihatnya pada kode ini, tetapi direktif using
System.IO ditampilkan di atas file. Ini diperlukan untuk deklarasi StreamReader pada baris 14).
· Baris 17 membuka sebuah file dengan nama Nilai.txt. Setelah statemen ini dieksekusi, variabel fileMasukan
mereferensi sebuah objek StreamReader
yang terkait dengan file itu.
· Baris 21 adalah awal dari sebuah loop while yang membaca item-item dari
file dan menugaskannya kepada elemen-elemen dari array angka. Perhatikan bahwa loop menguji dua ekspresi Boolean yang
dihubungkan oleh operator &&. Ekspresi pertama adalah !fileMasukan.EndOfStream. Tujuan dari
ekspresi ini adalah untuk mencegah loop dari pembacaan melebihi akhir file.
Ketika tidak ada lagi nilai yang dibaca dari file, loop akan berhenti. Ekspresi
kedua adalah hitung < angka.Length.
Tujuan dari ekspresi ini adalah mencegah loop dari penulisan melebihi akhir
array. Ketika array penuh, loop akan berhenti.
· Di dalam loop, baris 24 membaca sebaris teks dari file, mengkonversinya
menjadi sebuah int, dan
menugaskannya kepada angka[indeks].
· Kemudian, baris 27 menginkremen variabel hitung. Setiap kali sebuah nilai ditugaskan kepada sebuah elemen
array, variabel hitung akan
diinkremen. Hasilnya, variabel hitung
memuat banyak item yang disimpan di dalam array.
·
Baris 31 menutup file.
· Loop for pada baris 37-40 menampilkan elemen-elemen array pada kontrol kotakListKeluaran. Daripada menjejak
semua elemen di dalam array, loop hanya akan menjejak elemen-elemen yang memuat
nilai. Perhatikan bahwa loop beriterasi sepanjang indeks bernilai kurang dari hitung.
Karena hitung memuat banyak item
yang disimpan di dalam array, loop akan berhenti ketika elemen yang memuat
nilai valid terakhir telah ditampilkan.
Setelah Anda melihat beberapa algoritma dalam
memproses isi dari suatu array, Anda sebaiknya berlatih menuliskannya. Tutorial
5.2 memandu Anda dalam proses penulisan sebuah aplikasi yang membaca data dari
sebuah file ke dalam suatu array int dan kemudian menentukan nilai tertinggi,
nilai terendah, dan nilai rerata di dalam array.
Tutorial 5.2: Memproses Sebuah Array
Pada tutorial
ini, Anda akan menciptakan sebuah aplikasi yang membaca lima skor ujian dari
sebuah file dan menyimpan skor-skor ujian tersebut di dalam array. Aplikasi
menampilkan skor-skor ujian berikut dengan skor tertinggi, skor terendah, dan
skor rerata. Gambar 5.27 menunjukkan form aplikasi, yang telah disediakan bagi
Anda. Sebanyak lima skor ujian disimpan di dalam sebuah file dengan nama SkorUjian.txt, yang juga telah
diciptakan bagi Anda.
Langkah 1: Awali Visual Studio (atau Visual Studio
Express).
Langkah 2: Buka kode form Form1 pada editor kode. Sisipkan direktif using System.IO; yang ditunjukkan pada baris 10 pada Program 5.2 di
akhir dari tutorial ini. Statemen ini diperlukan karena Anda akan menggunakan
kelas StreamReader, dan ia merupakan
bagian dari namespace System.IO di
dalam .NET Framework.
Langkah 3: Dengan editor kode masih terbuka, ketikkan
komentar dan kode untuk metode Rerata,
yang ditunjukkan pada barais 21-40 pada Program 5.2. Tujuan dari metode Rerata adalah untuk menerima sebuah
array int sebagai argumen dan
menghasilkan rerata dari nilai-nilai di dalam array. Metode ini menggunakan
sebuah algoritma yang sama dengan pererataan array yang telah Anda pelajari
sebelumnya.
Langkah 4: ketikkan komentar dan kode untuk metode Tertinggi, yang ditunjukkan pada barais
42-63 pada Program 5.2. Tujuan dari metode Tertinggi
adalah untuk menerima sebuah array int
sebagai argumen dan menghasilkan nilai tertinggi dari nilai-nilai di dalam
array. Metode ini menggunakan sebuah algoritma yang telah Anda pelajari
sebelumnya.
Langkah 5: ketikkan komentar dan kode untuk metode Terendah, yang ditunjukkan pada barais
65-86 pada Program 5.2. Tujuan dari metode Terendah
adalah untuk menerima sebuah array int
sebagai argumen dan menghasilkan nilai terendah dari nilai-nilai di dalam
array. Metode ini menggunakan sebuah algoritma yang telah Anda pelajari
sebelumnya.
Langkah 5: Sekarang Anda menciptakan event handler
untuk tiap kontrol Button. Kembali
ke mode Designer dan klik ganda pada
kontrol tombolBaca. Ini akan membuka
editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolBaca_Click. Sempurnakan event
handler ini dengan mengetikkan kode yang ditunjukkan pada baris 90-134 pada
Program 5.2. Amati kode ini lebih dekat:
Baris 90: Ini adalah awal dari statemen try-catch yang menangani setiap eksepsi
yang dilemparkan ketika membaca dan memproses data dari file. Jika suatu
eksepsi terjadi di dalam blok try
(baris 92-128), program akan melompat ke blok catch, dan baris 133 akan menampilkan pesan error.
Baris 93-99: Deklarasi-deklarasi berikut diberikan pada
baris-baris ini:
·
UKURAN: sebuah konstanta,
ditetapkan 5, untuk banyak skor ujian.
·
skor: sebuah array int yang memuat skor-skor ujian.
· indeks: sebuah variabel int, yang diinisialisasi dengan 0, yang
dipakai di dalam loop untuk menjejak elemen-elemen dari array skor.
·
skorTertinggi: sebuah variabel int yang memuat skor tertinggi.
·
skorTerendah: sebuah variabel int yang memuat skor terendah.
·
skorRerata: sebuah variabel int yang memuat skor rerata.
· fileMasukan: sebuah variabel
yang mereferensi objek StreamReader
yang dipakai untuk membaca data dari file.
Baris 102: Setelah statemen ini dieksekusi, file SkorUjian.txt akan dibuka untuk
pembacaan, dan variabel fileMasukan
akan mereferensi sebuah objek StreamReader
yang berkaitan dengan file itu.
Baris 105: Ini merupakan awal dari loop while yang beriterasi sepanjang akhir
dari file SkorUjian.txt belum
dijumpai dan sepanjang indeks
bernilai kurang dari skor.Length.
Baris 107: Statemen ini membaca sebuah baris teks dari
file dan menugaskannya kepada elemen array skor[indeks].
Baris 108: Statemen ini menginkremen variabel indeks.
Baris 112: Statemen ini menutup file SkorUjian.txt.
Baris 115-118: Loop foreach
menampilkan isi dari array skor pada kontrol kotakListSkor.
Baris 121: Statemen ini memanggil metode Tertinggi, yang melewatkan array skor sebagai argumen. Metode ini
menghasilkan nilai tertinggi dari nilai-nilai di dalam array, yang ditugaskan
kepada variabel skorTertinggi.
Baris 122: Statemen ini memanggil metode Terendah, yang melewatkan array skor sebagai argumen. Metode ini
menghasilkan nilai terendah dari nilai-nilai di dalam array, yang ditugaskan
kepada variabel skorTerendah.
Baris 123: Statemen ini memanggil metode Rerata, yang melewatkan array skor sebagai argumen. Metode ini
menghasilkan rerata dari nilai-nilai di dalam array, yang ditugaskan kepada
variabel skorRerata.
Baris 126-128: Statemen-statemen ini menampilkan skor
tertinggi, skor terendah, dan skor rerata.
Langkah 7: Tukar kembali ke mode Designer dan klik ganda pada kontrol tombolKeluar. Pada editor kode, Anda akan melihat sebuah event
handler kosong dengan nama tombolKeluar_Click.
Sempurnakan event handler ini dengan menuliskan kode yang ditunjukkan pada
baris 139-140 pada Program 5.2.
Langkah 8: Simpan projek dan jalankan aplikasi. Ketika
aplikasi dijalankan, klik tombol Baca
Skor. Ini akan menampilkan sejumlah
skor ujian pada ListBox berikut
dengan skor tertinggi, skor terendah dan skor rerata, seperti ditunjukkan pada
Gambar 5.28. Klik tombol Keluar
untuk mengakhiri aplikasi.
Program 5.2 Kode utuh untuk form Form1 pada aplikasi Rerata Ujian
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace Rerata_Ujian
{
public
partial class Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
//Metode
Rerata menerima sebuah argumen array int
//dan
menghasilkan rerata dari nilai-nilai di dalam array
private
double Rerata(int[] iArray)
{
int
total = 0; //Akumulator,
diinisialisasi dengan 0
double rerata; //Untuk memuat
rerata
//Menjejak array, menambahkan tiap elemen pada
//akumulator
for (int indeks = 0; indeks <
iArray.Length; indeks++)
{
total += iArray[indeks];
}
//Menghitung rerata
rerata = (double) total / iArray.Length;
//Menghasilkan rerata
return rerata;
}
//Metode
Tertinggi menerima sebuah argumen array int
//dan
menghasilkan nilai tertinggi di dalam array
private
int Tertinggi(int[] iArray)
{
//Mendeklarasikan sebuah variabel untuk memuat nilai tertinggi, dan
//menginisialisasinya dengan nilai pertama di dalam array.
int
tertinggi = iArray[0];
//Menjejak elemen-elemen array yang lain, dimulai pada
//elemen 1. Ketika sebuah nilai yang lebih besar dari tertinggi
ditemukan,
//tugaskan nilai itu kepada tertinggi
for
(int indeks = 1; indeks < iArray.Length; indeks++)
{
if (iArray[indeks] > tertinggi)
{
tertinggi = iArray[indeks];
}
}
//Menghasilkan nilai tertinggi
return tertinggi;
}
//Metode
Terendah menerima sebuah argumen array int
//dan
menghasilkan nilai terendah di dalam array
private
int Terendah(int[] iArray)
{
//Mendeklarasikan sebuah variabel untuk memuat nilai terendah, dan
//menginisialisasinya dengan nilai pertama di dalam array.
int
terendah = iArray[0];
//Menjejak elemen-elemen array yang lain, dimulai pada
//elemen 1. Ketika sebuah nilai yang lebih kecil dari terendah
ditemukan,
//tugaskan nilai itu kepada terendah
for (int indeks = 1; indeks <
iArray.Length; indeks++)
{
if (iArray[indeks] < terendah)
{
terendah = iArray[indeks];
}
}
//Menghasilkan nilai tertinggi
return terendah;
}
private
void tombolBaca_Click(object sender, EventArgs e)
{
try
{
//Variabel-variabel lokal
const int UKURAN = 5;
//Banyaknya skor
int[] skor = new int[UKURAN];
//Array yang memuat skor-skor ujian
int indeks = 0;
//Pencacah loop
int skorTertinggi;
//Untuk memuat skor tertinggi
int skorTerendah;
//Untuk memuat skor terendah
double skorRerata;
//Untuk memuat skor rerata
StreamReader fileMasukan;
//Untuk file masukan
//Membuka file dan mendapatkan sebuah objek StreamReader
fileMasukan = File.OpenText("SkorUjian.txt");
//Membaca skor-skor ujian ke dalam array
while (!fileMasukan.EndOfStream && indeks < skor.Length)
{
skor[indeks] = int.Parse(fileMasukan.ReadLine());
indeks++;
}
//Menutup file
fileMasukan.Close();
//Menampilkan skor-skor ujian
foreach (int value in skor)
{
kotakListSkor.Items.Add(value);
}
//Mendapatkan skor tertinggi, terendah, rerata
skorTertinggi = Tertinggi(skor);
skorTerendah = Terendah(skor);
skorRerata = Rerata(skor);
//Menampilkan nilai-nilai
labelTertinggi.Text = skorTertinggi.ToString();
labelTerendah.Text = skorTerendah.ToString();
labelRerata.Text = skorRerata.ToString("n1");
}
catch
(Exception ex)
{
//Menampilkan pesan error
MessageBox.Show(ex.Message);
}
}
private
void tombolKeluar_Click(object sender, EventArgs e)
{
//Menutup form
this.Close();
}
}
}
|
5.6 Algoritma-Algoritma Untuk Pengurutan dan
Pencarian Array
KONSEP: Algoritma
pengurutan dipakai untuk menata data dengan urutan tertentu. Algoritma
pencarian adalah metode untuk mencari lokasi dari item tertentu pada suatu
koleksi data berukuran besar. Pengurutan seleksi dan pencarian biner merupakan
algoritma pengurutan dan algoritma pencarian yang populer.
Algoritma Pengurutan Seleksi
Seringkali data di dalam array harus diurutkan
dengan tatanan tertentu. Daftar konsumen, misalnya, umumnya diurutkan
berdasarkan alfabetis. Nilai-nilai siswa bisa diurutkan dari tertinggi sampai
terendah. Kode-kode barang dapat diurutkan sehingga semua barang dengan warna
sama disimpan bersama. Pada bagian ini, Anda akan mengeksplorasi bagaimana
menuliskan algoritma pengurutan sendiri. Algoritma pengurutan adalah suatu
teknik untuk menjelajah array dan menata-ulang isinya dengan urutan tertentu.
Algoritma yang akan dieksplorasi adalah pengurutan seleksi.
Pengurutan seleksi bekerja seperti ini: Nilai
terkecil di dalam array dicari lokasinya dan dipindahkan ke elemen 0. Kemudian
nilai terkecil berikutnya dicari lokasinya dan dipindahkan ke elemen 1. Proses
ini berlanjut sampai semua elemen telah ditempatkan dengan tatanan yang tepat.
Lihat bagaimana pengurutan seleksi bekerja ketika menata elemen-elemen array
pada Gambar 5.29.
Pengurutan seleksi menjelajah array, dimulai
pada elemen 0, dan mencari lokasi elemen dengan nilai terkecil. Kemudian, isi
dari elemen ini ditukar dengan isi dari elemen 0. Pada contoh ini, 1 yang
disimpan pada elemen 5 ditukar dengan 5 yang disimpan pada elemen 0. Setelah
penukaran, array tampak seperti ditunjukkan pada Gambar 5.30.
Kemudian, algoritma mengulangi proses yang sama, tetapi karena elemen 0 telah memuat nilai terkecil di dalam array, ia dapat dkeluarkan dari prosedur. Kali ini, algoritma dimulai pada elemen 1. Pada contoh ini, nilai pada elemen 2 ditukar dengan nilai pada elemen 1. Kemudian, array menjadi seperti ditampilkan pada Gambar 5.31.
Sekali lagi, proses ini diulangi, tetapi kali ini dimulai dari elemen 2. Algoritma akan menemukan bahwa elemen 5 memuat nilai terkecil selanjutnya. Nilai elemen ini ditukar dengan nilai pada elemen 2, yang menyebabkan array ditampilkan seperti pada Gambar 5.32.
Selanjutnya, proses diawali pada elemen 3. Nilainya ditukar dengan nilai pada elemen 5, yang menyebabkan array dihasilkan seperti pada Gambar 5.33.
Pada titik ini, hanya ada dua elemen yang perlu diurutkan. Algoritma ini menemukan bahwa nilai pada elemen 5 lebih kecil daripada nilai pada elemen 4, jadi keduanya ditukar. Ini akan menghasilkan array dengan tatanan terakhir, seperti ditunjukkan pada Gambar 5.34.
Penukaran Elemen-Elemen Array
Seperti yang Anda lihat pada penjelasan dari
algoritma pengurutan seleksi, elemen-elemen tertentu ditukar ketika algoritma
menjejak array. Anda perlu mempelajari proses penukaran dua item pada memori
komputer. Asumsikan bahwa Anda memiliki deklarasi-deklarasi variabel berikut:
int
a = 1;
int
b = 9;
Dimisalkan bahwa Anda ingin menukar nilai dari
kedua variabel ini sehingga a memuat 9 dan b memuat 1. Pertama-tama, Anda
mungkin berpikir bahwa Anda hanya perlu menugaskan variabel itu satu sama lain,
seperti ini:
//
ERROR! Hal berikut tidak menukar variabel
a
= b;
b
= a;
Untuk memahami bagaimana hal in ini tidak
bekerja, Anda perlu mempelajari kode tersebut. Statemen pertama adalah a = b.
Ini menyebabkan nilai 9 ditugaskan kepada a. Tetapi, apa yang terjadi dengan
nilai 1 yang sebelumnya disimpan di dalam a? Ingat, ketika Anda menugaskan
sebuah nilai baru kepada suatu varibel, nilai baru itu menggantikan nilai
apapun yang sebelumnya disimpan di dalam variabel. Jadi, nilai lama, 1,
dibuang. Kemudian statemen selanjutnya b = a. Karena variabel a memuat 9, ini
akan menugaskan 9 kepada b. Setelah kedua statemen ini dieksekusi, variabel a
dan b keduanya memuat nilai 9.
Agar Anda dapat menukar isi dari dua
variabel, Anda memerlukan sebuah variabel ketiga yang dapat berperan sebagai
lokasi penyimpanan sementara:
int
temp;
Kemudian, Anda dapat melakukan
langkah-langkah berikut untuk menukar nilai pada varibel a dan b:
·
Menugaskan nilai dar a kepada temp.
·
Menugaskan nilai dari b kepada a.
·
Menugaskan nilai dari temp
kepada b.
Gambar 5.35 menunjukkan isi dari kedua variabel
ketika langkah-langkah ini dilakukan. Perhatikan bahwa setelah selesai, nilai
di dalam a dan b telah tertukar.
Berikut adalah kode untuk sebuah metode Tukar yang dapat Anda gunakan untuk
menukar nilai-nilai int:
1
2
3
4
5
6
|
private void Tukar(ref int a,
ref int b)
{
int temp = a;
a = b;
b = temp;
}
|
Lihat sebuah program utuh yang
mendemonstrasikan algoritma pengurutan seleksi. Pada folder di CD, Anda akan
mendapati sebuah projek dengan nama Pengurutan Seleksi. Gambar 5.36 menunjukkan
form aplikasi. Pada Gambar 5.36a, Anda melihat form dengan nama-nama dari
sejumlah kontrol. Pada Gambar 5.36b, Anda melihat form setelah tombol Go
diklik.
Ketika Anda mengklik tombol Go, aksi-aksi berikut terjadi:
·
Sebuah array int diciptakan, yang diinisialisasi dengan nilai-nilai tak
terurut.
·
Isi dari array ditampilkan pada kontrol kotakListAwal.
· Array dilewatkan sebagai argumen kepada metode UrutSeleksi. Metode ini menggunakan algoritma pengurutan seleksi
untuk mengurutkan array.
·
Isi array ditampilkan pada kontrol kotakListTerurut.
Program 5.3 menunjukkan kode utuh untuk
aplikasi Pengurutan Seleksi.
Program 5.3 Kode utuh untuk form Form1 pada aplikasi Pengurutan
Seleksi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Pengurutan_Seleksi
{
public
partial class Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
//Metode
PengurutanSeleksi menerima sebuah array int sebagai argumen
//Ia
menggunakan agoritma pengurutan seleksi untuk mengurutkan array
private
void PengurutanSeleksi(int[] iArray)
{
int
minIndeks; //Indeks dari nilai
terkecil pada luasan pembacaan
int minNilai; //Nilai terkecil pada luasan pembacaan
//Loop terluar menjejak semua elemen array,
//kecuali yang terakhir. Variabel bacaAwal menandai
//posisi dimana pembacaan dimulai
for
(int bacaAwal = 0; bacaAwal < iArray.Length - 1; bacaAwal++)
{
//Asumsikan elemen pertama pada array
//adalah elemen terkecil
minIndeks = bacaAwal;
minNilai = iArray[bacaAwal];
//Menjejak array, diawali pada elemen kedua
//mencari nilai terkecil pada luasan pembacaan
for (int indeks = bacaAwal + 1; indeks < iArray.Length; indeks++)
{
if (iArray[indeks] <
minNilai)
{
minNilai = iArray[indeks];
minIndeks = indeks;
}
}
//Menukar elemen nilai terkecil dengna nilai
//pada elemen pertama pada luasan
pembacaan
Tukar(ref iArray[minIndeks], ref iArray[bacaAwal]);
}
}
//Metode
Tukar menerima dua argumen integer, dengan referensi,
//dan
menukar isinya
private
void Tukar(ref int a, ref int b)
{
int
temp = a;
a =
b;
b =
temp;
}
private
void tombolGo_Click(object sender, EventArgs e)
{
//Menciptakan array integer
int[] angka = { 4, 6, 1, 3, 5, 2 };
//Menampilkan array dengan tatanan awal
foreach (int nil in angka)
{
kotakListAwal.Items.Add(nil);
}
//Mengurutkan array
PengurutanSeleksi(angka);
//Menampilkan array dengan tatanan terurut
foreach (int nil in angka)
{
kotakListTerurut.Items.Add(nil);
}
}
private
void tombolKeluar_Click(object sender, EventArgs e)
{
//Menutup form
this.Close();
}
}
}
|
Algoritma Pencarian Biner
Sebelumnya pada bab ini, Anda telah
mempelajari alogoritma pencarian sekuensial, yang menggunakan sebuah loop untuk
menjejak array secara sekuensial, yang diawali dari elemen pertama. Ia
membandingkan setiap elemen dengan nilai yang sedang dicari dan berhenti ketika
nilai yang dicari ditemukan atau ketika akhir array dijumpai. Jika nilai yang
sedang dicari tidak ada di dalam array, maka algoritma tidak berhasil
menemukannya sampai akhir array.
Keuntungan dari pencarian sekuensial ini
adalah kesederhanaannya: Ia sangat mudah dipahami dan diimplementasikan. Selain
itu, ia juga tidak mengharuskan data di dalam array disimpan dengan urutan
tertentu. Kekurangannya adalah ketidak-efisienannya. Jika array memuat 20 ribu
elemen, algoritma ini perlu melihat semua 20 ribu elemennya untuk menemukan
suatu nilai yang bisa jadi merupakan elemen terakhir di dalam array.
Pada beberapa kasus, sebuah item bisa jadi
ditemukan di dekat awal array atau di dekat akhir array. Umumnya, untuk sebuah
array dengan n item, pencarian sekuensial menemukan lokasi dari suatu item
dengan n/2 percobaan. Jika suatu array memiliki 50 ribu elemen, pencarian
sekuensial perlu melakukan 25 ribu perbandingan. Ini tentu saja diasumsikan
bila item yang dicari secara konsisten ditemukan di dalam array. (n/2 adalah
rerata dari jumlah perbandingan. Jumlah perbandingan maksimum adalah n).
Ketika pencarian sekuensial gagal menemukan
lokasi dari suatu item, ia berarti telah melakukan perbandingan dengan semua
elemen di dalam array. Dengan bertambahnya percobaan pencarian yang gagal,
bertambah pula jumlah perbandingan rerata. Meskipun algoritma pencarian
sekuensial cukup untuk array berukuran kecil, ia tidak dapat dipakai untuk
array berukuran besar jika kecepatan pencarian merupakan faktor penting.
Pencarian biner adalah suatu algoritma cerdas
yang jauh lebih efisien daripada pencarian sekuensial. Satu-satunya
persyaratannya adalah bahwa nilai-nilai di dalam array harus terurut menaik.
Algoritma ini diawali dari elemen tengah. Jika elemen itu ternyata nilai yang
diinginkan, maka pencarian selesai. Jika tidak, nilai pada elemen tengah
bernilai lebih besar atau lebih kecil dari nilai yang dicari. Jika lebih besar,
maka nilai yang diinginkan (jika ia ada di dalam array) akan ditemukan di suatu
tempat pada setengah bagian pertama dari array. Jika lebih kecil, maka nilai
yang diinginkan akan ditemukan di suatu tempat pada setengah bagian kedua dari
array. Pada tiap kasus, setengah jumlah elemen array telah dieliminasi dari
pencarian.
Jika nilai yang dicari tidak ditemukan pada
elemen tengah, prosedur diulangi untuk setengah bagian array yang berpotensi
memuat nilai yang dicari. Sebagai contoh, jika setengah bagian terakhir dari
array merupakan tempat pencarian, algoritma ini akan menguji elemen tengahnya.
Jika nilai yang diinginkan tidak ditemukan di sana, pencarian dipersempit ke
seperempat bagian array yang ada sebelum atau sesudah elemen itu. Proses ini
berlanjut sampai nilai yang dicari ditemukan atau sampai tidak ada lagi elemen
yang perlu diuji.
Berikut adalah pseudocode untuk sebuah metode
yang melakukan pencarian biner pada suatu array.
Metode PencarianBiner(array,
nilaiDicari)
Tetapkan pertama menjadi 0
Tetapkan terakhir menjadi indeks terakhir
di dalam array
Tetapkan posisi menjadi −1
Tetapkan ditemukan menjadi false
While ditemukan tidak bernilai ture dan
pertama kurang dari atau sama dengan terakhir
Tetapkan tengah menjadi indeks tengah
antara array[pertama] dan array[terakhir]
If array[tengah] sama dengan
nilaiDicari
Tetapkan ditemukan menjadi true
Tetapkan posisi menjadi tengah
Else If array[tengah] lebih besar dari
nilaiDicari
Tetapkan terakhir menjadi tengah-1
Else
Tetapkan pertama menjadi tengah +1
End If
End While
Return posisi
End Metode
Algoritma ini menggunakan tiga variabel untuk
menandari posisi-posisi di dalam array: pertama,
terakhir, dan tengah. Variabel pertama dan terakhir menandai batas-batas dari
porsi array yang sedang menjadi tempat pencarian. Kedua variabel ini
diinisialsiasi dengan indeks dari elemen pertama dan elemen terakhir array.
Indeks dari elemen tengah antara elemen pertama dan elemen terakhir dihitung
dan disimpan di dalam variabel tengah.
Jika elemen di tengah array tidak memuat nilai yang dicari, maka variabel pertama atau terakhir diperbarui sehingga hanya setengah bagian array bagian
atas atau setengah bagian array bagian bawah yang menjadi tempat pencarian pada
iterasi selanjutnya. Ini akan memotong porsi array setiap kali loop gagal
menemukan nilai yang dicari.
Metode C# berikut melakukan pencarian biner
pada sebuah array integer. Parameter pertama, iArray, merupakan tempat pencarian untuk menemukan nilai yang
dicari, nil. Jika nilai ini
ditemukan, maka indeksnya akan dijadikan nilai balik. Sebaliknya, -1
dihasilkan, yang mengindikasikan bahwa nilai yang dicari tidak ada di dalam
array.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
private int BinarySearch(int[]
iArray, int nil)
{
int pertama = 0; //Elemen
pertama array
int terakhir = iArray.Length − 1; //Elemen terakhir array
int tengah; //Titik
tengah pencarian
int posisi = −1; //Posisi dari nilai yang dicari
bool ditemukan = false; //Bendera
//Mencari nil
while (!ditemukan && pertama <= terakhir)
{
//Menghitung titik tengah
tengah = (pertama + terakhir) / 2;
//Jika nil ditemukan di tengah
if (iArray[tengah] == nil)
{
ditemukan = true;
posisi = tengah;
}
//jika nil di setengah bagian bawah
else if (iArray[tengah] > nil)
{
terakhir = tengah - 1;
}
//jika nil di setengah bagian atas
else
{
pertama = tengah + 1;
}
}
//Menghasilkan posisi dari item atau -e
//jika tidak ditemukan
return posisi;
}
|
5.7 Array Dua Dimensi
KONSEP: Array
dua dimensi seperti beberapa array identik yang ditempatkan bersama. Ia berguna
untuk menyimpan beberapa himpunan data.
Array yang telah Anda pelajari sejauh ini
dikenal dengan array satu dimensi. Dikatakan satu dimensi karena ia hanya dapat
memuat satu himpunan data. Array dua dimensi, yang juga dikenal dengan array
2D, dapat memuat beberapa himpunan data.
Anda dapat memandang sebuah array dua dimensi seperti baris-baris dan
kolom-kolom elemen, yang ditunjukkan pada Gambar 5.37. Gambar ini menunjukkan
sebuah array dua-dimensi dengan tiga baris dan empat kolom. Perhatikan bahwa baris-baris
dinomori 0, 1, dan 2, dan kolom-kolom dinomori 1, 2, dan 3. Ada total 12 elemen
di dalam array.
Array dua dimensi berguna bila Anda bekerja dengan beberapa himpunan data. Sebagai contoh, dimisalkan bahwa Anda sedang merancang sebuah program pererataan-nilai untuk seorang dosen. Dosen tersebut memiliki enam siswa, dan tiap siswa mengambil lima ujian selama satu semester. Salah satu pendekatan yang bisa dilakukan adalah dengan menciptakan enam buah array satu dimensi, satu untuk tiap siswa. Setiap array ini akan memiliki lima elemen, satu untuk tiap skor ujian. Pendekatan ini akan melelahkan, karena Anda akan memproses setiap array secara terpisah. Pendekatan yang lebih baik adalah dengan menggunakan array dua dimensi yang memiliki enam baris (satu untuk tiap siswa) dan lima kolom (satu untuk tiap skor ujian), seperti ditunjukkan pada Gambar 5.38.
Mendeklarsikan Array Dua-Dimensi
Untuk mendeklarasikan sebuah array
dua-dimensi, dua deklarator ukuran diperlukan: deklarator ukuran pertama untuk
jumlah baris, dan deklarator ukuran kedua untuk jumlah kolom. Berikut adalah
sebuah contoh deklarasi dari sebuah array dua dimensi dengan tiga baris dan
empat kolom:
double[,] skor = new double[3, 4];
Perhatikan koma yang ditampilkan di dalam
kurung siku. Ini mengindikasikan bahwa variabel skor mereferensi sebuah array dua dimensi. Nilai 3 dan 4 adalah
deklarator ukuran. Deklarator ukuran pertama menetapkan banyak baris, dan
deklarator ukuran kedua menetapkan banyak kolom. Perhatikan bahwa kedua
deklarator ukuran dipisahkan dengan koma.
Sama seperti array satu dimensi, adalah lebih
baik untuk menggunakan konstanta bernama sebagai deklarator ukuran. Berikut
adalah salah satu contohnya:
const int BARIS = 3;
const int KOL = 4;
int[,] skor = new int[BARIS, KOL];
Ketika memproses data pada sebuah array dua
dimensi, setiap elemen memiliki dua subskript: satu untuk barisnya dan satu
lagi untuk kolomnya. Pada array skor,
elemen pada baris 0 direferensi sebagai berikut:
skor[0,0]
skor[0,1]
skor[0,2]
skor[0,3]
Elemen-elemen pada baris 1 direferensi
sebagai berikut:
skor[1,0]
skor[1,1]
skor[1,2]
skor[1,3]
Elemen-elemen pada baris 2 direferensi
sebagai berikut:
skor[2,0]
skor[2,1]
skor[2,2]
skor[2,3]
Gambar 5.39 mengilustrasikan array dengan
subskript-subskript ditunjukkan untuk tiap elemen:
Mengakses Elemen-Elemen Pada Arrray Dua Dimensi
Untuk mengakses salah satu elemen pada sebuah
array dua dimensi, Anda perlu menggunakan dua subkript. Sebagai contoh,
dimisalkan bahwa Anda memiliki deklarasi-deklarasi berikut pada suatu program:
const int BARIS = 5;
const int KOL = 10;
int[,] arrayNilai = new int[BARIS, KOL];
Statemen berikut menugaskan nilai 95 kepada arrayNilai[2,1]:
arrayNilai[2,1] = 95;
Program seringkali menggunakan loop bersarang
untuk memproses array dua dimensi. Sebagai contoh, kode berikut menugaskan
sebuah nilai acak kepada tiap elemen dari array arrayNilai:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//Menciptakan sebuah objek
Random
Random rand = new Random();
//Menciptakan sebuah array int
dua-dimensi
const int BARIS = 5;
const int KOL = 10;
int[,] arrayNilai = new int[BARIS,
KOL];
// Fill the array with random
numbers.
for (int baris = 0; baris < BARIS;
baris++)
{
for (int kol = 0; kol < KOL; kol++)
{
arrayNilai[baris, kol] = rand.Next(100);
}
}
|
Dan kode berikut menampilkan semua elemen
dari array arrayNilai pada sebuah
kontrol ListBox dengan nama kotakListKeluaran:
1
2
3
4
5
6
7
8
|
//Menampilkan isi array
for (int baris = 0; baris < BARIS;
baris++)
{
for (int kol = 0; kol < KOL; kol++)
{
kotakListKeluaran.Items.Add(arrayNilai[baris, kol].ToString());
}
}
|
Pengubahan Ukuran dan Inisialisasi Implisit Pada Array Dua Dimensi
Sama seperti pada array satu dimensi, Anda
bisa menyediakan daftar inisialisasi untuk array dua dimensi. Ingat bahwa
ketika Anda menyediakan daftar inisialisasi untuk sebuah array, Anda tidak
dapat menyediakan nomor subskript atas. Ketika menginisialisasi sebuah array
dua dimensi, Anda perlu menyediakn koma untuk mengindikasikan banyak dimensi.
Berikut adalah sebuah contoh deklarasi array dua dimensi dengan suatu daftar
inisialisasi:
int[,] arrayNilai = { {1, 2, 3},
{4, 5,
6},
{7, 8,
9} };
Nilai-nilai inisialisasi untuk tiap baris
diapit dengan sepasang kurung kurawal sendiri. Pada contoh ini, nilai-nilai
inisialisasi untuk baris 0 adalah {1, 2, 3}, nilai-nilai inisialisasi untuk
baris 1 adalah {4, 5, 6}, dan nilai-nilai inisialisasi untuk baris 2 adalah {7,
8, 9}. Jadi, statemen ini mendeklarasikan sebuah array dengan tiga baris dan
tiga kolom. Nilai-nilai ditugaskan kepada array arrayNilai dengan cara berikut:
arrayNilai[0, 0] ditetapkan 1.
arrayNilai[0, 1] ditetapkan 2.
arrayNilai[0, 2] ditetapkan 3.
arrayNilai[1, 0] ditetapkan 4.
arrayNilai[1, 1] ditetapkan 5.
arrayNilai[1, 2] ditetapkan 6.
arrayNilai[2, 0] ditetapkan 7.
arrayNilai[2, 1] ditetapkan 8.
arrayNilai[2, 2] ditetapkan 9.
Tutorial 5.3 memberikan Anda praktek dalam menggunakan sebuah array dua dimensi.
Tutorial 5.3: Menciptakan Aplikasi Daftar Kursi
Pada tutorial
ini, Anda akan menciptakan sebuah aplikasi Daftar
Kursi. Form aplikasi, yang
ditampilkan pada Gambar 5.40, menggunakan sebuah kontrol PictureBox untuk menampilkan suatu daftar kursi penumpan pesawat
yang ditata dalam baris-baris dan kolom-kolom. Ketika selesai, aplikasi dapat
dipakai user untuk memasukkan banyak baris dan banyak kolom pada kotak teks teksBaris dan teksKolom dan kemudian mengklik tombol Daftar Harga. Harga dari
kursi terseleksi akan ditampilkan pada kontrol labelHarga. Tabel berikut menunjukkan harga dari tiap kursi:
Ketika Anda menuliskan kode untuk applikasi, Anda akan menuliskan suatu array dua dimensi untuk memuat nilai-nilai ini:
Langkah 1: Awali Visual Studio (atau Visual Studio Express). Buka
projek dengan nama Daftar Kursi.
Langkah 2: Buka form Form1
pada mode Designer. Klik ganda pada
kontrol tombolTampilHarga. Ini
membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan
nama tombolTampilHarga_Click.
Sempurnakan event handler dengan menuliskan kode yang ditunjukkan pada baris
22-78 pada Program 5.4. Amati kode ini lebih dekat:
Baris 23: Statemen ini mendeklarasikan dua variabel int, baris dan kol, untuk memuat baris dan kolom terseleksi oleh user.
Baris 26-27: Statemen-statemen ini mendeklarasikan konstanta int
dengan nama BARIS_MAKS dan KOL_MAKS, yang ditetapkan 5 dan 3.
Keduanya digunakan sebagai deklarator ukuran array.
Baris 30-36: Statemen ini menciptakan sebuah array dua dimensi
decimal dengan nama harga, yang
diinisialisasi dengan harga-harga tempat duduk seperti yang ditunjukkan
sebelumnya.
Baris 39: Statemen if
mengkonversi nilai yang dimasukkan ke dalam kontrol teksBaris menjadi sebuah int
dan menyimpan hasilnya pada variabel baris.
Jika konversi berhasil, program akan berlanjut. Jika konversi gagal, maka
program akan melompat ke klausa else
pada baris 74, dan kemudian baris 77 akan menampilkan pesan error.
Baris 42: Statemen if
mengkonversi nilai yang dimasukkan ke dalam kontrol teksKolom menjadi sebuah int
dan menyimpan hasilnya pada variabel kol.
Jika konversi berhasil, program akan berlanjut. Jika konversi gagal, maka
program akan melompat ke klausa else
pada baris 68, dan kemudian baris 71 akan menampilkan pesan error.
Baris 45: Statemen if
menentukan apakah variabel baris
berada dalam rentang 0 sampai BARIS_MAKS.
Jika ya, program akan berlanjut. Jika tidak, program akan melompat ke klausa else pada baris 61, dan kemudian baris
64-65 akan menampilkan pesan error.
Baris 48: Statemen if
menentukan apakah variabel kol
berada dalam rentang 0 sampai KOL_MAKS.
Jika ya, program akan berlanjut. Jika tidak, program akan melompat ke klausa else pada baris 54, dan kemudian baris 57-58
akan menampilkan pesan error.
Baris 51-52: Statemen ini mengunakan subskript baris dan kol untuk
membaca harga kursi terseleksi dari array harga
dan kemudian menampilkan nilai itu pada kontrol labelHarga.
Langkah 3: Kembali ke mode Designer
dan klik ganda pada kontrol tombolKeluar.
Pada editor kode, Anda akan melihat sebuah event handler kosong dengan nama tombolKeluar_Click. Sempurnakan event
handler dengan menuliskan kode yang ditunjukkan pada baris 83-84 pada Program 5.4.
Langkah 4: Simpan projek. Ketika aplikasi dijalankan, lakukan
eksperimen dengan memasukkan nomor baris dan nomor kolom untuk sejumlah kursi
yang berbeda dan bandingkan harga yang tertampil dengan yang ada di tabel.
Ketika selesai, klik tombol Keluar
untuk mengakhiri aplikasi.
Program 5.4 Kode utuh untuk form Form1 pada aplikasi Daftar
Kursi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Daftar_Kursi
{
public
partial class Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
private
void tombolTampilHarga_Click(object sender, EventArgs e)
{
//Variabel-variabel untuk baris dan kolom terseleksi
int
baris, kol;
//Konstanta-konstanta untuk subskript baris maksimum dan kolom
const int BARIS_MAKS = 5;
const
int KOL_MAKS = 3;
//Menciptakan sebuah array dengan harga-harga kursi
decimal[,] harga = { {450m,
450m, 450m, 450m},
{425m,
425m, 425m, 425m},
{400m, 400m,
400m, 400m},
{375m,
375m, 375m, 375m},
{375m,
375m, 375m, 375m},
{350m,
350m, 350m, 350m}
};
//Membaca nomor baris terseleksi
if
(int.TryParse(teksBaris.Text, out baris))
{
//Membaca nomor kolom terseleksi
if (int.TryParse(teksKolom.Text, out kol))
{
//Pastikan baris di dalam rentang
if (baris >= 0 && baris <= BARIS_MAKS)
{
//Pastikan kolom di dalam rentang
if (kol >= 0 && kol <= KOL_MAKS)
{
//Menampilkan
harga kursi terseleksi
labelHarga.Text =
"Rp. " +
harga[baris,
kol].ToString() + " Ribu";
}
else
{
//Pesan error
untuk kolom tak valid
MessageBox.Show("Kolom harus 0 sampai " +
KOL_MAKS);
}
}
else
{
//Pesan error untuk baris tak-valid
MessageBox.Show("Baris harus 0 sampai " +
BARIS_MAKS);
}
}
else
{
//Menampilkan pesan error untuk kolom tak-integer
MessageBox.Show("Masukkan sebuah integer untuk kolom.");
}
}
else
{
//Menampilkan pesan error untuk
baris tak-integer
MessageBox.Show("Masukkan sebuah integer untuk baris.");
}
}
private
void tombolKeluar_Click(object sender, EventArgs e)
{
//Menutup form
this.Close();
}
}
}
|
Menjumlahkan Semua Elemen dari Sebuah Array Dua Dimensi
Untuk menjumlahkan semua elemen dari sebuah
array dua dimensi, Anda dapat menggunakan sepasang loop bersarang untuk
menambahkan isi dari tiap elemen pada suatu akumulator. Kode berikut
menunjukkan suatu contoh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
const int BARIS = 3;
const int KOL = 3;
int[,] angka = { {1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int total = 0; //Akumulator,
ditetapkan 0
//Menjumlahkan elemen-elemen
array
for (int baris = 0; baris < BARIS;
baris ++)
{
for (int kol = 0; kol < KOL; kol++)
{
total += angka[baris, kol];
}
}
//Menampilkan hasil penjumlahan
MessageBox.Show(“Total penjumlahan adalah “ +
total);
|
Penjumlahan Baris-Baris Pada Sebuah Array Dua Dimensi
Kadangkala, Anda perlu menghitung penjumlahan
atas setiap baris pada suatu array dua dimensi. Sebagai contoh, dimisalkan
bahwa sebuah array dua dimensi dipakai untuk memuat sejumlah skor ujian untuk
sejumlah siswa. Setiap baris pada array merupakan sejumlah skor ujian untuk
satu siswa. Untuk mendapatkan penjumlahan atas skor-skor ujian dari seorang
siswa, Anda menggunakan sebuah loop untuk menambahkan semua elemen pada satu
baris. Kode berikut menunjukkan salah satu contoh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
const int BARIS = 3;
const int KOL = 3;
int[,] angka = { {1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int total; //Akumulator
//Menjumlahkan setiap baris pada
array
for (int baris = 0; baris < BARIS;
baris++)
{
//Menetapkan akumulator menjadi 0
total = 0;
//Total baris
for (int kol = 0; kol < KOL; kol++)
{
total += numbers[baris, kol];
}
//Menampilkan total baris
MessageBox.Show(“Total elemen pada baris “ + baris +
“ adalah “ + total);
}
|
Menjumlahkan Kolom-Kolom Pada Sebuah Array Dua Dimensi
Kadangkala Anda perlu menghitung penjumlahan
atas setiap kolom pada sebuah array dua dimensi. Sebagai contoh, dimisalkan
bahwa sebuah array dua dimensi dipakai untuk memuat sejumlah skor ujian untuk
beberapa siswa dan Anda ingin menghitung rerata kelas untuk tiap skor ujian.
Untuk melakukannya, Anda menghitung rerata dari tiap kolom di dalam array. Ini
dilakukan dengan dua loop bersarang. Loop terluar mengendalikan subskript
kolom, dan loop terdalam mengendalikan subskript baris. Loop terdalam
menghitung penjumlahan dari sebuah kolom, yang disimpan pada suatu akumulator.
Kode berikut mendemonstrasikannya:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
const int BARIS = 3;
const int KOL = 3;
int[,] angka = { {1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int total; //Akumulator
//Menjumlahkan tiap kolom pada
array
for (int kol = 0; kol < KOL; kol++)
{
//Menetapkan akumulator menjadi 0
total = 0;
//Total nilai pada kolom
for (int baris = 0; baris < BARIS; baris++)
{
total += numbers[baris, kol];
}
//Menampilkan total kolom
MessageBox.Show(“Total elemen pada kolom “
+ kol +
“ adalah “ + total);
}
|
Array Bergerigi
KONSEP: Array
bergerigi sam dengan array dua dimensi, tetapi baris-baris pada array bergerigi
memiliki panjang yang berbeda.
Pada sebuah array dua dimensi tradisional,
setiap baris memiliki banyak kolom yang sama. Anda biasanya memvisualisasi
sebuah array dua dimensi sebagai struktur persegi-panjang. Gambar 5.37, yang
sebelumnya ditunjukkan, adalah salah satu contoh. Oleh karena itu, array dua
dimensi kadangkala dinamakan dengan array persegi-panjang.
Array bergerigi mirip dengan array dua
dimensi, tetapi baris-baris pada array bergerigi dapat memiliki banyak kolom
yang berbeda. Ini dimungkinkan karena array bergerigi sebenarnya adalah array
yang memuat beberapa array. Untuk lebih spesifik, array bergerigi adalah sebuah
sebuah array dua dimensi, dan tiap elemen array tersebut juga merupakan sebuah
array dimensi. Gambar 5.41 menunjukkan salah satu contohnya. Pada gambar, baris
0 memiliki empat kolom, baris 1 memiliki tiga kolom, dan baris 2 memiliki lima
kolom.
Karena array bergerigi adalah sebuah array yang memuat beberapa array, Anda membangunnya berbeda dari array dua dimensi. Pertama, Anda menciptakan sebuah array, dan kemudian Anda menciptakan setiap array yang merupakan elemen-elemen dari array pertama. Kode berikut menunjukkan suatu contoh bagaiman array bergerigi pada Gambar 5.41 diciptakan dan diinisialisasi.
1
2
3
4
5
6
7
8
|
//Menciptakan sebuah array yang
memuat 3 array int
int[][] arrayBergerigi = new
int[3][];
//Menciptakan setiap array yang merupakan
sebuah elemen
//dari array bergerigi
arrayBergerigi[0] = new int[4] {
1, 2, 3, 4 };
arrayBergerigi[1] = new int[3] {
5, 6, 7 };
arrayBergerigi[2] = new int[5] { 8, 9, 10, 11, 12
};
|
Amati kode lebih dekat:
· Baris 2 mendeklarasikan sebuah array dengan nama arrayBergerigi.
Perhatikan bahwa tipe data adalah int[][],
dengan dua kurung siku. Ini mengindikasikan bahwa Anda sedang mendeklarasikan
sebuah array yang memuat array-array int.
Selain itu, perhatikan bahwa ekspresi new
int[3][] hanya menggunakan satu deklarator ukuran, yang menetapkan banyak
baris. Ukuran-ukuran kolom ditetapkan sendiri-sendiri.
· Baris 6 menciptakan elemen 0, yang merupakan sebuah array int dengan empat kolom. Kolom-kolom
diinisialisasi dengan nilai 1, 2, 3, dan 4.
· Baris 6 menciptakan elemen 1, yang merupakan sebuah array int dengan tiga kolom. Kolom-kolom
diinisialisasi dengan nilai 5, 6, dan 7.
· Barais 6 menciptakan elemen 2, yang merupakan sebuah array int dengan lima kolom. Kolom-kolom
diinisialisasi dengan nilai 8, 9, 10, 11, dan 12.
Untuk mengakses sebuah item yang disimpan pada baris dan kolom tertentu pada array bergerigi, Anda mengapit subskript baris dan kolom dengan kurung siku sendiri. Sebagai contoh, statemen berikut menampilkan nilai yang disimpan pada baris 1, kolom 2, pada arrayBergerigi yang telah dideklarasikan sebelumnya:
MessageBox.Show(arrayBergerigi[1][2].ToString());
Statemen berikut menunjukkan contoh lain. Ia
menugaskan nilai 99 pada baris 0, kolom 3 pada arrayBergerigi:
arrayBergerigi[0][3] = 99;
Array bergerigi memiliki sebuah properti Length yang memuat banyak baris, dan
setiap baris memiliki properti Length
sendiri. Anda dapat menggunakan properti Length
dari baris untuk menentukan banyak kolom pada baris itu. Sebagai contoh, dua
loop bersarang berikut menampilkan semua nilai yang disimpan di dalam arrayBergerigi yang sebelumnya telah
dideklarasikan:
1
2
3
4
5
6
7
|
for (int baris = 0; baris < arrayBergerigi.Length;
baris++)
{
for (int kol = 0; kol < arrayBergerigi[baris].Length; kol++)
{
MessageBox.Show(arrayBergerigi[baris][kol].ToString());
}
}
|
5.9 Koleksi List
KONSEP: List
adalah sebuah kelas pada .NET Framework yang mirip dengan array. Tidak seperti
array, ukuran dari objek List secara otomatis diperbarui untuk mengakomodasi
banyak item yang sedang disimpan di dalamnya.
.NET Framework menyediakan sebuah kelas
dengan nama List, yang dapat dipakai
untuk menyimpan dan membaca item-item. Setelah Anda menciptakan sebuah objek List, Anda dapat menggunakannya sebagai
kontainer untuk memuat objek-objek lain. Sebuah objek List mirip dengan array tetapi menawarkan banyak kelebihan daripada
array. Berikut adalah beberapa dari kelebihan itu:
· Ketika Anda menciptakan sebuah objek List, Anda tidak perlu mengetahui banyak item yang ingin Anda
simpan di dalamnya.
·
Sebuah objek List secara
otomatis mengembang saat item-item ditambahkan ke dalamnya.
·
Selain menambahkan item pada suatu List,
Anda juga dapat menghapus item dari dalam List.
·
Sebuah objek List secara
otomatis menyusut ketika item-item dihapus darinya.
Menciptakan Sebuah List
Berikut adalah sebuah contoh bagaimana Anda
menciptakan sebuah objek List yang
dapat dipakai untuk memuat string-string:
List<string>
namaList = new List<string>();
Statemen ini menciptakan sebuah objek List, yang direferensi oleh variabel namaList. Perhatikan bahwa pada contoh
ini kata string dituliskan di dalam
kurung <> setelah kata List.
Ini menetapkan bahwa List dapat
memuat objek-objek dengan tipe data string.
Jika Anda mencoba menyimpan objek dengan tipe data lain di dalam List ini, maka error akan terjadi.
Berikut adalah sebuah contoh bagaimana Anda
menciptakan sebuah objek List yang
dapat memuat integer-integer:
List<int>
angkaList = new List<int>();
Statemen ini menciptakan sebuah List, yang direferensi oleh variabel angkaList. Perhatikan bahwa pada contoh
ini kata int dituliskan di dalam
kurung <> setelah kata List.
Menginisialisasi Sebuah List
Anda dapat secara opsional menginisialisasi
sebuah objek List ketika Anda
mendeklarasikannya. Berikut adalah salah satu contohnya:
List<int> angkaList = new List<int>() { 1, 2, 3 };
Statemen ini menciptakan sebuah objek List yang dapat memuat integer-integer
dan menginisialisasinya dengan nilai 1, 2, dan 3. Berikut adalah sebuah contoh
yang menciptakan sebuah objek List
untuk memuat string-string dan menginisialisasinya dengan tiga string:
List<string> namaList = new List<string>() { “Krista”,
“Katerin”, “Budi” };
Menambahkan Item-Item Pada Sebuah List
Untuk menambahkan item-item pada suatu objek List yang telah ada, Anda bisa
menggunakan metode Add. Sebagai
contoh, statemen-statemen berikut menciptakan sebuah objek List dan menambahkan beberapa string ke dalamnya:
namaList.Add(“Krista”);
namaList.Add(“Katerin”);
namaList.Add(“Budi”);
Setelah ketiga statemen ini dieksekusi, objek
namaList akan memuat tiga string
tersebut.
Item yang disimpan di dalam suatu List memiliki indeks. Indeks itu
menetapkan lokasi item di dalam List.
Jadi, ia berperan seperti subskript pada array. Item pertama yang ditambahkan
pada suatu List disimpan pada indeks
0. Item selanjutnya yang ditambahkan pada List
disimpan pada indeks 1, dan seterusnya. Setelah ketiga statemen tersebut
dieksekusi, “Krista” disimpan pada indeks 0, “Katerin” disimpan pada indeks 1,
dan “Budi” disimpan pada indeks 2.
Properti Count
Sebuah objek List memiliki properti Count
yang memuat banyak item yang disimpan di dalam List. Sebagai contoh, statemen berikut menggunakan properti Count untuk menampilkan banyak item
yang disimpan di dalam namaList:
MessageBox.Show(“List memiliki sebanyak “ + namaList.Count +
“ objek yang disimpan di
dalamnya.”);
Bila diasumsikan bahwa namaList memuat string
“Krista”, “Katerin”, dan “Budi”, statemen tersebut akan menampilkan pada sebuah
kotak pesan:
List
memiliki sebanyak 3 objek yang disimpan di dalamnya
Mengakses Item-Item Pada Sebuah List
Anda dapat menggunakan notasi subskript untuk
mengakses item-item di dalam suatu List,
sama seperti ketika Anda melakukannya pada array. Sebagai contoh, loop for berikut menampilkan item-item pada
objek namaList:
for (int indeks = 0; indeks < namaList.Count; indeks++)
{
MessageBox.Show(namaList[indeks]);
}
Perhatikan bahwa loop menggunakan properti Count dari objek List pada ekspresi pengujian untuk mengendalikan banyak iterasi.
Berikut adalah sebuah contoh yang membaca nilai-nilai dari sebuah file teks dan
menambahkannya pada sebuah List:
1
2
3
4
5
6
7
8
9
10
11
12
|
//Membuka file Nama.txt
StreamReader fileMasukan = File.OpenText(“Nama.txt”);
//Menciptakan sebuah objek List
untuk memuat string-string
List<string> namaList =
new List<string>();
//Membaca isi file
while (!fileMasukan.EndOfStream)
{
//Membaca sebaris dan menambahkannya pada List
namaList.Add(fileMasukan.ReadLine());
}
|
Amati kode ini lebih dekat:
· Baris 2 membuka sebuah file dengan nama Nama.txt dan mengaitkannya
dengan sebuah objek StreamReader
yang direferensi oleh variabel fileMasukan.
· Baris 5 menciptakan sebuah objek List,
yang direferensi oleh variabel namaList.
Objek ini dapat memuat string-string.
·
Loop while yang diawali pada
baris 8 beriterasi sampai akhir file ditemui.
· Statemen pada baris 11 membaca sebuah baris dari file dan menambahkannya
pada objek namaList.
Setelah kode ini dieksekusi, objek namaList akan memuat semua baris yang
dibaca dari file Nama.txt.
Anda juga dapat menggunakan loop foreach untuk beriterasi pada item-item
di dalam suatu List, sama seperti
pada array:
foreach (string str in namaList)
{
MessageBox.Show(str);
}
Melewatkan Sebuah List Kepada Metode
Kadangkala Anda ingin menuliskan sebuah
metode yang menerima suatu List
sebagai argumennya dan melakukan suatu operasi pada List itu. Sebagai contoh, kode berikut menunjukkan sebuah metode dengan
nama TampilList. Metode ini menerima
sebuah List string sebagai argumen
dan menampilkan tiap item di dalam List:
1
2
3
4
5
6
7
|
private void TampilList(List<string>
sList)
{
foreach (string str in sList)
{
MessageBox.Show(str);
}
}
|
Perhatikan pada baris 1 bahwa metode memiliki
sebuah variabel parameter dengan nama sList
dan bahwa tipe data parameter adalah List<string>.
Variabel parameter adalah suatu referensi ke suatu objek List<string>. Ketika Anda memanggil metode ini, Anda harus
melewatkan sebuah objek List<string>
sebagai argumen.
Ketika Anda memanggil sebuah metode dan
melewatkan suatu objek List<string>
sebagai argumen, Anda hanya perlu melewatkan variabel yang mereferensi List. Kode berikut menunjukkan sebuah
contoh bagaimana metode TampilList
dapat dipanggil:
1
2
3
4
5
6
|
//Menciptakan sebuah List yang
memuat string-string
List<string> namaList =
new List<string>() { “Krista”,
“Katerin”, “Budi” };
//Melewatkan List kepada metode
TampilList
TampilList(namaList);
|
Statemen pada baris 2 dan 3 menciptakan
sebuah List yang memuat string “Krista”, “Katerin”, dan “Budi”. Baris 6
memanggil metode TampilList, yang
melewatkan objek namaList sebagai
argumen.
Menghapus Item dari Sebuah List
Anda dapat menggunakan metode RemoveAt untuk menghapus sebuah item
pada indeks tertentu di dalam sebuah List.
Kode berikut menunjukkan salah satu contoh:
1
2
3
4
5
6
|
//Menciptakan sebuah List yang
memuat string-string
List<string> namaList =
new List<string>() { “Krista”,
“Katerin”, “Budi” };
//Menghapus item pada indeks 0
namaList.RemoveAt(0);
|
Statemen pada baris 2 dan 3 menciptakan
sebuah List yang memuat string
“Krista”, “Katerin”, dan “Budi”. Kemudian, statemen pada baris 6 menghapus
string pada indeks 0. Setelah statemen ini dieksekusi, List akan memuat string “Katerin” dan “Budi”.
Jika Anda mengetahui nilai dari item yang
ingin Anda hapus dari sebuah List,
tetapi Anda tidak mengetahui indeks item, Anda dapat menggunakan metode Remove. Anda melewatkan item yang ingin
Anda hapus, dan metode Remove akan
mencari item itu di dalam List. Jika
item ditemukan, ia akan dihapus. Berikut adalah salah satu contohnya:
1
2
3
4
5
6
|
//Menciptakan sebuah List yang
memuat string-string
List<string> namaList =
new List<string>() { “Krista”,
“Katerin”, “Budi” };
//Menghapus “Budi” dari List
namaList.Remove(“Budi”);
|
Statemen pada baris 2 dan 3 menciptakan
sebuah List yang memuat string
“Krista”, “Katerin”, dan “Budi”. Kemudian, setelah statemen pada baris 6
menghapus “Budi” dari List. Setelah
statemen ini dieksekusi, List akan
memuat string “Krista” dan “Katerin”.
Metode Remove
menghasilkan sebuah nilai Boolean yang mengindikasikan apakah item telah
dihapus dari List atau tidak. Jika
item ditemukan di dalam List dan
dihapus, metode Remove akan
menghasilkan true. Jika item tidak
ditemukan di dalam List, metode ini
akan menghasilkan false. Kode
berikut mendemonstrasikan bagaimana Anda dapat menggunakan nilai yang
dihasilkan dari metode Remove:
1
2
3
4
5
6
7
8
9
|
//Menciptakan sebuah List yang
memuat string-string
List<string> namaList =
new List<string>() { “Krista”,
“Katerin”, “Budi” };
//Menghapus “Susan”.
if (!namaList.Remove(“Susan”))
{
MessageBox.Show(“Susan tidak ditemukan.”);
}
|
Statemen pada baris 2 dan 3 menciptakan
sebuah List yang memuat string
“Krista”, “Katerin”, dan “Budi”. Kemudian, statemen pada baris 6 mencoba
menghapus “Susan” dari List.
List tidak memuat string “Susan”, jadi metode Remove akan menghasilkan false. Pesan “Susan tidak ditemukan
akan ditampilkan. Setelah kode ini dieksekusi, List masih tetap memuat string
“Krista”, “Katerin”, dan “Budi”.
Jika Anda ingin menghapus semua item dari
sebuah List, Anda dapat memanggil
metode Clear. Berikut adalah salah
satu contohnya:
namaList.Clear();
Setelah statemen ini dieksekusi, objek namaList akan kosong.
Menyisipkan Sebuah Item
Anda dapat menggunakan metode Insert untuk menyisipkan sebuah item
pada indeks tertentu di dalam suatu List.
Kode berikut menunjukkan salah satu contoh:
1
2
3
4
5
6
|
//Menciptakan sebuah List yang
memuat string-string
List<string> namaList =
new List<string>() { “Krista”,
“Katerin”, “Budi” };
//Menyisipkan sebuah item pada
indeks 0
namaList.Insert(“Jeni”, 0);
|
Statemen pada baris 2 dan 3 menciptakan
sebuah List yang memuat string
“Krista”, “Katerin”, dan “Budi”. Kemudian, statemen pada baris 6 menyisipkan
string “Jeni” pada indeks 0. Setelah statemen ini dieksekusi, List akan memuat
string “Jeni”, “Krista”, “Katerin”, dan “Budi”.
Melakukan Pencarian Item di dalam Sebuah List
Karena Anda dapat menggunakan notasi
subskript untuk mengakses item-item di dalam sebuah List, Anda dapat mengadaptasikan setiap algoritma berbasis-array
yang telah Anda pelajari pada awal bab ini sehingga dapat diterapkan pada List. Sebagai contoh, Anda dapat
menuliskan kode untuk melakukan pencarian sekuensial, pencarian biner,
pengurutan seleksi, dan seterusnya pada List.
Cara mudah dalam melakukan pencarian item di
dalam sebuah List adalah dengan
menggunakan metode IndexOf. Metode IndexOf menerima sebuah nilai sebagai
argumen, dan ia melakukan pencarian terhadap nilai itu di dalam List. Jika nilai itu ditemukan, metode
akan menghasilkan indeksnya. Jika nilai tidak ditemukan, metode akan
menghasilkan -1. Kode berikut menunjukkan salah satu contoh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//Menciptakan sebuah List yang
memuat string-string
List<string> namaList =
new List<string>() { “Krista”,
“Katerin”, “Budi” };
//Mencari “Katerin”
int posisi = namaList.IndexOf(“Katerin”);
//Apakah Katerin ditemukan di
dalam List?
if (posisi != −1)
{
MessageBox.Show(“Katerin ditemukan pada indeks “ +
posisi);
}
else
{
MessageBox.Show(“Katerin tidak ditemukan.”);
}
|
Statemen pada baris 2 dan 3 menciptakan
sebuah List yang memuat string
“Krista”, “Katerin”, dan “Budi”. Statemen pada baris 6 memanggil metode IndexOf untuk mencari “Katerin” di
dalam List. Nilai yang dihasilkan
dari metode ditugaskan kepada variabel posisi.
Setelah statemen ini dieksekusi, variabel posisi
akan memuat indeks dari “Katerin” atau -1 jika “Katerin” tidak ditemukan di
dalam List. Statemen if pada baris 9-17 menampilkan salah
satu dari dua pesan, tergantung dari apakah “Katerin” ditemukan di dalam List atau tidak.
Ada dua versi lain dari metode IndexOf yang dapat Anda pakai untuk
menetapkan luasan List yang menjadi
tempat pencarian. Statemen berikut menunjukkan salah satu contoh:
posisi = namaList.IndexOf(“Diana”, 2);
Perhatikan bahwa dua argumen yang dilewatkan
kepada metode IndexOf. Argumen
pertama, “Diana”, adalah item yang akan dicari. Argumen kedua, 2, adalah indeks
awal dari pencarian. Ini menetapkan bahwa pencarian akan dimulai pada indeks 2
dan diakhiri pada item terakhir di dalam List.
(Indeks awal termasuk luasan pencarian. Jika Anda melewatkan indeks tak valid
sebagai argumen, eksepsi akan terjadi).
Berikut adalah suatu contoh dari versi lain
dari metode IndexOf:
posisi = namaList.IndexOf(“Diana”, 2, 5);
Pada contoh ini, tiga argumen dilewatkan
kepada metode IndexOf. Argumen pertama, “Diana”, adalah item yang dicari.
Argumen kedua, 2, adalah indeks awal dari pencarian. Ini menetapkan bahwa
pencarian akan dimulai pada indeks 2. Argumen ketiga, 5, adalah indeks akhir
dari pencarian. (Indeks awal dan indeks akhir termasuk luasan pencarian. Jika
Anda melewatkan indeks tak valid sebagai argumen, eksepsi akan terjadi).
Pada Tutorial 5.4, Anda akan menciptakan
sebuah aplikasi yang membaca isi dari suatu file ke dalam sebuah List, dan melakukan sejumlah operasi
pada List itu.
Tutorial 5.4: Menciptakan Aplikasi List Skor Ujian
Pada tutorial
ini, Anda menciptakan sebuah aplikasi List
Skor Ujian. Form aplikasi, yang ditampilkan pada Gambar 5.42, telah
disediakan bagi Anda. Ketika aplikasi dijalankan, ia akan membaca sejumlah skor
ujian dari sebuah file ke suatu List.
(File juga telah diciptakan bagi Anda). Skor-skor ujian akan ditampilkan pada
sebuah kontrol ListBox. Skor rerata
ujian dihitung dan ditampilkan, berikut dengan banyak skor ujian di atas rerata
dan banyak skor ujian di bawah rerata:
Langkah 1: Awali Visual Studio (atau Visual Studio Express). Buka
projek dengan nama List Skor Ujian.
Langkah 2: Buka kode dari form Form1 pada editor kode. Sisipkan direktif using System.IO; yang ditunjukkan pada baris 10 pada Program 5.5 di
akhir tutorial ini. Statemen ini diperlukan karena Anda akan menggunakan kelas StreamReader, dan ia merupakan bagian
dari namespace System.IO di dalam
.NET Framework.
Langkah 3: Dengan editor kode masih terbuka, ketikkan komentar dan
kode untuk metode BacaSkor, yang
ditunjukkan pada baris 21-44 pada Program 5.5. Tujuan dari metode BacaSkor adalah untuk menerima sebuah
objek List<int> sebagai
argumen dan membaca isi dari file SkorUjian.txt
ke dalam List.
Langkah 4: Ketikkan komentar dan kode untuk metode TampilSkor, yang ditunjukkan pada baris
46-54 pada Program 5.5. Tujuan dari metode TampilSkor
adalah untuk menerima sebuah objek List<int>
sebagai argumen dan menampilkan isinya pada kontrol kotakListSkor.
Langkah 5: Tuliskan komentar dan kode untuk metode Rerata, yang ditunjukkan pada baris
56-74 pada Program 5.5. Tujuan dari metode ini adalah untuk menerima sebuah
objek List<int> sebagai
argumen dan menghasilkan rerata dari nilai-nilai di dalam List.
Langkah 6: Tuliskan komentar dan kode untuk metode AtasRerata, yang ditunjukkan pada baris
76-96 pada Program 5.5. Tujuan dari metode ini adalah untuk menerima sebuah
objek List<int> sebagai
argumen dan menghasilkan banyak nilai di atas rerata di dalam List.
Langkah 7: Tuliskan komentar dan kode untuk metode BawahRerata, yang ditunjukkan pada
baris 98-118 pada Program 5.5. Tujuan dari metode ini adalah untuk menerima
sebuah objek List<int> sebagai
argumen dan menghasilkan banyak nilai di bawah rerata di dalam List.
Langkah 8: Selanjutnya, Anda menciptakan sebuah event handler Click untuk kontrol-kontrol Button. Kembali ke mode Designer dan klik ganda pada kontrol tombolBaca. Ini akan membuka editor
kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolBaca_Click. Sempurnakan event
handler ini dengan menuliskan kode yang ditunjukkan pada baris 122-145 pada
Program 5.5. Amati kode ini:
Baris 122-124: Statemen-statemen ini mendeklarasikan
variabel-variabel berikut:
·
skorRerata: Variabel ini
dipakai untuk memuat skor rerata.
·
jumAtasRerata: Variabel ini untuk
memuat banyak skor di atas nilai rerata.
·
jumBawahRerata: Variabel ini untuk
memuat banyak skor di bawah nilai rerata.
Baris 127: Statemen ini menciptakan sebuah objek List<int>, yang direferensi oleh
variabel listSkor.
Baris 130: Statemen ini memanggil metode BacaSkor, yang melewatkan objek listSkor sebagai argumen. Setelah statemen ini dieksekusi, objek listSkor akan memuat skor-skor ujian
yang ada di dalam file SkorUjian.txt.
Baris 133: Statemen ini memanggil metode TampilSkor, yang melewatkan objek listSkor sebagai argumen. Setelah statemen ini dieksekusi,
item-item di dalam objek listSkor
akan ditampilkan pada kontrol kotakListSkor.
Baris 136: Statemen ini memanggil metode Rerata, yang melewatkan objek listSkor
sebagai argumen. Metode ini menghasilkan skor rerata dari nilai-nilai di dalam
objek listSkor, yang ditugaskan
kepada variabel skorRerata.
Baris 137: Statemen ini menampilkan skor rerata pada kontrol labelRerata.
Baris 140: Statemen ini memanggil metode AtasRerata, yang melewatkan objek listSkor sebagai argumen. Metode ini menghasilkan banyak skor di
atas rerata di dalam objek listSkor,
yang ditugaskan kepada variabel jumAtasRerata.
Baris 141: Statemen ini menampilkan banyak skor di atas rerata
pada kontrol labelAtasRerata.
Baris 144: Statemen ini memanggil metode BawahRerata, yang melewatkan objek listSkor sebagai argumen. Metode ini menghasilkan banyak skor di
bawah rerata di dalam objek listSkor,
yang ditugaskan kepada variabel jumBawahRerata.
Baris 145: Statemen ini menampilkan banyak skor di bawah rerata
pada kontrol labelBawahRerata.
Langkah 9: Kembali ke mode Designer
dan klik ganda pada kontrol tombolKeluar.
Pada editor kode, Anda akan melihat sebuah event handler kosong dengan nama tombolKeluar_Click. Sempurnakan event
handler ini dengan menuliskan kode seperti ditunjukkan pada baris 150-151 pada
Program 5.5.
Langkah 10: Simpan projek dan jalankan aplikasi. Ketika aplikasi
dijalankan, klik tombol Baca Skor. Ini akan menampilkan sejumlah
skor ujian pada ListBox, berikut
dengan skor rerata, banyak skor di atas rerata, dan banyak skor di bawah
rerata, seperti ditunjukkan pada Gambar 5.43. Klik tombol Keluar untuk mengakhiri aplikasi.
Program 5.5 Kode utuh untuk form Form1 pada aplikasi List
Skor Ujian
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace List_Skor_Ujian
{
public
partial class Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
//Metode
BacaSkor membaca skor-skor dari filee
//SkorUjian.txt ke dalam parameter listSkor
private
void BacaSkor(List<int> listSkor)
{
try
{
//Membuka file SkorUjian.txt
StreamReader fileMasukan = File.OpenText("SkorUjian.txt");
//Membaca skor-skor ujian ke dalam List.
while (!fileMasukan.EndOfStream)
{
listSkor.Add(int.Parse(fileMasukan.ReadLine()));
}
//Menutup file
fileMasukan.Close();
}
catch
(Exception ex)
{
//Menampilkan pesan error
MessageBox.Show(ex.Message);
}
}
//Metode
TampilSkor menampilkan isi dari parameter
//listSkor pada kontrol ListBox
private
void TampilSkor(List<int> listSkor)
{
foreach (int skor in listSkor)
{
kotakListSkor.Items.Add(skor);
}
}
//Metode
Rerata menghasilkan rerata dari nilai-nilai
//pada
parameter listSkor
private
double Rerata(List<int> listSkor)
{
int
total = 0; //Akumulator
double rerata; //Untuk memuat
rerata
//Menghitung total skor
foreach (int skor in listSkor)
{
total += skor;
}
//Menghitung rerata skor
rerata = (double)total / listSkor.Count;
//Menghasilkan rerata
return rerata;
}
//Metode
AtasRerata menghasilkan banyak dari
//skor di
atas rerata pada listSkor
private
int AtasRerata(List<int> listSkor)
{
int
jumAtas = 0; //Akumulator
//Menghitung skor rerata
double rerata = Rerata(listSkor);
//Menghitung banyak skor di atas rerata
foreach (int skor in listSkor)
{
if (skor > rerata)
{
jumAtas++;
}
}
//Menghasilkan banyak skor di atas rerata
return jumAtas;
}
//Metode
BawahRerata menghasilkan banyak skor
//di
bawah rerata pada listSkor
private
int BawahRerata(List<int> skorList)
{
int
jumBawah = 0; //Akumulator
//Menghitung skor rerata
double rerata = Rerata(skorList);
//Menghitung banyak skor di bawah rerata
foreach (int skor in skorList)
{
if (skor < rerata)
{
jumBawah++;
}
}
//Menghasilkan banyak skor di bawah rerata
return jumBawah;
}
private
void tombolBaca_Click(object sender, EventArgs e)
{
double skorRerata; //Untuk
memuat skor rerata
int
jumAtasRerata; //Banyak skor di atas
rerata
int
jumBawahRerata; //Banyak skor di bawah rerata
//Menciptakan sebuah List untuk memuat skor-skor
List<int> listSkor = new List<int>();
//Membaca skor-skor dari file ke dalam List
BacaSkor(listSkor);
//Menampilkan skor-skor
TampilSkor(listSkor);
//Menampilkan skor rerata
skorRerata = Rerata(listSkor);
labelRerata.Text = skorRerata.ToString("n1");
//Menampilkan banyak skor di atas rerata
jumAtasRerata = AtasRerata(listSkor);
labelAtasRerata.Text = jumAtasRerata.ToString();
//Menampilkan banyak skor di bawah rerata
jumBawahRerata = BawahRerata(listSkor);
labelBawahRerata.Text = jumBawahRerata.ToString();
}
private
void tombolKeluar_Click(object sender, EventArgs e)
{
//Menutup form
this.Close();
}
}
}
|
No comments:
Post a Comment