Tuesday, December 13, 2016

Bab 6. Dasar Pemrograman Visual C#



Pemrosesan Data



6.1 Pengantar
Bab ini akan menyajikan beberapa topik beragam. Setelah Anda mempelajari dasar-dasar pemrograman menggunakan Visual C#, Anda dapat menggunakan topik-topik yang disajikan pada bab ini untuk melakukan operasi-operasi yang lebih rumit. Pertama, Anda akan mempelajari sejumlah teknik pemrosesan string dan karakter yang berguna pada aplikasi-aplikasi yang secara ekstensif bekerja dengan teks. Kemudian, Anda akan mempelajari struktur, yang dapat Anda pakai untuk mengenkapsulasi beberapa variabel ke dalam satu item. Setelah itu, Anda akan mempelajari tipe enumerasi, yang merupakan tipe data yang bisa Anda ciptakan, yang memuat nilai-nilai spesifik. Terakhir, Anda akan mempelajari kontrol ImageList, yang merupakan sebuah struktrur data untuk menyimpan dan membaca citra-citra.


6.2 Pemrosesan Karakter dan String
KONSEP: Sejumlah pekerjaan pemrograman mensyaratkan bahwa Anda perlu memanipulasi string pada level detil. C# dan .NET Framework menyediakan perangkat-perangkat yang dapat Anda pakai untuk memanipulasi karakter-karakter secara individual dan sejumlah karakter di dalam string.


Kadangkala data yang dipakai di dalam suatu program memiliki bentuk teks. Pengolah kata, program pesan teks, aplikasi e-mail, browser Web, dan pemeriksa ejaan merupakan beberapa contoh program yang bekerja secara ekstensif dengan teks. Bab-bab sebelumnya pada buku ini telah mendemonstrasikan sejumlah teknik pemrosesan teks, seperti membandingkan string dan mengkonversi string menjadi tipe data lain. Kadangkala, Anda memerlukan operasi pada string dengan level yang lebih detil. Beberapa operasi mengharuskan Anda untuk mengakses dan memanipulasi karakter di dalam suatu string.


Sebagai contoh, Anda bisa saja menggunakan program atau situs Web yang mengharuskan Anda untuk membuat password yang memenuhi persyaratan tertentu. Beberapa sistem mengharuskan password untuk memiliki panjang minimum dan memuat sedikitnya satu huruf besar, sedikitnya satu huruf kecil, dan sedikitnya satu dijit numerik. Persyaratan ini dimaksudkan untuk mencegah kata-kata biasa digunakan sebagai password sehingga membuat password lebih aman. Ketika sebuah password baru diciptakan, sistem perlu memeriksa setiap karakter di dalam password untuk menentukan apakah ia memenuhi persyaratan atau tidak. Pada bagian selanjutnya, Anda akan melihat sebuah contoh algoritma yang melakukan operasi ini. Anda akan mempelajari tipe data char dan proses pembacaan karakter di dalam suatu string.


Tipe Data char
Sejauh ini, Anda telah menggunakan tipe data string untuk menyimpan teks. C# juga menyediakan tipe data char, yang dipakai untuk menyimpan karakter. Sebuah variabel dengan tipe char hanya dapat memuat satu karakter pada suatu waktu. Berikut adalah sebuah contoh bagaimana Anda mendeklarasikan sebuah variabel char:

char huruf;


Statemen ini mendeklarasikan sebuah variabel dengan nama huruf, yang dapat menyimpan satu karakter. Pada C#, literal karakter diapit dengan tanda kutip tunggal. Berikut adalah sebuah contoh yang menunjukkan bagaimana Anda menugaskan sebuah karakter kepada variabel huruf:

huruf = 'g';


Statemen ini menugaskan karakter ‘g’ kepada variabel huruf. Karena variabel char hanya dapat memuat satu karakter, ia tidak kompatibel dengan string. Sebagai contoh, Anda tidak dapat menugaskan sebuah string kepada suatu variabel char, bahkan jika string hanya memuat satu karakter. Statemen berikut, misalnya, tidak akan bisa dikompilasi karena ia mencoba menugaskan sebuah literal string kepada sebuah variabel char:

huruf = "g"; // ERROR! Tidak dapat menugaskan sebuah string kepada suatu variabel char


Adalah penting bahwa Anda tidak perlu bingung dalam membedakan literal karakter, yang diapit oleh tanda kutip tunggal, dengan literal string, yang diapit oleh tanda kutip ganda. Ketika Anda perlu mengkonversi suatu variabel char menjadi string, Anda dapat memanggil metode ToString. Sebagai contoh, statemen berikut menampilkan nilai dari variabel huruf di dalam suatu kotak pesan:

MessageBox.Show(huruf.ToString());

Statemen berikut menunjukkan contoh lain. Asumsikan bahwa huruf adalah sebuah variabel char dan labelKeluaran merupakan nama dari suatu kontrol Label:

labelKeluaran.Text = huruf.ToString();


Membaca Karakter Di Dalam Suatu String
C# dapat dipakai untuk mengakses karakter-karakter secara individual di dalam suatu string menggunakan notasi pengindeksan. Ini dapat dimungkinkan dengan memandang string sebagai suatu array karakter. Anda dapat menggunakan indeks 0 untuk mengakses karakter pertama, indeks 1 untuk mengakses karakter kedua, dan seterusnya. Indeks dari karakter terakhir adalah panjang string dikurangi dengan 1. Kode berikut menunjukkan salah satu contohnya.

1
2
3
4
5
6
7
8
9
//Mendeklarasikan sebuah string dan sebuah char
string nama = "Kristof";
char huruf;

//Membaca karakter pertama (pada posisi 0)
huruf = nama[0];

//Menampilkan karakter
MessageBox.Show(huruf.ToString());


Pada kode ini, baris 2 mendeklarasikan sebuah variabel string dengan nama nama, yang diinisialisasi dengan string “Kristof”. Baris 3 mendeklarasikan sebuah variabel char dengan nama huruf. Baris 6 membaca karakter pada posisi 0 di dalam nama (karakter pertama di dalam string) dan menugaskannya kepada variabel huruf. Baris 9 menampilkan nilai dari variabel huruf di dalam suatu kotak pesan. Jika kode ini dieksekusi, sebuah kotak pesan akan ditampilkan yang menunjukkan karakter K.

Kode berikut menunjukkan bagaiman sebuah loop dapat dipakai untuk menjejak karakter-karakter di dalam suatu string. Perhatikan bahwa di dalam loop for, variabel indeks memiliki nilai yang diawali dari 0 dan diinkremen pada tiap iterasi loop, dan loop akan beriterasi sepanjang nilai indeks kurang dari nama.Lenght. Jika kode ini dieksekusi, serangkaian kotak pesan akan ditampilkan yang menampilkan karakter K, r, i, s, t, o, dan f.

1
2
3
4
5
6
7
8
9
10
//Mendeklarasikan sebuah string dan sebuah char
string nama = "Kristof";
char huruf;

//Menampilkan karakter-karakter di dalam string
for (int indeks = 0; indeks < nama.Length; indeks++)
{
   huruf = nama[indeks];
   MessageBox.Show(huruf.ToString());
}


Ingat bahwa indeks atau subskript menyediakan akses read-only pada karakter-karakter di dalam suatu string. Anda tidak dapat menggunakan sebuah indeks untuk mengubah nilai karakter. Sebagai contoh, kode berikut tidak akan bisa dikompilasi karena statemen kedua mencoba menggunakan sebuah ekspresi indeks untuk mengubah nilai dari karakter pertama di dalam variabel nama:

string nama = "Kristof";
nama[0] = 'C';       // ERROR!

Anda dapat menggunakan loop foreach untuk membaca karakter-karakter individual di dalam sebuah string. Kode berikut menunjukkan suatu contoh. Jika kode ini dieksekusi, serangkaian kotak pesan akan ditampilkan yang menunjukkan karakter-karakter K, r, i, s, t, o, dan f.

1
2
3
4
5
6
7
8
9
//Mendeklarasikan sebuah string dan sebuah char
string nama = "Kristof";
char huruf;

//Menampilkan karakter-karakter di dalam string
foreach (char huruf in nama)
{
   MessageBox.Show(huruf.ToString());
}


Penguji Karakter dan Metode-Metode Konversi
Tipe data char menyediakan sejumlah metode untuk menguji nilai dari sebuah karakter. Sejumlah metode dicantumkan pada Tabel 6.1. Perhatikan bahwa setiap metode yang dicantumkan pada tabel menghasilkan suatu nilai Boolean true atau false.

Contoh 6.1 Sejumlah metode penguji karakter
Metode
Deskripsi
char.IsDigit(ch)











char.IsDigit(str , indeks)













char.IsLetter(ch)










char.IsLetter(str , indeks )











char.IsLetterOrDigit(ch)













char.IsLetterOrDigit
(str , indeks)












char.IsLower(ch)










char.IsLower(str , indeks)











char.IsPunctuation(ch)











char.IsPunctuation
(str , indeks)












char.IsUpper(ch)









char.IsUpper(str , indeks)













char.IsWhiteSpace(ch)












char.IsWhiteSpace
(str , indeks)

Argumen ch adalah sebuah karakter. Metode ini menghasilkan true jika ch adalah sebuah dijit (0 sampai 9) atau false jika selain itu.
Contoh:

string str = "12345";
if (char.IsDigit(str[0]))
{
   MessageBox.Show("Karakter 0 adalah " +
      "sebuah dijit.");
}

Argumen str adalah sebuah string, dan indeks adalah posisi dari sebuah karakter di dalam str. Metode ini menghasilkan true jika karakter adalah sebuah dijit (0 sampai 9) atau false jika selain itu.
Contoh:

string str = "12345";
if (char.IsDigit(str, 0))
{
   MessageBox.Show("Karakter 0 adalah “ +
      "sebuah dijit.");
}

Argumen ch adalah sebuah karakter. Metode ini menghasilkan true jika ch adalah sebuah huruf alfabetik atau false jika sebaliknya.
Contoh:

string str = "Hallo Dunia";
if (char.IsLetter(str[0]))
{
   MessageBox.Show("Karakter 0 adalah " +
      "sebuah huruf.");
}

Argumen str adalah sebuah string, dan indeks adalah posisi dari sebuah karakter di dalam str. Metode menghasilkan true jika karakter adalah suatu huruf alfabetik atau false jika tidak.
Contoh:
string str = "Hallo Dunia";
if (char.IsLetter(str, 0))
{
   MessageBox.Show("Karakter 0 adalah " +
      "a letter.");
}

Argumen ch adalah sebuah karakter. Metode ini menghasilkan true jika ch adalah sebuah huruf alfabetik atau sebuah dijit numerik. Selain itu, metode akan menghasilkan false.
Contoh:
string str = "Hallo Dunia";
if (char.IsLetterOrDigit(str[0]))
{
   MessageBox.Show("Karakter 0 adalah " +
      "sebuah huruf atau " +
      "sebuah dijit.");
}

Argumen str di dalam sebuah string, dan indeks adalah posisi dari suatu karakter di dalam str. Metode menghasilkan true jika karakter adalah sebuah huruf alfabetik atau sebuah dijit numerik. Selain itu, metode menghasilkan false.
Contoh:
string str = "12345";
if (char.IsLetterOrDigit(str, 0))
{
   MessageBox.Show("Karakter 0 adalah " +
      "sebuah huruf atau " +
      "sebuah dijit.");
}

Argumen ch adalah sebuah karakter. Metode menghasilkan true jika ch adalah sebuah huruf kecil atau false jika tidak.
Contoh:
string str = "hallo dunia";
if (char.IsLower(str[0]))
{
   MessageBox.Show("Karakter 0 adalah" +
      "sebuah huruf kecil.");
}

Argumen str di dalam sebuah string, dan indeks adalah posisi dari suatu karakter di dalam str. Metode menghasilkan true jika karakter adalah sebuah huruf kecil. Jika tidak, metode menghasilkan false.
Contoh:
string str = “hallo dunia”;
if (char.IsLower(str, 0))
{
   MessageBox.Show("Karakter 0 adalah " +
      "sebuah huruf kecil.");
}

Argumen ch adalah sebuah karakter. Metode menghasilkan true jika ch dikategorikan sebagai tanda baca. Jika tidak, metode menghasilkan false.
Contoh:

string str = "Hallo!";
if (char.IsPunctuation(str[5]))
{
    MessageBox.Show("Karakter 7 adalah sebuah " +
        "tanda baca.");
}

Argumen str adalah sebuah string, dan indeks adalah posisi dari sebuah karakter di dalam str. Metode ini menghasilkan true jika karakter dikategorikan sebagai tanda baca. Jika tidak, metode menghasilkan false.
Contoh:

string str = "Hallo!";
if (char.IsPunctuation(str, 5))
{
    MessageBox.Show("Karakter 5 adalah " +
       "tanda baca.");
}

Argumen ch adalah sebuah karakter. Metode menghasilkan true jika ch adalah sebuah huruf besar atau false jika tidak.
Contoh:
string str = "Hallo Dunia";
if (char.IsUpper(str[0]))
{
   MessageBox.Show("Karakter 0 adalah" +
      "sebuah huruf besar.");
}

Argumen str di dalam sebuah string, dan indeks adalah posisi dari suatu karakter di dalam str. Metode menghasilkan true jika karakter adalah sebuah huruf besar. Jika tidak, metode menghasilkan false.
Contoh:
string str = “Hallo Dunia”;
if (char.IsUpper(str, 0))
{
   MessageBox.Show("Karakter 0 adalah " +
      "sebuah huruf besar.");
}

Argumen ch adalah sebuah karakter. Metode menghasilkan true jika ch adalah sebuah karakter spasi-putih atau false jika tidak. (Karakter spasi-putih adalah spasi, tab, linefeed, carriage-return, formfeed, vertical-tab, dan garis-baru).
Contoh:
string str = " ";
if (char.IsWhiteSpace(str[0]))
{
    MessageBox.Show("Karakter 0 adalah " +
      "spasi-putih.");
}

Argumen str di dalam sebuah string, dan indeks adalah posisi dari suatu karakter di dalam str. Metode menghasilkan true jika ch adalah sebuah karakter spasi-putih atau false jika tidak. (Karakter spasi-putih adalah spasi, tab, linefeed, carriage-return, formfeed, vertical-tab, dan garis-baru).
Contoh:
string str = " ";
if (char.IsWhiteSpace(str, 0))
{
    MessageBox.Show("Karakter 0 adalah " +
        "spasi-putih.");
}


Pada Tutorial 6.1, Anda menggunakan beberapa metode pengujian karakter pada suatu aplikasi yang memvalidasi password.

Tutorial 6.1: Menciptakan Aplikasi Validasi Password
Banyak sistem terproteksi-password dapat dipakai user untuk menciptakan passwordnya sendiri. Ketika user menciptakan sebuah password, sistem akan memeriksa password untuk menenukan apakah ia memenuhi persyaratan minimum. Jika tidak, sistem akan menolak password dan mengharuskan user untuk menciptakan password yang lebih aman.

Pada tutorial ini, Anda akan menciptakan sebuah aplikasi Validasi Password. Form aplikasi, yang telah diciptakan bagi Anda, ditampilkan pada Gambar 6.1. Ketika aplikasi dijalankan, user akan memasukkan sebuah password dan kemudian mengklik tombol Periksa Password. Aplikasi akan memeriksa password untuk memastikan ia memenuhi persyaratan berikut:
·         Password harus sedikitnya memiliki panjang delapan karakter.
·         Password harus memuat sedikitnya satu karakter huruf-besar.
·         Password harus memuat sedikitnya satu karakter huruf-kecil.
·         Password harus memuat sedikitnya satu dijit numerik.


Gambar 6.1 Form aplikasi Validasi Password


Langkah 1: Awali Visual Studio (atau Visual Studio Express). Buka projek dengan nama Validasi Password.

Langkah 2: Buka kode dari form Form1 pada editor kode. Ketikkan komentar dan kode untuk metode JumlahHurufBesar, yang ditunjukkan pada baris 20-37 pada Program 6.1. Tujuan dari metode JumlahHurufBesar adalah menerima sebuah string sebagai argumennya dan menghasilkan jumlah huruf besar yang dimuat di dalam string.

Langkah 3: Ketikkan komentar dan kode untuk metode JumlahHurufKecil, yang ditunjukkan pada baris 39-56 pada Program 6.1. Tujuan dari metode JumlahHurufKecil adalah menerima sebuah string sebagai argumennya dan menghasilkan jumlah huruf kecil yang dimuat di dalam string.

Langkah 4: Ketikkan komentar dan kode untuk metode JumlahDijit, yang ditunjukkan pada baris 58-75 pada Program 6.1. Tujuan dari metode JumlahDijit adalah menerima sebuah string sebagai argumennya dan menghasilkan jumlah dijit numerik yang dimuat di dalam string.

Langkah 5: Selanjutnya, Anda menciptakan event-event handler Click untuk kontrol-kontrol Button. Kembali ke Designer dan klik ganda pada kontrol tombolPeriksa. Ini akan membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolPeriksa_Click. Sempurnakan event handler dengan mengetikkan kode yang ditunjukkan pada baris 79-96 pada Program 6.1. Amati kode ini:

Baris 79-82: Statemen pada baris 79 mendeklarasikan sebuah konstanta untuk panjang password minimum. Baris 82 mendeklarasikan variabel password dan menginisialisasinya dengan nilai yang dimasukkan oleh user.

Baris 85: Statemen if-else yang diawali pada baris 85 mengevaluasi sebuah ekspresi Boolean kompon. Statemen itu dinterpretasikan seperti ini:

Jika panjang password sedikitnya 8 dan
   jumlah huruf besar di dalam password sedikitnya 1 dan
   jumlah huruf kecil di dalam password sedikitnya 1 dan
   jumlah dijit numerik di dalam password sedikitnya 1,
Maka password valid
Jika tidak
Maka password tidak valid

Langkah 6: Kembali ke 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 mengetikkan kode yang ditunjukkan pada baris 101-102 pada Program 6.1.

Langkah 7: Simpan projek dan jalankan aplikasi. Ketika aplikasi dijalankan, uji sejumlah password untuk mengkonfirmasi apakah aplikasi telah bekerja dengan benar. Ketika selesai, klik tombol Keluar untuk mengakhiri aplikasi.

Program 6.1 Kode utuh untuk form Form1 pada aplikasi Validasi Password
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
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 Validasi_Password
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Metode JumlahHurufBesar menerima sebuah argumen string
        //dan menghasilkan banyak huruf besar yang dimuatnya
        private int JumlahHurufBesar(string str)
        {
            int hurufBesar = 0; //jumlah huruf besar
       
            //Menghitung karakter huruf-besar di dalam str
            foreach (char ch in str)
            {
                if (char.IsUpper(ch))
                {
                    hurufBesar++;
                }
            }

            //Menghasilkan banyak huruf besar
            return hurufBesar;
        }

        //Metode JumlahHurufKecil menerima sebuah argumen string
        //dan menghasilkan banyak huruf kecil yang dimuatnya
        private int JumlahHurufKecil(string str)
        {
            int hurufKecil = 0; //jumlah huruf kecil

            //Menghitung karakter huruf-kecil di dalam str
            foreach (char ch in str)
            {
                if (char.IsLower(ch))
                {
                    hurufKecil++;
                }
            }

            //Menghasilkan banyak huruf kecil
            return hurufKecil;
        }

        //Metode JumlahDijit menerima sebuah argumen string
        //dan menghasilkan banyak dijit yang dimuatnya
        private int JumlahDijit(string str)
        {
            int dijit = 0; //jumlah dijit numerik

            //Menghitung dijit di dalam str
            foreach (char ch in str)
            {
                if (char.IsDigit(ch))
                {
                    dijit++;
                }
            }

            //Menghasilkan banyak dijit numerik
            return dijit;
        }

        private void tombolPeriksa_Click(object sender, EventArgs e)
        {
            const int PANJANG_MIN = 8; //Panjang minimum password

            //Membaca password dari TextBox
            string password = teksPassword.Text;

             //Memvalidasi password
            if (password.Length >= PANJANG_MIN &&
                JumlahHurufBesar(password) >= 1 &&
                JumlahHurufKecil(password) >= 1 &&
                JumlahDijit(password) >= 1)
            {
                MessageBox.Show("Password valid.");
            }
            else
            {
                MessageBox.Show("Password tidak memenuhi " +
                    "persyaratan.");
            }
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}

Konversi Jenis Huruf
Tipe data char juga menyediakan metode ToLower dan ToUpper yang dicantumkan pada Tabel 6.2 untuk mengkonversi jenis huruf (huruf besar atau huruf kecil) dari sebuah karakter. Setiap metode menerima sebuah argumen char dan menghasilkan suatu nilai char.

Tabel 6.2 Metode-Metode Konversi Jenis Huruf Karakter
Metode
Deskripsi
char.ToLower(ch)



char.ToUpper(ch)
Argumen ch adalah sebuah karakter. Metode menghasilkan huruf kecil ekivalen dari ch.

Argumen ch adalah sebuah karakter. Metode menghasilkan huruf besar ekivalen dari ch.

Jika argumen dari metode ToLower adalah sebuah karakter huruf-besar, maka metode menghasilkan huruf kecil ekivalen. Sebagai contoh, lihat pada kode berikut. Statemen pada baris 2 menugaskan karakter ‘a’ kepada variabel huruf:

1
2
string str = "ABC";
char huruf = char.ToLower(str[0]);

Jika argumen berupa huruf kecil, maka metode ToLower tidak mengubah apapun.

Jika argumen dari metode ToUpper adalah sebuah karakter huruf-kecil, maka metode menghasilkan huruf besar ekivalen. Sebagai contoh, lihat pada kode berikut. Statemen pada baris 2 menugaskan karakter ‘A’ kepada variabel huruf:

1
2
string str = "abc";
char huruf = char.ToLower(str[0]);

Jika argumen berupa huruf besar, maka metode ToUpper tidak mengubah apapun.

Pencarian Substring
Beberapa pekerjaan mengharuskan Anda untuk melakukan suatu pencarian string karakter tertentu di dalam sebuah string. Sebuah string yang ada di dalam string lain disebut dengan substring. Objek dengan tipe data string memiliki sejumlah metode yang dapat Anda pakai untuk melakukan pencarian substring. Tabel 6.3 mencantumkan metode Contains, StartsWith, dan EndsWith. Setiap metode di dalam Tabel 6.3 menghasilkan sebuah nilai Boolean yang mengindikasikan apakah substring ditemukan atau tidak.

Tabel 6.3 Metode-Metode Pencarian Substring
Metode
Deskripsi
stringVar.Contains(substring)














stringVar.Contains(ch)













stringVar.StartsWith(substring)















stringVar.EndsWith( substring )

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string. Metode menghasilkan true jika stringVar memuat string substring atau false jika tidak.
Contoh:

//Kode beriktu menampilkan
// "es ditemukan."
string str = "es krim coklat";
if (str.Contains("es"))
{
   MessageBox.Show("es ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen ch adalah sebuah karakter. Metode menghasilkan true jika stringVar memuat karakter ch atau false jika tidak.
Contoh:
//Kode berikut menampilkan
// "b ditemukan."
string str = "abcd";
if (str.Contains('b'))
{
    MessageBox.Show("b ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string. Metode menghasilkan true jika stringVar diawali dengan string substring atau false jika tidak.
Contoh:
//Kode berikut menampilkan
//"String diawali dengan es."
string str = "es krim coklat";
if (str.StartsWith("es"))
{
   MessageBox.Show("String diawali dengan " +
      "es.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string. Metode menghasilkan true jika stringVar diakhiri dengan string substring atau false jika tidak.
Contoh:
//Kode berikut menampilkan
//"String diakhiri dengan coklat."
string str = "es krim coklat";
if (str.StartsWith("coklat"))
{
   MessageBox.Show("String diawali dengan " +
      "coklat.");
}

Metode-metode yang ditunjukkan pada Tabel 6.3 dapat dipakai untuk mengetahui apakah substring tertentu ditemukan di dalam sebuah string atau tidak. Kadangkala Anda juga ingin mengetahui posisi dari substring. Ketika hal ini diinginkan, Anda dapat menggunakan metode IndexOf atau LastIndexOf yang ditunjukkan pada Tabel 6.4. Perhatikan bahwa setiap metode pada Tabel 6.4 menghasilkan sebuah int.

Tabel 6.4 Metode-Metode untuk Membaca Posisi Karakter atau Substring
Metode
Deskripsi
stringVar.IndexOf(substring)




















stringVar.IndexOf(substring,
  awal)






















stringVar.IndexOf(substring,
   awal, hitung)






















stringVar.LastIndexOf(substring)




















stringVar.LastIndexOf(   
  substring, awal)

















stringVar.LastIndexOf(  
  substring, awal, hitung)


















stringVar.LastIndexOf(ch)
















stringVar.LastIndexOf(ch, awal)

















stringVar.LastIndexOf(ch, awal,
  hitung)




stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string. Jika substring ditemukan di dalam stringVar, maka metode menghasilkan posisi integer dari kemunculan pertama dari substring. Jika substring tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan "3"
string str = "es krim coklat";
int posisi = str.IndexOf("krim");
if (posisi != −1)
{
    MessageBox.Show(posisi.ToString());
}
else
{
    MessageBox.Show("krim tidak ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string dan argumen awal adalah sebuah integer. Metode ini melakukan pencarian substring di dalam stringVar, diawali dari posisi yang ditetapkan oleh awal dan berlanjut sampai akhir dari stringVar. Jika substring ditemukan, maka metode akan menghasilkan integer posisi dari kemunculan pertamanya. Jika tidak ditemukan, metode menghasilkan -1.
Contoh:

//Kode berikut menampilkan “7”
string str = “dimana-mana”;
int posisi = str.IndexOf(“ma”, 4);
if (posisi != −1)
{
   MessageBox.Show(posisi.ToString());
}
else
{
   MessageBox.Show(“ma tidak ditemukan.”);
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string, argumen awal adalah sebuah integer, dan argumen hitung juga sebuah integer. Metode ini melakukan pencarian substring di dalam stringVar, diawali dari posisi yang ditetapkan oleh awal dan berlanjut sampai sebanyak hitung karakter. Jika substring ditemukan, maka metode akan menghasilkan integer posisi dari kemunculan pertamanya. Jika tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan "6"
string str = "xx oo xx oo xx";
int posisi = str.IndexOf("xx", 3, 8);
if (posisi!= −1)
{
    MessageBox.Show(posisi.ToString());
}
else
{
    MessageBox.Show("xx tidak ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string. Jika substring ditemukan di dalam stringVar, maka metode menghasilkan posisi integer dari kemunculan terakhir dari substring. Jika substring tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan “11”.
string str = “biru hijau biru”;
int posisi = str.LastIndexOf(“biru”);
if (posisi!= −1)
{
   MessageBox.Show(posisi.ToString());
}
else
{
   MessageBox.Show(“biru tidak ditemukan.”);
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string dan argumen awal adalah sebuah integer. Metode ini melakukan pencarian substring di dalam stringVar, diawali dari posisi yang ditetapkan oleh awal dan berlanjut mundur sampai awal dari stringVar. Jika substring ditemukan, maka metode akan menghasilkan integer posisi dari kemunculan pertamanya. Jika tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan "6".
string str = "xx oo xx oo xx";
int posisi = str.LastIndexOf("xx", 10);
if (posisi != −1)
{
   MessageBox.Show(posisi.ToString());
}
else
{
   MessageBox.Show("xx tidak ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen substring juga merupakan suatu string, argumen awal adalah sebuah integer, dan argumen hitung juga sebuah integer. Metode ini melakukan pencarian substring di dalam stringVar, diawali dari posisi yang ditetapkan oleh awal dan berlanjut mundur ke awal stringVar sebanyak hitung karakter. Jika substring ditemukan, maka metode akan menghasilkan integer posisi dari kemunculan pertamanya. Jika tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan "6".
string str = "oo xx oo xx oo";
int posisi = str.LastIndexOf("oo", 10, 8);
if (posisi != −1)
{
    MessageBox.Show(posisi.ToString());
}
else
{
    MessageBox.Show("oo tidak ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen ch adalah sebuah karakter. Jika ch ditemukan di dalam stringVar, maka metode menghasilkan posisi integer dari kemunculan terakhir dari ch. Jika ch tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan "10".
string str = "es krim coklat";
int posisi = str.LastIndexOf('k');
if (posisi != −1)
{
   MessageBox.Show(posisi.ToString());
}
else
{
   MessageBox.Show("k tidak ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen ch adalah sebuah karakter dan argumen awal adalah sebuah integer. Metode ini melakukan pencarian ch di dalam stringVar, diawali dari posisi yang ditetapkan oleh awal dan berlanjut mundur sampai awal dari stringVar. Jika ch ditemukan, maka metode akan menghasilkan integer posisi dari kemunculan pertamanya. Jika tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan "3".
string str = "es krim coklat";
int posisi = str.LastIndexOf('k', 9);
if (posisi != −1)
{
    MessageBox.Show(posisi.ToString());
}
else
{
    MessageBox.Show("k tidak ditemukan.");
}

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen ch adalah sebuah karakter, argumen awal adalah sebuah integer, dan argumen hitung juga sebuah integer. Metode ini melakukan pencarian ch di dalam stringVar, diawali dari posisi yang ditetapkan oleh awal dan berlanjut mundur sebanyak hitung karakter sampai awal dari stringVar. Jika ch ditemukan, maka metode akan menghasilkan integer posisi dari kemunculan pertamanya. Jika tidak ditemukan, metode menghasilkan -1.
Contoh:
//Kode berikut menampilkan "3".
string str = "es krim coklat";
int posisi = str.LastIndexOf('k', 9, 8);
if (posisi != −1)
{
    MessageBox.Show(posisi.ToString());
}
else
{
    MessageBox.Show("k tidak ditemukan.");
}


Kadangkala Anda perlu membaca sejumlah karakter tertentu dari sebuah string. Sebagai contoh, dimisalkan bahwa sebuah string memuat nomor telepon, seperti “(0622)6386-4834” dan Anda tertarik untuk mendapatkan kode area. Anda memerlukan suatu cara untuk membaca karakter-karakter pada posisi 1 sampai 4. Anda dapat menggunakan metode Substring, seperti ditunjukkan pada Tabel 6.5. Perhatikan bahwa metode Substring menghasilkan sebuah string.

Tabel 6.5 Metode Substring
Metode
Deskripsi
stringVar.Substring(awal)









stringVar.Substring(awal, hitung)


stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen awal adalah sebuah integer yang menetapkan sebuah posisi di dalam stringVar. Metode menghasilkan sebuah string yang memuat karakter-karakter yang diawali pada awal, berlanjut ke akhir dari stringVar.
Contoh:
//Kode berikut menampilkan "datang".
string str = "selamat datang";
MessageBox.Show(str.Substring(8));

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen awal adalah sebuah integer yang menetapkan sebuah posisi di dalam stringVar dan hitung juga adalah sebuah integer yang menentukan jumlah karakter. Metode menghasilkan sebuah string yang memuat karakter-karakter yang diawali pada awal, berlanjut sebanyak hitung karakter.
Contoh:
//Kode berikut menampilkan "Serius".
string str = "Serius Santai";
MessageBox.Show(str.Substring(0, 6));

Metode-Metode untuk Memodifikasi String
Tabel 6.6 menjelaskan beberapa metode yang dimiliki oleh objek-objek string untuk memodifikasi isi dari sebuah string dengan cara-cara berikut:
·            Metode Insert menyisipkan sebuah string ke dalam string lain.
·            Metode Remove menghapus karakter-karakter tertentu dari sebuah string.
·            Metode ToLower mengkonversi sebuah string menjadi semua karakter huruf kecil.
·            Metode ToUpper mengkonversi sebuah string menjadi semua karakter huruf besar.
·            Metode Trim menghapus semua spasi di depan dan di belakang dari sebuah string.
·            Metode TrimStart menghapus semua spasi yang ada di depan dari sebuah string.
·            Metode TrimEnd menghapus semua spasi yang ada di depan dari sebuah string.

Adalah penting untuk mengingat bahwa metode-metode yang ditunjukkan pada Tabel 6.6 sebenarnya tidak memodifikasi objek string pemanggil. Metode-metode itu menghasilkan salinan termodifikasi dari objek string pemanggil. Sebagai contoh, lihat pada kode berikut, yang mendemonstrasikan metode Remove:

1
2
3
4
string str1 = "matahari";
string str2 = str1.Remove(4);
MessageBox.Show(str1);
MessageBox.Show(str2);

Baris 1 mendeklarasikan sebuah variabel string dengan nama str1, yang diinisialisasi dengan string “matahari”. Baris 2 memanggil metode str1.Remove, yang melewatkan 4 sebagai argumen. Metode ini menghasilkan salinan dari str1 dengan semua karakter dari posisi 5 ke akhir string dihapus. Baris 3 menampilkan variabel str1, yaitu “matahari”, dan baris 4 menampilkan variabel str2, yaitu “mata”.

Tabel 6.6 Metode-Metode untuk Memodifikasi Sebuah String
Metode
Deskripsi
stringVar.Insert(awal, strItem)












stringVar.Remove(awal)












stringVar.Remove(awal, hitung)














stringVar.ToLower()










stringVar.ToUpper()








stringVar.Trim()










stringVar.TrimStart()








stringVar.TrimEnd()
stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen awal adalah sebuah integer yang menetapkan sebuah posisi di dalam stringVar, dan argumen strItem adalah sebuah string yang akan disisipkan. Metode ini menghasilkan sebuah string yang memuat salinan dari stringVar dengan strItem disisipkan ke dalamnya dimulai pada posisi yang ditetapkan oleh awal.
Contoh:
//Berikut menampilkan "Kota Pematang Siantar".
string str1 = "Kota Pematang";
string str2 = str1.Insert(13, " Siantar");
MessageBox.Show(str2);

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen awal adalah sebuah integer yang menetapkan sebuah posisi di dalam stringVar. Metode ini menghasilkan sebuah salinan stringVar dimana semua karakter dari posisi yang ditetapkan oleh awal sampai ke akhir akan dihapus.
Contoh:
//Berikut menampilkan "blue".
string str1 = "blueberry";
string str2 = str1.Remove(4);
MessageBox.Show(str2);

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Argumen awal adalah sebuah integer yang menetapkan sebuah posisi di dalam stringVar dan argumen hitung adalah sebuah integer yang menetapkan banyaknya karakter. Metode ini menghasilkan sebuah salinan stringVar dimana sebanyak hitung karakter dihapus, diawali dari posisi yang ditetapkan oleh awal.
Contoh:
//Berikut menampilkan “aku indonesia”.
string str1 = “aku cinta indonesia”;
string str2 = str1.Remove(4, 6);
MessageBox.Show(str2);

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Metode ini menghasilkan sebuah string yang memuat salinan dari stringVar yang dikonversi menjadi huruf kecil.
Contoh:
//Berikut menampilkan "abc".
string str1 = "ABC";
string str2 = str1.ToLower();
MessageBox.Show(str2);

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Metode ini menghasilkan sebuah string yang memuat salinan dari stringVar yang dikonversi menjadi huruf besar.
Contoh:
//Berikut menampilkan "ABC".
string str1 = "abc";
string str2 = str1.ToLower();
MessageBox.Show(str2);
stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Metode menghasilkan sebuah string yang memuat salinan dari stringVar dengan semua spasi depan dan belakang dihapus.
Contoh:
//Berikut menampilkan ">Hallo<".
string str1 = " Hallo ";
string str2 = str1.Trim();
MessageBox.Show(">" + str2 + "<");

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Metode menghasilkan sebuah string yang memuat salinan dari stringVar dengan semua spasi depan  dihapus.
Contoh:
//Berikut menampilkan ">Hallo<".
string str1 = " Hallo";
string str2 = str1.TrimStart();
MessageBox.Show(">" + str2 + "<");

stringVar adalah nama dari sebuah variabel string atau sebuah ekspresi string. Metode menghasilkan sebuah string yang memuat salinan dari stringVar dengan semua spasi belakang  dihapus.
Contoh:
//Berikut menampilkan ">Hallo<".
string str1 = "Hallo ";
string str2 = str1.TrimStart();
MessageBox.Show(">" + str2 + "<");


Pada Tutorial 6.2 dan 6.3, Anda menggunakan beberapa metode string yang telah didiskusikan.

Tutorial 6.2: Menciptakan Aplikasi Format Telepon
Nomor telepon pada kasus ini akan diformat dengan cara berikut:

(XXX)XXX-XXXX

Pada format, X merepresentasikan sebuah dijit. Tiga dijit yang ada di dalam kurung merupakan kode area. Tiga dijit yang mengikuti kode area adalah prefiks, dan empat dijit setelah tanda hubung adalah nomor langganan. Berikut adalah salah satu contohnya:

(021)346-4633

Meskipun kurung dan tanda-hubung membuat nomor lebih mudah dibaca, karakter-karakter itu tidak diperlukan pada pemrosesan oleh komputer. Pada sebuah sistem komputer, nomor telepon umumnya disimpan dalam serangkaian dijit tak terformat, seperti ditunjukkan di sini:

0213464633

Program yang memproses nomor-nomor telepon perlu mengekstrak nomor-nomor yang dimasukkan oleh user. Ini berarti bahwa tanda kurung dan tanda hubung harus dihilangkan sebelum menyimpan nomor tersebut di dalam sebuah file atau memprosesnya dengan cara tertentu. Selain itu, program semacam itu perlu memiliki kemampuan dalam memformat sebuah nomor sehingga ia memuat kurung dan tanda hubung sebelum menampilkannya di layar atau mencetaknya di kertas.

Pada tutorial ini, Anda menciptakan aplikasi Format Telepon. Form aplikasi, yang telah disediakan bagi Anda, ditampilkan pada Gambar 6.2a. Ketika aplikasi dijalankan, Anda akan dapat memasukkan sebuah string yang memuat 10 dijit ke dalam kontrol teksNomor dan mengklik tombol Format untuk melihat string itu diformat sebagai sebuah nomor telepon.

Gambar 6.2a Form aplikasi Format Telepon


Langkah 1: Awali Visual Studio (atau Visual Studio Express).

Langkah 2: Buka kode dari form Form1 pada editor kode. Ketikkan komentar dan kode untuk metode ApaNomorValid, yang ditunjukkan pada baris 20-50 pada Program 6.2. Metode ini menerima sebuah string sebagai argumennya dan menghasilkan true jika string memiliki panjang 10 karakter dan hanya memuat dijit-dijit. Jika tidak, metode akan menghasilkan false. Anda menggunakan metode ini untuk memastikan bahwa user telah memasukkan sebuah string dijit yang valid. Amati kode ini lebih dekat:
Baris 25: Statemen ini mendeklarasikan konstanta PANJANG_VALID, yang diinisialisasi dengan nilai 10, untuk merepresentasikan panjang dari sebuah string valid.

Baris 26: Statemen ini mendeklarasikan sebuah variabel bool dengan nama valid, yang diinisialisasi dengan nilai true. Variabel valid dipakai sebagai bendera untuk mengindikasikan apakah parameter str adalah suatu nilai valid atau tidak.

Baris 29: Statemen if ini menentukan apakah panjang dari parameter str valid atau tidak. Jika ya, program akan berlanjut pada baris 32. Jika tidak, program akan melompat ke klausa else pada baris 42, dan baris 45 menugaskan false kepada variabel valid.

Baris 32: Loop foreach ini menjejak setiap karakter di dalam parameter str. Jika statemen pada baris 36 menentukan bahwa sebuah karakter bukan sebuah dijit, maka statemen pada baris 38 akan menugaskan false kepada variabel valid.

Baris 49: Statemen ini menghasilkan nilai dari variabel valid.

Langkah 3: Ketikkan komentar dan kode untuk metode FormatTelepon, yang ditampilkan pada baris 52-64 pada Program 6.2. Metode ini menerima sebuah string sebagai argumennya, yang dilewatkan dengan referensi, dan menyisipkan tanda kurung dan tanda hubung pada lokasi-lokasi yang tepat sehingga ia ditampilkan dengan bentuk (XXX)XXX-XXXX. Amati kode ini lebih dekat:
Baris 54: Perhatikan bahwa katakunci ref dipakai di dalam deklarasi dari variabel parameter str.

Baris 57: Statemen ini memanggil metode Insert untuk menyisipkan “(“ pada posisi 0. Semua karakter di dalam string secara otomatis digeser ke kanan satu posisi untuk mengakomodasi karakter yang disisipkan.

Baris 60: Statemen ini memanggil metode Insert untuk menyisipkan “)” pada posisi 4, yang menggeser karakter-karakter yang sebelumnya ditampilkan mulai posisi 4 ke kanan satu spasi.

Baris 63: Statemen ini memanggil metode Insert untuk menyisipkan “-“ pada posisi 8, yang menggeser karakter-karakter yang sebelumnya ditampilkan mulai pada posisi 8 ke kanan satu posisi. Setelah statemen ini dieksekusi, string yang direferensi oleh str diformat sebagai (XXX)XXX-XXXX.

Langkah 4: Selanjutnya Anda menciptakan event-event handler Click untuk kontrol-kontrol Button. Kembali ke mode Designer dan klik ganda pada kontrol tombolFormat. Ini akan membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolFormat_Click. Sempurnakan event handler ini dengan mengetikkan kode yang ditunjukkan pada baris 62-68 pada Program 6.2. Amati kode ini lebih dekat:

Baris 69: Perhatikan bahwa ekspresi di sisi kanan dari operator = adalah teksNomor.Text.Trim(). Ekspresi ini memanggil metode Trim pada properti Text dari kontrol teksNomor. Metode ini menghasilkan salinan dari properti Text dari kontrol teksNomor dengan semua spasi di depan dan di belakang dihapus. Hasilnya ditugaskan kepada variabel masukan.

Baris 73: Statemen if ini memanggil metode ApaNomorValid, yang melewatkan variabel masukan sebagai argumen. Jika nilai dari variabel masukan adalah suatu nomor valid, maka metode menghasilkan true dan program berlanjut ke baris 75. Pada baris 75, metode FormatTelepon dipanggil, yang melewatkan masukan dengan referensi sebagai argumen, dan kemudian baris 76 menampilkan nilai dari variabel masukan pada suatu kotak pesan.

Jika nilai dari variabel masukan bukan merupakan nilai yang valid, maka metode ApaNomorValid akan menghasilkan false, dan program melompat ke klausa else pada baris 78. Kemudian, baris 81 menampilkan sebuah pesan error.

Langkah 5: 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 mengetikkan kode yang ditampilkan pada baris 87-88 pada Program 6.2.

Langkah 6: Simpan dan jalankan apliksi. Lakukan sejumlah pengujian untuk melihat apakah aplikasi telah tepat.

Program 6.2 Kode utuh untuk form Form1 pada aplikasi Format Telepon
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
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 Format_Telepon
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Metode ApaNomorValid menerima sebuah string dan
        //menghasilkan true jika ia memuat 10 dijit, atau
        //false jika tidak.
        private bool ApaNomorValid(string str)
        {
            const int PANJANG_VALID = 10; //Panjang dari sebuah string valid
            bool valid = true;           //Bendera untuk validitas kevalidan

            //Memeriksa panjang string
            if (str.Length == PANJANG_VALID)
            {
                //Memeriksa setiap karakter di dalam str
                foreach (char ch in str)
                {
                    //Jika karakter ini bukan dijit, maka
                    //string tidak valid
                    if (!char.IsDigit(ch))
                    {
                        valid = false;
                    }
                }
            }
            else
            {
                //Panjang tidak tepat
                valid = false;
            }

            //Menghasilkan status
            return valid;
        }

        //Metode FormatTelepon menerima sebuah argumen string
        //dengan referensi dan memformatnya sebagai nomor telepon
        private void FormatTelepon(ref string str)
        {
            //Pertama, sisipkan kurung kiri pada posisi 0
            str = str.Insert(0, "(");

            //Selanjutnya, sisipkan kurung kanan pada posisi 4
            str = str.Insert(4, ")");

            //Selanjutnya, sisipkan tanda-hubung pada posisi 8
            str = str.Insert(8, "-");
        }

        private void tombolFormat_Click(object sender, EventArgs e)
        {
            //Mendapatkan salinan terpotong dari masukan user
            string masukan = teksNomor.Text.Trim();

            //Jika masukan adalah nomor yang tepat, ia akan
            //diformat dan ditampilkan
            if (ApaNomorValid(masukan))
            {
                FormatTelepon(ref masukan);
                MessageBox.Show(masukan);
            }
            else
            {
                //Menampilkan pesan error
                MessageBox.Show("Masukan tidak valid");
            }
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}

Keluaran yang didapatkan saat aplikasi dijalankan ditampilkan pada Gambar 6.2b.

Gambar 6.2b Aplikasi Format Telepon saat dijalankan


Tutorial 6.3: Menciptakan Aplikasi Hapus Format Telepon
Pada tutorial ini, Anda menciptakan aplikasi Hapus Format Telepon. Form aplikasi, yang telah disediakan bagi Anda, ditampilkan pada Gambar 6.3a. Ketika aplikasi dijalankan, Anda akan memasukkan sebuah nomor telepon dengan format (XXX)XXX-XXXX ke dalam kontrol teksNomor dan mengklik Hapus Format untuk melihat apakah kurung dan tanda-hubung dihapus.

Gambar 6.3a Aplikasi Hapus Format Telepon

Langkah 1: Awali Visual Studio (atau Visual Studio Express).

Langkah 2: Buka kode dari form Form1 pada editor kode. Ketikkan komentar dan kode untuk metode ApaFormatValid, seperti ditunjukkan pada baris 20-44 pada Program 6.3. Metode ini menerima sebuah string sebagai argumennya dan menghasilkan true jika string diformat dengan (XXX)XXX-XXXX. Jika tidak, metode ini akan menghasilkan false. Anda menggunakan metode ini untuk memastikan bahwa user telah memasukkan sebuah nomor telepon yang terformat dengan benar. Amati kode ini lebih dekat:

Baris 28: Statemen ini mendeklarasikan konstanta PANJANG_VALID, yang diinisialisasi dengan nilai 13, untuk merepresentasikan panjang dari sebuah nomor telepon yang terformat dengan benar.

Baris 29: Statemen ini mendeklarasikan sebuah variabel bool dengan nama valid, yang diinisialisasi dengan nilai true. Variabel valid dipakai sebagai bendera untuk mengindikasikan apakah parameter str terformat dengan benar atau tidak.

Baris 32-33: Statemen if-else menentukan apakah parameter str terformat dengan benar atau tidak. Interpretasi atas statemen ini seperti berikut:

Jika panjang string adalah 13 dan karakter pada posisi 0 adalah “(“ dan karakter pada posisi 4 adalah “)” dan karakter pada posisi 8 adalah “-“ maka
   Tetapkan valid menjadi true
Jika tidak
   Tetapkan valid menjadi false

Setelah statemen if-else dieksekusi, variabel valid akan ditetapkan menjadi true atau false, yang mengindikasikan apakah str terformat dengan benar atau tidak. Statemen pada baris 39 menghasilkan nilai dari variabel valid.

Baris 43: Statemen ini menghasilkan nilai dari variabel valid.

Langkah 3: Ketikkan komentar dan kode untuk metode HapusFormat, yang ditunjukkan pada baris 46-65 pada Program 6.3. Metode HapusFormat menerima sebuah string sebagai argumennya, yang dilewatkan dengan referensi. Metode ini mengasumsikan bahwa string diformat sebagai (XXX)XXX-XXXX. Ketika metode selesai dieksekusi, tanda kurung dan tanda hubung akan dihapus dari string. Amati kode ini lebih dekat:
Baris 54: Statemen ini menghapus karakter pada posisi 0, yaitu karakter “(“. Semua karakter lain secara otomatis digeser ke kiri sejauh satu posisi untuk menempati ruang kiri dari karakter yang dihapus.

Baris 59: Statemen ini menghapus karakter pada posisi 3, yaitu karakter “)”. Karakter-karakter yang sebelumnya ditampilkan diawali pada posisi 4 secara otomatis digeser ke kiri untuk menempati ruang yang ditinggalkan oleh karakter yang dihapus.

Baris 64: Statemen ini menghapus karakter pada posisi 6, yaitu tanda-hubung. Karakter-karakter yang sebelumnya ditampilkan di kanan dari tanda-hubung secara otomatis digeser ke kiri sejauh satu posisi. Setelah statemen ini dieksekusi, string yang direferensi oleh str akan terhapus formatnya.

Langkah 4: Selanjutnya, Anda menciptakan event-event handler Click untuk kontrol-kontrol Button. Ganti ke mode Designer dan klik ganda pada kontrol tombolHapusFormat. Ini akan membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolHapusFormat_Click. Amati kode ini:

Baris 70: Perhatikan bahwa ekspresi di sisi kanan dari operator = adalah teksNomor.Text.Trim(). Ekspresi ini memanggil metode Trim pada properti Text dari kontrol teksNomor. Metode ini menghasilkan salinan dari properti Text dari kontrol teksNomor dengan semua spasi depan dan belakang terhapus. Hasilnya ditugaskan kepada variabel masukan.

Baris 74: Statemen if ini memanggil metode ApaFormatValid, yang melewatkan variabel masukan sebagai argumen. Jika nilai dari variabel masukan diformat secara benar, maka metode menghasilkan true, dan program berlanjut ke baris 76. Pada baris 76, metode HapusFormat dipanggil, yang melewatkan masukan dengan referensi sebagai argumen, dan kemudian baris 77 menampilkan nilai dari variabel masukan pada suatu kotak pesan.

Jika nilai dari variabel masukan tidak diformat dengan benar, maka metode ApaFormatValid akan menghasilkan false, dan program melompat ke klausa else pada baris 79. Kemudian, baris 82 menampilkan pesan error.

Langkah 5: Ganti 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 mengetikkan kode yang ditunjukkan pada baris 88-89 pada Program 6.3.

Langkah 6: Simpan projek dan jalankan aplikasi. Uji aplikasi dengan beberapa data.

Program 6.3 Kode utuh untuk form Form1 pada aplikasi Hapus Format Telepon
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
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 Hapus_Format_Telepon
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Metode ApaFormatValid menerima sebuah argumen string
        //dan menentukan apakah ia terformat dengan benar sebagai
        //sebuah nomor telepon dengan cara ini:
        // (XXX)XXX-XXXX
        //Jika argumen diformat dengan benar, maka metode ini
        //menghasilkan true, jika tidak menghasilkan false
        private bool ApaFormatValid(string str)
        {
            const int PANJANG_VALID = 13;    //Panjang dari sebuah string valid
            bool valid;              //Bendera untuk mengindikasikan validitas

            //Menentukan apakah str terformat dengan benar
            if (str.Length == PANJANG_VALID && str[0] == '(' &&
                str[4] == ')' && str[8] == '-')
            {
                valid = true;
            }
            else
            {
                valid = false;
            }

            //Menghasilkan nilai dari valid
            return valid;
        }

        //Metode HapusFormat menerima sebuah string, dengan referensi
        //jika diasumsiak ia memuat sebuah nomor telon yang terformat
        //dengan cara ini: (XXX)XXX-XXXX.
        //Metode ini akan menghapus format dengan menghapus
        //tanda kurung dan tanda hubung
        private void HapusFormat(ref string str)
        {
            //Pertama, hapus kurung kiri pada posisi 0
            str = str.Remove(0, 1);

            //Selanjutnya, hapsu kurung kanan. Karena penghapusan
            //sebelumnya, ia sekarang berada pada
            //posisi 3
            str = str.Remove(3, 1);

            //Selanjutnya, hapus tanda-hubung. Karena penghapusan
            //sebelumnya, ia sekarang berada pada
            //posisi 6
            str = str.Remove(6, 1);
        }

        private void tombolHapusFormat_Click(object sender, EventArgs e)
        {
            //Membaca salinan terpotong dari masukan user
            string masukan = teksNomor.Text.Trim();

            //Jika masukan terformat dengan benar, maka hapus formatnya
            //dan tampilkan
            if (ApaFormatValid(masukan))
            {
                HapusFormat(ref masukan);
                MessageBox.Show(masukan);
            }
            else
            {
                //Menampilkan pesan error
                MessageBox.Show("Masukan tidak valid");
            }
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}

Keluaran saat aplikasi dijalankan ditunjukkan pada Gambar 6.3b.

Gambar 6.3b Aplikasi Hapus Format Telepon saat dijalankan


Mentokenkan String
Kadangkala sebuah string memuat serangkaian kata atau item-item data lain yang dipisahkan dengan spasi atau karakter lain. Sebagai contoh, lihat pada string berikut:

"satu dua tiga empat"

String ini memuat empat item data: satu, dua, tiga, dan empat. Dalam pemrograman, item-item seperti ini dikenal dengan token. Perhatikan bahwa spasi diberikan antar item. Karakter yang memisahkan token dikenal dengan delimiter. Berikut adalah salah satu contohnya:

"17;92;81;12;46;5"

String ini memuat token-token berikut: 17, 92, 81, 12, 46, dan 5. Perhatikan bahwa titik-koma ditampilkan antara tiap item. Pada contoh ini, titik-koma dipakai sebagai delimiter. Sejumlah permasalahan pemrograman mengharuskan Anda untuk membaca sebuah string yang memuat sejumlah item dan kemudian mengekstrak semua token dari string untuk diproses. Sebagai contoh, lihat pada string yang memuat suatu tanggal berikut:

"3-22-2016"

Token-token di dalam string adalah 3, 22, dan 2016, dan delimiter adalah karakter tanda-hubung. Suatu program bisa saja perlu mengekstrak bulan, hari, dan tahun dari string semacam itu.

Proses pemecahan suatu string menjadi token-token dikenal dengan penokenan. Dalam C#, objek-objek string memiliki suatu metode dengan nama Split yang dapat dipakai untuk mentokenkan string. Ketika Anda memanggil metode Split dari sebuah objek string, metode itu mengekstrak token-token dari string dan menghasilkan (menjadikannya nilai balik) sebagai suatu array string. Setiap elemen di dalam array adalah salah satu token.

Anda akan mempelajari dua cara dalam memanggil metode Split. Cara pertama adalah dengan melewatkan nilai null sebagai argumen. Ketika Anda melewatkan null sebagai argumen kepada metode Split, metode ini mentokenkan string menggunakan karakter spasi putih sebagai delimiter. (Spasi putih mencakup spasi, tab, linfeed, carriage-return, formfeed, vertical-tab, dan garis-baru). Metode ini menghasilkan sebuah string, dengan tiap elemen array memuat salah satu token. Kode berikut menunjukkan salah satu contohnya:

1
2
3
4
5
6
7
8
9
10
11
//Menciptakan sebuah string untuk ditokenkan
string str = "satu dua tiga empat”;

//Mengekstrak token-token dari string
string[] token = str.Split(null);

//Menampilkan tiap token
foreach (string s in token)
{
   MessageBox.Show(s);
}


Amati kode ini lebih dekat:
·         Baris 2 mendeklarasikan sebuah variabel string dengan nama str, yang diinisialisasi dengan string “satu dua tiga empat”.
·         Baris 5 mendeklarasikan sebuah array string dengan nama token. Array token diinisialisasi dengan array yang dihasilkan dari pemanggilan metode str.Split(null). Setelah statemen ini dieksekusi, array token akan memiliki empat elemen, yang memuat string “satu”, “dua”, “tiga”, dan “empat”.
·       Loop foreach pada baris 8-11 menampilkan tiap elemen array token pada kotak-kotak teks. Ketika loop dieksekusi, empat kotak pesan akan ditampilkan, satu demi satu, yang menampilkan string “satu”, “dua”, “tiga”, dan “empat”.

Cara kedua dalam memanggil metode Split adalah dengan melewatkan suatu array char sebagai argumen. Setiap elemen dari array char dipakai sebagai delimiter. Kode berikut menunjukkan salah satu contohnya:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Menciptakan sebuah string untuk ditokenkan
string str = "satu;dua;tiga;empat";

//Menciptakan sebuah array delimiter
char[] delim = { ';' };

//Mengekstrak token-token dari string
string[] token = str.Split(delim);

//Menampilkan tiap token
foreach (string s in token)
{
   MessageBox.Show(s);
}

Amati kode lebih dekat:
·         Baris 2 mendeklarasikan sebuah variabel string dengan nama str, yang diinisialisasi dengan string “satu;dua;tiga;empat”.
·       Baris 5 mendeklarasikan sebuah array char dengan nama delim. Perhatikan bahwa daftar inisialisasi hanya memuat satu karakter. Array delim memiliki satu elemen, yang memuat karakter ‘;’.
·        Baris 8 mendeklarasikan sebuah array string dengan nama token. Array token diinisialisasi dengan array yang dihasilkan dari pemanggilan metode str.Split(delim). Setelah statemen ini dieksekusi, array token akan memiliki empat elemen, yang memuat string “satu”, “dua”, tiga”, dan “empat”.
·       Loop foreach pada baris 11-14 menampilkan tiap elemen array token pada kotak-kotak pesan. Ketika loop ini dieksekusi, empat kotak pesan akan ditampilkan, satu demi satu, yang menunjukkan string “satu”, “dua”, “tiga”, dan “empat”.

Pada beberapa situasi, Anda diharuskan menggunakan beberapa karakter sebagai delimiter pada string yang sama. Sebagai contoh, lihat pada alamat e-mail berikut:

kristof@gmail.com

String ini menggunakan dua delimiter: @ (simbol at) dan . (titik). Untuk mengekstrak token-token dari string ini, Anda perlu menetapkan kedua karakter tersebut sebagai delimiter. Berikut adalah salah satu contohnya:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Menciptakan sebuah string untuk ditokenkan
string str = "joe@gaddisbooks.com";

//Menciptakan sebuah array delimiter
char[] delim = { '@', '.' };

//Mengekstrak token-token dari string
string[] token = str.Split(delim);

//Menampilkan setiap token
foreach (string s in token)
{
   MessageBox.Show(s);
}

Amati kode lebih dekat:
·         Baris 2 mendeklarasikan sebuah variabel string dengan nama str, yang diinisialisasi dengan string “kristof@gmail.com”.
·       Mendeklarasikan sebuah array string dengan nama token. Array token diinisialisasi dengan array yang dihasilkan dari pemanggilan metode str.Split(delim). Setelah statemen ini dieksekusi, array token akan memiliki tiga elemen, yang memuat string “kristof”, “gmail”, dan “com”.
·       Loop foreach pada baris 11-14 menampilkan tiap elemen array token pada kotak-kotak pesan. Ketika loop ini dieksekusi, tiga kotak pesan akan ditampilkan, satu demi satu, yang menunjukkan string “kristof”, “gmail”, dan “com”.


Memotong atau Merapikan String sebelum Penokenan
Ketika Anda menokenkan suatu string yang dimasukkan oleh user dan Anda sedang menggunakan karakter selain spasi putih sebagai delimiter, Anda mungkin ingin merapikan string sebelum menokenkannya. Jika tidak, user bisa saja memasukkan beberapa karakter spasi-putih di depan dan beberapa karakter spasi-putih di bagian belakang. Sebagai contoh, lihat pada kode berikut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Menciptakan sebuah string dengan spasi-putih di depan dan di belakang
String str = " satu;dua;tiga ";

//Menciptakan sebuah array char yang memuat titik-koma
char[] delim = { ';' };

//Mengekstrak token-token dari string
string[] token = str.Split(delim);

//Menampilkan tiap token
foreach (string s in token)
{
   MessageBox.Show("*" + s + "*");
}

Kode ini akan menghasilkan tiga kotak pesan yang menampilkan keluaran berikut:
* satu*
*dua*
*tiga *

Perhatikan bahwa token pertama memuat spasi putih di depan dan token terakhir memuat spasi putih di belakang. Untuk mencegahnya, Anda bisa menggunakan metode Trim untuk menghapusnya. Berikut adalah contohnya, yang menggunakan metode Trim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Menciptakan sebuah string dengan spasi-putih di depan dan di belakang
String str = " satu;dua;tiga ";

//Menciptakan sebuah array char yang memuat titik-koma
char[] delim = { ';' };

//Merapikan string
str = str.Trim();

//Mengekstrak token-token dari string
string[] token = str.Split(delim);

//Menampilkan tiap token
foreach (string s in token)
{
   MessageBox.Show("*" + s + "*");
}

Kode ini akan menghasilkan tiga kotak pesan yang menampilkan keluaran berikut:
*satu*
*dua*
*tiga*



Pada Tutorial 6.4, Anda akan menciptakan sebuah aplikasi yang membaca dan menokennya data dari suatu file yang diekspor dari Microsoft Excel.

Tutorial 6.4: Menyelesaikan Aplikasi Pembaca CSV
Seorang profesor menyimpan skor ujian dari tiap mahasiswanya di dalam sebuah spreadsheet Microsoft Excel. Gambar 6.4 menunjukkan skor-skor ujian dari lima mahasiswa. Setiap kolom memuat sebuah skor ujian, dan tiap baris merepresentasikan skor-skor ujian untuk satu mahasiswa.

Gambar 6.4 Spreadsheet Microsoft Excel

Dimisalkan bahwa profesor meminta Anda menuliskan suatu aplikasi C# yang membaca skor-skor ujian dari spreadsheet Excel dan melakukan beberapa operasi terhadap data itu. Excel, seperti aplikasi lain, memiliki kemampuan untuk mengekspor data ke sebuah file teks. Ketika data di dalam spreadsheet diekspor, setiap baris dituliskan pada suatu baris, dan nilai dari tiap sel akan dipisahkan dengan koma. Sebagai contoh, ketika data yang ditunjukkan pada Gamabr 6.4 diekspor, ia akan dituliskan pada sebuah file teks dengan format berikut:

87,79,91,82,94
72,79,81,74,88
94,92,81,89,96
77,56,67,81,79
79,82,85,81,90

Ini dinamakan dengan format file comma separated value atau csv. Ketika Anda menyimpan sebuah spreadsheet dengan format ini, Excel akan menyimpannya menjadi sebuah file dengan ekstensi .csv. Pada suatu aplikasi C#, Anda dapat membaca sebuah baris dari file ke dalam suatu variabel string dan kemudian menggunakan metode Split untuk mengekstrak nilai-nilai sebagai token-token.

Untuk mempelajari bagaimana ini dilakukan, Anda akan menciptakan aplikasi Pembaca CSV. Form aplikasi, yang telah disediakan bagi Anda, ditampilkan pada Gambar 6.5. Sebuah file dengan nama Skor.csv, yang memuat skor-skor ujian yang ditampilkan pada Gambar 6.5, juga telah diciptakan bagi Anda. Ketika Anda menjalankan aplikasi dan mengklik tombol Baca Skor, ia akan membaca skor-skor ujian dari file Skor.csv. Skor rerata ujian dari setiap mahasiswa akan dihitung dan ditampilkan pada kontrol kotakListRerata.

Gambar 6.5 Form aplikasi Pembaca CSV


Langkah 1: Awali Visual Studio (atau Visual Studio Express).

Langkah 2: Buka kode dari form Form1 pada editor kode. Ketikkan direktif using System.IO; yang ditampilkan pada baris 10 pada Program 6.4. Direktif ini diperlukan karena Anda akan menciptakan sebuah objek StreamReader untuk membaca masukan dari sebuah file.

Langkah 3: Selanjutnya Anda menciptakan event-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 dengan mengetikkan kode yang ditunjukkan pada baris 23-74 pada Program 6.4. Amati kode ini lebih dekat:

Baris 23: Ini adalah awal dari statemen try-catch. Blok try ditampilkan pada baris 25-68, dan blok catch ditampilkan pada baris 72-73. Jika sebuah eksepsi dilemparkan oleh sembarang statemen di dalam blok try, program akan melompat ke blok catch, dan baris 73 akan menampilkan pesan error.

Baris 25-29: Statemen-statemen ini mendeklarasikan variabel-variabel berikut:
·         fileMasukan: sebuah variabel StreamReader yang akan dipakai untuk membaca file masukan.
·         baris: sebuah variabel string untuk menampung sebuah baris yang dibaca dari file.
·      hitung: sebuah variabel int yang akan dipakai untuk menghitung jumlah mahasiswa ketika loop beriterasi (Perhatikan bahwa variabel hitung diinisialisasi dengan nilai 0).
·         total: sebuah variabel int yang akan dipakai untuk memuat total skor ujian dari seorang mahasiswa.
·         rerata: sebuah variabel double yang akan memuat rerata skor dari seorang mahasiswa.

Baris 32: Statemen ini menciptakan sebuah array char dengan nama delim. Array ini memiliki satu elemen yang memuat karakter ‘,’.

Baris 35: Statemen ini membuka file Skor.csv. Setelah statemen ini dieksekusi, variabel fileMasukan mereferensi sebuah objek StreamReader yang berkaitan dengan file itu.

Baris 37: Ini adalah awal dari sebuah loop while yang membaca isi dari file Skor.csv.

Baris 40: Statemen ini menginkremen variabel hitung, yang menghitung banyak mahasiswa. Statemen ini akan menyebabkan hitung ditetapkan 1 selama iterasi pertama loop, 2 selama iterasi kedua loop, dan seterusnya.

Baris 43: Statemen ini membaca sebuah baris dari file Skor.csv dan menugaskannya kepada variabel baris.

Baris 46: Statemen ini menokenkan variabel baris, menggunakan karakter ‘,’ sebagai sebuah delimiter. Setelah statemen ini dieksekusi, token-token disimpan di dalam elemen-elemen array token. (Skor ujian pertama di dalam token[0], skor ujian kedua disimpan di dalam token[2], dan seterusnya).

Baris 49: Statemen ini menetapkan variabel total menjadi 0. Ini diperlukan karena total akan dipakai sebagai akumulator dalam menghitung total dari semua skor ujian yang ada di dalam array token.

Baris 53-56: Loop foreach ini menjejak elemen-elemen array token. Pada baris 55, setiap elemen dikonversi menjadi sebuah int dan kemudian ditambahkan pada variabel total. Setelah loop selesai dieksekusi, variabel total akan memuat total dari semua skor ujian yang ada di dalam array token.

Baris 60: Statemen ini menghitung rerata dari skor-skor ujian dan menugaskan hasilnya kepada variabel rerata. Perhatikan bahwa operator cast (double) dipakai untuk mencegah pembagian integer.

Baris 63-64: Statemen ini menampilkan rerata, berikut dengan nomor mahasiswa, pada kontrol kotakListRerata.

Baris 68: Statemen ini menutup file Skor.csv.

Langkah 4: 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 mengetikkan kode yang ditunjukkan pada baris 79-80 pada Program 6.4.

Langkah 5: Simpan projek dan jalankan aplikasi. Ketika aplikasi dijalankan, klik pada tombol Baca Skor. Rerata mahasiswa akan ditampilkan seperti ditunjukkan pada Gambar 6.6.

Program 6.4 Kode utuh untuk form Form1 pada aplikasi Pembaca CSV
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
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 Pembaca_CSV
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void tombolBaca_Click(object sender, EventArgs e)
        {
             try
            {
                StreamReader fileMasukan;   //Untuk membaca file
                string baris;               //Untuk memuat sebuah baris dari file
                int hitung = 0;             //Pencacah mahasiswa
                int total;                  //Akumulator
                double rerata;              //Rerata skor ujian

                //Menciptakan array delimiter
                char[] delim = { ',' };

                //Membuka file CSV
                fileMasukan = File.OpenText("Skor.csv");

                while (!fileMasukan.EndOfStream)
                {
                    //Menginkremen pencacah mahasiswa
                    hitung++;

                    //Membaca satu baris dari file
                    baris = fileMasukan.ReadLine();

                    //Membaca skor-skor ujian sebagai token-token
                    string[] token = baris.Split(delim);

                    //Menetapkan akumulator menjadi 0
                    total = 0;

                    //Menghitung total dari
                    //token-token skor ujian
                    foreach (string str in token)
                    {
                        total += int.Parse(str);
                    }

                    //Menghitung rerata dari
                    //skor-skor ujian
                    rerata = (double)total / token.Length;

                    //Menampilkan rerata
                    kotakListRerata.Items.Add("Rerata untuk mahasiswa " +
                        hitung + " adalah " + rerata.ToString("n1"));
                }

                //Menutup file
                fileMasukan.Close();
            }
            catch (Exception ex)
            {
                //Menampilkan pesan error
                MessageBox.Show(ex.Message);
            }
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}

Gambar 6.6 Aplikasi Pembaca CSV saat dijalankan



6.3 Struktur
KONSEP: C# dapat dipakai untuk mengelompokkan beberapa variabel menjadi satu item yang dikenal dengan struktur.

Sejauh ini, Anda telah menciptakan aplikasi-aplikasi yang menyimpan data ke dalam variabel-variabel individual. Kadangkala, ada relasi antara item-item data yang berbeda. Sebagai contoh, sebuah sistem inventori dealer mobil bekas bisa jadi menggunakan variabel-variabel seperti ditunjukkan pada statemen-statemen deklarasi berikut:

string buatan;             //Pembuat mobil
int tahun;                  //Tahun pembuatan mobil
double jarakKm;            //Jarak Km yang telah ditempuh

Semua variabel ini berelasi karena ketiganya memuat data yang berkaitan dengan mobil yang sama. Statemen-statemen deklarasi tersebut tidak menjelaskan bahwa ketiganya merupakan data yang saling berkaitan. Untuk menciptakan relasi antara variabel-variabel, C# mempunyai kapabilitas untuk mengelompokkannya menjadi satu item, yang dikenal dengan struktur. Struktur adalah sebuah tipe data yang dapat Anda ciptakan yang memuat satu atau lebih variabel yang dikenal dengan bidang-bidang. Bidang-bidang tersebut dapat berbeda tipe data.

Sebelum sebuah struktur dapat digunakan, ia harus dideklarasikan. Berikut adalah bentuk umum yang dapat Anda gunakan untuk mendeklarasikan sebuah struktur:

struct NamaStruktur
{
    Deklarasi-deklarasi bidang
}

Baris pertama dari deklarasi struktur diawali dengan katakunci struct, yang diikuti dengan nama struktur. Sepasang kurung kurawal mengapit satu atau lebih deklarasi bidang. Berikut adalah sebuah contoh deklarasi struktur:

1
2
3
4
5
6
struct Otomobil
{
   public string buatan;
   public int tahun;
   public double jarakKm;
}

Nama struktur adalah Otomobil. Pada buku ini, Anda selalu mengawali nama struktur dengan huruf besar. Ini tidak diharuskan, tetapi banyak programer mengikuti konvensi ini karena ia membantu membedakan nama struktur dari nama variabel biasa.

Baris 3, 4, dan 5 mendeklarasikan tiga bidang. Baris 3 mendeklarasikan sebuah bidang string dengan nama buatan, baris 4 mendeklarasikan sebuah bidang int dengan nama tahun, dan baris 5 mendeklarasikan sebuah bidang double dengan nama jarakKm. Perhatikan bahwa setiap deklarasi diawali dengan katakunci public. Katakunci public merupakan sebuah pemodifikasi akses yang menetapkan bidang yang dapat diakses secara langsung oleh statemen-statemen dari luar struktur.

Pada buku ini, Anda akan selalu mendeklarasikan struktur di dalam namespace dari suatu aplikasi tetapi tidak di dalam dari sebuah kelas. Gambar 6.7 menunjukkan di mana, di dalam sebuah kode form, Anda menuliskan deklarasi-deklarasi struktur. Pada gambar, Anda menuliskan deklarasi dari struktor Otomobil di dalam namespace aplikasi tetapi tidak di dalam kelas Form1.

Gambar 6.7 Di mana biasanya Anda menempatkan deklarasi struktur


Ingat bahwa sebuah deklarasi struktur tidak menciptakan apapun di dalam memori. Ia hanya memberitahu kompiler C# apa yang ada di dalam struktur. Sebelum Anda dapat menggunakan struktur untuk menyimpan data, Anda perlu menciptakan sebuah objek struktur di dalam memori.

Pada awal Bab 7, Anda telah mempelajari tipe nilai dan tipe referensi. Struktur adalah tipe nilai, jadi penciptaan objek dari sebuah struktur sama dengan pendeklarasian sebuah variabel. Sebagai contoh, dimisalkan bahwa Anda ingin menciptakan sebuah objek dari struktur Otomobil dan Anda ingin menamai objek itu menjadi mobilSport. Anda akan menuliskannya dengan:

Otomobil mobilSport;

Setelah statemen ini dieksekusi, sebuah objek dari struktur Otomobil akan ditempatkan di dalam memori. Nama objek itu adalah mobilSport. Seperti diilustrasikan pada Gambar 6.8, objek mobilSport memiliki tiga bidang: buatan, tahun, dan jarakKm.

Gambar 6.8 Objek mobilSport sebagai sebuah objek dari struktur Otomobil

Anda dapat menciptakan sejumlah objek dari sebuah struktur dengan satu statemen deklarasi, seperti ditunjukkan di sini:

Otomobil mobilSport, trukPickup;

Statemen ini menciptakan dua objek dari struktur Otomobil. Objek-objek itu dinamai dengan mobilSport dan trukPickup. Seperti diilustrasikan pada Gambar 6.9, setiap objek memiliki sendiri bidang buatan, tahun, dan jarakKm.

Gambar 6.9 Dua objek dari struktur Otomobil


Menggunakan Operator new untuk Menciptakan Objek Struktur
Ketika Anda menciptakan sebuah objek struktur dengan sebuah statemen deklarasi sederhana, seperti sebelumnya ditunjukkan, bidang-bidang objek tidak diinisialisasi, dan jika Anda mencoba menggunakannya sebelum menugaskannya nilai, error kompilasi akan terjadi. Cara alternatifnya adalah dengan menggunakan operator new untuk menciptakan sebuah objek struktur, seperti ditunjukkan di sini:

Otomobil mobilSport = new Otomobil();

Ini merupakan teknik yang direkomendasikan untuk menciptakan objek struktur karena operator new tidak hanya menciptakan objek di dalam memori, tetapi ia juga menginisialisasi bidang-bidang objek dengan nilai default 0. (Jika struktur memuat bidang yang merupakan variabel referensi, ia akan diinisialisasi dengan nilai null). Berikut adalah sebuah contoh dalam menciptakan dua objek dari struktur Otomobil menggunakan operator new:

Otomobil mobilSport = new Otomobil();
Automobile trukPickup = new Otomobil();


Mengakses Bidang-Bidang Di Dalam Sebuah Struktur
Setelah Anda menciptakan objek dari sebuah struktur, Anda dapat mengakses bidang-bidangnya menggunakan operator dot (sebuah titik). Sebagai contoh, dimisalkan bahwa suatu aplikasi memuat deklarasi struktur Otomobil yang sebelumnya telah ditunjukkan dan kode berikut ada di dalam suatu metode:

1
2
3
4
Otomobil mobilSport = new Otomobil();
mobilSport.buatan = "Ford Mustang";
mobilSport.tahun = 1965;
mobilSport.jarakKm = 67500.0;

Baris 1 menciptakan sebuah objek dari struktur Otomobil di dalam memori. Nama objek adalah mobilSport. Baris 2 menugaskan string “Ford Mustang” kepada bidang buatan dari objek mobilSport. Baris 3 menugaskan nilai 1965 kepada bidang tahun dari objek mobilSport. Baris 4 menugaskan nilai 67500.0 kepada bidang jarakKm dari objek mobilSport.

Kode berikut menunjukkan contoh lain menggunakan objek mobilSport yang sama. Statemen-statemen ini menampilkan nilai dari tiap bidang objek pada kotak pesan:

1
2
3
MessageBox.Show(mobilSport.buatan);
MessageBox.Show(mobilSport.tahun.ToString());
MessageBox.Show(mobilSport.jarakKm.ToString());

Berikut adalah contoh lain. Statemen ini menampilkan sebuah pesan seperti “1965 Ford Mustang dengan jarak tempuh 67500 km.”

MessageBox.Show(mobilSport.tahun + " " + mobilSport.buatan +
   " dengan jarak tempuh " + mobilSport.jarakKm + " km.");

Menugaskan Satu Objek Struktur Ke Objek Struktur Lain
Anda dapat menggunakan operator penugasan (=) untuk menugaskan satu objek struktur kepada objek struktur lain. Sebagai contoh, diasumsikan bahwa mobil1 dan mobil2 keduanya adalah objek dari struktor Otomobil. Statemen beriktu menugaskan mobil1 kepada mobil2:

mobil2 = mobil1;

Setelah statemen ini dieksekusi, bidang-bidang dari objek mobil2 memuat nilai-nilai sama dengan bidang-bidang dari objek mobil1.

Melewatkan Objek Struktur Kepada Metode
Sama seperti tipe objek lain, Anda dapat melewatkan sebuah objek struktur sebagai argumen kepada suatu metode. Kode berikut menunjukkan sebuah metode dengan nama TampilOto yang dituliskan untuk menerima sebuah objek dari struktur Otomobil sebagai argumen:

1
2
3
4
5
private void TampilOto(Otomobil oto)
{
   MessageBox.Show(oto.tahun + " " + oto.buatan +
      " dengan jarak tempuh " + oto.jarakKm + " km.");
}

Perhatikan pada bab 1 bahwa metode memiliki sebuah variabel parameter dengan nama oto, dan tipe datanya adalah Otomobil. Ketika Anda memanggil metode ini, Anda melewatkan sebuah objek Otomobil sebagai argumen, seperti ditunjukkan pada kode berikut:

1
2
3
4
5
6
7
8
9
10
//Menciptakan sebuah objek dari struktur Otomobil
Otomobil mobilSport = new Otomobil();

//Menugaskan nilai-nilai kepada bidang-bidang objek
mobilSport.buatan = "Chevy Corvette";
mobilSport.tahun = 1970;
mobilSport.jarakKm = 50000.0;

//Menampilkan bidang-bidang dari objek
TampilOto(mobilSport);

Pada baris 10, objek mobilSport dilewatkan sebagai sebuah argumen kepada metode TampilOto. Di dalam metode TampilOto, parameter oto memuat salinan dari objek mobilSport.

Objek struktur dapat dilewatkan dengan nilai atau dengan referensi. Umumnya, objek struktur dilewatkan dengan nilai. Variabel parameter memuat salinan dari argumen, dan setiap perubahan yang dilakukan terhadap parameter tidak memengaruhi argumen asli. Jika metode penerima perlu mengubah isi dari argumen asli, katakunci ref atau out dapat dipakai pada deklarasi parameter. Kode berikut menunjukkan sebuah parameter yang menggunakan parameter referensi dengan tipe Otomobil. Asumsikan bahwa form aplikasi memuat kontrol-kontrol TextBox dengan nama teksBuata, teksTahun, dan teksJarakKm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void BacaData(ref Otomobil oto)
{
   try
   {
      //Membaca data dari kontrol-kontrol TextBox
      oto.buatan = teksBuatan.Text;
      oto.tahun = int.Parse(teksTahun.Text);
      oto.jarakKm = double.Parse(teksJarakKm.Text);
   }
   catch (Exception ex)
   {
      //Menampilkan pesan eksepsi
      MessageBox.Show(ex.Message);
   }
}

Perhatikan bahwa parameter oto dideklarasikan dengan katakunci ref. Statemen-statemen pada baris 6-8 membaca data dari kontrol-kontrol TextBox dan menugaskan data itu kepada bidang-bidang dari parameter oto. Karena oto adalah sebuah parameter ref, nilai-nilai sebenarnya ditugaskan kepada objek yang dilewatkan sebagai argumen kepada metode.

Ketika Anda memanggil metode ini, Anda melewatkan sebuah objek Otomobil dengan referensi, seperti ditunjukkan di sini:

1
2
3
4
5
//Menciptakan sebuah objek dari struktur Otomobil
Otomobil mobil = new Otomobil();

//Membaca data untuk objek
BacaData(ref mobil);

Setelah metode dieksekusi, objek mobil akan memuat data yang dimasukkan ke dalam kontrol-kontrol TextBox.

Membandingkan Objek-Objek Struktur
Anda tidak bisa menggunakan operasi-operasi perbandingan secara langsung pada objek-objek struktur. Sebagai contoh, diasumsikan bahwa mobilSport dan mobilBalap adalah dua objek dari struktur Otomobil. Statemen berikut akan menyebabkan error:

if (mobilSport == mobilBalap) // Error!

Untuk membandingkan dua objek struktur, Anda perlu membandingkan bidang demi bidang, seperti ditunjukkan pada kode berikut:

if (mobilSport.buatan == mobilBalap.buatan &&
    mobilSport.tahun == mobilBalap.tahun &&
    mobilSport.jarakKm == mobilBalap.jarakKm)
{
    MessageBox.Show("Kedua objek sama.");
}


Array yang Memuat Objek-Objek Struktur
Objek-objek struktur dapat disimpan di dalam suatu array. Sebagai contoh, diasumsikan bahwa struktur Otomobil yang sebelumnya ditunjukkan ada di dalam suatu aplikasi. Kode berikut menciptakan sebuah array yang memuat lima objek Otomobil:

const int UKURAN = 5;
Otomobil[] mobil = new Otomobil[UKURAN];

Ketika Anda menciptakan sebuah array struktor, setiap elemen array adalah sebuah objek struktur dan bidang-bidang dari tiap objek diinisialisasi dengan 0. (Jika ada bidang yang merupakan variabel referensi, ia akan diinisialisasi dengan nilai null).

Setiap elemen dari array struktur dapat diakses melalui indeks. Sebagai contoh, mobil[0] adalah objek pertama di dalam array, mobil[1] adalah objek kedua, dan seterusnya. Untuk mengakses sebuah bidang dari sembarang elemen, Anda hanya perlu menggunakan operator dot dan nama bidang setelah indeks. Sebagai contoh, ekspresi berikut mengakses anggota jarakKm dari mobil[2]:

mobil[2].jarakKm

Loop for berikut menjejak array mobil, yang menampilkan data yang disimpan pada tiap elemennya:

for (int indeks = 0; indeks < mobil.Length; indeks++)
{
    MessageBox.Show(mobil[indeks].tahun + " " +
      mobil[indeks].buatan + " dengan jarak tempuh " +
      mobil[indeks].jarakKm + " km.");
}

Anda dapat menggunakan loop foreach untuk beriterasi pada semua elemen di dalam sebuah array struktur seperti ditunjukkan pada kode berikut:

foreach (Otomobil aMobil in mobil)
{
    MessageBox.Show(mobil[indeks].tahun + " " +
      mobil[indeks].buatan + " dengan jarak tempuh " +
      mobil[indeks].jarakKm + " km.");
}


Menyimpan Objek-Objek Struktur di dalam Sebuah List
Pada Bab 7, Anda telah mempelajari kelas List, yang merupakan sebuah kontainer untuk menyimpan sekumpulan objek-objek. Berikut adalah sebuah contoh bagaimana Anda menciptakan sebuah List yang menampung objek-objek Otomobil:

List<Otomobil> mobilList = new List<Otomobil>();

Statemen ini menciptakan sebuah objek List, yang direferensi ole variabel mobilList. Perhatikan bahwa kata Otomobil dituliskan di dalam kurung siku, <>, yang ada setelah kata List. Ini menetapkan bahwa List hanya dapat memuat objek-objek dengan tipe data Otomobil.

Untuk menambahkan sebuah objek struktur ke dalam sebuah List, Anda dapat menggunakan metode Add. Kode berikut menunjukkan salah satu contohnya:

1
2
3
4
5
6
7
8
9
10
11
12
13
//Menciptakan sebuah List untuk menampung objek-objek Otomobil
List<Otomobil> mobilList = new List<Otomobil>();

//Menciptakan sebuah objek dari struktur Otomobil
Otomobil mobilSport = new Otomobil ();

//Menugaskan nilai-nilai kepada bidang-bidang objek
mobilSport.buatan = "Chevy Corvette";
mobilSport.tahun = 1970;
mobilSport.jarakKm = 50000.0;

//Menambahkan objek pada List
mobilList.Add(mobilSport);

Statemen pada baris 2 menciptakan sebuah List dengan nama mobilList yang dapat menampung objek-objek Otomobil. Baris 5 menciptakan sebuah objek dari struktur Otomobil dengan nama mobilSport, dan baris 8-10 menugaskan nilai-nilai kepada bidang-bidang dari objek. Baris 13 menambahkan objek ke dalam List.

Ingat bahwa objek-objek struktur adalah objek-objek bertipe nilai, dan ketika Anda menambahkan sebuah objek tipe nilai ke dalam sebuah List, List itu akan memuat salinan dari objek itu. 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
//Menciptakan sebuah List untuk menampung objek-objek Otomobil
List<Otomobil> mobilList = new List<Otomobil>();

//Menciptakan sebuah objek dari struktur Otomobil
Otomobil mobilSport = new Otomobil();

//Menugaskan nilai kepada tiap bidang dari objek
mobilSport.buatan = "Chevy Corvette";
mobilSport.tahun = 1970;
mobilSport.jarakKm = 50000.0;

//Menambahkan objek ke dalam List
mobilList.Add(mobilSport);

//Menugaskan nilai bari pada tiap bidang dari objek
mobilSport.buatan = "Ford Mustang";
mobilSport.tahun = 1965;
mobilSport.jarakKm = 67500.0;

//Menambahkan objek ke dalam List
mobilList.Add(mobilSport);

Statemen pada baris 2 menciptakan sebuah List dengan nama mobilList yang dapat menampung objek-objek Otomobil. Baris 5-10 menciptakan sebuah objek Otomobil dengan nama mobilSport dan menugaskan nilai-nilai kepada bidang-bidang dari objek. Baris 13 menambahkan objek mobilSport pada List. Ketika baris 13 dieksekusi, sebuah salinan dari objek mobilSport dibuat dan disimpan di dalam List. (Ini terjadi karena objek mobilSport adalah sebuah objek tipe nilai). Pada titik ini, dua objek dari struktur Otomobil telah ada: objek mobilSport dan salinan dari objek mobilSport yang ada di dalam List.

Baris 16-18 menugaskan nilai-nilai baru kepada bidang-bidang dari objek mobilSport, dan kemudian baris 21 menambahkan objek mobilSport pada List lagi. Sekali lagi, sebuah salinan dari objek mobilSport dibuat dan ditambahkan pada List. Pada titik ini, tiga objek dari struktur Otomobil telah ada: objek mobilSport dan dua objek yang ada di dalam List.

Lihat pada program yang mendemonstrasikan objek-objek struktur yang ditambahkan pada sebuah List. Gambar 6.10 menunjukkan form aplikasi.

Gambar 6.10 Form aplikasi List Mobil


Ketika Anda menjalankan aplikasi, Anda dapat memasukkan data tentang sebuah mobil ke dalam kontrol-kontrol TextBox. Ketika Anda mengklik kontrol tombolTambahkan, data itu ditugaskan kepada sebuah objek Otomobil dan kemudian ditambahkan pada sebuah List. Anda dapat melakukan ini sebanyak yang Anda inginkan. Ketika Anda mengklik kontrol tombolTampilkan, data dari tiap objek di dalam List akan ditampilkan pada kontrol kotakListMobil. Gambar 6.11 menunjukkan sebuah contoh form aplikasi setelah empat objek ditambahkan pada List dan kontrol tombolTampilkan telah diklik.

Program 6.5 menunjukkan kode dari Form1. Amati kode lebih dekat:
Baris 13-18: Struktur Otomobil dideklarasikan pada baris-baris ini.
Baris 23: Statemen ini menciptakan sebuah List yang dapat menampung objek-objek Otomobil. Perhatikan bahwa List dideklarasikan sebagai sebuah bidang di dalam kelas Form1. Semua metode di dalam kelas dapat mengaksesnya.

Baris 33-47: Metode BacaData ditampilkan pada baris-baris ini. Metode ini menerima sebuah objek Otomobil, dengan referensi, sebagai suatu argumen. Data yang dimasukkan ke dalam kontrol-kontrol TextBox ditugaskan kepada bidang-bidang dari objek.

Baris 49-67: Event handler tombolTambahkan_Click ditampilkan pada baris-baris ini. Berikut adalah simpulan dari kode dari event handler ini:
·         Baris 52 menciptakan sebuah objek mobil, yang merupakan suatu objek dari struktur Otomobil.
·         Baris 55 memanggil metode BacaData, yang melewatkan objek mobil, dengan referensi, sebagai argumen. Setelah statemen ini dieksekusi, bidang-bidang dari objek mobil memuat data yang telah dimasukkan ke dalam kontrol-kontrol TextBox dari form oleh user.
·         Baris 58 menambahkan sebuah salinan dari objek mobil pada mobilList.
·         Baris 61-63 membersihkan isi dari kontrol-kontrol TextBox.
·         Baris 66 memberikan fokus pada kontrol teksBuatan.

Baris 69-87: Event handler tombolTampilkan_Click ditampilkan pada baris-baris ini. Berikut adalah simpulan dari kode event handler:
·     Baris 72 mendeklarasikan sebuah variabel string dengan nama keluaran. Ini dipakai untuk memuat sebuah baris keluaran yang ditampilkan pada kontrol ListBox.
·         Baris 75 membersihkan isi dari kontrol ListBox.
·         Loop foreach pada baris 78-86 menampilkan data tentang setiap objek pada mobilList.
·         Statemen pada baris 81-82 menciptakan sebaris keluaran dan menugaskannya kepada variabel keluaran.
·         Baris 85 menambahkan variabel keluaran pada kontrol kotakListKeluaran.

Gambar 6.11 Form aplikasi List Mobil dengan data ditampilkan


Pada Tutorial 6.5, Anda akan menciptakan sebuah aplikasi buku telepon yang menggunakan sebuah List yang memuat objek-objek struktur.

Program 6.5 Kode utuh untuk form Form1 pada aplikasi List Mobil
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
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 List_Mobil
{
    struct Otomobil
    {
        public string buatan;
        public int tahun;
        public double jarakKm;
    }

     public partial class Form1 : Form
     {
         //Menciptakan sebuah List sebagai suatu bidang
         private List<Otomobil> mobilList = new List<Otomobil>();

         public Form1()
         {
             InitializeComponent();
         }

         //Metode BacaData membaca data yang dimasukkan oleh
         //user dan menugaskannya bidang-bidang dari
         //objek parameter
         private void BacaData(ref Otomobil oto)
         {
             try
             {
                 //Membaca data dari TextBox
                 oto.buatan = teksBuatan.Text;
                 oto.tahun = int.Parse(teksTahun.Text);
                 oto.jarakKm = double.Parse(teksJarakKm.Text);
             }
             catch (Exception ex)
             {
                 //Menampilkan pesan eksepsi
                 MessageBox.Show(ex.Message);
             }
         }

         private void tombolTambahkan_Click(object sender, EventArgs e)
         {
            //Menciptakan sebuah objek dari struktur Otomobil
             Otomobil mobil = new Otomobil();

            //Membaca data yang dimasukkan oleh useer
            BacaData(ref mobil);

            //Menambahkan objek mobil pada List
            mobilList.Add(mobil);

            //Membersihkan TextBox
            teksBuatan.Clear();
            teksTahun.Clear();
            teksJarakKm.Clear();

            //Memberikan fokus pada kontrol teksBuatan
            teksBuatan.Focus();
         }

         private void tombolTampilkan_Click(object sender, EventArgs e)
         {
             //Mendeklarasikan sebuah string yang menampung sebaris keluaran
             string keluaran;

            //Membersihkan isi dari ListBox
            kotakListMobil.Items.Clear();

            //Menampilkan info mobil pada ListBox
            foreach (Otomobil aMobil in mobilList)
            {
                //Membuat sebaris keluaran
                keluaran = aMobil.tahun + " " + aMobil.buatan +
                    " dengan jarak tempuh " + aMobil.jarakKm + " km.";

                //Menambah baris keluaran pada ListBox
                kotakListMobil.Items.Add(keluaran);
            }
         }
     }
}



Tutorial 6.5: Menciptakan Aplikasi Buku Telepon
Pada tutorial ini, Anda akan menciptakan sebuah aplikasi Buku Telepon. Ketika aplikasi dijalankan, user dapat memilih nama seseorang dari sebuah kontro ListBox, dan program akan menampilkan nomor telepon orang tersebut. Gambar 6.12 menunjukkan sebuah contoh bagaimana form ditampilkan saat aplikasi dijalankan. Pada gambar, John Kristof diseleksi pada kontrol ListBox, dan nomor telepon John ditampilkan pada sebuah kontrol Label. Form aplikasi telah diciptakan bagi Anda dan ditampilkan pada Gambar 6.13 dengan nama dari tiap kontrolnya.

Gambar 6.12 Form aplikasi Buku Telepon dengan sebuah nama terseleksi


Gambar 6.13 Form aplikasi Buku Telepon


Gambar 6.14 Isi dari file DaftarTelepon.txt

Sebelum Anda memulai menuliskan kode, akan diberikan simpulan bagaimana aplikasi bekerja. Sebuah file dengan nama DaftarTelepon.txt, yang memuat beberapa nama dan nomor teleponnya, telah diciptakan bagi Anda. Isinya ditampilkan pada Gambar 6.14. Perhatikan bahwa tiap baris di dalam file memuat sebuah nama, yang diikuti dengan koma, yang diikuti dengan sebuah nomor telepon.

Ketika aplikasi dijalankan, event handler Load dari form memanggila sebuah metode dengan nama BacaFile. Metode BacaFile membaca isi dari file DaftarTelepon.txt. Setiap baris yang dibaca dari file akan ditokenkan, menggunakan karakter koma sebagai delimiter. Ini akan menghasilkan dua token string: satu yang memuat nama orang dan yang lain yang memuat nomor telepon. Token-token disimpan di dalam sebuah objek dari struktur EntriBukuTelepon berikut:

struct EntriBukuTelepon
{
    public string nama;
    public string telepon;
}

Objek EntriBukuTelepon kemudian ditambahkan pada sebuah List. Ketika metode BacaFile selesai dieksekusi, List akan memuat sebuah objek EntriBukuTelepon untuk setiap baris pada file DaftarTelepon.txt.

Event handler Load kemudian memanggil metode lain dengan nama TampilNama. Metode TampilNama menjejak List, membaca bidang nama dari tiap objek dan menambahkan nama pada kontrol ListBox. Ketika metode TampilNama selesai dieksekusi, kontrol ListBox akan memuat semua nama yang dimuat di dalam List.

Ketika user mengklik sebuah nama pada kontrol ListBox, sebuah event SelectedIndexChanged terjadi. Anda perlu menuliskan sebuah event handler yang merespon event ini. Event handler akan membaca indeks dari item terseleksi pada kontrol ListBox, dan menggunakan indeks itu untuk membaca objek dari List. Objek ini memuat nomor telepon untuk nama terseleksi, yang ditampilkan pada sebuah kontrol Label.

Langkah 1: Awali Visual Studio (atau Visual Studio Express).

Langkah 2: Buka kode untuk form Form1 pada editor kode. Ketikkan direktif using System.IO yang ditunjukkan pada baris 10 pada Program 6.6. Direktif ini diperlukan karena Anda akan menciptakan sebuah objek StreamReader untuk membaca masukan dari suatu file.

Langkah 3: Tuliskan deklarasi dari struktur EntriBukuTelepon, yang ditunjukkan pada baris 14-18. Pastikan Anda menuliskan deklarasi itu di dalam namespace Buku_Telepon, seperti ditunjukkan pada Program 6.6.

Langkah 4: Selanjutnya, tuliskan komentar dan deklarasi untuk daftarTelepon, yang ditampilkan pada baris 22-24 pada Program 6.6. Perhatikan bahwa daftarTelepon dideklarasikan sebagai sebuah bidang pada kelas Form1. Ia tersedia bagi semua metode di dalam kelas itu.

Langkah 5: Tuliskan komentar dan kode untuk metode BacaFile, seperti ditunjukkan pada baris 31-72 pada Program 6.6. Metode BacaFile membuka file DaftarTelepon.txt. Loop while yang diawali pada baris 51 beriterasi sampai akhir file. Pada tiap iterasi loop, baris-baris berikut dieksekusi:

Baris 54: Statemen ini membaca sebuah baris dari file dan menugaskannya kepada variabel baris.

Baris 57: Statemen ini menokenkan variabel baris, menggunakan karakter koma sebagai delimiter. Token-token ditugaskan kepada array token. (Setelah statemen ini dieksekusi, token[0] akan memuat sebuah nama dan token[1] akan memuat sebuah nomor telepon).

Baris 60-61: Statemen-statemen ini menugaskan token-token kepada bidang nama dan bidang telepon dari objek entri (yang merupakan sebuah objek dari struktur EntriBukuTelepon).

Baris 64: Statemen ini menambahkan objek entri pada koleksi daftarTelepon.

Gambar 6.15 mengilustrasikan langkah-langkah yang dilakukan pada baris-baris kode ini. Setelah loop selesai dieksekusi, daftarTelepon akan memuat sebuah objek EntriBukuTelepon untuk tiap baris pada file DaftarTelepon.txt.

Gambar 6.15 Simpulan dari baris 54-64


Langkah 6: Tuliskan komentar dan kode untuk metode TampilNama, yang ditampilkan pada baris 74-82 pada Program 6.6. Loop foreach pada baris 78 menjejak semua objek di dalam daftarTelepon. Untuk setiap objek di dalam daftarTelepon, baris 89 menambahkan bidang nama pada kontrol kotakListNama.
Perhatikan bahwa nama-nama ditambahkan pada kontrol ListBox dengan urutan yang sama dengan yang ada pada daftarTelepon.

Gambar 6.16 mengilustrasikan bagaimana objek-objek di dalam daftarTelepon dan nama-nama pada kontrol ListBox berelasi berdasarkan indeks. Anda dapat memanfaatkan relasi ini pada Langkah 7 ketika Anda menuliskan kode untuk membaca sebuah objek dari daftarTelepon.

Gambar 6.16 Objek-objek di dalam daftarTelepon dan nama-nama di dalam kotakListNama berelasi dengan indeks


Langkah 7: Selanjutnya, Anda menciptakan event handler Load dari form. Kembali ke mode Designer dan klik ganda pada bagian dari form yang tidak memuat kontrol. Ini akan membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama Form1_Load. Sempurnakan event handler dengan menuliskan kode yang ditampilkan pada baris 86-90 pada Program 6.6. Statemen pada baris 87 memanggil metode BacaFile, dan baris 90 memanggil metode TampilNama.

Langkah 8: Sekarang Anda menciptakan event handler SelectedIndexChange untuk kontrol kotakListNama. Kembali ke mode Designer dan klik ganda pada kontrol kotakListNama. Ini akan membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama kotakListNama_SelectedIndexChanged. Sempurnakan event handler ini dengan menuliskan kode yang ditunjukkan pada baris 95-99 pada Program 6.6.

Telah disebutkan pada Langkah 6 bahwa nama-nama pada ListBox dan objek-objek pada daftarTelepon berelasi berdasarkan indeks. Ketika user menyeleksi sebuah nama pada ListBox, apa yang perlu Anda lakukan adalah membaca indeks item dan kemudian menggunakan indeks itu untuk membaca objek terkait pada daftarTelepon. Inilah yang dilakukan oleh event handler ini. Baris 96 membaca indeks dari item terseleksi pada kontrol kotakListNama dan menugaskannya kepada variabel indeks. Baris 99 menggunakan variabel indeks untuk mendapatkan sebuah objek dari daftarTelepon. Bidang telepon dari objek yang dibaca ditugaskan kepada labelTelepon.Text.

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 yang ditunjukkan pada baris 104-105 pada Program 6.6.

Langkah 10: Simpan projek dan jalankan aplikasi.

Program 6.6 Kode utuh untuk form Form1 pada aplikasi Buku Telepon
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
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 Buku_Telepon
{
    struct EntriBukuTelepon
    {
        public string nama;
        public string telepon;
    }

    public partial class Form1 : Form
    {
        //Bidang untuk menampung sebuah list yang memuat objek-objek EntriBukuTelepon
        private List<EntriBukuTelepon> daftarTelepon =
        new List<EntriBukuTelepon>();

        public Form1()
        {
            InitializeComponent();
        }

        //Metode BacaFile membaca isi dari file
        //DaftarTelepon.txt dan menyimpannya sebagai objek-objek
        //EntriBukuTelepon di dalam daftarTelepon
        private void BacaFile()
        {
            try
            {
                StreamReader fileMasukan; //Untuk membaca file
                string baris;         //Untuk menampung sebaris dari file

                //Menciptakan sebuah objek dari struktur EntriBukuTelepon
                EntriBukuTelepon entri = new EntriBukuTelepon();

                //Menciptakan sebuah array delimiter
                char[] delim = { ',' };

                //Membuka file DaftarTelepon.txt
                fileMasukan = File.OpenText("DaftarTelepon.txt");

                //Membaca baris-baris dari file
                while (!fileMasukan.EndOfStream)
                {
                    //Membaca sebuah baris dari file
                    baris = fileMasukan.ReadLine();

                    //Menokenkan baris
                    string[] token = baris.Split(delim);

                    //Menyimpan token-token di dalam objek entri
                    entri.nama = token[0];
                    entri.telepon = token[1];

                    //Menambahkan objek entri pada List
                    daftarTelepon.Add(entri);
                }
            }
            catch (Exception ex)
            {
                //Menampilkan pesan error
                MessageBox.Show(ex.Message);
            }
        }

        //Metode TampilNama menampilkan daftar nama
        //pada kontrol kotakListNama
        private void TampilNama()
        {
            foreach (EntriBukuTelepon entry in daftarTelepon)
            {
                kotakListNama.Items.Add(entry.nama);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Membaca file DaftarTelepon.txt
            BacaFile();

            //Menampilkan nama-nama
            TampilNama();
        }

        private void kotakListNama_SelectedIndexChanged(…)
        {
            //Membaca indeks dari item terseleksi
            int indeks = kotakListNama.SelectedIndex;

            //Menampilkan nomor telepon terkait
            labelTelepon.Text = daftarTelepon[indeks].telepon;
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}



6.4 Tipe Enumerasi
KONSEP: Tipe enumerasi data adalah tipe data yang didefinisikan oleh programer. Tipe data ini terdiri-dari konstanta-konstanta, yang dikenal dengan enumerator, yang merepresentasikan nilai-nilai integer.

Kadangkala, di dalam sebuah program, Anda memerlukan suatu cara untuk merepresentasikan nilai-nilai yang tidak dapat disimpan di memori dengan cara yang sederhana. Misalnya, Anda sedang menuliskan sebuah program yang bekerja dengan nama-nama hari (Minggu, Senin, Selasa, dan seterusnya), dan Anda memerlukan suatu cara untuk merepresentasikan setiap hari di dalam memori. Salah satu solusinya adalah dengan menetapkan integer 0 sampai 6 untuk merepresentasikan nama-nama hari; 0 dapat merepresentasikan Minggu, 1 dapat merepresentasikan Senin, dan seterusnya. Meskipun pendekatan ini dapat dilakukan, ia memiliki beberapa kekurangan.

Sebagai contoh, bagi mereka yang membaca kode hal itu tidak jelas. Selain itu, ketika Anda menetapkan Minggu sebagai hari pertama dari seminggu, orang lain bisa saja menetapkan Senin sebagai hari pertama. Ketika orang itu melihat nilai 0, ia bisa berpikir bahwa nilai itu merepresentasikan Senin.

Pendekatan yang lebih baik dalam menangani tipe data ini adalah dengan menciptakan tipe data enumerasi. Tipe data enumerasi adalah sebuah tipe data yang dapat Anda ciptakan. Ketika Anda menciptakan sebuah tipe data enumerasi, Anda menetapkan sejumlah nilai simbolik untuk tipe data itu. Berikut adalah salah satu contoh dari deklarasi tipe data enumerasi:

enum Hari{Minggu, Senin, Selasa, Rabu, Kamis, Jumat, Sabtu}

Deklarasi tipe data enumerasi diawali dengan katakunci enum, yang diikuti dengan nama tipe, yang diikuti dengna sejumlah pengenal di dalam kurung kurawal. Deklarasi tersebut menciptakan sebuah tipe enumerasi dengan nama Hari. Pengenal-pengenal Minggu, Senin, Selasa, Rabu, Kamis, Jumat, dan Sabtu, yang dicantumkan di dalam kurung kurawal, dikenal dengan enumerator.

Enumerator adalah konstanta yang merepresentasikan nilai integer. Ketika Anda mendeklarasikan sebuah tipe enumerasi, tiap enumerator ditugasi nilai integer, diawali dengan 0. Sebagai contoh, pada tipe data Hari, enumerator Hari.Minggu ditugasi nilai 0, enumerator Hari.Senin ditugasi nilai 1, dan seterusnya.

Sebuah deklarasi enum dapat dimunculkan pada tempat-tempat berikut:
·         Di luar namespace dari aplikasi.
·         Di dalam namespace dari aplikasi.
·         Di dalam sebuah kelas

Pada buku ini, Anda akan selalu menuliskan deklarasi num pada region yang sama: di dalam namespace aplikasi tetapi tidak di dalam sebuah kelas.

Setelah Anda menciptakan sebuah tipe enumerasi, Anda dapat mendeklarasikan variabel dengan tipe itu. Sebagai contoh, statemen berikut mendeklarasikan hariKerja sebagai sebuah variabel bertipe Hari:

Hari hariKerja;

Anda menamakan ini sebagai variabel enum. Karena hariKerja adalah variabel bertipe Hari, nilai-nilai yang ditugaskan kepadanya adalah enumerator-enumerator tipe Hari. Sebagai contoh, statemen berikut menugaskan nilai Hari.Rabu kepada variabel hariKerja:

hariKerja = Hari.Rabu;

Perhatikan bahwa Anda menugaskan Hari.Rabu, bukan hanya Rabu. Nama Hari.Rabu adalah nama lengkap dari enumerator Rabu dari tipe Hari.

Anda perlu menggunakan nama utuh enumerator karena dimungkinkan untuk memiliki enumerator yang sama pada beberapa tipe enumerasi. Berikut adalah salah satu contohnya:

Hari hariLibu = Hari.Sabtu;

Statemen ini mendeklarasikan sebuah variabel Hari dengan nama hariLibur dan menginisialisasinya dengan nilai Hari.Sabtu.

Kode berikut menunjukkan contoh lain. (Asumsikan bahwa form aplikasi memiliki sebuah kontrol tombol radio dengan nama tombolRadioSenin).

1
2
3
4
5
Hari hariTerseleksi;
if (tombolRadioSenin.Checked)
{
   hariTerseleksi = Hari.Senin;
}

Pada kode ini, baris 1 mendeklarasikan sebuah variabel Hari dengan nama hariTerseleksi. Statemen if pada baris 2 menentukan apakah kontrol tombolRadioSenin diseleksi atau tidak. Jika ya, statemen pada baris 4 akan menugaskan Hari.Senin pada variabel hariTerseleksi.

Anda dapat melakukan perbandingan variabel enum dengan enumerator. Kode berikut menunjukkan salah satu contoh. (Asumsikan hariTerseleksi adalah sebuah variabel Hari).

1
2
3
4
if (hariTerseleksi == Hari.Rabu)
{
   MessageBox.Show("Setengah minggu terlampaui!");
}

Statemen if pada baris 1 menentukan apakah variabel hariTerseleksi sama dengan Hari.Rabu atau tidak. Jika ya, baris 3 akan menampilkan sebuah kotak pesan.

Kode berikut menunjukkan bahwa sebuah variabel enum dapat diuji di dalam suatu statemen switch. (Asumsikan bahwa hariTerseleksi adalah sebuah variabel Hari).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
switch (hariTerseleksi)
{
   case Hari.Minggu:
      MessageBox.Show("Istrahat.");
      break;
   case Hari.Senin:
      MessageBox.Show("Kembali bekerja.");
      break;
   case Hari.Selasa:
      MessageBox.Show("Hari kerja biasa.");
      break;
   case Hari.Rabu:
      MessageBox.Show("Setengah minggu terlampaui.");
      break;
   case Hari.Kamis:
      MessageBox.Show("Hampir sampai.");
      break;
   case Hari.Jumat:
      MessageBox.Show("Hari kerja terakhir minggu ini!");
      break;
   case Hari.Sabtu:
      MessageBox.Show("Tidur larut hari ini.");
      break;
 }

Pada baris 1, statemen switch menguji variabel hariTerseleksi. Tergantung dari nilai dari variabel, program bercabang ke statemen case tertentu.

Menggunakan Metode ToString dari Enumerator atau dari Variabel enum
Enumerator dan variabel enum memiliki metode ToString. Ketika Anda memanggil metode ToString dari sebuah enumerator, ia akan menghasilkan nama dari enumerator sebagai suatu string. Sebagai contoh, kode berikut menampilkan string “Minggu” pada sebuah kotak pesan:

MessageBox.Show(Haru.Minggu.ToString());

Ketika Anda memanggil metode ToString dari variabel enum, ia akan menghasilkan nama dari nilai yang dimuat variabel itu, sebagai suatu string. Sebagai contoh, kode berikut akan menampilkan string “Kamis” pada sebuah kotak pesan:

Hari hariIni = Hari.Kamis;
MessageBox.Show(hariIni.ToString());

Ketika Anda menggunakan operator + pada suatu string dan sebuah variabel enum, metode ToString dari variabel enum akan secara implisit dipanggil. (Hal yang sama terjadi ketika Anda menggunakan operator + pada suatu variabel int. Metode ToString dari variabel int akan secara implisit dipanggil). Berikut adalah salah satu contohnya:

Hari hariIni = Har.Kamis;
MessageBox.Show("Hari ini adalah hari " + hariIni);

Kode ini akan menampilkan string “Hari ini adalah hari Kamis” pada suatu kotak pesan.



Pada Tutorial 6.6, Anda akan menciptakan sebuah aplikasi yang menggunakan suatu tipe enumerasi untuk merepresentasikan sejumlah warna.

Tutorial 6.6: Menciptakan Aplikasi Spektrum Warna
Singkatan ROY G BIV umumnya dipakai untuk membantu mengingat runtun warna berikut: red, orange, yellow, green, blue, indigo, dan violet. Pada tutorial ini, Anda akan menciptakan apliksi Spektrum Warna, yang menampilkan warna-warna ini. Aplikasi akan menampilkan nama dari suatu warna ketika Anda mengkliknya.

Form aplikasi, yang telah diciptakan bagi Anda, ditampilkan pada Gambar 6.17. Warna-warna sebenarnya merupakan kontrol-kontrol Label dengan properti BackColor-nya ditetapkan menjadi warna tertentu.

Gambar 6.17 Form aplikasi Spektrum Warna


Langkah 1: Awali Visual Studio (atau Visual Studio Express).

Langkah 2: Buka kode dari form Form1 pada editor kode. Tuliskan deklarasi dari tipe enumerasi Spektrum, yang ditunjukkan pada baris 13-17 pada Program 6.7. Pastikan Anda menuliskan deklarasi itu di dalam namespace Spektrum_Warna, persis seperti ditunjukkan pada Gambar 6.7. Perhatikan bahwa enumerator-enumerator pada tipe Spektrum merepresentasikan warna-warna.

Langkah 3: Tuliskan komentar dan kode untuk metode TampilWarna, yang ditunjukkan pada baris 26-31 pada Program 6.6. Perhatikan pada baris 28 bahwa metode ini memiliki sebuah variabel parameter dengan tipe Spektrum. Ketika Anda memanggil metode ini, Anda melewatkan sebuah enumerator Spektrum sebagai argumen. Pada baris 30, nama dari enumerator  ditampilkan pada kontrol labelWarna.

Langkah 4: Selanjutnya, Anda menciptakan event handler Click untuk kontrol-kontrol Label. Kembali ke mode Designer dan klik ganda pada kontrol labelRed. Ini akan membuka kode editor, dan Anda akan melihat sebuah event handler kosong dengan nama labelRed_Click. Sempurnakan event handler ini dengan menuliskan statemen yang ditunjukkan pada baris 35 pada Program 6.7. Statemen ini memanggil metode TampilWarna, yang melewatkan enumerator Spektrum.Red sebagai argumen.

Langkah 5: Ulangi proses ini untuk kontrol-kontrol Label yang lain, dan tuliskan event handler Click untuk tiap kontrol itu pada Program 6.7.

Langkah 6: Simpan projek dan jalankan aplikasi. Ketika aplikasi dijalankan, klik pada salah satu warna yang ditunjukkan pada form untuk memastikan bahwa aplikasi telah bekerja dengan benar.

Program 6.7 Kode utuh untuk form Form1 pada aplikasi Spektrum Warna
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
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 Spektrum_Warna
{
    enum Spektrum
    {
        Red, Orange, Yellow, Green,
        Blue, Indigo, Violet
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Metode TampilWarna menampilkan
        //nama dari sebuah warna.
        private void TampilWarna(Spektrum warna)
        {
            labelWarna.Text = warna.ToString();
        }

        private void labelRed_Click(object sender, EventArgs e)
        {
            TampilWarna(Spektrum.Red);
        }

        private void labelOrange_Click(object sender, EventArgs e)
        {
            TampilWarna(Spektrum.Orange);
        }

        private void labelYellow_Click(object sender, EventArgs e)
        {
            TampilWarna(Spektrum.Yellow);
        }

        private void labelGreen_Click(object sender, EventArgs e)
        {
            TampilWarna(Spektrum.Green);
        }

        private void labelBlue_Click(object sender, EventArgs e)
        {
            TampilWarna(Spektrum.Blue);
        }

        private void labelIndigo_Click(object sender, EventArgs e)
        {
            TampilWarna(Spektrum.Indigo);
        }

        private void labelViolet_Click(object sender, EventArgs e)
        {
            TampilWarna(Spektrum.Violet);
        }
    }
}


Membaca Nilai Integer dari Variabel enum atau Enumerator
Anda tidak dapat menugaskan sebuah enumerator secara langsung kepada suatu variabel, tetapi Anda dapat mengkonversinya menjadi tipe integer ekivalennya menggunakan operator cast. Berikut adalah salah satu contohnya:

int nilai = (int)Hari.Jumat;

Statemen ini mendeklarasikan sebuah variabel int dengan nama nilai dan menginisialisasinya dengan nilai integer Hari.Jumat. Setelah statemen ini dieksekusi, nilai akan bernilai 5. Berikut diberikan contoh lain:

Hari hariKerja = Hari.Senin;
int nilai = (int)hariKerja;

Statemen pertama mendeklarasikan sebuah variabel Hari dengan nama hariKerja, yang diinisialisasi dengan Hari.Senin. Statemen kedua mendeklarasikan sebuah variabel int dengan nama nilai dan menginisialisasinya dengan nilai integer dari variabel hariKerja. Setelah statemen ini dieksekusi, nilai akan bernilai 1.

Menetapkan Nilai Integer untuk Enumerator
Secara default, enumerator-enumerator pada sebuah tipe data enumerasi ditugasi nilai integer 0, 1, 2, dan seterusnya. Jika tidak sesuai dengan keinginan Anda, Anda dapat menetapkan nilai-nilai yang akan ditugaskan, seperti pada contoh berikut:

enum Air {Beku = 0, Didih = 100}

Pada contoh ini, enumerator Air.Beku ditugasi nilai integer 0 dan enumerator Air.Didih ditugasi nilai integer 100.

Nilai-nilai integer yang Anda tugaskan kepada enumerator-enumerator tidak harus unik. Sebagai contoh, kode berikut menunjukkan sebuah tipe enumerasi dengan nama HariBulan. Enumerator-enumeratornya adalah Januari, Februari, Maret, dan seterusnya. Perhatikan bahwa nilai-nilai yang ditugaskan kepada enumerator-enumerator adalah jumlah hari pada bulan tertentu (Januari memiliki 31 hari, Februari memiliki 28 hari, dan seterusnya). Tipe data ini dapat dimunculkan pada suatu aplikasi yang menggunakan banyak hari pada tiap bulan:

1
2
3
4
5
6
7
enum HariBulan
{
   Januari = 31, Februari = 28, Maret = 31,
   April = 30, Mei = 31, Juni = 30,
   Juli = 31, Agustus = 31, September = 30,
   Oktober = 31, November = 30, Desember = 31
}


Membandingkan Enumerator dan Variabel enum
Sebelumnya, Anda telah melihat bahwa enumerator dan variabel enum dapat dibandingkan menggunakan operator ekualitas (==). Anda dapat membandingkan enumerator dan variabel enum menggunakan operator relasional yang lain. Sebagai contoh, dengan menggunakan tipe data Hari yang telah didiskusikan sebelumnya, ekspresi berikut bernilai true:

Hari.Jumat > Hari.Senin

Ekspresi ini bernilai true karena enumerator Hari.Jumat disimpan di memori sebagai nilai 5 dan enumerator hari.Senin disimpan 1. Kode berikut menampilkan pesan “Jumat lebih besar dari Senin”:

1
2
3
4
if (Hari.Jumat > Hari.Senin)
{
   MessageBox.Show("Jumat lebih besar dari Senin");
}

Kode berikut menampilkan contoh lain yang membandingkan dua variabel enum. Kode ini menampilkan pesan “Jumat lebih besar dari Senin”:

1
2
3
4
5
6
7
Hari hari1 = Hari.Jumat;
Hari hari2 = Hari.Senin;

if (hari1 > hari2)
{
   MessageBox.Show(hari1 + " lebih besar dari " + hari2);
}

Enumerator dan variabel enum dapat dibandingkan secara langsung dengan nilai integer. Sebagai contoh, kode berikut menampilkan pesan “Minggu sama dengan nol”:

1
2
3
4
if (Hari.Minggu == 0)
{
   MessageBox.Show("Minggu sama dengan nol");
}

Menggunakan Variabel enum untuk Menjejak Elemen-Elemen Array
Karena enumerator merepresentasikan nilai integer, ia dapat dipakai di dalam suatu loop untuk menjejak elemen-elemen dari sebuah array. Sebagai contoh, lihat pada kode berikut:

1
2
3
4
5
6
7
8
decimal[] penjualan = { 1000, 2000, 3000, 4000,
  5000, 6000, 7000 };

for (Hari jumHari = Hari.Minggu; jumHari <= Hari.Sabtu; jumHari++)
{
   MessageBox.Show("Penjualan untuk " + jumHari + " sebesar Rp. " +
      penjualan [(int)jumHari].ToString());
}

Baris 1 dan baris 2 menciptakan sebuah array decimal dengan nama penjualan. Loop for yang diawali pada baris 4 menggunakan sebuah variabel dengan nama jumHari sebagai pencacah loop.



6.5 Kontrol ImageList
KONSEP: Kontrol ImageList dapat Anda pakai untuk menyimpan koleksi citra. Saat aplikasi dijalankan, Anda dapat membaca sebuah citra dari kontrol ImageList dan menampilkannya pada kontrol PictureBox.

Kontrol ImageList adalah sebuah kontainer yang dapat menampung sejumlah citra. Seperti diimplikasikan dari namanya, ia merupakan suatu daftar citra. Anda dapat menggunakan indeks untuk membaca citra dari kontrol ImageList dan menampilkannya pada kontrol PictureBox.

Ada beberapa panduan yang perlu diikuti ketika Anda berencana menggunakan kontrol ImageList pada aplikasi:
·         Semua citra yang disimpan di dalam sebuah kontrol ImageList harus berukuran sama.
·         Citra-citra yang disimpan di dalam sebuah kontrol ImageList tidak lebih besar dari ukuran 256 x 256 piksel.
·         Semua citra yang disimpan di dalam sebuah kontrol ImageList harus dengan format yang sama (.bpm, .jpg, atau lainnya).

Meskipun panduan ini tampak membatasi, Anda perlu mengingat bahwa kontrol ImageList didesain untuk menyimpan citra-citra kecil seperti ikon atau thumbnail.

Anda akan mendapati kontrol ImageList pada bagian Components pada jendela Toolbox. Ketika Anda mengklik ganda ikon ImageList tesebut, sebuah kontrol ImageList diciptakan pada area di bawah Designer. (Kontrol ImageList tidak ditampilkan pada form). Gambar 6.18 menunjukkan salah satu contoh. Ketika Anda menciptakan kontrol ImageList, ia diberikan nama default seperti imageList1, imageList2, dan seterusnya.


Gambar 6.18 Sebuah kontrol ImageList


Setelah Anda menciptakan sebuah kontrol ImageList, Anda dapat mengatur properti ImageSize menjadi ukuran citra yang ingin Anda simpan di dalam kontrol itu. Ukuran defaultnya adalah 16, 16. Anda dapat mengatur properti ImageSize menjadi sembarang nilai dari 0,0 sampai 256,256. (Jika nilai dari properti ImageSize tidak sesuai dengan ukuran dari citra-citra yang disimpan di dalam kontrol, citra-citra itu akan ditampilkan terdistorsi).

Kemudian, Anda dapat menggunakan properti Images untuk menambahkan citra-citra pada kontrol. Pada jendela Properties, klik tombol elipsis (…) yang ditampilkan di samping dari properti Images. Ini akan menampilkan jendela Images Collection Editor yang ditunjukkan pada Gambar 6.19. Klik pada tombol Add, dan sebuah kotak dialog Open akan ditampilkan. Gunakan kotak dialog untuk mencari dan memilih citra file (atau beberapa citra file) yang ingin Anda tambahkan pada kontrol ImageList.

Gambar 6.19 Jendela Images Collection Editor

Gambar 6.20 menunjukkan jendela Images Collection Editor setelah sejumlah cira ditambahkan. Perhatikan bahwa nilai indeks ditampilkan di samping tiap nama citra. Anda akan menggunakan nilai indeks ini nanti untuk membaca citra dari kontrol ini.

Gambar 6.20 Dua puluh citra ditambahkan pada kontrol ImageList


Jika Anda mengetahui nilai indeks dari citra tertentu, Anda dapat membaca citra itu dari kontrol ImageList dan menampilkannya pada PictureBox. Kode berikut menunjukkan salah satu contoh. Asumsikan bahwa kuImageList adalah nama dari kontrol ImageList dan kuPictureBox adalah nama dari kontrol PictureBox:

kuPictureBox.Image = kuImageList.Images[5];

Statemen ini membaca citra pada indeks 5 dari kuImageList dan menugaskannya kepada properti Images dari kontrol kuPictureBox. Hasilnya, citra itu ditampilkan pada PictureBox.

Pada kode, Anda dapat menentukan banyaknya citra yang disimpan di dalam sebuah kontrol ImageList dengan mendapatkan nilai dari properti Images.Count. Kode berikut menunjukkan salah satu contoh. Asumsikan bahwa kuImageList adalah nama dari sebuah kontrol ImageList dan banyakCitra adalah nama dari sebuah variabel int.

banyakCitra = kuImageList.Images.Count;

Pada Tutorial 6.7, Anda menciptakan sebuah aplikasi yang secara acak memilih citra-citra dari sebuah kontrol ImageList dan menampilkannya pada sebuah PictureBox.

Tutorial 6.7: Menciptakan Aplikasi Kartu Acak
Pada tutorial ini, Anda akan menciptakan aplikasi Kartu Acak, yang secara acak menampilkan citra dari tiap kartu poker yang diseleksi dari sebuah kontrol ImageList. Form aplikasi, yang telah disediakan bagi Anda, ditampilkan pada Gambar 6.21. Perhatikan bahwa kontrol PictureBox menampilkan salah satu citra kartu.

Langkah 1: Awali Visual Studio (atau Visual Studio Express).

Langkah 2: Pastikan form Form1 dibuka pada mode Designer. Gulung ke bawah pada jendela Toolbox sampai Anda melihat bagian Components, dan klik ganda pada kontrol ImageList. Ini akan menciptakan sebuah kontrol ImageList dengan nama imageList1, yang akan Anda lihat di bagian bawah form.

Gambar 6.21 Form aplikasi Kartu Acak


Langkah 3: Ubah nama dari kontrol imageList1 menjadi iLKartu.

Langkah 4: Setiap citra yang akan Anda tambahkan pada kontrol iLKartu adalah berukuran lebar 71 dan tinggi 96. Ubah properti ImageSize dari kontrol iLKartu menjadi 71,96.

Langkah 5: Selanjutnya, Anda menambahkan citra-citra pada kontrol iLKartu. Pada jendela Properties, klik tombol elipsis (…) yang ada di samping properti Images. Ini akan menampilkan jendela Images Collection Editor. Klik tombol Add, dan sebuah kotak dialog Open akan ditampilkan. Gunakan kotak dialog itu untuk menemukan dan memilih file citra.

Langkah 6: Sekarang Anda menciptakan event handler Click untuk kontrol tombolAmbilKartu. Klik ganda pada kontrol itu pada mode Designer. Ini akan membuka editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolAmbilKartu_Click. Sempurnakan event handler ini dengan menuliskan kode yang ditunjukkan pada baris 22-29 pada Program 6.8. Amati kode ini lebih dekat:
Baris 23: Statemen ini menciptakan sebuah objek Random, yang direferensi oleh variabel rand.

Baris 26: Statemen ini mendeklarasikan sebuah variabel int dengan nama indeks. Variabel ini diinisialisasi dengan sebuah nilai acak yang dihasilkan dari metode rand.Next. Perhatikan bahwa iLKartu.Images.Count dilewatkan sebagai argumen kepada metode. Hasilnya, Anda mendapatkan sebuah nilai acak dalam rentang 0 sampai, tetapi tidak termasukn, banyak citra di dalam kontrol.

Baris 29: Statemen ini menggunakan variabel indeks untuk membaca citra dari kontrol iLKartu dan menugaskannya kepada properti Image dari kontrol pbKartu. Hasilnya, citra akan ditampilkan pada kontrol PictureBox.

Langkah 7: Simpan projek dan jalankan aplikasi. Ketika aplikasi dijalankan, klik pada tombol Ambil Kartu beberapa kali untuk melihat citra-citra yang diseleksi secara acak.

Program 6.8 Kode utuh untuk form Form1 pada aplikasi Kartu 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
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 Kartu_Acak
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void tombolAmbilKartu_Click(object sender, EventArgs e)
        {
             //Menciptakan sebuah objek Random
            Random rand = new Random();

            //Membaca indeks acak
            int indeks = rand.Next(iLKartu.Images.Count);

             // Display a card.
            pbKartu.Image = iLKartu.Images[indeks];
        }
    }
}



No comments:

Post a Comment