Tuesday, December 13, 2016

Bab 5. Dasar Pemrograman Visual C#



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.


Gambar 5.6 Variabel arrayNilai yang mereferensi sebuah array int

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).

Gambar 5.7 Subskript-subskript array


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.

Gambar 5.8 Nilai-nilai ditugaskan pada elemen-elemen array

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.

Gambar 5.9 Form aplikasi Tampil Elemen


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.


Gambar 5.10 Form aplikasi Nilai Acak

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.


Gambar 5.11 Variabel angka mereferensi sebuah array enam-elemen

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.

Gambar 5.12 Variabel angka mereferensi sebuah array tiga-elemen

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.

Gambar 5.13 Isi dari file Nilai.txt



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);
   }
}


Gambar 5.14 Form File Ke Array

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.



Gambar 5.15 Sebuah array yang dilewatkan sebagai argumen



Gambar 5.16 Variabel orang dan variabel strArray mereferensi array yang sama

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;
   }
}



Gambar 5.17 Form aplikasi Argumen Array

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:

Gambar 5.18 Form aplikasi Ubah Array 1

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.


Gambar 5.19 Setelah baris 19 dieksekusi

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.20 Setelah baris 29 dieksekusi pada aplikasi Ubah Array 2

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.

Gambar 5.21 Aplikasi Ubah Array 2



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.

Gambar 5.22 Aplikasi Propinsi Indonesia

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.

Gambar 5.23 Kedua variabel array1 dan array2 mereferensi array yang sama


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.

Gambar 5.24 Diagram alir untuk mencari nilai tertinggi di dalam array


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.

Gambar 5.25 Diagram alir untuk 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);
   }
}



Gambar 5.26 Form aplikasi Array Terisi Sebagian

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.

Gambar 5.27 Form aplikasi Rerata Ujian

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.

Gambar 5.28 Aplikasi Rerata Ujian

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.

Gambar 5.29 Nilai-nilai di dalam suatu array

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.

Gambar 5.30 Nilai-nilai di dalam array setelah penukaran pertama


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.


Gambar 5.31 Nilai-nilai di dalam array setelah penukaran kedua


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.

Gambar 5.32 Nilai-nilai di dalam array setelah penukaran ketiga


Selanjutnya, proses diawali pada elemen 3. Nilainya ditukar dengan nilai pada elemen 5, yang menyebabkan array dihasilkan seperti pada Gambar 5.33.

Gambar 5.33 Nilai-nilai di dalam array setelah penukaran keempat


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.

Gambar 5.34 Nilai-nilai di dalam array setelah penukaran kelima



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.

Gambar 5.35 Penukaran nilai a dan b


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.

Gambar 5.36a Form Pengurutan Seleksi dengan nama-nama dari sejumlah kontrol


Gambar 5.36b Form Pengurutan Seleksi 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.

Gambar 5.37 Sebuah array dua dimensi


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.


Gambar 5.38 Array dua-dimensi dengan enam baris dan lima kolom



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:


Gambar 5.39 Subskript untuk tiap elemen pada array skor



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:

Gambar 5.40 Form aplikasi Daftar 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.

Gambar 5.41 Array bergerigi


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:

Gambar 5.42 Form aplikasi List Skor Ujian

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.

Gambar 5.43 Aplikasi List Skor Ujian saat dijalankan


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