Saturday, December 24, 2016

Bab 6. Visual Basic .NET Belajar Dari Contoh



6. Array







Array

Array adalah sekelompok lokasi memori yang bertetangga yang memiliki nama sama dan tipe sama. Untuk merujuk ke lokasi tertentu dalam memori atau sebuah elemen di dalam suatu array, Anda perlu menspesifikasi nama array dan nomor posisi elemen yang ditunjuk. Nomor posisi adalah nilai yang mengindikasikan lokasi spesifik di dalam array.

Gambar 6.1 menampilkan sebuah array integer bernama arrayAngka. Array ini memuat 12 elemen, yang semuanya dapat dirujuk dengan memberikan nama diikuti dengan nomor posisi elemen (diapit dalam kurung). Elemen pertama di dalam setiap array adalah elemen ke nol. Jadi, elemen pertama pada array arrayAngka dirujuk sebagai arrayAngka(0), elemen kedua sebagai arrayAngka(1), array ketujuh sebagai arrayAngka(6), dan seterusnya. Elemen ke-i arrayAngka dinyatakan sebagai arrayAngka(i-1).



Gambar 6.1 Sebuah array yang memuat 12 elemen


Nomor posisi di dalam kurung secara formal dinamakan dengan indeks (atau subskript). Indeks adalah sebuah integer atau ekspresi integer. Jika program menggunakan ekspresi sebagai indeks, maka ekspresi tersebut dievaluasi terlebih dahulu untuk menentukan indeks. Sebagai contoh, jika variabel nilai1 sama dengan 5, dan variabel nilai2 sama dengan 6, maka statemen

arrayAngka(nilai1 + nilai2) += 2

menambahkan dua pada elemen array arrayAngka(11). Perhatikan bahwa nama array yang diindeks (nama array diikuti dengan sebuah indeks di dalam kurung) merupakan sebuah lvalue, yang dapat digunakan di sisi kiri sebuah statemen penugasan.

Akan dibahas array arrayAngka pada Gambar 6.1 dengan lebih dekat. Nama array adalah arrayAngka. Dua belas elemen array tersebut dirujuk sebagai arrayAngka(0) sampai arrayAngka(11). Nilai dari arrayAngka(0) adalah -45, nilai dari arrayAngka(1) adalah 6, nilai dari arrayAngka(7) adalah 62, dan nilai dari ArrayAngka(11) adalah 78. Nilai-nilai yang disimpan di dalam array dapat digunakan dalam berbagai kalkulasi dan aplikasi. Sebagai contoh, untuk menentukan penjumlahan atas semua nilai di dalam tiga elemen pertama pada arrayAngka dan kemudian menyimpan hasilnya di dalam variabel jum, akan dituliskan

jum = arrayAngka(0) + arrayAngka (1) + arrayAngka (2)

Untuk membagi nilai dari elemen ketujuh arrayAngka dengan 2 dan menugaskan hasilnya pada variabel hasil, akan dituliskan

hasil = arrayAngka (6) \ 2

Setiap array dalam Visual Basic “mengetahui” panjangnya sendiri. Panjang array (pada kasus ini, 12) ditentukan dengan ekspresi berikut:

arrayAngka.Length

Semua array memiliki akses terhadap metode dan properti dari kelas System.Array, termasuk properti Length. Sebagai contoh, metode GetUpperBound menghasilkan nilai balik berupa indeks dari elemen terakhir di dalam suatu array. Metode GetUpperBound memerlukan satu argumen yang mengindikasikan dimensi array. Untuk array satu dimensi, seperti arrayAngka, argumen yang dilewatkan pada GetUpperBound adalah 0. Sebagai contoh, ekspresi

arrayAngka.GetUpperBound(0)

akan memberikan nilai balik 11. Perhatikan bahwa nilai yang dijadikan nilai balik oleh metode GetUpperBound adalah lebih rendah 1 dari nilai properti Length pada array tersebut. Kelas, objek, dan metode kelas akan didiskusikan lebih detil pada Bab 7.


Mendeklarasikan dan Mengalokasikan Array
Setiap array menempati ruang di dalam memori. Jumlah memori yang diperlukan sebuah array tergantung pada panjang array dan ukuran tipe data elemen array. Deklarasi atas sebuah array menciptakan suatu variabel yang dapat menyimpan referensi yang menunjuk ke suatu array tetapi tidak menciptakan array di dalam memori. Untuk mendeklarasikan sebuah array, programer perlu memberikan nama array dan tipe data. Statemen berikut mendeklarasikan array pada Gambar 6.1:

Dim arrayAngka As Integer()

Kurung yang mengikuti tipe data mengindikasikan bahwa arrayAngka adalah sebuah array. Array dapat dideklarasikan untuk menampung sembarang tipe data. Di dalam sebuah array bertipe data primitif, setiap elemen array memuat satu nilai bertipe data yang dideklarasikan. Sebagai contoh, setiap elemen dari array Integer memuat sebuah nilai Integer.

Sebelum digunakan, array harus menspesifikasi ukuran array dan mengalokasikan memori untuk array tersebut, menggunakan katakunci New. Nilai yang disimpan di dalam variabel array sebenarnya adalah referensi yang menunjuk ke lokasi di dalam memori komputer dimana objek array diciptakan. Semua variabel tipe tak-primitif adalah variabel referensi (biasanya hanya dinamakan dengan referensi). Untuk mengalokasikan memori untuk arrayAngka setelah ia dideklarasikan, statemen

arrayAngka = New Integer(11) {}

yang digunakan. Pada contoh sebelumnya, angka 11 mendefinisikan batas atas (upper bound) array. Batas array menentukan nomor indeks yang dapat dipakai untuk mengakses sebuah elemen di dalam array. Di sini, batas array adalah 0 (secara implisit pada statemen tersebut) dan 11, yang berarti bahwa indeks di luar batas itu tidak dapat digunakan untuk mengakses elemen dalam array. Perhatikan bahwa ukuran aktual array adalah satu lebih besar dari batas atas yang dispesifikasi dalam statemen alokasi.

Kurung kurawal ({ dan }) pada statemen alokasi array tersebut dinamakan dengan daftar penginisialisasi (initializer list) yang dipakai untuk menspesifikasi nilai-nilai awal elemen dalam array. Ketika daftar penginisialisasi kosong, elemen-elemen array diinisialisasi dengan nilai default. Nilai default 0 diberikan untuk variabel tipe data primitif, False untuk variabel Boolean, dan Nothing untuk tipe referensi. Katakunci Nothing menandakan sebuah referensi kosong (nilai yang mengindikasikan bahwa sebuah variabel referensi tidak ditugasi suatu alamat memori komputer). Daftar penginisialisasi juga dapat memuat daftar nilai awal elemen array yang dipisahkan dengan koma. Sebagai contoh,

Dim angka As Integer()
angka = New Integer() {1, 2, 3, 6}

mendeklarasikan dan mengalokasikan sebuah array yang memuat empat nilai Integer. Visual Basic dapat menentukan batas array dari jumlah elemen pada daftar penginisialisasi. Jadi, Anda tidak perlu menspesifikasi ukuran array ketika daftar penginisialisasi tak-kosong digunakan.

Alokasi sebuah array dapat digabungkan ke dalam deklarasi, seperti dalam statemen

Dim arrayAngka As Integer() = New Integer(11) {}

Beberapa array dapat dideklarasikan dengan satu statemen; statemen berikut mendeklarasikan dua variabel array bertipe Double():

Dim array1, array2 As Double()


Contoh: Mengalokasikan Array
Program pada kode 6.1 menggunakan katakunci New untuk mengalokasikan sebuah array dengan 10 elemen Integer, yang diinisialisasi dengan nol (nilai default untuk array bertipe Integer). Program menampilkan elemen-elemen array dalam format tabular pada dialog.
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
' Kode 6.1: MenciptakanArray.vb
' Mendeklarasikan dan mengalokasikan sebuah array.

Imports System.Windows.Forms

Module modCiptakanArray

    Sub Main()
        Dim keluaran As String
        Dim i As Integer

        Dim array As Integer() ' mendklarasikan variabel array
        array = New Integer(9) {} ' mengalokasikan memori untuk array

        keluaran &= "Subskript " & vbTab & "Nilai" & vbCrLf

        ' menampilkan nilai-nilai dalam array
        For i = 0 To array.GetUpperBound(0)
            keluaran &= i & vbTab & array(i) & vbCrLf
        Next

        keluaran &= vbCrLf & "Array memuat " & _
        array.Length & " elemen."

        MessageBox.Show(keluaran, "Array dengan Nilai-Nilai Integer", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub ' Main

End Module ' modCiptakanArray



Gambar 6.2 Keluaran program pada kode 6.1

Baris 12 mendeklarasikan array, sebuah variabel yang dapat menyimpan referensi yang menunjuk ke sebuah array dengan elemen-elemen Integer. Baris 13 mengalokasikan sebuah array dengan 10 elemen menggunakan New dan menugaskannya pada array. Program menghasilkan keluaran di dalam String keluaran.

Baris 18-20 menggunakan sebuah struktur For untuk menghasilkan nomor indeks (yang direpresentasikan oleh i) dan nilai tiap elemen array (array(i)) pada keluaran. Perhatikan bahwa pada header struktur For, ekspresi array.GetUpperBound(0) digunakan untuk mencari batas atas array. Properti Length (baris 22-23) menghasilkan nilai balik berupa jumlah elemen di dalam array.


Menginisialisasi Array
Program pada kode 6.2 menciptakan dua array, masing-masing dengan 10 elemen, dan menetapkan nilai-nilai elemen menggunakan daftar penginisialisasi. Program juga menggunakan sebuah struktur For. Kedua array ditampilkan dalam format tabular pada dialog pesan.

Baris 12 menggunakan satu statemen untuk mendeklarasikan array1 dan array2. Baris 16-17 mengalokasikan 10 elemen dari array1 menggunakan New dan menginisialisasi array tersebut menggunakan sebuah daftar penginisialisasi. Baris 20 mengalokasikan array2, dengan ukuran yang ditentukan oleh ekspresi array1.GetUpperBound(0). Ini berarti bahwa array1 dan array2, pada program ini, memiliki batas atas yang sama.

Struktur For pada baris 23-25 menginisialisasi setiap elemen dalam array2. Setiap elemen dalam array2 diinisialisasi (baris 24) dengan integer-integer genap 2, 4, 6, ..., 20. Struktur For pada baris 31-34 menggunakan semua nilai di dalam array untuk membangun String keluaran, yang ditampilkan pada sebuah MessageBox (baris 36-37).

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
' Kode 6.2: InisialisasiArray.vb
' Menginisialisasi array.

Imports System.Windows.Forms

Module modInisialisasiArray

    Sub Main()
        Dim keluaran As String
        Dim i As Integer

        Dim array1, array2 As Integer() ' mendeklarasikan dua array

        ' daftar penginisialisasi menspesifikasi jumlah elemen
        ' dan nilai tiap elemen
        array1 = New Integer() {32, 27, 64, 18, 95, _
            14, 90, 70, 60, 37}

        ' mengalokasikan array2 berdasarkan panjang array1
        array2 = New Integer(array1.GetUpperBound(0)) {}

        ' menetapkan nilai-nilai di dalam array2 dengan perhitungan
        For i = 0 To array2.GetUpperBound(0)
            array2(i) = 2 + 2 * i
        Next

        keluaran &= "Subskript " & vbTab & "Array1" & vbTab & _
            "Array2" & vbCrLf

        ' menampilkan nilai-nilai kedua array
        For i = 0 To array1.GetUpperBound(0)
            keluaran &= i & vbTab & array1(i) & vbTab & array2(i) & _
                vbCrLf
        Next

        MessageBox.Show(keluaran, "Array dengan Nilai-Nilai Integer", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub ' Main

End Module ' modInisialisasiArray



Gambar 6.3 Keluaran program pada kode 6.2


Menjumlahkan Elemen Array
Seringkali, elemen-elemen sebuah array merepresentasikan sederet angka yang diperlukan dalam perhitungan. Sebagai contoh, jika setiap elemen sebuah array merepresentasikan nilai ujian mahasiswa, maka pengajar perlu untuk mencari total penjumlahan elemen array, kemudian menghitung rerata kelas. Program pada kode 6.3 menjumlahan nilai-nilai yang dimuat di dalam array integer 10 elemen.

Baris 9-10 mendeklarasikan, mengalokasikan, dan menginisialisasi array 10 elemen, array. Baris 16, di dalam tubuh struktur For, melakukan penjumlahan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' Kode 6.3: JumElemenArray.vb
' Menghitung penjumlahan atas elemen-elemen array.

Imports System.Windows.Forms

Module JumElemenArray

    Sub Main()
        Dim array As Integer() = New Integer() _
         {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

        Dim total As Integer = 0, i As Integer = 0

        ' penjumlahan nilai-nilai elemen array
        For i = 0 To array.GetUpperBound(0)
            total += array(i)
        Next

        MessageBox.Show("Total elemen-elemen array: " & total, _
            "Penjumlahan elemen-elemen  Array", MessageBoxButtons.OK, _
        MessageBoxIcon.Information)
    End Sub ' Main

End Module ' JumElemenArray



Gambar 6.4 Keluaran program pada kode 6.3


Menggunakan Array untuk Menganalisa Hasil Survey
Contoh selanjutnya menggunakan array untuk menyimpulkan data yang dikoleksi dalam sebuah survey. Perhatikan statemen permasalah berikut:

Empat puluh mahasiswa diminta untuk memberikan nilai dengan skala 1 sampai 10. Pertanyaan yang diberikan adalah mengenai kualitas makanan di kantin kampus. Interpretasi skala 1 adalah kualitas makanan sangat buruk dan skala 10 berarti makanan sangat baik. Tempatkan 40 respon tersebut di dalam sebuah array integer dan tentukan frekuensi dari tiap skala.

Anda diminta untuk menyimpulkan jumlah respon untuk tiap tipe atau skala. Array respon (baris 14-16) merupakan sebuah array integer 40 elemen yang memuat respon mahasiswa terhadap survey. Dengan menggunakan array 11 elemen, frekuensi, Anda dapat menghitung jumlah respon untuk tiap skala. Anda mengabaikan elemen pertama, frekuensi(0), karena adalah sangat logis untuk memiliki respon survey dinomori mulai dari 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
' Kode 6.4: SurveyMahasiswa.vb
' Menggunakan array untuk menampilkan hasil survey.

Imports System.Windows.Forms

Module modSurveyMahasiswa

    Sub Main()
        Dim jawaban, skala As Integer
        Dim keluaran As String

        ' array respon
        Dim respon As Integer()
        respon = New Integer() {1, 2, 6, 4, 8, 5, 9, 7, _
           8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, _
           8 , 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10}

        ' array frekuensi (indeks 0 sampai 10)
        Dim frekuensi As Integer() = New Integer(10) {}

        ' menghitung frekuensi
        For jawaban = 0 To respon.GetUpperBound(0)
            frekuensi(respon(jawaban)) += 1
        Next

        keluaran &= "Skala " & vbTab & "Frekuensi " & vbCrLf

        For skala = 1 To frekuensi.GetUpperBound(0)
            keluaran &= skala & vbTab & frekuensi(skala) & vbCrLf
        Next

        MessageBox.Show(keluaran, "Program Survey Mahasiswa", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub ' Main

End Module ' modSurveyMahasiswa



Gambar 6.5 Keluaran program pada kode 6.4

Stuktur For (baris 22-24) membaca respon dari array respon dan menginkremen salah satu dari 10 kounter dalam array frekuensi (frekuensi(1) sampai frekuensi(10)). Statemen kunci dalam loop ada pada baris 23. Statemen ini menginkremen kounter frekuensi sesuai dengan nilai respon(jawaban).

Akan dijelaskan tentang beberapa iterasi pada struktur For. Ketika kounter jawaban bernilai 0, respon(jawaban) memiliki nilai respon(0). Oleh karena itu, frekuensi(respon(jawaban)) sebenarnya diinterpretasikan sebagai frekuensi(1), yang berarti bahwa kounter pertama di dalam array frekuensi diinkremen sebesar satu. Dalam mengevaluasi ekspresi frekuensi(respon(jawab-an)), Visual Basic memulai dengan nilai yang berada di dalam kurung terdalam (jawaban, sekarang bernilai 0). Nilai dari jawaban diberikan ke dalam ekspresi, dan Visual Basic mengevaluasi apa yang ada di dalam kurung lebih luar, (respon(jawaban)). Nilai tersebut digunakan sebagai indeks untuk array frekuensi dalam menentukan kounter mana yang akan diinkremen.

Ketika jawaban bernilai 1, respon(jawaban) adalah nilai dari respon(1). Hasilnya, frekuensi(respon(jawaban)) sebenarnya diinterpretasikan sebagai frekuensi(2), menyebabkan elemen ketiga dari array frekuensi diinkremen.

Ketika jawaban bernilai 2, respon(jawaban) adalah nilai dari respon(2), sehingga frekuensi(res-pon(jawaban)) diinterpretasikan sebagai frekuensi(6), menyebabkan elemen ketujuh dari array frekuensi diinkremen.


Menggunakan Histogram untuk Menampilkan Data Array
Banyak program menyajikan data kepada pengguna dalam format grafis atau visual. Sebagai contoh, nilai-nilai numerik seringkali ditampilkan sebagai grafik batang, dimana batang yang lebih panjang merepresentasikan nilai numerik yang lebih besar. Kode 6.5 menampilkan data numerik secara grafis dengan menciptakan sebuah histogram yang menggambarkan setiap nilai numerik sebagai batang asterisk (*).

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
' Kode 6.5: Histogram.vb
' Menggunakan data untuk menciptakan histogram.

Imports System.Windows.Forms

Module modHistogram

    Sub Main()
        Dim keluaran As String ' string keluaran
        Dim i, j As Integer ' kounter

        ' menciptakan array data
        Dim array1 As Integer() = New Integer() _
            {19, 3, 15, 7, 11, 9, 13, 5, 17, 1}

        keluaran &= "Elemen " & vbTab & "Nilai " & vbTab & _
        "Histogram"

        For i = 0 To array1.GetUpperBound(0)
            keluaran &= vbCrLf & i & vbTab & array1(i) & vbTab

            For j = 1 To array1(i)
                keluaran &= "*" ' menambah satu asterisk
            Next

        Next

        MessageBox.Show(keluaran, "Program Menampilkan Histogram", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub ' Main

End Module ' modHistogram

Program  membaca setiap nilai dari array dan menampilkan informasi dalam format grafik batang atau histogram. Setiap angka dan sebuah batang yang memuat sejumlah asterisk terkait ditampilkan. Loop For bersarang (baris 19-26) menempelkan atau menyambung grafik batang tersebut ke dalam String yang akan ditampilkan pada MessageBox. Perhatikan nilai akhir (array1(i)) dari struktur For sebelah dalam pada baris 22. Setiap kali struktur For sebelah dalam diraih (baris 22), dihitung mulai dari 1 sampai array1(i), menggunakan sebuah nilai di dalam array1 untuk menentukan nilai akhir dari variabel kendali j (jumlah asterisk yang akan ditampilkan).

Pada Bab 5, digunakan sederet kounter dalam progam pelemparan dadu untuk menjejak jumlah kemunculan setiap sisi dari sebuah dadu enam-sisi dalam 12 kali pelemparan. Sekarang ditemukan bahwa terdapat cara yang lebih elegan dalam melakukannya. Cara ini menggunakan array, seperti ditunjukkan pada kode 6.6.



Gambar 6.6 Keluaran program pada kode 6.5


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
' Kode 6.6: LemparDadu.vb
' Pelemparan dadu dengan grafik frekuensi.

' Perhatian: Directory.GetCurrentDirectory menghasilkan direktori
' folder dimana projek sekarang berada plus
' "bin/". Ini adalah dimana citra dadu ditempatkan
' untuk contoh ini.

Imports System.IO
Imports System.Windows.Forms

Public Class LemparDadu
    Inherits System.Windows.Forms.Form

    Dim angkaAcak As Random = New Random()
    Dim frekuensi As Integer() = New Integer(6) {}

    ' PictureBox
    Friend WithEvents lblDadu1 As PictureBox
    Friend WithEvents lblDadu2 As PictureBox
    Friend WithEvents lblDadu3 As PictureBox
    Friend WithEvents lblDadu4 As PictureBox
    Friend WithEvents lblDadu5 As PictureBox
    Friend WithEvents lblDadu6 As PictureBox
    Friend WithEvents lblDadu7 As PictureBox
    Friend WithEvents lblDadu8 As PictureBox
    Friend WithEvents lblDadu9 As PictureBox
    Friend WithEvents lblDadu10 As PictureBox
    Friend WithEvents lblDadu11 As PictureBox
    Friend WithEvents lblDadu12 As PictureBox

    ' kotak teks
    Friend WithEvents txtTampil As TextBox

    ' tombol
    Friend WithEvents cmdLempar As Button

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' event handler untuk tombol cmdLempar
    Private Sub cmdLempar_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdLempar.Click

        ' melewatkan label kepada sebuah metode yang
        ' secara acak menugaskan sebuah sisi ke setiap dadu
        LemparDadu(lblDadu1)
        LemparDadu(lblDadu2)
        LemparDadu(lblDadu3)
        LemparDadu(lblDadu4)
        LemparDadu(lblDadu5)
        LemparDadu(lblDadu6)
        LemparDadu(lblDadu7)
        LemparDadu(lblDadu8)
        LemparDadu(lblDadu9)
        LemparDadu(lblDadu10)
        LemparDadu(lblDadu11)
        LemparDadu(lblDadu12)

        Dim total As Double = 0
        Dim i As Integer

        For i = 1 To frekuensi.GetUpperBound(0)
            total += frekuensi(i)
        Next

        txtTampil.Text = "Sisi" & vbTab & vbTab & "Frekuensi" & _
            vbTab & vbTab & vbTab & "Persen" & vbCrLf

        ' menampilkan nilai-nilai frekuensi
        For i = 1 To frekuensi.GetUpperBound(0)
            txtTampil.Text &= i & vbTab & vbTab & frekuensi(i) & _
            vbTab & vbTab & vbTab & String.Format("{0:N}", _
            frekuensi(i) / total * 100) & "%" & vbCrLf
        Next

    End Sub  ' cmdLempar_Click

    ' mensimulasikan pelemparan, menampilkan
    ' citra dan menginkremen frekuensi
    Sub LemparDadu(ByVal lblDadu As PictureBox)
        Dim sisi As Integer = 1 + angkaAcak.Next(6)

        lblDadu.Image = _
        Image.FromFile(Directory.GetCurrentDirectory & _
        "\Citra\dadu" & sisi & ".png")

        frekuensi(sisi) += 1
    End Sub ' LemparDadu

End Class


Pelewatan Array kepada Prosedur
Untuk melewatkan argumen array kepada sebuah prosedur, Anda perlu menspesifikasi nama array tanpa menggunakan kurung. Sebagai contoh, jika array suhuPerJam telah dideklarasikan sebagai

Dim suhuPerJam As Integer() = New Integer(24) {}

Pemanggilan prosedur

DataHarian(suhuPerJam)

akan melewatkan array suhuPerJam kepada prosedur DataHarian.




Gambar 6.7 Keluaran program pada kode 6.6


Setiap objek array “mengetahui” batas atasnya sendiri (nilai balik yang diberikan oleh metode GetUpperBound), jadi, ketika Anda melewatkan sebuah objek array kepada suatu prosedur, Anda tidak perlu melewatkan batas atas array sebagai suatu argumen terpisah.

Agar prosedur bisa menerima array melalui pemanggilan prosedur, daftar parameter prosedur harus menspesifikasi bahwa sebuah array akan diterima. Sebagai contoh, header prosedur untuk DataHarian yang ditulis sebagai

Sub DataHarian(ByVal DataSuhu As Integer())

mengindikasikan bahwa DataHarian akan menerima sebuah array Integer di dalam parameter DataSuhu. Dalam Visual Basic, array selalu dilewatkan dengan referensi, tetapi normalnya tidak digunakan katakunci ByRef di dalam header definisi prosedur.

Meskipun keseluruhan array selalu dilewatkan dengan referensi, elemen array dapat dilewatkan dengan cara yang sama seperti variabel bertipe primitif. Sebagai contoh, nilai elemen array bertipe primitif, seperti Integer, dapat dilewatkan dengan nilai atau dengan referensi, tergantung dari definisi prosedur. Untuk melewatkan sebuah elemen array kepada prosedur, digunakan nama berindeks dari elemen array sebagai argumen di dalam pemanggilan prosedur. Program pada kode 6.7 mendemonstrasikan perbedaan antara pelewatan sebuah array utuh dengan pelewatan sebuah elemen 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
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
' Kode 6.7: PelewatanArray.vb
' Melewatkan array dan elemen array kepada prosedur.

Imports System.Windows.Forms

Module modPelewatanArray
    Dim keluaran As String

    Sub Main()
        Dim array1 As Integer() = New Integer() {1, 2, 3, 4, 5}
        Dim i As Integer

        keluaran = "EFEK PELEWATAN ARRAY SECARA UTUH " & _
        "DENGAN REFERENSI:" & vbCrLf & vbCrLf & _
        "Nilai-nilai dari array asli adalah:" & vbCrLf

        ' menampilkan elemen-elemen dari array1
        For i = 0 To array1.GetUpperBound(0)
            keluaran &= " " & array1(i)
        Next

        ModifikasiArray(array1) ' array dilewatkan dengan referensi

        keluaran &= vbCrLf & _
        "Nilai-nilai dari array termodifikasi adalah:" & vbCrLf

        ' menampilkan elemen-elemen termodifikasi dari array1
        For i = 0 To array1.GetUpperBound(0)
            keluaran &= " " & array1(i)
        Next

        keluaran &= vbCrLf & vbCrLf & _
        "EFEK PELEWATAN ELEMEN ARRAY " & _
        "DENGAN NILAI:" & vbCrLf & vbCrLf & "array1(3) " & _
        "sebelum ModifikasiElemenDgnNil: " & array1(3)

        ' elemen array dilewatkan dengan nilai
        ModifikasiElemenDgnNil(array1(3))

        keluaran &= vbCrLf & "array1(3) setelah " & _
        "ModifikasiElemenDgnNil: " & array1(3)

        keluaran &= vbCrLf & vbCrLf & "EFEK PELEWATAN " & _
        "ELEMEN ARRAY DENGAN REFERENSI: " & vbCrLf & vbCrLf & _
        "array1(3) sebelum ModifikasiDgnRef: " & array1(3)

        ' elemen array dilewatkan dengan referensi
        ModifikasiDgnRef(array1(3))

        keluaran &= vbCrLf & "array1(3) setelah " & _
        "ModifikasiDgnRef: " & array1(3)

        MessageBox.Show(keluaran, "Pelewatan Array", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub ' Main

    ' prosedur memodifikasi array yang diterima (perhatikan ByVal)
    Sub ModifikasiArray(ByVal parameterArray As Integer())
        Dim j As Integer

        For j = 0 To parameterArray.GetUpperBound(0)
            parameterArray(j) *= 2
        Next

    End Sub ' ModifikasiArray

    ' prosedur memodifikasi integer yang dilewatkan kepadanya
    ' yang asli tidak termodifikasi (perhatikan ByVal)
    Sub ModifikasiElemenDgnNil(ByVal elemen As Integer)

        keluaran &= vbCrLf & "Nilai yang diterima di dalam " & _
            "ModifikasiElemenDgnNil: " & elemen
        elemen *= 2
        keluaran &= vbCrLf & "Nilai yang dihitung di dalam " & _
            "ModifikasiElemenDgnNil: " & elemen
    End Sub ' ModifikasiElemenDgnNil

    ' prosedur memodifikasi integer yang dilewatkan kepadanya
    ' yang asli tidak termodifikasi (perhatikan ByRef)
    Sub ModifikasiDgnRef(ByRef elemen As Integer)

        keluaran &= vbCrLf & "Nilai yang diterima di dalam " & _
            "ModifikasiDgnRef: " & elemen
        elemen *= 2
        keluaran &= vbCrLf & "Nilai yang dihitung di dalam " & _
            "ModifikasiDgnRef: " & elemen
    End Sub ' ModifikasiDgnRef

End Module ' modPelewatanArray

Struktur For/Next pada baris 18-20 menyambung lima elemen array integer array1 (baris 10) dengan String keluaran. Baris 22 melewatkan array1 kepada prosedur ModifikasiArray (baris 58), yang kemudian mengalikan setiap elemennya dengan 2 (baris 62). Untuk mengilustrasikan bahwa elemen-elemen array1 telah dimodifikasi dalam prosedur terpanggil (akibat pelewatan dengan referensi), struktur For/Next pada baris 28-30 menyambungkan lima elemen dari array1 dengan keluaran. Seperti yang ditunjukkan pada keluaran, elemen-elemen array1 dimodifikasi oleh ModifikasiArray.

Untuk menunjukkan nilai array1(3) sebelum pemanggilan ModifikasiElemenDgnNil, baris 32-35 menyambungkan nilai array1(3) dengan String keluaran. Baris 38 memanggil prosedur ModifikasiElemenDgnNil dan melewatkan array1(3). Ketika array1(3) dilewatkan dengan nilai, nilai Integer di dalam posisi keempat pada array1 (sekarang bernilai 8) disalin dan dilewatkan kepada prosedur ModifikasiElemenDgnNil, dimana ia menjadi nilai dari argumen elemen. Prosedur ModifikasiElemenDgnNil kemudian mengalikan elemen dengan 2 (baris 73). Parameter dari ModifikasiElemenDgnNil adalah sebuah variabel lokal yang dihancurkan ketika prosedur berhenti dieksekusi. Jadi, ketika kendali program kembali kepada Main, nilai tak-termodifikasi dari array1(3) disambungkan ke variabel string keluaran (baris 40-41).

Baris 43-51 mendemonstrasikan efek dari prosedur ModifikasiELemenDgnRef (baris 80-87). Prosedur ini melakukan perhitungan yang sama dengan ModifikasiElemenDgnNil, mengalikan elemen dengan 2. Pada kasus ini, array1(3) dilewatkan dengan referensi.



Gambar 6.8 Keluaran program pada kode 6.7


Pelewatan Array: ByVal versus ByRef
Dalam Visual Basic .NET, sebuah variabel yang “menyimpan” sebuah objek, seperti array, sebenarnya tidak menyimpan objek tersebut. Yang terjadi adalah bahwa variabel tersebut menyimpan sebuah referensi yang menunjuk ke objek tersebut (lokasi dalam memori komputer dimana objek disimpan). Perbedaan antara variabel referensi dan variabel tipe primitif sangat penting diketahui para programer.

Ketika digunakan untuk mendeklarasikan sebuah parameter tipe nilai, katakunci ByVal menyebabkan nilai argumen disalin ke sebuah variabel lokal di dalam prosedur. Perubahan yang terjadi pada variabel lokal hanya terjadi pada salinan dari variabel, bukan pada variabel asli di dalam program pemanggil. Namun, jika argumen dilewatkan menggunakan katakunci ByRef,  nilai yang disalin adalah referensi yang menunjuk ke objek asli dalam memori komputer. Jadi, tipe referensi (seperti array dan objek lainnya) dilewatkan dengan katakunci ByVal sebenarnya dilewatkan dengan referensi, yang berarti bahwa perubahan yang terjadi di dalam prosedur yang dipanggil mempengaruhi objek asli di dalam pemanggil.

Visual Basic mengijinakan prosedur untuk melewatkan referensi dengan katakunci ByRef. Ini merupakan kapabilitas yang kompleks, yang, jika disalah-gunakan, dapat mengakibatkan masalah. Sebagai contoh, ketika sebuah objek tipe referensi seperti array dilewatkan dengan ByRef, prosedur terpanggil sebenarnya memiliki kuasa atau kendali atas referensi yang dilewatkan kepadanya, mengijinkan prosedur terpanggil untuk mengganti referensi asli di dalam pemanggil dengan sebuah objek yang berbeda atau bahkan dengan Nothing. Tindakan semacam itu dapat menyebabkan hasil yang tak diduga. Program pada kode 6.8 mendemonstrasikan perbedaan antara pelewatan referensi ByVal versus byRef.

Baris 11-12 mendeklarasikan dua variabel integer, arrayPertama dan salinanArrayPertama. Baris 15 mengalokasikan sebuah array yang memuat nilai-nilai Integer 1, 2, dan 3, dan menyimpan referensi array di dalam variabel arrayPertama. Statemen penugasan pada baris 16 menyalin referensi arrayPertama kepada variabel salinanArrayPertama, menyebabkan kedua variabel ini mereferensi (menunjuk) ke objek array yang sama. Struktur For/Next pada baris 24-26 menampilkan isi arrayPertama sebelum dilewatkan kepada prosedur DoublePertama pada baris 29 sehingga Anda dapat memverifikasi bahwa array ini dilewatkan dengan referensi (yaitu, metode terpanggil melakukan perubahan terhadap isi array).

Struktur For/Next di dalam prosedur DoublePertama (baris 94-96) mengalikan nilai semua elemen array dengan 2. Baris 99 mengalokasikan sebuah array baru yang memuat nilai 11, 12, dan 13; referensi untuk array ini kemudian ditugaskan kepada parameter array. Setelah prosedur DoublePertama dieksekusi, struktur For/Next pada baris 35-37 menampilkan isi arrayPertama, mendemonstrasikan bahwa nilai setiap elemen telah diubah oleh prosedur. Struktur If pada baris 40-46 menggunakan operator Is untuk membandingkan referensi arrayPertama dan salinan-ArrayPertama. Visual Basic menyediakan operator Is untuk membandingkan dua referensi apakah menunjuk ke objek yang sama atau tidak. Ekspresi pada baris 40 bernilai true jika kedua operand dari operator Is merupakan referensi yang menunjuk ke objek yang sama.

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
' Kode 6.8: UjiReferensiArray.vb
' Menguji pengaruh pelewatan referensi array menggunakan
' ByVal dan ByRef.

Module modUjiReferensiArray

    Sub Main()
        Dim i As Integer

        ' mendeklarasikan referensi array
        Dim arrayPertama As Integer()
        Dim salinanArrayPertama As Integer()

        ' mengalokasikan arrayPertama dan menyalin referensinya
        arrayPertama = New Integer() {1, 2, 3}
        salinanArrayPertama = arrayPertama

        Console.WriteLine("Menguji pelewatan referensi array " & _
            "menggunakan ByVal.")
        Console.Write("Isi dari arrayPertama sebelum " & _
            "pemanggilan DoublePertama: ")

        ' menampilkan isi arrayPertama
        For i = 0 To arrayPertama.GetUpperBound(0)
            Console.Write(arrayPertama(i) & " ")
        Next

        ' melewatkan arrayPertama menggunakan ByVal
        DoublePertama(arrayPertama)

        Console.Write(vbCrLf & "Isi dari arrayPertama setelah " & _
        "pemanggilan DoublePertama: ")

        ' menampilkan isi dari arrayPertama
        For i = 0 To arrayPertama.GetUpperBound(0)
            Console.Write(arrayPertama(i) & " ")
        Next

        ' menguji apakah referensi diubah oleh DoublePertama
        If arrayPertama Is salinanArrayPertama Then
            Console.WriteLine(vbCrLf & "Kedua referensi " & _
            "sama.")
        Else
            Console.WriteLine(vbCrLf & "Kedua referensi " & _
            "tidak sama.")
        End If

        ' mendeklarasikan referensi array
        Dim arrayKedua As Integer()
        Dim salinanArrayKedua As Integer()

        ' mengalokasikan arrayKedua dan menyalin referensinya
        arrayKedua = New Integer() {1, 2, 3}
        salinanArrayKedua = arrayKedua

        Console.WriteLine(vbCrLf & "Menguji pelewatan referensi " & _
            "array menggunakan ByRef.")
        Console.Write("Isi dari arrayKedua sebelum " & _
            "pemanggilan DoubleKedua: ")

        ' menampilkan isi dari arrayKedua sebelum pemanggilan prosedur
        For i = 0 To arrayKedua.GetUpperBound(0)
            Console.Write(arrayKedua(i) & " ")
        Next

        ' melewatkan arrayKedua menggunakan ByRef
        DoubleKedua(arrayKedua)

        Console.Write(vbCrLf & "Isi dari arrayKedua " & _
            "setelah pemanggilan DoubleKedua: ")

        ' menampilkan isi dari arrayKedua setelah pemanggilan prosedur
        For i = 0 To arrayKedua.GetUpperBound(0)
            Console.Write(arrayKedua(i) & " ")
        Next

        ' mengujia apakah referensi diubah oleh DoubleKedua
        If arrayKedua Is salinanArrayKedua Then
            Console.WriteLine(vbCrLf & "Kedua referensi " & _
            "sama.")
        Else
            Console.WriteLine(vbCrLf & "Kedua referensi " & _
            "tidak sama.")
        End If

    End Sub ' Main

    ' prosedur memodifikasi elemen-elemen array dan menugaskan
    ' referensi baru (perhatikan ByVal)
    Sub DoublePertama(ByVal array As Integer())
        Dim i As Integer

        ' menggandakan setiap nilai elemen
        For i = 0 To array.GetUpperBound(0)
            array(i) *= 2
        Next

        ' menciptakan referensi baru dan menugaskannya kepada array
        array = New Integer() {11, 12, 13}
    End Sub ' DoublePertama

    ' prosedur memodifikasi elemen-elemen array dan menugaskan
    ' referensi baru (perhatkan ByRef)
    Sub DoubleKedua(ByRef array As Integer())
        Dim i As Integer

        ' menggandakan isi array
        For i = 0 To array.GetUpperBound(0)
            array(i) *= 2
        Next

        ' menciptakan referensi baru dan menugaskannya kepada array
        array = New Integer() {11, 12, 13}
    End Sub ' DoubleKedua

End Module ' modUjiReferensiArray
Menguji pelewatan referensi array menggunakan ByVal.
Isi dari arrayPertama sebelum pemanggilan DoublePertama: 1 2 3
Isi dari arrayPertama setelah pemanggilan DoublePertama: 2 4 6
Kedua referensi sama.

Menguji pelewatan referensi array menggunakan ByRef.
Isi dari arrayKedua sebelum pemanggilan DoubleKedua: 1 2 3
Isi dari arrayKedua setelah pemanggilan DoubleKedua: 11 12 13
Kedua referensi tidak sama.


Pengurutan Array
Pengurutan data (menata data dengan urutan tertentu, seperti urutan menaik atau menurun) merupakan salah satu aplikasi komputasi yang populer. Module pada kode 6.9 memuat beberapa prosedur untuk mengurutkan nilai-nilai dari sebuah array integer agar menjadi urutan menaik. Teknik yang digunakan adalah pengurutan bubble, dimana nilai-nilai yang lebih kecil secara bertahap ditempatkan ke atas array (ke arah elemen pertama). Teknik ini menggunakan beberapa loop bersarang untuk melakukan beberapa pelewatan melalui array. Setiap pelewatan akan membandingkan pasangan elemen. Jika pasangan tersebut dalam urutan menaik (atau kedua nilai sama), maka pengurutan bubble akan membiarkannya. Jika pasangan dalam urutan menurun, maka pengurutan bubble akan saling menukarkannya.

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
' Kode 6.9: PengurutanBubble.vb
' Beberapa prosedur untuk mengurutkan sebuah array integer.

Module modPengurutanBubble

    ' mengurutkan array menggunakan algoritma pengurutan bubble
    Sub PengurutanBubble(ByVal arrayUrut As Integer())
        Dim pass, i As Integer

        For pass = 1 To arrayUrut.GetUpperBound(0)

            For i = 0 To arrayUrut.GetUpperBound(0) - 1

                If arrayUrut(i) > arrayUrut(i + 1) Then
                    Tukar(arrayUrut, i)
                End If

            Next

        Next

    End Sub ' PengurutanBubble

    ' menukar dua elemen array
    Sub Tukar(ByVal arrayTukar As Integer(), _
        ByVal pertama As Integer)

        Dim tampung As Integer

        tampung = arrayTukar(pertama)
        arrayTukar(pertama) = arrayTukar(pertama + 1)
        arrayTukar(pertama + 1) = tampung
    End Sub ' Tukar

End Module ' modPengurutanBubble

Module memuat prosedur PengurutanBubble dan Tukar. Prosedur PengurutanBubble (baris 7-22) mengurutkan elemen-elemen dari parameternya, arrayUrut. Prosedur PengurutanBubble memanggil prosedur Tukar (baris 25-33) untuk saling-menukar elemen-elemen. Aplikasi Windows pada kode 6.10 mendemonstrasikan prosedur PengurutanBubble dengan mengurutkan array 10 elemen.

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
' Kode 6.10: UjiPengurutanBubble.vb
' Program menciptakan angka-angka acak dan mengurutkannya.

Imports System.Windows.Forms

Public Class FrmPengurutanBubble
    Inherits System.Windows.Forms.Form

    ' tombol
    Friend WithEvents cmdCiptakan As Button
    Friend WithEvents cmdUrutkan As Button

    ' label
    Friend WithEvents lblAsli As Label
    Friend WithEvents lblTerurut As Label

    ' textboxe
    Friend WithEvents txtAsli As TextBox
    Friend WithEvents txtTerurut As TextBox

    ' kode yang dibangkitkan oleh Visual Studio .NET

    Dim array As Integer() = New Integer(9) {}

    ‘ menciptakan angka-angka acak
    Private Sub cmdCiptakan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdCiptakan.Click

        Dim keluaran As String
        Dim angkaAcak As Random = New Random()
        Dim i As Integer

        txtTerurut.Text = ""

        ' menciptakan 10 angka acak dan menempelkannya ke keluaran
        For i = 0 To array.GetUpperBound(0)
            array(i) = angkaAcak.Next(100)
            keluaran &= array(i) & vbCrLf
        Next

        txtAsli.Text = keluaran ' menampilkan angka-angka
        cmdUrutkan.Enabled = True ' mengaktifkan tombol cmdUrutkan

    End Sub  ' cmdCiptakan_Click

    Private Sub cmdUrutkan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdUrutkan.Click

        Dim keluaran As String
        Dim i As Integer

        ' mengurutkan array
        modPengurutanBubble.PengurutanBubble(array)

        ' menciptakan string dengan angka-angka terurut
        For i = 0 To array.GetUpperBound(0)
            keluaran &= array(i) & vbCrLf
        Next

        txtTerurut.Text = keluaran ' menampilkan angka-angka
        cmdUrutkan.Enabled = False
    End Sub ' cmdUrutkan_Click

End Class

Program memuat metode cmdCiptakan_Click dan cmdUrutkan_Click. Metode cmdCiptakan_Click (baris 26-43) menugaskan 10 nilai acak kepada tiap elemen array dan menampilkan isi array di dalam textAsli. Metode cmdUrutkan_Click (baris 46-62) mengurutkan array dengan memanggil prosedur PengurutanBubble dari modPengurutanBubble.



Gambar 6.9 Keluaran program pada kode 6.10


Prosedur PengurutanBubble menerima array sebagai parameter arrayUrut. Struktur For/Next bersarang pada baris 10-20 pada kode 6.9. Loop sebelah luar mengendalikan jumlah pass. Loop sebelah dalam (baris 12-18) mengendalikan pembandingan dan penukaran elemen-elemen pada tiap pass.

Prosedur PengurutanBubble pertama-tama membandingkan arrayUrut(0) dengan arrayUrut(1), kemudian arrayUrut(1) dengan arrayUrut(2), dan seterusnya sampai arrayUrut(8) dengan arrayUrut(9). Meskipun terdapat 10 elemen, loop hanya memerlukan sembilan operasi perbandingan.

Jika perbandingan atas dua elemen menyatakan urutan menurun, PengurutanBubble akan memanggil prosedur Tukar untuk saling-menukar kedua elemen, sehingga menjadi tatanan menaik. Prosedur Tukar menerima arrayTukar dan indeks elemen pertama array. Penukaran dilakukan dalam tiga statemen

tampung = arrayTukar(pertama)
arrayTukar(pertama) = arrayTukar(pertama + 1)
arrayTukar(pertama + 1) = tampung

dimana variabel ekstra tampung secara temporer menyimpan salah satu nilai yang sedang ditukar. Penukaran tidak dapat dilakukan hanya dengan dua statemen

arrayTukar(pertama) = arrayTukar(pertama + 1)
arrayTukar(pertama + 1) = arrayTukar(pertama)

Jika tukarArray(pertama) adalah 7 dan tukarArray(pertama+1) adalah 5, setelah penugasan pertama  kedua elemen array akan memuat 5, dan nilai 7 akan hilang. Inilah mengapa dibutuhkan variabel ekstra tampung.


Pencarian Array dengan Pencarian Linier
Module modPencarianLinier pada kode 6.11 memuat sebuah prosedur untuk melakukan pencarian linier. Prosedur PencarianLinier (baris 7-22) menggunakan sebuah struktur For/Next yang memuat struktur If (baris 15-17) untuk membandingkan setiap elemen array dengan sebuah kunci pencarian. Jika kunci ditemukan, maka prosedur akan menghasilkan nilai balik berupa indeks elemen tersebut, mengindikasikan posisi kunci pencarian di dalam array. Jika kunci pencarian tidak ditemukan, prosedur menghasilkan nilai balik -1. (Nilai -1 merupakan pilihan yang baik karena tidak valid untuk nomor indeks).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' Kode 6.11: PencarianLinier.vb
' Pencarian linier atas sebuah array.

Module modPencarianLinier

    ' beriterasi melalui array
    Function PencarianLinier(ByVal kunci As Integer, _
        ByVal angka As Integer()) As Integer

        Dim n As Integer

        ' struktur beriterasi secara linier melalui array
        For n = 0 To angka.GetUpperBound(0)

            If angka(n) = kunci Then
                Return n
            End If

        Next

        Return -1
    End Function ' PencarianLinier

End Module ' modPencarianLinier

Program pada kode 6.12 menggunakan module modPencarianLinier untuk melakukan pencarian atas sebuah array 20 elemen, yang memuat nilai-nilai acak yang diciptakan ketika pengguna mengklik cmdCiptakan. Pengguna kemudian mengetikkan sebuah kunci pencarian di dalam sebuah TextBox (bernama txtMasukan) dan mengklik cmdCari untuk memulai pencarian.

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
' Kode 6.12: UjiPencarianLinier.vb
' Pencarian linier atas sebuah array.

Imports System.Windows.Forms

Public Class UjiPencarianLinier
    Inherits System.Windows.Forms.Form

    ' tombol
    Friend WithEvents cmdCari As Button
    Friend WithEvents cmdCiptakan As Button

    ' kotak teks
    Friend WithEvents txtMasukan As TextBox
    Friend WithEvents txtData As TextBox

    ' label
    Friend WithEvents lblMasukan As Label
    Friend WithEvents lblHasil As Label

    ' kode yang dihasilkan Visual Studio .NET

    Dim array1 As Integer() = New Integer(19) {}

    ‘ menciptakan data acak
    Private Sub cmdCiptakan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdCiptakan.Click

        Dim keluaran As String
        Dim angkaAcak As Random = New Random()
        Dim i As Integer

        keluaran = "Indeks" & vbTab & "Nilai" & vbCrLf

        ' menciptakan string yang memuat 11 angka acak
        For i = 0 To array1.GetUpperBound(0)
            array1(i) = angkaAcak.Next(1000)
            keluaran &= i & vbTab & array1(i) & vbCrLf
        Next

        txtData.Text = keluaran ' menampilkan angka-angka
        txtMasukan.Text = "" ' mengosongkan kotak teks kunci
        cmdCari.Enabled = True ' mengaktifkan tombol Cari
    End Sub  ' cmdCiptakan_Click

    ‘ mencari kunci elemen
    Private Sub cmdCari_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdCari.Click

        ' jika kotak teks kunci pencarian kosong,
        ' tampilkan pesan dan keluar dari prosedur
        If txtMasukan.Text = "" Then
            MessageBox.Show("Anda harus memasukkan sebuah kunci pencarian.")
            Exit Sub
        End If

        Dim kunciPencarian As Integer = Convert.ToInt32(txtMasukan.Text)
        Dim elemen As Integer = PencarianLinier(kunciPencarian, array1)

        If elemen <> -1 Then
            lblHasil.Text = "Nilai ditemukan dalam indeks " & elemen
        Else
            lblHasil.Text = "Nilai Tidak Ditemukan"
        End If

    End Sub  ' cmdCari_Click

End Class  ' UjiPencarianLinier



Gambar 6.10 Keluaran program pada kode 6.12


Pencarian Array Terurut dengan Pencarian Biner
Metode pencarian linier cocok untuk array kecil yang tak-terurut. Namun, untuk array besar, pencarian linier menjadi tidak efisien. Jika array telah diurutkan, teknik pencarian biner dapat dilakukan.

Setelah tiap perbandingan, algoritma pencarian biner mengeliminiasi setengah bagian array yang sedang dicari. Algoritma mencari lokasi elemen array tengah dan membandingkannya dengan kunci pencarian. Jika elemen tengah sama dengan kunci, maka kunci pencarian telah ditemukan, dan indeks elemen tersebut dijadikan nilai balik. Sebaliknya, masalah direduksi dengan melakukan pencarian pada setengah bagian array.

Jika kunci pencarian bernilai kurang dari elemen tengah array, maka setengah bagian kedua dari array dieliminasi dari pencarian, dan pencarian berlanjut pada setengah bagian pertama dari array; sebaliknya, pencarian dilakukan pada setengah bagian kedua dari array. Hal ini dilakukan secara berulang sampai kunci pencarian sama dengan elemen tengah subarray, atau sampai subarray hanya memuat satu elemen yang tidak sama dengan kunci pencarian (kunci pencarian tidak ditemukan).

Pada skenario terburuk, pencarian atas sebuah array terurut yang memuat 1024 elemen menggunakan pencaruan biner hanya memerlukan 10 perbandingan. Pembagian 1024 dengan 2 secara berulang ( setelah tiap perbandingan, setengah bagian array dieliminasi) menghasilkan nilai-nilai 512, 256, 128, 64, 32, 16, 8, 4, 2, 1.

Kode 6.13 merepresentasikan versi iterasi dari metode PencarianBiner (baris 60-86). Metode tersebut menerima dua argumen, array integer array1 (array yang akan dicari), dan integer kunciPencarian. Array tersebut dilewatkan kepada PencarianBiner, meskipun array tersebut merupakan sebuah variabel instans.

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
' Kode 6.13: UjiPencarianBiner.vb
' Mendemonstrasikan pencarian biner atas sebuah array.

Imports System.Windows.Forms

Public Class FrmPencarianBiner
    Inherits System.Windows.Forms.Form

    ' label
    Friend WithEvents lblMasukKunci As Label
    Friend WithEvents lblHasil As Label
    Friend WithEvents lblKeluaranHasil As Label
    Friend WithEvents lblTampil As Label
    Friend WithEvents lblIndeks As Label
    Friend WithEvents lblIndeks2 As Label

    ' tombol
    Friend WithEvents cmdCariKunci As Button

    ' kotak teks
    Friend WithEvents txtMasukan As TextBox

    ' kode yang dibangkitkan Visual Studio .NET

    Dim array1 As Integer() = New Integer(14) {}

    ' FrmPencarianBiner menginisialisasi array1 dengan nilai-nilai
    ' 0, 2, 4, 6, ..., 28 (urutan menaik)
    Private Sub FrmPencarianBiner_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i As Integer

        For i = 0 To array1.GetUpperBound(0)
            array1(i) = 2 * i
        Next

    End Sub  ' FrmPencarianBiner_Load

    Private Sub cmdCariKunci_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdCariKunci.Click

        Dim kunciPencarian As Integer = Convert.ToInt32(txtMasukan.Text)

        lblTampil.Text = ""

        ' melakukan pencarian biner
        Dim elemen As Integer = PencarianBiner(array1, kunciPencarian)

        If elemen <> -1 Then
            lblKeluaranHasil.Text = "Nilai ditemukan di dalam elemen " & elemen
        Else
            lblKeluaranHasil.Text = "Nilai tidak ditemukan"
        End If

    End Sub  ' cmdCariKunci_Click

    ' melakukan pencarian biner
    Function PencarianBiner(ByVal array As Integer(), _
        ByVal kunci As Integer) As Integer

        Dim bawah As Integer = 0 ' indeks bawah
        Dim atas As Integer = array.GetUpperBound(0) ' indeks atas
        Dim tengah As Integer ' indeks tengah

        While bawah <= atas
            tengah = (bawah + atas) \ 2

            ' baris berikut menampilkan bagian
            ' dari array yang sedang dimanipulasi selama
            ' tiap iterasi loop
            BangunKeluaran(bawah, tengah, atas)

            If kunci = array(tengah) Then ' cocok
                Return tengah
            ElseIf kunci < array(tengah) Then ' mencari ke bawah
                atas = tengah - 1 ' dari array
            Else
                bawah = tengah + 1
            End If

        End While

        Return -1 ' kunci pencarian tidak ditemukan
    End Function ' KunciPencarian

    Sub BangunKeluaran(ByVal bawah As Integer, _
        ByVal tengah As Integer, ByVal atas As Integer)

        Dim i As Integer

        For i = 0 To array1.GetUpperBound(0)

            If i < bawah OrElse i > atas Then
                lblTampil.Text &= " "
            ElseIf i = tengah Then ' menandai elemen tengah
                lblTampil.Text &= String.Format("{0:D2}", _
                array1(i)) & "* "
            Else
                lblTampil.Text &= String.Format("{0:D2}", _
                array1(i)) & " "
            End If

        Next i

        lblTampil.Text &= vbCrLf
    End Sub ' BangunKeluaran

End Class




Array Persegi-Panjang dan Array Jagged
Sejauh ini, yang telah dipelajari adalah array satu dimensi, yaitu array yang hanya memiliki satu baris nilai. Pada bagian ini, akan dikenalkan array multidimensi, yang memerlukan dua atau lebih indeks untuk mengidentifikasi elemen tertentu. Pada bab ini, hanya akan difokuskan pada array dua dimensi atau array memiliki banyak baris. Ada dua jenis array multidimensi, array persegi-panjang dan array jagged. Array persegi-panjang dengan dua indeks seringkali merepresentasikan tabel nilai yang memuat informasi yang ditata dalam baris dan kolom. Setiap baris berukuran sama, dan setiap kolom juga berukuran sama. Untuk mengidentifikasi elemen tabel tertentu, diperlukan dua indeks, indeks pertama untuk baris dan indeks kedua untuk kolom. Gambar 6.11 mengilustrasikan array persegi-panjang dua dimensi, a, yang memuat tiga baris dan empat kolom. Array persegi-panjang dua dimensi dengan m baris dan n kolom dikenal dengan array m-kali-n; Array pada Gambar 6.11 disebut dengan array 3-kali-4.

Setiap elemen di dalam array a diidentifikasi pada Gambar 6.11 dengan nama elemen dalam format a(i,j), dimana a adalah nama array, dan i dan j adalah indeks baris dan kolom setiap elemen di dalam a. Perhatikan bahwa, karena indeks array ditentukan berdasarkan penghitungan mulai dari nol, nama-nama elemen dalam baris pertama memiliki indeks pertama 0; nama-nama elemen dalam kolom keempat memiliki indeks kedua 3.

Array multidimensi diinisialisasi dalam deklarasi menggunakan proses dan notasi yang sama seperti untuk array satu dimensi. Sebagai contoh, array persegi-panjang dua dimensi, angka, dengan dua baris dan dua kolom dapat dideklarasikan dan diinisialisasi dengan

Dim angka As Integer(,) = New Integer(1,1) {}
angka(0, 0) = 1
angka(0, 1) = 2
angka(1, 0) = 3
angka(1, 1) = 4

Sebagai alternatif, inisialisasi dapat ditulis pada satu baris, sebagai berikut:

Dim angka As Integer(,) = New Integer(,) {{1, 2}, {3, 4}}



Gambar 6.11 Array dua dimensi dengan tiga baris dan empat kolom


Nilai-nilai dikelompokkan baris per baris di dalam kurung kurawal, dengan 1 dan 2 menginisialisasi angka(0,0) dan angka(0,1), dan 3 dan 4 menginisialisasi angka(1,0) dan angka(1,1). Kompiler menentukan  jumlah baris dengan menghitung jumlah daftar sub-penginisialisasi (direpresentasikan oleh himpunan kurung kurawal) di dalam daftar penginisialisasi utama. Kemudian, kompiler menentukan jumlah kolom dalam setiap baris dengan menghitung jumlah nilai-nilai penginisialisasi pada daftar sub-penginisialisasi untuk baris tersebut. Pada array persegit-panjang, setiap baris memiliki jumlah nilai yang sama.

Array jagged dipandang sebagai array yang memuat array. Tidak seperti array persegi-panjang, baris dalam array jagged dapat berbeda panjang satu sama lain. Statemen

Dim array2 As Integer()() ' mendeklarasikan array jagged

array2 = New Integer(1)() {} ' mengalokasikan dua baris

' mengalokasikan kolom-kolom untuk baris 0
array2(0) = New Integer() {1, 2}

' mengalokasikan kolom-kolom untuk baris 1
array2(1) = New Integer() {3, 4, 5}

menciptakan array Integer, array2, dengan baris 0 memuat dua elemen (1 dan 2), dan baris 1 memuat tiga elemen (3, 4, dan 5). Perhatikan bahwa nama array, diikuti dengan indeks tunggal (seperti, array2(0)), berperilaku persis seperti variabel array satu dimensi.

Program pada kode 6.14 mendemonstrasikan penginisialisasian sebuah array persegi-panjang (array1) dan sebuah array jagged (array2) dalam deklarasi dan penggunaan beberapa loop For/Next bersarang untuk menjelajahi array (juga untuk memanipulasi setiap elemen array).

Program mendeklarasikan dua array dalam metode Main. Alokasi dari array1 (baris 14) menyediakan enam penginisialisasi dalam dua sub-daftar. Sub-daftar pertama menginisialisasi baris pertama (baris 0) dari array dengan nilai 1, 2, dan 3; sub-daftar kedua menginisialisasi baris kedua (baris 1) dari array dengan nilai 4, 5, dan 6. Deklarasi dan alokasi dari array2 (baris 17) menciptakan sebuah array jagged yang memuat 3 array (dispesifikasi dengan 2 dalam kurung setelah katakunci Integer). Baris 18-20 menginisialisasi setiap subarray sehingga subarray pertama memuat nilai 1 dan 2, dan subarray kedua memuat nilai 3 dan subarray ketiga memuat nilai 4, 5, dan 6.

Struktur For/Next bersarang pada baris 24-31 menempatkan elemen-elemen dari array1 pada string keluaran. Struktur For/Next bersarang dipakai untuk menjelajahi array dalam dimensi dua. Struktur For/Next sebelah luar menjelajahi baris; struktur For/Next sebelah dalam menjelajahi kolom di dalam sebuah baris. Setiap struktur For/Next memanggil metode GetUpperBound untuk mendapatkan batas atas dimensi yang dijelajahi. Perhatikan bahwa dimensi array adalah berbasis nol, yang berarti bahwa baris adalah dimensi 0 dan kolom adalah dimensi 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
' Kode 6.14: ArrayMultiDimensi.vb
' Menginisialisasi array multidimensi.

Imports System.Windows.Forms

Module modArrayMultiDimensi

    Sub Main()
        Dim keluaran As String
        Dim i, j As Integer

        ' menciptakan array dua dimensi persegi-panjang
        Dim array1 As Integer(,)
        array1 = New Integer(,) {{1, 2, 3}, {4, 5, 6}}

        ' menciptakan array jagged dua dimensi
        Dim array2 As Integer()() = New Integer(2)() {}

        array2(0) = New Integer() {1, 2}
        array2(1) = New Integer() {3}
        array2(2) = New Integer() {4, 5, 6}

        keluaran = "Nilai-nilai dalam array1 baris per baris: " & vbCrLf

        For i = 0 To array1.GetUpperBound(0)

            For j = 0 To array1.GetUpperBound(1)
                keluaran &= array1(i, j) & " "
            Next

            keluaran &= vbCrLf
        Next

        keluaran &= vbCrLf & "Nilai-nilai dalam array2 baris per baris: " & _
            vbCrLf

        For i = 0 To array2.GetUpperBound(0)

            For j = 0 To array2(i).GetUpperBound(0)
                keluaran &= array2(i)(j) & " "
            Next

            keluaran &= vbCrLf
        Next

        MessageBox.Show(keluaran, _
            "Menginisialisasi array dua-dimensi", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub ' Main

End Module ' ArrayMultiDimensi



Gambar 6.12 Keluaran program pada kode 6.14
  

Banyak manipulasi array yang umum dijumpai menggunakan struktur repetisi For/Next. Bayangkan sebuah array jagged, yang memuat 3 baris, atau 3 array. Struktur For/Next berikut menetapkan semua elemen dalam baris ketiga arrayJagged menjadi nol:

For kolom = 0 To arrayJagged(2).GetUpperBound(0)
    arrayJagged(2)(kolom) = 0
Next

Yang dispesifikasi adalah baris ketiga; oleh karena itu, diketahui bahwa indeks pertama selalu 2 (0 untuk baris pertama dan 1 untuk baris kedua). Loop For/Next hanya memvariasi indeks kolom. Perhatikan kegunaan arrayJagged(2).GetUpperBound(0) sebagai nilai akhir dari struktur For/Next. Dalam ekspresi ini, metode GetUpperBound dipanggil pada array yang dimuat dalam baris ketiga dari arrayJagged. Statemen ini mendemonstrasikan bahwa setiap baris dari arrayJagged adalah sebuah array. Struktur For/Next tersebut ekivel dengan beberapa statemen penugasan berikut:

arrayJagged (2)(0) = 0
arrayJagged (2)(1) = 0
arrayJagged (2)(2) = 0
arrayJagged (2)(3) = 0

Struktur For/Next bersarang berikut menentukan total semua elemen di dalam arrayJagged. Digunakan metode GetUpperBound pada header struktur For/Next untuk menentukan jumlah baris dalam arrayJagged dan jumlah kolom pada setiap baris.

Dim total, baris, kolom As Integer

For baris = 0 To jaggedArray.GetUpperBound(0)

    For kolom = 0 To jaggedArray(baris).GetUpperBound(0)
        total += jaggedArray(baris)(kolom)
    Next

Next

Program pada kode 6.15 melakukan beberapa manipulasi array yang lain pada sebuah array 3-kali-4, skor. Setiap baris merepresentasikan seorang mahasiswa, dan setiap kolom merepresentasikan skor salah satu dari empat ujian dalam satu semester. Manipulasi array dilakukan oleh empat prosedur: Prosedur Minimum (bairs 44) menentukan skor terendah dari semua mahasiswa selama satu semester. Prosedur Maksimum (bairs 66) menentukan skor tertinggi dari semua mahasiswa selama satu semester. Prosedur Rerata (baris 89) menentukan rerata. Prosedur BangunString (baris 103) menempatkan array dua dimensi pada string keluaran dalam format tabular.

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
' Kode 6.15: ArrayJagged.vb
' Contoh array dua dimensi.

Imports System.Windows.Forms

Module modArrayJagged
    Dim siswaAkhir, ujianAkhir As Integer
    Dim keluaran As String

    Sub Main()
        Dim i As Integer

        ' array jagged dengan 3 baris yang memuat skor ujian
        Dim arraySkor As Integer()() = New Integer(2)() {}

        ' mengalokasikan setiap baris dengan 4 skor mahasiswa
        arraySkor(0) = New Integer() {77, 68, 86, 73}
        arraySkor(1) = New Integer() {98, 87, 89, 81}
        arraySkor(2) = New Integer() {70, 90, 86, 81}

        ' batas atas untuk manipulasi array
        siswaAkhir = arraySkor.GetUpperBound(0)
        ujianAkhir = arraySkor(0).GetUpperBound(0)

        keluaran = "Mahasiswa \ Ujian" & vbCrLf

        ' membangun string keluaran
        BangunString(arraySkor)
        keluaran &= vbCrLf & vbCrLf & "Skor terendah: " & _
        Minimum(arraySkor) & vbCrLf & "Skor tertinggi: " & _
        Maksimum(arraySkor) & vbCrLf

        ' menghitung rerata setiap mahasiswa
        For i = 0 To siswaAkhir
            keluaran &= vbCrLf & "Rerata untuk mahasiswa " & _
            i & " adalah " & Rerata(arraySkor(i))
        Next

        MessageBox.Show(keluaran, "Array jagged dua dimensi", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub ' Main

    ' mencari skor minimum
    Function Minimum(ByVal skor As Integer()()) _
        As Integer

        Dim skorBawah As Integer = 100
        Dim i, j As Integer

        For i = 0 To siswaAkhir

            For j = 0 To ujianAkhir

                If skor(i)(j) < skorBawah Then
                    skorBawah = skor(i)(j)
                End If

            Next

        Next

        Return skorBawah
    End Function ' Minimum

    ' mencari skor maksimum
    Function Maksimum(ByVal skor As Integer()()) _
        As Integer

        Dim skorAtas As Integer = 0
        Dim i, j As Integer

        For i = 0 To siswaAkhir

            For j = 0 To ujianAkhir

                If skor(i)(j) > skorAtas Then
                    skorAtas = skor(i)(j)
                End If

            Next

        Next

        Return skorAtas
    End Function ' Maksimum

    ' menentukan rerata skor untuk mahasiswa
    ' (atau sekumpulan skor)
    Function Rerata(ByVal himpunanSkor As Integer()) _
        As Double

        Dim i As Integer, total As Integer = 0

        ' mencari jumlah skor mahasiswa
        For i = 0 To ujianAkhir
            total += himpunanSkor(i)
        Next

        Return total / himpunanSkor.Length
    End Function ' Rerata

    ' menciptakan String untuk menampilkan array
    Sub BangunString(ByVal skor As Integer()())
        Dim i, j As Integer

        ' menyejajarkan kepala kolom
        keluaran &= " "

        For i = 0 To ujianAkhir
            keluaran &= "(" & i & ") "
        Next

        For i = 0 To siswaAkhir
            keluaran &= vbCrLf & " (" & i & ") "

            For j = 0 To ujianAkhir
                keluaran &= skor(i)(j) & " "
            Next

        Next

    End Sub ' BangunString

End Module ' modArrayJagged

Prosedur Minimum, Maksimum, dan BangunString menggunakan array skor dan variabel siswaAkhir (batas atas untuk baris di dalam array) dan ujianAkhir (batas atas untuk kolom di dalam array). Setiap prosedur menggunakan struktur For/Next untuk beriterasi melalui array skor. Perhatikan struktur For/Next bersarang di dalam prosedur Minimum (baris 50-60). Struktur For/Next sebelah luar menetapkan i (baris indeks) menjadi 0 sehingga elemen-elemen baris pertama dapat dibandingkan dengan variabel skorBawah di dalam struktur For/Next sebelah dalam (baris 54). Struktur For/Next sebelah dalam beriterasi melalui empat skor pada baris tertentu dan membandingkan setiap skor dengan skorBawah. Jika skor lebih rendah dari skorBawah, maka skorBawah ditugaskan pada skor tersebut. Struktur For/Next sebelah luar kemudian menginkremen indeks baris menjadi 1. Elemen-elemen baris kedua dibandingkan dengan variabel skorBawah. Struktur For/Next sebelah luar kemudian menginkremen indeks baris menjadi 2. Elemen-elemen baris ketiga dibandingkan dengan variabel skorBawah. Ketika eksekusi terhadap struktur bersarang selesai (baris 62), skorBawah memuat nilai terkecil di dalam array dua dimensi. Prosedur Maksimum berperilaku sama seperti prosedur Minimum.



Gambar 6.13 Keluaran program pada kode 6.15


Prosedur Rerata mengambil satu argumen, sebuah array satu dimensi yang memuat semua skor untuk mahasiswa tertentu. Rerata dipanggil (baris 36) dengan argumen arraySkor(i), yang merupakan baris i dari array jagged dua dimensi skor. Sebagai contoh, argumen skor(1) merepresentasikan empat skor mahasiswa 1. Ingat bahwa array jagged dua dimensi adalah sebuah array dengan setiap elemen merupakan array satu dimensi. Prosedur Rerata menghitung jumlah elemen array, membagi total dengan jumlah hasil ujian (yang didapatkan menggunakan properti Length) dan kemudian menghasilkan nilai balik bertipe Double (baris 89).


Daftar Parameter Panjang Tak Tentu
Adalah memungkinkan untuk menciptakan prosedur yang meneriman sejumlah tak-tentu argumen, menggunakan katakunci ParamArray. Program pada kode 6.16 prosedur SembarangJumlah-Argumen sebanyak tiga kali, melewatkan pelbagai jumlah nilai setiap kali pemanggilan. Nilai-nilai yang dilewatkan kepada prosedur SembarangJumlahArgumen disimpan di dalam array satu dimensi Integer, array1, yang dideklarasikan menggunakan ParamArray.

Prosedur SembarangJumlahArgumen pada baris 7-9, melewatkan sejumlah tak tentu argumen pada setiap pemanggilan. Prosedur ini didefinisikan pada baris 14-34 dan menerapkan katakunci ParamArray di dalam array1 pada baris 14. Struktur If pada baris 20-32 menentukan apakah banyak argumen yang dilewatkan kepada prosedur nol (tidak ada argumen) atau tidak. Jika tidak, baris 24-31 akan menampilkan setiap elemen array1 dan penjumlahannya.

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
' Kode 6.16: UjiParamArray.vb
' Menggunakan ParamArray untuk menciptakan daftar parameter panjang tak tentu.

Module modUjiParamArray

    Sub Main()
        SembarangJumlahArgumen()
        SembarangJumlahArgumen(2, 3)
        SembarangJumlahArgumen(7, 8, 9, 10, 11, 12)

    End Sub ' Main

    ' menerima sembarang jumlah argumen di dalam array
    Sub SembarangJumlahArgumen(ByVal ParamArray array1 _
        As Integer())

        Dim i, total As Integer
        total = 0

        If array1.Length = 0 Then
            Console.WriteLine("Prosedur SembarangJumlahArgumen" & _
            " menerima 0 argumen.")
        Else
            Console.Write("Total dari ")

            For i = 0 To array1.GetUpperBound(0)
                Console.Write(array1(i) & " ")
                total += array1(i)
            Next

            Console.WriteLine("adalah {0}.", total)
        End If

    End Sub ' SembarangJumlahArgumen

End Module ' modUjiParamArray
Prosedur SembarangJumlahArgumen menerima 0 argumen.
Total dari 2 3 adalah 5.
Total dari 7 8 9 10 11 12 adalah 57.


Latihan
1.       Modifikasi kode 6.11 dan 6.12 agar menggunakan prosedur PencarianLinier rekursif. Prosedur ini harus menerima sebuah array integer, sebuah pencarian kunci, indeks awal, dan indeks akhir sebagai argumen. Jika kunci ditemukan, maka indeks array dijadikan nilai balik; sebaliknya, dihasilkan -1.

2.       Modifikasi kode 6.13 agar menggunakan prosedur PencarianBiner rekursif. Prosedur ini harus menerima sebuah array integer, sebuah pencarian kunci, indeks awal, dan indeks akhir sebagai argumen. Jika kunci ditemukan, maka indeks array dijadikan nilai balik; sebaliknya, dihasilkan -1.


No comments:

Post a Comment