Daftar Isi
Bagian 1, Tentang Excel Bagian 2, Fasilitas Pada Excel Bagian 3, Formula Dan Fungsi Bantu Bagian 4, Tools Pada Excel Bagian 5, Pengolahan Data Dengan Excel
2 11 20 24 32
Indoprog
Bagian 1
Tentang Excel Apa itu Excel Excel adalah salah satu software di keluarga Microsoft Office Excel merupakan software yang dikenal sebagai Spreadsheet. Apa itu Spreadsheet Suatu program interaktif yang berorientasi pada layar dimana memungkinkan pemakai untuk menempatkan data keuangan pada layar.
www.cogsci.princeton.edu/cgi-bin/webwn
Suatu type software aplikasi yang memungkinkan tulisan, angka dan fungsi-fungsi kompleks untuk dimasukan kedalam suatu matrix yang terdiri dari ribuan sel-sel tersendiri. Aplikasi tersebut akan mengubah hasil formula sebagaimana perubahan pada data angka. Menyediakan fungsi-fungsi matematika dan statistic, serta menghasilkan grafik.
www.pitt.edu/~document/glossary/glossary.html
Layar Excel
Cell
Horizontal scrollbar
Indoprog
Worksheet pada Excel terdiri dari 256 kolom, dan 65536 baris. Penamaan kolom mulai dari A,B,C, , Z, AA, AB, AC AZ, IV. Beberapa Worksheet pada Excel membentuk satu Workbook. Cell adalah perpotongan antara kolom dan baris. Penamaan Cell pada Excel
Cell A1
Penamaan Cell pada worksheet yang sama adalah dengan menyebut <namakolom><namabaris>. Contoh : A1, sel yang terletak pada kolom A baris 1 IV65536, sel yang terletak pada kolom IV baris 65536
Cell IV65536
Penamaan Cell dari worksheet yang lain adalah dengan menyebut <namasheet>!<namakolom><namabaris> Contoh : Sheet2!A1, sel yang terletak pada Sheet2 kolom A baris 1 Sheet3!A1, sel yang terletak pada Sheet3 kolom A baris 1 Penamaan Cell dari workbook yang berbeda adalah dengan menyebut [<namafile>]<namasheet>!<namakolom><namabaris> Contoh : [Training2.xls]Sheet1!A1, sel yang berada pada file Training2.xls Sheet1 kolom A baris 1.
Indoprog
Range A1:C10
Pada Worksheet yang sama Penamaan Range pada worksheet yang sama adalah dengan menyebut <namacell_kiriatas>:<namacell_kananbawah> Contoh : A1:C10, adalah range yang dimulai dari A1 s/d C10 Pada Worksheet yang berbeda Penamaan Range dari worksheet yang berbeda adalah dengan menyebut <namasheet>!<namacell_kiriatas>:<namacell_kananbawah> Contoh : Sheet2!A1..C10, adalah range yang berada di Sheet2 dari A1 s/d C10 Pada Workbook yang berbeda Penamaan Range dari workbook yang berbeda adalah dengan menyebut [namafile]<namasheet>!<namacell_kiriatas>:<namacell_kananbawah> Contoh : [Traning2.xls]Sheet1!A1..C10, adalah range yang berada di file Training2.xls, Sheet1 dari A1 s/d C10. Penamaan Range 3D pada Excel Pada umumnya kita terbiasa bekerja dengan range 2D, tetapi Excel juga menyediakan kemampuan range 3D, adapun penamaannya adalah sebagai berikut : <namasheet_awal>:<namasheet_akhir>!<namacell_kiriatas>:<namacell_kananba wah> Contoh : Sheet1:Sheet3!A1:C10, adalah range mulai dari Sheet1 s/d Sheet3 dari A1 s/d C10. Cukup rumit bukan ?
Indoprog
Memindahkan Cell pointer Cara yang paling mudah untuk memindahkan Cell pointer adalah dengan menggunakan bantuan mouse. Anda dapat juga menggunakan tombol maupun kombinasi tombol berikut untuk memindahkan Cell pointer.
Tombol Up Down Left Right Ctrl+Home Ctrl+Left Ctrl+Down Ctrl+Up Ctrl+Right Ctrl+PgUp Ctrl+PgDn F5
Isikan alamat cell yang ingin dituju, dan klik pada Ok.
Indoprog
Dengan menggunakan mouse Klik pada drag tombol mouse mulai dari cell kiri atas range sampai dengan cell kanan bawah range. Dengan menggunakan keyboard Aktifkan ke cell kiri atas, tekan tombol shift (jangan dilepas), dan geser cell pointer sampai cell kanan bawah. Mengetik data di Excel Untuk mengetik data di Excel dapat dilakukan dengan memindahkan keaktifan Cell pointer ke Cell yang dimaksud, dan mengetikan data yang diinginkan serta diakhiri dengan Enter atau tombol arah. Type data pada Excel
Label
Excel mengenal empat type data yaitu : Label, Number, Logical dan Error. Pada saat anda melakukan Entri data, maka Excel secara otomatis akan menyesuaikan type data sesuai dengan jenis data yang anda ketik.
Number
Beberapa hal yang sering menyebabkan kesalahan dalam entry data di Excel : Mengetikan tanda Rp. dan pemisah ribuan untuk data numeric yang mewakili nilai uang sehingga mengakibatkan data tersebut menjadi type Label. Kesalahan pemakaian punctuation untuk data numeric yang memiliki decimal (pemakaian punctuation harus disesuaikan dengan regional setting anda) Format pengetikan tanggal harus disesuaikan dengan regional setting anda, apakah MM/DD/YY atau DD/MM/YY. Sesuatu hal yang perlu anda ketahui adalah Tanggal di Excel adalah berupa suatu data numeric yang format cellnya diset ke Date/Time. Tanggal di Excel dinyatakan sebagai jumlah hari sejak 1 January 1900.
Date merupakan numeric yang menunjukan jumlah hari sejak 1 january 1900
Waktu di Excel merupakan hasil bagi waktu terhadap 24 jam. Dalam hal ini instruktur perlu menunjukan apa yang dimaksud dengan pernyataan diatas.
Indoprog
Penyimpanan data pada Excel dapat dilakukan dengan melakukan klik pada toolbar Save, dan selanjutnya akan muncul dialiog box Save As
Pada saat Save, hal yang perlu diperhatian adalah Save In (folder dimana file akan disimpan), dan Filename (Nama file), dan Save as type (Type penyimpanan). Memproteksi file dengan password Salah satu fasilitas yang disediakan oleh Excel untuk penyimpanan data yang sifatnya rahasia adalah proteksi dengan password terhadap file. Untuk melakukan proteksi dapat dilakukan dengan klik pada Tools, dan pilih Properties. Untuk menyimpan file dengan nama baru, dapat digunakan menu File, dan pilihan Save As.
Indoprog
Berikan tanda Check pada Always create backup, kalau kita bertujuan menghasilkan backup file pada setiap penyimpanan data. Password to open, diisi dengan password untuk membuka file. Password to modify, diisi dengan password memodifikasi file Berikan tanda Check pada Read-only recommended kalau kita ingin memberikan pertanyaan readonly pada saat buka file. Jika isi file anda sangat rahasia, anda dapat melakukan klik pada Advanced untuk memiliki jenis metode enkripsi.
Teknologi Enkripsi
Sesuatu hal yang perlu anda perhatikan dalam melakukan proteksi file adalah pemilihan password. Dewasa ini diinternet tersedia berbagai software yang dapat membuka kembali file yang telah terproteksi dengan metode brute force. Langkah yang cukup bijaksana adalah memilih password dengan ukuran minimal 10 digit.
Indoprog
Pernahkan anda menggunakan Excel secara kompleks, artinya anda menggunakan formula yang berkaitan antara satu workbook dengan workbook lain. Sesuatu hal yang menjadi masalah adalah ketika kita ingin membuka kembali workbook tersebut satu per satu. Bagaimana kalau kita ingin sekali buka, maka semua workbook yang berkaitan juga ikut terbuka ? Jawabannya adalah menggunakan fasilitas Save Workspace pada Excel. Fasilitas ini dapat diaktifkan dengan menggunakan menu File, Save Workspace.
Berikan nama file workspace anda, dan klik pada Save. Sesuatu hal yang perlu diingat adalah bahwasannya file workspace WLW berisi informasi file-file yang membentuk workspace, sedangkan masing-masing workbook harus disimpan tersendiri dalam file XLS.
Indoprog
Bagian 2
Fasilitas pada Excel Delete, Cut, Copy dan Paste Salah satu fasilitas yang paling banyak dilakukan pada spreadsheet adalah Copy dan Move. Secara sederhana proses copy dan move dapat dilakukan dengan menggunakan toolbar
Cut (memotong isi cell/range ke clipboard) Copy (menduplikasi isi cell/range ke clipboard) Paste (memindahkan isi clipboard ke posisi cell pointer) Format painter (menduplikasi format cell/range ke lokasi baru)
Untuk mempercepat proses cut, copy dan paste, alangkah baiknya kalau anda menggunakan. Paste Special Salah satu fasilitas Paste yang jarang diketahui oleh pemakai adalah Paste Special. Fasilitas ini dapat diaktifkan dengan menu Edit, Paste Special.
Indoprog
10
Fasilitas Clear Fasilitas ini dapat digunakan untuk melakukan clear terhadap semua, isi ataupun format saja.
Fasilitas Undo Fasilitas Undo dan Redo adalah fasilitas yang paling menyenangkan di Excel, bayangkan jika anda membuat kesilapan dan dapat kembali keposisi semula, alangkah indahnya hidup ini. Fasilitas ini dapat diaktifkan dengan toolbar :
Catatan : Anda hanya dapat melakukan Undo/Redo sampai titik terakhir penyimpanan anda. Fasilitas Find and Replace Mencari data adalah pekerjaan yang cukup membosankan, apalagi kalau data yang ingin dicari berada dalam daftar yang cukup panjang. Tapi jangan pesimis terlebih dahulu, karena Excel sudah mengetahui kebutuhan anda, Cukup aktifkan menu Edit, Find atau Replace
Fasilitas Klik Kanan Kebanyakan kebutuhan anda dalam pemakaian Excel dapat terpenuhi dengan melakukan klik kanan. Jadi jika anda mencari sesuatu fasilitas pada Excel, biasakan untuk klik kanan terlebih dahulu. Shortcut klik kanan pada Cell
Indoprog
11
Cobalah menu Insert, Delete, Insert Comment, dan buatlah kesimpulan anda :
Jadi Ingat ! Apapun yang ingin anda lakukan, jika tidak tahu, maka klik kanan terlebih dahulu.
Toolbar Formatting Warna dan Cita rasa, itulah yang menjadi hidup ini indah. Dapatkah anda bayangkan kalau anda membuat laporan yang hanya terdiri dari data, alangkah membosankan bagi yang membacanya. Tetapi kalau anda mampu memberikan warna dan border, tentu saja laporan anda menjadi menarik bukan ?
Secara berturut-turut adalah sebagai berikut : Font Font Size Bold Italic Underline Align Left Center Align Right Merge and Center Currency Style Percent Style Comma Style Decrease Decimal Increase Desimal Decrease Indent Increase Indent Borders Fill Color Font Color Memilih jenis font Arial, Arial Black, Verdana, Times New Roman, dll Memilih ukuran font 10, 11, 12, 14, Cetak tebal (Ctrl B) Cetak Miring (Ctrl I) Garis bawah (Ctrl U) Rata kiri Rata tengah Rata kanan Pengabugan cell dan rata tengah Format uang $10,000,000.00 Format percent 10% Format koma 10,000,000.00 Mengurangi tempat decimal Menambah tempat desimal Mengurangi indent Manambah indent Membuat bingkai Membuat warna latar belakang Membuat warna tulisan
18, dst
Indoprog
12
Saya yakin anda pernah melakukan format nilai uang dengan menggunakan tanda mata uang, dengan menggunakan format Currency, tetapi ternyata hasilnya tidak rata dikanan.
Untuk format mata uang biasanya digunakan Klik kanan, format Cell, kemudian pilih Currency, dan
Tips, gunakan format Accounting, akan menghasilkan format mata uang yang rapi.
Indoprog
13
Anda dapat melakukan format terhadap suatu cell berdasarkan kondisi tertentu, misalnya data negative dengan warna merah, data positif dengan warna hitam. Untuk menggunakan conditional format, anda dapat menggunakan menu Format, dan klik pada Conditional Formatting.
Pembuatan Grafik
Pembuatan grafik di Excel dapat dilakukan dengan mudah, karena Excel telah menyediakan suatu Wizard, artinya siapkan data anda, aktifkan Wizard, maka akan menghasilkan grafik sesuai dengan keinginan anda. Contoh :
Buat range dari A3:F7 Klik pada toolbar Chart, dan otomatis akan muncul suatu chart Wizard.
Indoprog
14
Pilih jenis Chart yang diinginkan, misalnya Column dan klik pada Next
Selanjutnya anda dapat menentukan data range, dan series dan klik pada Next
Indoprog
15
Isikan Chart title, Category (X) axis, dan Value (Y) axis. Anda dapat juga mengatur Axes, Gridlines, Legend, Data Labels, dan Data Table. Lalu klik Next.
Pilih penempatan Grafik pada satu sheet tersendiri atau sebagai object pada sheet tertentu.
Jika anda perhatikan chart diatas, maka untuk Series Proyeksi Unit tidak nampak, hal ini terjadi karena adanya perbedaan data antara Unit dengan rupiah. Jadi Bagaimana ? Dalam hal ini kita bisa menggunakan fasilitas Secondary Axis, caranya. Pada Menu View, pilih Toolbar, dan pilih Chart untuk mengaktifkan toolbar Chart.
Indoprog
16
Klik pada seires Proyeksi Rupiah, sehingga penampilan dari toolbar Chart anda menjadi :
Pilih tab Axis, dan klik pada Secondary Axis, dan klik pada Ok
Indoprog
17
Dan akhirnya menghasilkan Grafik dengan dua Sumbu, dengan kombinasi Batang dan Garis.
Indoprog
18
Bagian 3
Formula dan Fungsi Bantu Membuat formula di Excel Formula merupakan salah satu fasilitas pada spreadsheet yang sangat mengagumkan. Pengetikan formula di Excel Formula di Excel dimulai dengan suatu tanda sama dengan (=), kemudian diikuti oleh suatu ekspresi. Contoh : =A1+A2, merupakan formula untuk menjumlahkan Cell A1 dan A2. Sesuatu hal yang penting dalam penulisan ekspresi adalah operator. Operator matematika ^ (pangkat), * (Kali), / (Bagi), + (Tambah), - (Kurang) Hal lain yang perlu diperhatikan adalah urutan operasi dan pemakaian kurung (). Pengaruh ekspresi formula terhadap Copy dan Move
Formula
Normalnya ekspresi formula yang mengandung alamat cell akan berubah secara relative terhadap proses Copy dan Move. Dalam hal ini instruktur perlu menunjukan apa yang dimaksud dengan pernyataan diatas.
Untuk membuat tanda Absolute dapat digunakan tanda $, atau dengan menekan F4 pada alamat cell dalam formula.
Indoprog
19
Contoh : $D$1, Nama cell tidak akan berubah pada operasi Copy maupun Move. $D1, Kolom cell tidak akan berubah, tetapi baris cell dapat berubah Fungsi Bantu pada Excel Excel merupakan alat Bantu kerja yang sangat efektif untuk pengolahan maupun analisa data. Beberapa fungsi Bantu yang sering digunakan : Fungsi Bantu Sum(Range) Average(Range) Count(Range) Max(Range) HyperLink(Link_location, Friendly_name) If(Logical_Test, Value if true, value if false) SumIf(Range, Criteria, Sum_Range) CountIf(Range, Criteria) AND(Logika1, Logika2, ) OR(Logika1, Logika2, ) Fungsi Mentotalkan data numeric dalam range Menghitung rata-rata data numeric dalam range Menghitung jumlah data numeric dalam range Mencari data numeric yang terbesar dalam range Membuat hyperlink ke alamat cell tertentu, dengan diwakili suatu nama Melakukan logika test, dan mengembalikan nilai sesuai dengan hasil logika test. Melakukan total terhadap Sum_Range dimana baris yang Range yang memenuhi Criteria. Menghitung jumlah baris di Range yang memenuhi Criteria. Menghasilkan operasi And terhadap Logika1, Logika2, , Logika N. Menghasilkan operasi Or terhadap Logika1, Logika2, , Logika N
Indoprog
20
Fungsi Bantu Pencarian Data VLOOKUP Mencari suatu nilai berdasarkan nilai kolom yang paling kiri dari suatu tabel, dan mengembalikan nilai dari baris yang bersesuaian dengan nomor kolom yang anda tentukan. VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) Contoh :
Indoprog
21
Indoprog
22
Bagian 4
Tools pada Excel Pemakaian Sheet Protection Sheet Protection adalah merupakan fasilitas pada Excel untuk melakukan proteksi terhadap sheet tertentu sehingga perubahan terhadap isi sheet tidak dapat dilakukan. Fasilitas ini dapat diaktifkan dengan menggunakan menu Tools, Protection, Protect Sheet. Isikan password yang akan digunakan untuk membebaskan kembali proteksi terhadap worksheet.
Selanjutnya jika anda ingin melakukan perubahan terhadap sheet yang telah diproteksi akan ditampilkan pesan :
Indoprog
23
Untuk menghilangkan proteksi terhadap suatu worksheet dapat menggunakan menu Tools, Protection, Unprotect Sheet.
Bagaimana kalau pada Sheet yang terproteksi kita ingin membuat beberapa Cell dapat diubah oleh pemakai ?
Bagaimana membuat Cell B2, B3, B6, dan B7 dapat diubah oleh pemakai, tetapi Cell lainnya terproteksi ? Klik kanan pada Cell B2, pilih format Cell, pada tab Protection hilangkan tanda Check pada Locked
Indoprog
24
Lakukan cara yang sama untuk Cell B3, B6, dan B7. Selanjutnya lakukan proteksi terhadap Sheet tersebut. Maka Cell B2, B3, B6 dan B7 tidak ikut terproteksi.
Indoprog
25
Goal seek merupakan salah satu fasilitas pada Excel untuk melakukan analisa "What if" pada data yang anda berikan. Sebagai contoh anda dapat menghitung jumlah DP (uang muka) pembelian sepeda motor secara KDS (Kredit Dana Sendiri) untuk menyesuaikan nilai cicilan perbulan, jika bunga kredit dan jangka waktu cicilan diketahui. Contoh kasus :
Berapa jumlah DP yang harus dibayar, jika cicilan/perbulan yang diinginkan adalah 85000 ? Maka, gunakan menu Tools, Goal Seek, dan isikan parameter berikut : Set cell : Isikan dengan alamat cell yang ingin ditentukan nilai tujuannya. To value : Isikan nilai tujuan By changing cell : Isikan alamat cell yang dicari.
Dan klik pada Ok, selanjutnya akan ditampilkan hasil perhitungan secara iterasi.
Indoprog
26
Indoprog
27
Scenario adalah suatu himpunan nilai yang disimpan oleh Microsoft Excel dan dapat disubsitusi secara otomatis kedalam worksheet. Anda dapat menggunakan scenario untuk memprediksi berbagai situasi yang berbeda dalam spreadsheet anda. Misalnya kita ingin membuat scenario perubahan tabel cicilan KDS, terhadap persentasi nilai DP, jika bunga kredit dan jangka waktu cicilan tetap.
Buatlah tiga scenario tabel cicilan untuk DP 50%, 40% dan 30% ! Maka pada menu Tools, pilih Scenarios
Indoprog
28
Indoprog
29
Isikan nilai cell berdasarkan scenario yang diinginkan. Lakukan langkah yang sama untuk DP 40% dan 30%, sehingga jendela Scenario Manager menghasilkan tampilan :
Selanjutnya anda dapat melakukan presentasi dengan menampilkan Scenario DP 50%, 40%, dan 30%, dengan melakukan klik pada Show.
Indoprog
30
Bagian 5
Pengolahan data dengan Excel Excel menyediakan berbagai fasilitas untuk memudahkan entry data, pengurutan data dan analisa data yang berada dibawah kelompok menu Data. Tips pengetikan data Jika anda mengetikan data dalam bentuk tabel, biasanya setelah anda mengetikan isi cell kemudian diikuti dengan tombol arah kesamping atau kebawah untuk berpindah ke cell berikutnya. Tips : Gunakan tombol Tab untuk berpindah ke kolom berikutnya, dan tombol Enter untuk ke baris berikutnya, kolom pertama. Menginput Data dalam bentuk Form Untuk penginputan data dalam jumlah besar dalam Excel adalah lebih mudah dilakukan dalam bentuk form. Contoh : Klik pada salah satu Cell Data anda, dan pada menu Data, pilih Form
Selanjutnya anda dapat melakukan berbagai aktifitas seperti New, Delete, Find dan lain-lain.
Indoprog
31
Mengurut Data Pengurutan data merupakan salah satu proses yang paling banyak digunakan dalam pengolahan data. Data yang berada dalam keadaan berurut akan memudahkan pencarian dan pengelompokan. Misalnya kita memiliki data DO dari AHM berikut ini yang berurut berdasarkan NomorDO:
Tampilkan data tersebut diatas dalam keadaan berurut berdasarkan KodeModel dan KodeWarna ? Select range data anda, kemudian pada menu Data, pilih Sort, dan isikan parameter berikut ini :
Indoprog
32
Aktifkan option My list has Header row Sort by, diisi dengan KodeModel Then by, diisi dengan KodeWarna Keterangan : Ascending : diurut dari kecil ke besar Descending : diurut dari besar ke kecil
Klik pada Ok, dan selanjutnya data telah berurut berdasarkan KodeModel dan KodeWarna.
Indoprog
33
Membatasi data (filter) Kadang-kadang kita ingin focus terhadap data dengan criteria tertentu saja, ataupun ingin melakukan pencarian data terhadap criteria tertentu, hal tersebut adalah mudah dilakukan dengan menggunakan Excel. Fasilitas AutoFilter. Fasilitas ini dapat diaktifkan dengan menu Data, Filter, dan AutoFilter. Batasi tampilan data untuk tanggal 1/10/2004 s/d 10/10/2004 untuk Kode Model BM0. Klik pada salah satu cell didalam range data. Pada Menu Data, Filter, pilih AutoFilter, sehingga akan ditampilkan AutoFilter pada masing-masing judul kolom data.
Isikan criteria yang diinginkan, dan klik Ok. Kemudian klik pada filter untuk kolom KodeModel dan pilih BM0.
Indoprog
34
Untuk menghilangkan Filter, gunakan menu Data, Filter, dan klik lagi pada AutoFilter. Fasilitas Advanced Filter Fasilitas Advanced Filter digunakan jika criteria filter cukup rumit, misalnya kita ingin melakukan filter terhadap KodeModel BM0 dan BF2 yang memiliki kolom jumlah 5 sampai 10. Buatlah Tabel Kriteria dengan isi sebagai berikut :
Kemudian pada menu Data, pilih Filter, dan Advanced Filter Catatan : Khusus untuk data tanggal harus menggunakan format nomor hari dalam penulisan criteria.
Klik pada Ok, otomatis data anda akan terfilter berdasarkan criteria yang dimaksud. Untuk menghilangkan efek Filter, gunakan menu Data, Filter, ShowAll.
Indoprog
35
Melakukan SubTotal Setelah pengurutan, maka kadang-kadang kita perlu melakukan total terhadap kolom numerik berdasarkan pengelompokan kolom tertentu. Totalkan kolom Jumlah, berdasarkan Kode Model dan Kode Warna ! Lakukan pengurutan terhadap data anda berdasarkan kolom KodeModel. Klik pada salah satu cell dalam range data anda. Pada Menu Data pilih Subtotal At each change in, di isikan dengan judul kolom pengelompokan data KodeModel Use function, pilih formula pengolahan data Sum Add subtotal to, berikan tanda check terhadap kolom yang akan dilakukan proses pengolahan. Beri tanda check pada Replace current subtotals Beri tanda check pada Summary below data.
Setelah anda klik pada Ok, maka akan ditampilkan sub total pada kolom Jumlah.
Selanjutnya adalah melanjutkan proses sub total berdasarkan KodeWarna. Klik pada salah satu cell dalam range data anda.
Indoprog
36
At each change in, di isikan KodeWarna Use function, pilih formula pengolahan data Sum Add subtotal to, berikan tanda check terhadap kolom yang akan dilakukan proses pengolahan. Buang tanda check pada Replace current subtotals Beri tanda check pada Summary below data.
Setelah klik pada Ok, maka Subtotal menjadi dua tingkat yaitu berdasarkan KodeModel Per KodeWarna.
Untuk menghilangkan Subtotal dapat menggunakan tombol RemoveAll pada dialog Subtotal.
Indoprog
37
Membatasi pemasukan data Kadang-kadang kita merancang suatu form untuk diisi oleh orang lain, dan untuk mengurangi kesalahan operator, kita dapat membatasi type dan range data serta informasi yang dapat di masukkan pada suatu range tertentu.
Batasi data yang dapat dimasukan pada cell B2 adalah numeric antara 10% s/d 40%, dengan keterangan Bunga/bulan:Masukan bunga cicilan/perbulan, dan pesan kesalahan Periksa lagi:Nilai yang diperbolehkan adalah 10% s/d 40% Klik pada Cell B2. Pada menu Data, pilih Validation
Indoprog
38
Indoprog
39
Dan akan menampilkan pesan kesalahan kalau data yang dimasukan tidak memenuhi criteria yang telah ditentukan.
Membuat Drop Down List Pengisian pada Cell Misalnya anda memiliki ingin membuat drop down list pada saat pengetikan kolom status. Caranya : Select Range pada kolom status. Pada Menu Data, pilih validation Pada kolom Allow, pilih List Kemudian pada Source isikan A2:A9
Indoprog
40
Melakukan Analisa Data dengan Data Table Kadang-kadang kita ingin melakukan analisa data dengan kombinasi perubahan terhadap dua parameter. Misalnya kita ingin membuat analisa pengaruh Perubahan Hutang Pokok dan DP terhadap nilai cicilan bulanan dalam bentuk tabel sebagai berikut.
Kemudian lakukan select range B8:G12 Pada Menu Data, pilih Table Isikan Row input cell : B4 Isikan Column input cell : B3 Dan Klik pada Ok.
Indoprog
41
Melakukan Analisa Data dengan Pivot Table Pivot table merupakan suatu fasilitas pada Excel yang sangat mengagumkan. Bagi pemakai yang sering melakukan analisa data berdasarkan pengelompokan data terhadap baris dan kolom, maka pivot table merupakan pilihan yang tepat. Lakukan analisa data DO berdasarkan KodeModel dan KodeWarna, dimana ditampilkan jumlah unit per tanggal !
Klik pada salah satu cell range data Pada Menu Data, pilih Pivot Table and Pivot Chart Report, dan selanjutnya akan muncul Pivot Table Wizard.
Indoprog
42
Indoprog
43
Klik pada Ok, dan Klik pada Finish, dan selanjutnya akan ditampilkan Pivot Table pada suatu Sheet baru.
Indoprog
44
Hendra, S.T.
Buku ini membahas tentang bahasa pemrograman Visual Basic .Net, dan ditujukan kepada siapa saja yang serius untuk mempelajari bahasa pemrograman VB.Net. Untuk memfokuskan pada bahasa VB.Net, buku ini akan menggunakan pendekatan program Console, sehingga fokus pembelajaran lebih terfokus kepada bahasa itu sendiri. Untuk mempelajari buku ini anda tidak perlu menginstalasi Visual Studio .Net, tetapi anda cukup menginstalasi .Net Framework yang dapat didownload secara gratis dari website Microsoft. Semua contoh dan latihan dibuku ini dapat dikompilasi langsung dari Dos prompt dengan menggunakan kompiler Visual Basic yang langsung tersedia setelah anda menginstalasi .Net Framework.
INDOPROG
Hendra, S.T.
Ketiklah program diatas dengan text editor (notepad pada Windows ataupun edit pada Dos Prompt), dan kemudian simpan dengan nama hello.vb (anda wajib menyimpannya dengan ekstension .vb).
Proses Kompilasi
Agar program yang kita buat diatas dapat dijalankan oleh komputer, maka diperlukan suatu kompiler untuk menterjemahkan perintah-perintah yang telah kita buat menjadi instruksi yang dapat dikenali oleh sistem komputer. Kompiler Visual Basic dapat diperoleh dengan melakukan instalasi Microsoft .NET framework sdk v1.1. Sesaat setelah instalasi .NET framework, maka kompiler VB telah tersedia pada komputer anda, dan proses kompilasi dapat dilakukan dengan : 1. Mengatur path environment pada Command Prompt path=%path%;c:\windows\microsoft.net\framework\v1.1.4322 2. Selanjutnya anda dapat mengkompilasi program anda dengan perintah : Vbc <nama file>.vb Pada saat kompilasi, anda wajib menulis lengkap nama file dan ekstension Contoh :
vbc hello.vb Microsoft (R) Visual Basic .NET Compiler version 7.10.3052.4
INDOPROG
Hendra, S.T.
for Microsoft (R) .NET Framework version 1.1.4322.573 Copyright (C) Microsoft Corporation 1987-2002. All rights reserved.
Jika proses kompilasi tidak menampilkan adanya kesalahan, maka akan terbentuk suatu hello.exe yang dapat dijalankan langsung pada Command Prompt. Sesuatu hal yang perlu anda pahami adalah file hello.exe hanya dapat dijalankan pada komputer yang sudah terinstalasi Microsoft .NET framework. Kemudian suatu hal yang perlu anda ketahui adalah file hello.exe bukanlah berisi binari yang merupakan kode mesin, melainkan merupakan binari yang berisi Intermediate Language (IL) yang pada saat dijalankan akan dikompilasi menjadi bahasa mesin oleh kompiler Just In Time (JIT) yang terdapat pada Common Language Runtime (CLR) yang merupakan salah satu komponen dari .NET framework.
Option Statements
Perintah Option akan menentukan aturan dasar penanganan kode dalam program pada saat kompilasi. Option Explicit Option Explicit On/Off, menentukan apakah variabel-varibel yang digunakan dalam program harus dideklarasikan terlebih dahulu atau tidak (defaultnya adalah On). Contoh :
Option Explicit Off Module Modmain Sub Main() a = 100000 End Sub End Module
Yang jika di kompilasi tidak menyebabkan kesalahan walaupun variabel a tidak pernah dideklarasikan.
Option Explicit On
INDOPROG
Hendra, S.T.
Agar terhindar dari kesalahan maka variabel a harus dideklarasikan terlebih dahulu sesuai dengan setting Option Explicit On.
Option Explicit On Module Modmain Sub Main() Dim a As Integer a = 100000 End Sub End Module
Option Strict Option Strict On/Off, menentukan apakah kompiler memperbolehkan konversi nilai implicit yang berpotensi menyebabkan kehilangan data (default adalah Off), misalnya kita memasukan nilai dari suatu variabel dengan tipe data yang lebih lebar ke variabel dengan tipe data yang lebih sempit (lihat pada kolom nominal storage allocation pada tabel tipe data). Contoh :
Option Option Module Sub Explicit On Strict On Hello Main() Dim a As Integer Dim b As Short a = 100000 b = a End Sub End Module
INDOPROG
Hendra, S.T.
Yang jika dikompilasi akan menyebabkan pesan kesalahan berikut ini karena variabel b yang bertipe short (16 bit), tidak dimungkinkan menampung nilai dari tipe integer (32 bit), yang memiliki potensi kehilangan data pada saat runtime, sehingga pemakaian Option Strict On akan menampilkan pesan kesalahan pada saat kompilasi.
Microsoft (R) Visual Basic .NET Compiler version 7.10.3052.4 for Microsoft (R) .NET Framework version 1.1.4322.573 Copyright (C) Microsoft Corporation 1987-2002. All rights reserved. D:\BELAJA~1\coba.vb(8) : error BC30512: Option Strict On disallows implicit conversions from 'Integer' to 'Short'. b = a ~
Maka pada saat kompilasi tidak terjadi kesalahan, tetapi pada saat runtime akan menimbulkan runtime error (System.OverflowException), karena variabel a yang bertipe short hanya memiliki jangkauan daya tampung dari -32767 s/d 32768.
INDOPROG
Hendra, S.T.
Option Compare Perintah Option Compare Binary/Text akan menentukan bagaimana bertipe data string akan dibandingkan antara satu dengan lainnya (default adalah Binary). Adapun aturan perbandingan pada masing-masing setting adalah sebagai berikut : Pada Option Compare Binary : A < B < E < Z < a < b < e < z < < < < < < Pada Option Compare Text : (A=a) < (= ) < (B=b) < (E=e) < (= ) < ( = ) < (Z=z)
Contoh :
Option Compare Binary Module Hello Sub Main() Dim a,b As String a = "ABC" b = "abc" System.Console.WriteLine(a = b) End Sub End Module
'False
Yang jika dijalankan akan menghasilkan False, karena perbandingan data berdasarkan nilai biner dari masing-masing data string (lihat aturan untuk Binary).
INDOPROG
Hendra, S.T.
Tetapi jika :
Option Compare Text Module Hello Sub Main() Dim a,b As String a = "ABC" b = "abc" System.Console.WriteLine(a = b) End Sub End Module
'True
Yang jika dijalankan akan menghasikan True, karena sebagai text-nya "ABC" dianggap sama dengan "abc" tanpa melihat huruf besar atau kecil (lihat aturan untuk Text).
Imports Statements
Perintah Imports berfungsi memudahkan pengetikan tanpa harus mengetik nama class didalam namespace yang di import. Contoh :
Module Hello Sub Main() System.Console.WriteLine("Hello World !") End Sub End Module
Yang setelah adanya Imports System penulisan Console.WriteLine menjadi sebagai berikut.
Imports System Module Hello Sub Main() Console.WriteLine("Hello World !") End Sub End Module
Dalam hal ini kita tidak perlu lagi mengetik System.Console.WriteLine, tapi cukup Console.WriteLine, karena kita telah melakukan Imports System.
Main Procedure
Procedure Main merupakan titik awal dari program anda merupakan procedure yang pertama kali dieksekusi ketika anda menjalankan kode anda. Jadi apa yang ingin anda jalankan pertama kali pada program anda ditempatkan pada procedure main ini. Ada empat cara penulisan Main, yaitu sebagai Sub atau Function yang memiliki parameter atau tidak.
INDOPROG
Hendra, S.T.
Sub Main() Sub Main(ByVal CmdArgs() As String) Function Main() As Integer Function Main(ByVal CmdArgs() As String) As Integer
Bentuk procedure yang paling sering digunakan adalah Sub Main( ) seperti pada contoh yang sudah-sudah. Contoh Sub Main dengan parameter :
Imports System Module Hello Sub Main(ByVal CmdArgs() As String) Dim i As Integer Console.WriteLine("Jumlah Parameter :" & CmdArgs.Length()) For i = 0 to CmdArgs.Length()-1 Console.WriteLine("Parameter :" & i.ToString() & "adalah :" & CmdArgs(i)) Next End Sub End Module
Dalam hal ini kita menjalankan program Coba.exe pada command prompt dengan mengirim dua parameter yaitu kata Hello dan World yang dianggap sebagai array bertipe string. Catatan : Index Array dimulai dari 0, sehingga pada contoh diatas looping dimulai dari 0 s/d CmdArgs.Length()-1. Program yang menggunakan parameter jarang digunakan pada lingkungan Windows, dan sering digunakan pada program di lingkungan Console.
Pemberian komentar
Jika kita hari ini membuat program, dan pada saat yang sama semua logika serta rumusan dapat kita ingat dengan baik, tetapi bagaimana kalau kita membaca kembali program yang pernah kita buat untuk 3 bulan yang lalu, apakah anda masih mengingatnya ? Bagaimana kita membuat program kita mudah di pahami kembali ? Tentu saja dengan memberikan keterangan secukupnya.
INDOPROG
Hendra, S.T.
Pada Visual Basic pembuatan keterangan dapat menggunakan simbol ' (petik tunggal) maupun keyword REM. Contoh : ' Ini adalah keterangan REM Ini adalah keterangan
Type Data
Sebagaimana bahasa pemrograman lainnya, Visual Basic menyediakan berbagai type data yang dapat digunakan oleh pemrogram sesuai dengan konteks pemakaiannya. Type data pada Visual Basic dibagi atas dua kelompok besar yaitu Value Type (Tipe data primitif) dan Reference (String, Array dan Objek). Berikut ini adalah tabel tipe data pada VB disertai dengan alokasi storage yang dibutuhkan serta jangkauan nilai yang dapat ditampung oleh masing-masing tipe.
Visual Basic type Boolean Byte Char Date Decimal Common language runtime type structure System.Boolean System.Byte System.Char System.DateTime System.Decimal Nominal storage allocation 2 bytes 1 byte 2 bytes 8 bytes 16 bytes True or False. 0 through 255 (unsigned). 0 through 65535 (unsigned). 0:00:00 on January 1, 0001 through 11:59:59 PM on December 31, 9999. 0 through +/79,228,162,514,264,337,593,543,950,335 with no decimal point; 0 through +/7.9228162514264337593543950335 with 28 places to the right of the decimal; smallest nonzero number is +/-0.0000000000000000000000000001 (+/1E-28). -1.79769313486231570E+308 through -4.94065645841246544E-324 for negative values; 4.94065645841246544E-324 through 1.79769313486231570E+308 for positive values. -2,147,483,648 through 2,147,483,647. -9,223,372,036,854,775,808 through 9,223,372,036,854,775,807. Any type can be stored in a variable of type Object. -32,768 through 32,767. -3.4028235E+38 through -1.401298E-45 for negative values; 1.401298E-45 through 3.4028235E+38 for positive values. 0 to approximately 2 billion Unicode characters. Value range
8 bytes
Single System.Single (singleprecision floating-point) String (variablelength) UserDefined Type System.String (class)
Each member of the structure has a range determined by its data type and independent of the ranges of the other members.
INDOPROG
Hendra, S.T.
(structure)
Walaupun dewasa ini, memori dan media penyimpanan data tidak menjadi masalah seperti pada awal kelahiran komputer, tetapi hendaklah programmer bijaksana dalam pemakaian type data berkaitan dengan perfomance yang dihasilkan.
Deklarasi Variabel
Pemrogram yang baik tentu saja menggunakan pendekatan yang terstruktur dalam pengembangan program, salah satu ciri dari program yang terstruktur adalah mendeklarasikan semua variabel yang digunakan dalam program. Pada Visual Basic printah Dim digunakan untuk mendeklarasikan variabel dan memberikan nilai awal kepadanya. Contoh :
Dim Dim Dim Dim Harga, Jumlah As Single Kuantitas As Integer = 10 Lanjutkan As Boolean = True Keterangan As String = "Visual Studio .NET"
Catatan : Pada Visual Basic pemakaian variabel harus dideklarasikan terlebih dahulu, jika tidak anda akan mendapatkan kesalahan kompiler, karena default setting Explicit pada Visual Basic adalah Option Explicit On. Kemudian Jika anda tidak memberikan nilai awal pada suatu variabel pada dideklarasikan, maka nilai berikut akan diberikan sebagai nilai awal variabel tersebut :
0 untuk semua tipe data numerik (termasuk Byte). Binary 0 untuk Char. Nothing untuk semua tipe reference (termasuk Object, String, dan semua array). False untuk Boolean. 12:00 AM pada 1 Januari 1 untuk Date.
Sesuatu hal yang perlu anda perhatikan adalah daya tampung variabel berdasarkan tipe yang ditentukan, jika anda memasukan nilai diluar dari daya tampung variabel, suatu kesalahan overflow exception akan terjadi.
Konversi Tipe
Konversi Tipe pada Visual Basic dapat dilakukan secara Implicit maupun Explicit, konversi secara Implicit dilakukan tanpa menggunakan fungsi bantu casting tertentu seperti Cbool, Cbyte, Cchar, Cdate, Cdec, CDbl, Cint, CLng, Cobj, Cshort, CSng, CStr. INDOPROG
10
Hendra, S.T.
Contoh :
Module Test Sub Main() Dim intValue As Integer = 123 Dim longValue As Long = intValue Console.WriteLine(intValue & " = " & longValue) End Sub End Module
Pada konversi secara Implicit, setting Option Strict akan mempengaruhi apakah konversi dari tipe yang lebih lebar ke tipe yang lebih sempit (Misalnya dari Integer 32 bit ke Short 16 bit) diperbolehkan oleh kompiler atau tidak. Contoh berikut akan melakukan konversi dari Integer 32 bit ke Short 16 bit.
Option Strict On Option Explicit On Imports System Public Module ModKali Sub Main() Dim i, j As Byte Dim a As Integer = 40000 Dim b As Short b = a Console.WriteLine(b) End Sub End Module
INDOPROG
11
Hendra, S.T.
~ Hal tersebut dapat diperbaiki dengan menggunakan fungsi ToInt16 yang terdapat pada System.Convert yang artinya konversi memang dikehendaki oleh programmer Contoh :
Option Strict On Option Explicit On Imports System Public Module ModKali Sub Main() Dim i, j As Byte Dim a As Integer = 40000 Dim b As Short b = System.Convert.ToInt16(a) Console.WriteLine(b) End Sub End Module
Tetapi karena nilai 40000 tidak dapat ditampung oleh type data short, maka akan menghasilkan error pada saat runtime : System.OverflowException. Konversi data secara Explicit dapat juga memanfaatkan fungsi bantu casting yang terdapat pada Objek System Convert sebagai berikut :
Function
ToBoolean ToByte ToChar ToDateTime ToDecimal ToDouble ToInt16 ToInt32 ToInt64 ToSByte ToSingle ToString ToUInt16 ToUInt32 ToUInt64
Purpose
Converts a value to a Boolean (True or False). Converts a value to an 8-bit Byte in the range 0 to 255. Converts a value to a 2-byte Unicode character. Converts a value to a DateTime object. Converts a value to a 12-byte Decimal. Converts a value to an 8-byte Double. Converts a value to a 2-byte Short. Converts a value to a 4-byte Integer. Converts a value to an 8-byte Integer. Converts a value to an 8-bit signed value in the range 128 to 127. Converts a value to a 4-byte Single. Converts a value to its String representation. Converts a value to a 2-byte unsigned Short in the range 0 to 65,535. Converts a value to a 4-byte unsigned Integer in the range 0 to 4,294,967,295. Converts a value to an 8-byte unsigned long Integer in the range 0 to 18,446,744,073,709,551,615.
Catatan : Berdasarkan uji coba yang dilakukan fungsi bantu konversi tipe seperti Cint, Cdate, CSng,CDbl, Cdec dan kadang-kadang fungsi bantu konversi memiliki unjuk kerja yang lebih baik seperti yang ditunjukan oleh tabel berikut ini adalah hasil konversi dengan Integer.Pars, Convert.ToInt32, dibandingkan dengan CInt INDOPROG
12
Hendra, S.T.
String "12,500" "12" "12500" "12500.00" "$12,500.00" "$12,500.10" "&HFF" Error 12 12500 Error Error Error
Integer.Parse
Operator
Berdasarkan pengalaman pemrograman, pemakaian operator tidak dapat dilepaskan dari pekerjaan pemrograman, adapun operator pada Visual Basic adalah sebagai berikut : Operator aritmatika : *, /, \, ^, Mod, +, dan Operator relasi : =, <>, <, >, <=, and >= Catatan : Pada tipe data string, prilaku perbandingan sangat dipengaruhi oleh setting dari Option Compare. (default adalah Option Compare Binary) Pada Option Compare Binary : A < B < E < Z < a < b < e < z < < < < < < Pada Option Compare Text : (A=a) < (= ) < (B=b) < (E=e) < (= ) < ( = ) < (Z=z) Operator logika And, AndAlso, Or, OrElse, and Xor Catatan :
Jika operand pertama pada suatu operasi AndAlso adalah False, maka hasil ekspresi tersebut adalah False. Sebaliknya, suatu operasi logika And dilakukan terhadap kedua operand. Jika operand pertama dari operasi OrElse adalah True, maka hasil ekspresi adalah True. Sebaliknya, suatu operasi logika Or akan dilakukan terhadap kedua operand.
Operator pengabungan : & Operator bit shift : << dan >> Contoh :
Dim Pattern As Short = 192 ' Bit pattern is 0000 0000 1100 0000. Dim Result1, Result2, Result3, Result4, Result5 As Short
INDOPROG
13
Hendra, S.T.
Dim Pattern As Short = 2560 ' Bit pattern is 0000 1010 0000 0000. Dim Result1, Result2, Result3, Result4, Result5 As Short Result1 = Pattern >> 0 ' Result is 2560 (0000 1010 0000 0000). Result2 = Pattern >> 4 ' Result is 160 (0000 0000 1010 0000). Result3 = Pattern >> 10 ' Result is 2 (0000 0000 0000 0010). Result4 = Pattern >> 18 ' Result is 640 (0000 0010 1000 0000). Result5 = Pattern >> -1 ' Result is 0 (shifted 15 places to right).
Operator bit shift bekerja pada tingkat bit, yang artinya jika 192 pada tipe data short (desimal/basis sepuluh) maka representasinya dalam bentuk biner adalah 0000 0000 1100 0000 (16 bit). Kemudian hal lain yang perlu diketahui adalah bit mask untuk masing-masing tipe data adalah berbeda, berikut ini adalah tabel bitmask : LeftOperand Type SizeMask 7 (&H7) Byte 15 (&HF) Short 31 (&H1F) Integer 63 (&H3F) Long Perhatikan kembali contoh diatas
Dim Pattern As Short = 2560 ' Bit pattern is 0000 1010 0000 0000.
Perintah shift right 18 untuk tipe Short akan menghasilkan operasi yang sama dengan shift right 2 ( hasil operasi 18 And 15 = 2).
Result4 = Pattern >> 18 ' Result is 640 (0000 0010 1000 0000).
Karakter ? mewakili satu karakter sembarang. Karakter * mewakili tidak ada karakter atau sekumpulan karakter sembarang. Karakter # mewakili satu sembarang digit (09). Suatu daftar karakter dalam kurung siku ([ab ]) mewakili salah satu karakter dalam daftar tersebut. Suatu daftar dari karakter dalam kurung siku dan diawali dengan suatu tanda ! ([!ab ]) mewakili satu karakter yang tidak ada dalam daftar tersebut.
Contoh :
Dim myCheck As Boolean myCheck = "F" Like "F" myCheck = "F" Like "f" myCheck = "F" Like "FFF" Does "F" match "F"? Returns True. Does "F" match "f"? Returns False. Does "F" match "FFF"? Returns False.
INDOPROG
14
Hendra, S.T.
myCheck = "F" Like "[A-Z]" myCheck = "F" Like "[!A-Z]" myCheck = "a2a" Like "a#a" myCheck = "aM5b" Like "a[L-P]#[!c-e]"
Does "aBBBa" have a "a" at the beginning, an "a" at the end, and any number of characters in between? Returns True. Does "F" occur in the set of characters from A to Z? Returns True. Does "F" NOT occur in the set of characters from A to Z? Returns False. Does "a2a" begin and end with an "a" and have any single-digit number inbetween? Returns True. Does "aM5b" fit the following pattern: Begins with "a", has and character from the set L through P, followed byb any single-digit number, and finally contains any character excluded from the character set c through e. Returns True. Does "BAT123khg" fit the following pattern: Begins with "B", followed by any single character, followed by a "T" and finally zero or more characters of any type. Returns True Does "CAT123khg" fit the following pattern: Begins with "B", followed by any single character, followed by a "T" and finally zero or more characters of any type. Returns False.
Operator assignment : =, ^=, *=, /=, \=, +=, -=, <<=, >>=, &= Contoh : Dim a As Integer = 2 Dim b As Integer = 3 a += b // akan menghasilkan 5 pada variabel a, atau sama dengan a = a+b Catatan : Sesuatu hal yang penting bagi programmer pemula adalah memahami urutan operasi dari operator, pada Visual Basic menggunakan urutan operasi berikut ini : Operator Aritmatika dan Pengabungan Exponentiation (^) Unary negation () Multiplication and division (*, /) Integer division (\) Modulus arithmetic (Mod) Addition and subtraction (+, ), string concatenation (+) String concatenation (&) Arithmetic bit shift (<<, >>) Operator Perbandingan All comparison operators (=, <>, <, <=, >, >=, Like, Is, TypeOf...Is) Operator Logika dan Bitwise Negation (Not) Conjunction (And, AndAlso) Disjunction (Or, OrElse, Xor)
INDOPROG
15
Hendra, S.T.
Contoh :
Dim A, B, C, D, E, F, G As Double A = 3.0 B = 6.0 C = 4.0 D = 2.0 E = 1.0 F = A + B - C / D * E ' The previous line sets F to 7.0. Because of natural operator ' precedence, it is exactly equivalent to the following line: F = (A + B) - ((C / D) * E) ' The following line overrides the natural operator precedence: G = A + (B - C) / (D * E) ' The previous line sets G to 4.0.
Dengan memahami urutan operasi akan sangat membantu untuk menghindari kesalahan dalam penulisan rumus yang dapat menyebabkan logika error.
INDOPROG
16
Hendra, S.T.
INDOPROG
17
Hendra, S.T.
Masing-masing akan menghasilkan The The See See The The number is 10 result of 3 + 7 = 10 decimal 0.1 decimal 0.123456789 value is 001.23 value is 1234.57
Latihan :
1. Buatlah program untuk menghitung luas persegi panjang. Jawab :
Option Explicit On Public Module modmain Sub Main() Dim Panjang As System.Int32 Dim Lebar As System.Int32 Dim Luas As System.Int64 System.Console.Write("Masukkan Panjang :")
INDOPROG
18
Hendra, S.T.
atau
Option Explicit On Imports System Public Module modmain Sub Main() Dim Panjang As Integer Dim Lebar As Integer Dim Luas As Long Console.Write("Masukkan Panjang :") Panjang = Console.ReadLine() Console.Write("Masukan Lebar :") Lebar = Console.ReadLine() Luas = Panjang*Lebar Console.WriteLine("Luas Persegi Panjang adalah :" & Luas.ToString()) End Sub End Module
INDOPROG
19
Hendra, S.T.
Console.Write("Masukkan Jari-jari :") R = Console.ReadLine() Luas = PI * R^2 Console.WriteLine("Luas : {0, 10:f2}",Luas)'10 tempat 2 desimal End Sub End Module
INDOPROG
20
Hendra, S.T.
Contoh :
Option Explicit On Imports System Module ModIf Sub Main() Dim Nilai As Single Console.Write("Masukkan Nilai Akhir :") Nilai = Console.ReadLine() If Nilai >= 85 Then Console.WriteLine("A") ElseIf Nilai >= 70 Then Console.WriteLine("B") ElseIf Nilai >= 60 Then Console.WriteLine("C") ElseIf Nilai >= 25 Then Console.WriteLine("D")
INDOPROG
21
Hendra, S.T.
Perintah Select...Case
Jika statement If melakukan pemilihan berdasarkan kondisi, maka perintah Select melakukan pemilihan berdasarkan nilai ekspresi dengan syntax sebagai berikut :
Select [ Case ] testexpression [ Case expressionlist [ statements ] ] [ Case Else [ elsestatements ] ] End Select
Contoh :
Option Explicit On Imports System Module ModHari Sub Main() Dim Hari As Byte Console.Write("Masukkan No Hari :") Hari = Console.ReadLine() Select Case Hari Case 1 Console.WriteLine("Senin") Case 2 Console.WriteLine("Selasa") Case 3 Console.WriteLine("Rabu") Case 4 Console.WriteLine("Kamis") Case 5 Console.WriteLine("Jumat") Case 6 Console.WriteLine("Sabtu") Case 7 Console.WriteLine("Minggu") Case Else Console.WriteLine("No Hari tidak sah") End Select End Sub End Module
Contoh Lain :
Option Explicit On Imports System Module ModHari Sub Main()
INDOPROG
22
Hendra, S.T.
Perintah For...Next
Salah satu keunggulan komputer dibandingkan dengan manusia adalah dapat mengerjakan sesuatu secara berulang-ulang tanpa mengalami penurunan kualitas terhadap hasil kerja. Salah satu perintah perulangan di Visual Basic ada ForNext Statements yang merupakan perulangan dengan menggunakan sistem counter dengan menggunakan syntax sebagai berikut :
For counter [ As datatype ] = start To end [ Step step ] [ statements ] [ Exit For ] [ statements ] Next [ counter ]
Contoh : Dim I As Integer For I = 1 To 100 Console.WriteLine(I) Next I Atau For I As Integer = 1 To 100 Console.WriteLine(I) Next I 'Defaultnya Step 1 'Defaultnya Step 1
Akan mencetak daftar bilangan 1 s/d 100 Catatan : Dari segi looping pemakaian : Dim I As Integer INDOPROG
23
Hendra, S.T.
For I = 1 To 100 Console.WriteLine(I) Next I Tidak berbeda dengan For I As Integer = 1 To 100 Console.WriteLine(I) Next I
'Defaultnya Step 1
'Defaultnya Step 1
Tapi jika ditinjau dari lingkup pemakaian variabel, maka variabel I pada contoh pertama adalah variabel local Sub Main, sedangkan variabel I pada contoh kedua adalah variable local untuk blok looping. Contoh : Dim I As Integer For I = 1 To 100 Console.WriteLine(I) Next I Console.WriteLine(I) Sedangkan For I As Integer = 1 To 100 Console.WriteLine(I) Next I Console.WriteLine(I) 'Defaultnya Step 1 'Terjadi error pada saat kompilasi 'Defaultnya Step 1 'Akan tercetak 101
Dimana pesan error adalah error BC30451: Name I is not declared. Dim I As Integer For I = 1 To 100 Step 2 Console.WriteLine(I) Next I Akan mencetak daftar bilangan ganjil 1 s/d 99 Catatan : Step tidak selamanya harus berupa bilangan bulat, tetapi juga dapat berupa bilangan floating point. For I As Single = 1 To 10 Step 0.1 Console.WriteLine(I) Next I Akan mencetak daftar bilangan 1, 1.1, 1.2, 1.3, ,10
INDOPROG
24
Hendra, S.T.
Bagaimana dengan perulangan dari besar ke kecil ? Perulangan dari besar ke kecil dapat dilakukan dengan menentukan nilai Step negatif. Contoh : For I As Integer = 100 To 1 Step -1 Console.WriteLine(I) Next I Akan mencetak daftar bilangan 100, 99. 98, , 1 Dapatkah anda menerangkan fungsi dan contoh pemakaian Exit For ? Exit For merupakan perintah keluar dari looping tanpa bersyarat, artinya kalau perintah Exit For ditemukan maka proses program dilanjutkan ke perintah dibawah Next. Adapun contoh pemakaian Exit For adalah misalnya kita ingin membuat password dengan jumlah kesempatan coba sebanyak 3 kali.
Option Explicit On Imports System Module ModPass Sub Main() Dim I As Integer Dim Pass As String For I = 1 To 3 Step 1 Console.Write("Password :") Pass = Console.ReadLine() If Pass.ToUpper() ="INDOPROG" Then 'Jika Password Benar Exit For 'Keluar dari Looping End If Next I If I > 3 Then Console.WriteLine("Proses Login Gagal !") Else Console.WriteLine("Welcome !") End If End Sub End Module
Perintah Do...Loop
Jika perintah For Next melakukan looping berdasarkan counter, maka perintah Do Loop melakukan looping berdasarkan kondisi, adapun tata cara penulisannya adalah sebagai berikut :
Do { While | Until } condition [ statements ] [ Exit Do ] [ statements ]
Loop
INDOPROG
25
Hendra, S.T.
Atau
Do [ statements ] [ Exit Do ] [ statements ] Loop { While | Until }
condition
Perbedaan antara kedua struktur perulangan diatas adalah posisi pemeriksaan kondisi yang akan diuji, pada struktur yang pertama pengujian kondisi dilakukan sebelum statements dikerjakan, sedangkan pada struktur yang kedua pengujuan dilakukan setelah statement dikerjakan. Sebagaimana dengan Exit For, perintah Exit Do akan mengakhiri Looping tanpa bersyarat, yang artinya jika perintah Exit Do ditemukan, maka proses Looping akan segera dihentikan dan dilanjutkan ke Statement dibawah Loop. Contoh :
Option Explicit On Imports System Module DoLoop Sub Main() Dim Dat() As Integer Dim Jd,DTemp As Integer Jd = 0 Do Console.Write("Data Ke-{0} :", Jd+1) DTemp = Console.ReadLine() If DTemp <> 0 Then ReDim Preserve Dat(Jd) Dat(Jd) = DTemp Jd+=1 End If Loop Until DTemp = 0 'Ulangi sampai Dtemp diisi 0 For I As Integer = 0 To Jd-1 Console.WriteLine("Data Ke-{0} adalah {1}",I+1, Dat(I)) Next I End Sub End Module
Pada contoh diatas, mula-mula kita mendeklarasikan suatu array tanpa diikuti dengan ukuran, kemudian proses akan dilanjutkan dengan pembacaan data ke variabel Dtemp, dab jika nilai Dtemp bukan 0 (nol), maka ukuran array akan dialokasi ulang dengan perintah ReDim Preserve yang akan mempertahankan isi array, dan pembacaan data akan terus diulang sampai Dtemp diisi dengan 0 (nol).
INDOPROG
26
Hendra, S.T.
Selain struktur DoLoop, juga tersedia perintah perulangan dengan tata cara penulisan sebagai berikut.
While condition [ statements ]
End While Pada prinsipnya struktur While End While sama dengan Do While Loop.
Array pada Visual Basic merupakan collection pada System.Array, sehingga pemakaian perintah For Each akan mendapatkan elemen 0 s/d element terakhir dari array.
INDOPROG
27
Hendra, S.T.
Latihan :
1. Buatlah program mencetak tabel perkalian 1x1 = 1 s/d 10 x 10 = 100
Option Explicit On Imports System Public Module ModKali Sub Main() Dim i, j As Byte For i = 1 To 10 For j = 1 to 10 Console.WriteLine("{0,3} x {1,3} = {2,3}",i,j,i*j) Next j Next i End Sub End Module.
2. Buatlah program untuk konversi data desimal ke binary dengan pemakaian operator bit shift
Option Explicit On Imports System Module ModBiner Sub Main() Dim D As Integer Dim I As Short Console.Write("Bilangan Desimal :") D = Console.ReadLine() For I = 15 to 0 Step -1 If ((D >> I) And 1) = 1 Then Console.Write(1) Else Console.Write(0) End If Next End Sub End Module
3. Buatlah program yang menentukan bilangan bulat yang dimasukan pemakai Genap atau Ganjil. 4. Buatlah program yang menentukan tahun yang dimasukan pemakai termasuk tahun Kabisat atau bukan. 5. Buatlah program yang mencetak barisan bilangan fibonacci sesuai dengan jumlah suku yang ditentukan oleh pemakai. 6. Buatlah program yang menentukan bilangan bulat yang dimasukan pemakai Prima atau bukan.
INDOPROG
28
Hendra, S.T.
7. Buatlah program yang dapat mencetak faktor prima dari suatu bilangan bulat (Contoh 100 = 2 x 2 x 5 x 5)
INDOPROG
29
Hendra, S.T.
Array dapat juga diberi nilai awal pada saat deklarasi dengan penulisan sebagai berikut:
Private a As Integer() = { 0, 2, 4, 6, 8 }
INDOPROG
30
Hendra, S.T.
Private b As Integer(,) = { { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 }, { 8, 9 } }
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModArr Public Arr(3,3) As Integer Sub Main() Console.WriteLine(Arr.Length()) Console.WriteLine(Arr.LongLength()) Console.WriteLine(Arr.Rank()) End Sub End Module
GetLength GetLongLength
Mendapatkan jumlah elemen dalam Array pada dimensi tertentu (Integer 32-bit) Mendapatkan jumlah elemen dalam Array pada dimensi tertentu (Integer 64-bit)
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModArr
INDOPROG
31
Hendra, S.T.
'4 '4
GetLowerBound GetUpperBound
Mendapatkan nilai index batas bawah Array pada dimensi tertentu. Mendapatkan nilai index batas atas Array pada dimensi tertentu.
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModArr Public Arr(3,3) As Integer Sub Main() Console.WriteLine(Arr.GetLowerBound(0)) Console.WriteLine(Arr.GetUpperBound(0)) End Sub End Module IndexOf LastIndexOf Mendapatkan index paling awal dari nilai tertentu pada Array 1 dimensi. Mendapatkan index paling akhir dari nilai tertentu pada Array 1 dimensi.
'0 '3
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModArr Public Arr() As Integer = {0,1,2,3,4,3,2,1,0} Sub Main() Console.WriteLine(Array.IndexOf(Arr,3)) Console.WriteLine(Array.LastIndexOf(Arr,3)) End Sub End Module Reverse Membalik urutan element dalam suatu Array 1 dimensi.
'3 '5
Option Explicit On
INDOPROG
32
Hendra, S.T.
Sub Main() Dim I As Integer For I = Arr.GetLowerBound(0) To Arr.GetUpperBound(0) Console.Write(Arr(I)) '01234 Next I Console.WriteLine() Array.Reverse(Arr,0,4) For I = Arr.GetLowerBound(0) To Arr.GetUpperBound(0) Console.Write(Arr(I)) '43210 Next I End Sub End Module Sort Mengurut elemen dalam suatu Array 1 dimensi.
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModArr Public Arr() As Integer = {0,4,3,1,2} Sub Main() Dim I As Integer For I = Arr.GetLowerBound(0) To Arr.GetUpperBound(0) Console.Write(Arr(I)) '04312 Next I Console.WriteLine() Array.Sort(Arr,0,4) For I = Arr.GetLowerBound(0) To Arr.GetUpperBound(0) Console.Write(Arr(I)) '01234 Next I End Sub End Module
BinarySearch
Mencari Nilai tertentu pada suatu Array dengan algoritma Binary Search.
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModArr Public Arr() As Integer = {0,4,3,1,2} Sub Main() Dim Nilai = 3
INDOPROG
33
Hendra, S.T.
'2
Perintah ReDim
Perintah ReDim digunakan untuk mendefinisi ulang jumlah elemen pada Array dengan atau tanpa mempertahankan data array sebelumnya. ReDim [ Preserve ] name(boundlist) Preserve Sifatnya optional, jika digunakan maka data pada array tersebut akan dipertahankan pada array ukuran baru Contoh : Pada contoh berikut menggunakan perintah ReDim untuk mengalokasi ualang ukuran variabel array.
Dim I, MyArray() As Integer ReDim MyArray(5) For I = 0 To UBound(MyArray) MyArray(I) = I Next I ' Declare variable and array variable. ' Allocate 6 elements. ' Initialize array.
Perintah berikut mengubah ukuran dari array dengan mempertahankan isi elementnya.
ReDim Preserve MyArray(15) ' Resize to 16 elements.
Contoh berikut mengalokasi ulang array sesuai dengan data yang dimasukan pemakai :
Option Explicit On Imports System Module DoLoop
INDOPROG
34
Hendra, S.T.
Jd = 0 Do Console.Write("Data Ke-{0} :", Jd+1) DTemp = Console.ReadLine() If DTemp <> 0 Then ReDim Preserve Dat(Jd) Dat(Jd) = DTemp Jd+=1 End If Loop Until DTemp = 0 'Ulangi sampai Dtemp diisi 0 For I As Integer = 0 To Jd-1 Console.WriteLine("Data Ke-{0} adalah {1}",I+1, Dat(I)) Next I End Sub End Module
Perintah Erase
Perintah Erase digunakan untuk membebaskan array dan memory yang digunakan elemennya, dengan tata cara penulisan sebagai berikut :
Erase arraylist
Catatan Perintah Erase akan memberikan nilai Nothing ke variabel array. Contoh Pada contoh berikut menggunakan perintah Erase untuk membebaskan memori dua array (1000 dan 100 tempat elemen yang bersesuaian). Kemudian menggunakan perintah ReDim untuk memberikan ukuran baru untuk ketiga dimensi dari array.
Dim Int3DArray(9, 9, 9), Int2DArray(9, 9) As Integer ' ... Erase Int3DArray, Int2DArray ' ... ReDim Int3DArray(4, 4, 9)
INDOPROG
35
Hendra, S.T.
Pengolahan data array dapat juga menggunakan beberapa fungsi bantu yang berkaitan dengan array yang tersedia pada Namespace Microsoft.VisualBasic, berikut ini adalah beberapa fungsi bantu tersebut :
Fungsi IsArray
Mengembalikan nilai Boolean yang menunjukan apakah suatu variabel menunjuk pada suatu array. Pada contoh ini fungsi IsArray memeriksa apakah variabel-variabel mengacu pada suatu array.
Dim MyArray(4), YourArray(3) As Integer Dim MyString As String Dim MyCheck As Boolean MyCheck = IsArray(MyArray) MyCheck = IsArray(YourArray) MyCheck = IsArray(MyString) ' Declare array variables.
LBound Function
Mengembalikan index terendah untuk dimensi tertentu dari suatu array Pada contoh berikut menggunakan fungsi LBound untuk mendapatkan index terendah suatu dimensi dari array.
Dim Lowest, MyArray(10, 15, 20), AnyArray(6) as Integer Lowest = LBound(MyArray, 1) ' Returns 0. Lowest = LBound(MyArray, 3) ' Returns 0. Lowest = LBound(AnyArray) ' Returns 0.
Suatu Exception/Error akan terjadi kalau kondisi berikut ini ditemukan : Exception type ArgumentNullException RankException Error number 9 9 Condition Array is Nothing. Rank < 1 or Rank is greater than the rank of Array.
Fungsi UBound
Mengembalikan index yang terbesar dari suatu dimensi pada array. Pada contoh berikut menggunakan fungsi Ubound untuk menentukan index yang terbesar dari suatu dimensi pada array.
Dim Highest, MyArray(10, 15, 20), AnyArray(6) as Integer
INDOPROG
36
Hendra, S.T.
Catatan : Untuk memanfaatkan fungsi IsArray, Lbound dan Ubound anda perlu mencantumkan Imports Microsoft.VisualBasic Pada awal program
Latihan :
1. Buatlah program yang menbaca sejumlah data dari pemakain, dan menampilkan kembali dalam keadaan berurut dari kecil ke besar, nilai total, rata-rata, nilai terbesar, dan nilai yang terkecil dengan pemanfaatan array. 2. Perbaiki program diatas untuk menampilkan kembali dalam keadaan berurut dari besar ke kecil. 3. Tambahkan kemampuan program untuk mencari suatu nilai yang dimasukan dan menampilkan posisinya dalam array. 4. Buatlah program yang mencetak suatu segitiga Pascal.
INDOPROG
37
Hendra, S.T.
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module GenapGanjil Function IsGenap(x As Long) As Boolean If (x Mod 2) = 0 Then Return True Else Return False End If End Function REM program utama Sub Main() Dim bil As Long Console.Write("Masukan Bilangan :") bil = Console.ReadLine() If IsGenap(bil) Then Console.WriteLine("Bilangan {0} adalah Genap",bil) Else Console.WriteLine("Bilangan {0} adalah Ganjil",bil) End If End Sub End Module
Defaultnya parameter pada function dikirim secara ByVal, kadang-kadang kita menginginkan proses yang dapat mengembalikan lebih dari satu nilai yang mana dapat dipenuhi dengan menggunakan parameter yang dikirim secara ByRef.
INDOPROG
38
Hendra, S.T.
Misalnya kita ingin menghitung akar persamaan kuadrat dengan menggunakan rumus ABC. Yang mana X1 dan X2 yang kemungkinan akar imaginier, dimana function akan mengembalikan suatu nilai true (ada solusi) atau false (tidak ada solusi). Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module AkarKuadrat Function CariAkar(A as Long, B as Long ,C As Long, _ ByRef X1 as single ,ByRef X2 as single) As Boolean Dim D as Long D = B^2 - 4*A*C If D < 0 Then 'Akar Imaginier Return False 'Tidak ada solusi Else X1 = (-B + Math.Sqrt(D))/(2*A) 'argumen X1 X2 = (-B - Math.Sqrt(D))/(2*A) 'argumen X2 Return True 'Ada solusi End If End Function REM program utama Sub Main() Dim A,B,C As Long Dim X1,X2 As Single Console.WriteLine("Mencari akar persamaan kuadrat") Console.Write("Masukan A :") A = Console.ReadLine() Console.Write("Masukan B :") B = Console.ReadLine() Console.Write("Masukan C :") C = Console.ReadLine() If CariAkar(A,B,C,X1,X2) Then Console.WriteLine("Akar X1={0} X2={1}",X1,X2) Else Console.WriteLine("Akar imaginier") End If End Sub End Module
Catatan : Perintah Return digunakan untuk mengembalikan nilai ke pemanggil, dan jika suatu Exit Function digunakan, maka function akan mengembali nilai defaut berupa 0 for Byte, Char, Decimal, Double, Integer, Long, Short, and Single; Nothing for Object, String, and all arrays; False for Boolean; and #1/1/0001 12:00 AM# for Date. Jika kita perlu melewatkan suatu array sebagai argumen pada function, maka dapat digunakan keyword ParamArray untuk melewatkan nilai array secara by value, contoh :
INDOPROG
39
Hendra, S.T.
Sub Statement
Pada bagian sebelumnya kita telah membahas tentang function dan pemakaiannya, selanjutnya kita akan melihat Sub yang menyerupai Function, dimana perbedaannya adalah jika function digunakan untuk proses yang mengembalikan nilai kepada pemanggil, sedangkan Sub cenderung digunakan untuk proses yang tidak mengembalikan nilai.
Sub name [(arglist)] [ statements ] [ Exit Sub ] [ statements ] End Sub
Catatan : Sebagaimana function, sebenarnya sub juga dapat digunakan untuk proses yang mengembalikan nilai melalui argumen yang dikirim secara ByRef. Jika Exit Sub digunakan, maka Sub akan kembali ke pemanggil secara tidak bersyarat. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModArr Public Arr() As Integer Public Jd As Byte Sub BacaJd() Console.Write("Masukkan Jumlah Data :") Jd = Console.ReadLine() End Sub Sub BacaData()
INDOPROG
40
Hendra, S.T.
Teknik Rekursi pada Visual Basic Dalam matematika, kita sering menjumpai formula yang mengandung rekursi, misalnya pada perhitungan nilai faktorial dari suatu bilangan yang dapat diformulasikan sebagai berikut : N! = N x (N-1)! Dimana 1! = 1. Sehingga secara pemrograman komputer dapat ditulis sebagai berikut :
Option Explicit On Imports System Public Module modFak Function Fak(N as Byte) If (N > 1) Then Return N * Fak(N-1) Else Return 1 End If End Function Sub Main() Console.WriteLine("Faktorial dari {0} adalah {1}",5,Fak(5)) End Sub End Module
Latihan :
INDOPROG
41
Hendra, S.T.
1. Buatlah function IsKabisat yang akan mengembalikan nilai True jika tahun yang dikirim sebagai argumen adalah Kabisat, dan False jika sebaliknya. 2. Buatlah function IsPrima yang akan mendeteksi apakah suatu bilangan yang diberikan adalah Prima atau tidak. 3. Dengan pemanfaatan teknik rekursi, buatlah function yang dapat menghitung suku yang ke n dari barisan fibonacci. 4. Buatlah program yang mencetak faktor prima dari suatu bilangan dengan pemanfaatan Sub secara rekursi.
INDOPROG
42
Hendra, S.T.
String
Variabel string pada Visual Basic disimpan sebagai urutan dari angka 16-bit (2 byte) yang memiliki jangkauan dari 0 sampai 65535. Masing-masing angka merupakan suatu karakter tunggal Unicode. Suatu string dapat mengandung sampai dengan 2 Milyar (2^31) karakter Unicode. 128 kode pertama (0-127) dari Unicode berkaitan dengan huruf dan simbol pada keyboard standard U.S yang mana sama dengan karakter set yang terdefinisi pada ASCII, kemudian 128 karakter berikutnya (128255) merupakan karakter spesial, seperti huruf alphabet Latin, accent, simbol mata uang, dan pecahan. Kemudian karakter sisianya digunakan untuk berbagai simbol, termasuk karakter teksual didunia, dan simbol teknis, dan metematika. Pada dasarnya String pada Visual Basic mengacu pada String Class. Contoh :
Option Explicit On Imports System Public Module modStr Dim Nama As String = "Hendra Soewarno" Sub Main() Console.WriteLine(Nama.ToUpper()) Console.WriteLine(Nama.ToLower()) End Sub End Module
Pada contoh diatas akan mencetak HENDRA SOEWARNO dan hendra soewarno.
Public Properties
Chars Length Mendapatkan karakter pada posisi tertentu string. Mendapatkan jumlah character dalam string
Contoh :
Option Explicit On Imports System Public Module modStr
INDOPROG
43
Hendra, S.T.
H e n 12
Public Methods
PadLeft Mengisi spasi atau karakter lain disebelah kiri string sampai string mencapai panjang tertentu. Mengisi spasi atau karakter lain disebelah kanan string sampai string mencapai panjang tertentu. Mengembalikan string yang telah diubah ke huruf kecil
PadRight
ToLower
ToUpper
Trim
Mengembalikan string dengan membuang spasi didepan dan belakang string Mengembalikan string dengan membuang spasi dibelakang string
TrimEnd
TrimStart
Substring
Contoh :
Option Explicit On Imports System Public Module modStr Dim Nama As String = "Hendra Soewarno" Dim Kota As String = " Medan " Sub Main() Console.WriteLine(Nama.PadLeft(20,"-")) Console.WriteLine(Nama.PadRight(20,"-")) Console.WriteLine(Nama.ToLower()) Console.WriteLine(Nama.ToUpper()) Console.WriteLine(Kota.TrimEnd()) Console.WriteLine(Kota.TrimStart())
INDOPROG
44
Hendra, S.T.
Menyisip string ke dalam string sekarang pada posisi tertentu. Menghapus sejumlah karakter dalam string Mengantu sejumlah karakter dengan string pada string sekarang
Contoh :
Option Explicit On Imports System Public Module modStr Dim Nama As String = "Santo" Sub Main() Console.WriteLine(Nama.Insert(1,"us")) 'Susanto Console.WriteLine(Nama.Remove(0,1)) 'anto Console.WriteLine(Nama.Replace("o","i")) 'Santi End Sub End Module IndexOf Mengembalikan posisi awal suatu string pada string sekarang mulai dari posisi tertentu Mengembalikan posisi awal suatu string pada string sekarang. Mengembalikan posisi akhir suatu string pada string sekarang sekarang mulai dari posisi tertentu Mengembalikan posisi akhir suatu string pada string sekarang. Mendapatkan apakah string dimulai dengan string tertentu. Mendapatkan apakah string diakhir dengan string tertentu.
IndexOfAny
LastIndexOf
Contoh :
Option Explicit On Imports System Public Module modStr ' 0 1 2 ' 012345678901234567890123456 Dim Nama As String = "ebook karya Hendra Soewarno"
INDOPROG
45
Hendra, S.T.
Option Explicit On Imports System Public Module modStr ' 0 1 2 ' 012345678901234567890123456 Dim Nama As String = "ebook karya Hendra Soewarno" Sub Main() Console.WriteLine(Nama.IndexOfAny("e")) Console.WriteLine(Nama.LastIndexOfAny("e")) Console.WriteLine(Nama.IndexOf("e",2)) Console.WriteLine(Nama.LastIndexOf("e",15)) End Sub End Module
INDOPROG
46
Hendra, S.T.
Len(x), mengembalikan panjang string x dalam karakter. Lcase(x), mengembalikan string yang telah diubah menjadi huruf kecil. Ucase(x), mengembalikan string yang telah diubah menjadi huruf besar. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama As String = "Hendra Soewarno" Console.WriteLine(Len(Nama)) Console.WriteLine(LCase(Nama)) Console.WriteLine(UCase(Nama)) End Sub End Module
GetChar(x,y), mendapatkan character posisi ke y dalam string x. Left(x,y), mengembalikan substring dari string x sebanyak y karakter dari depan. Right(x,y), mengembalikan substring dari string x sebanyak y karakter dari belakang. Mid(x,y,z) mengembalikan substring dari string x mulai posisi y sebanyak z karakter. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama As String = "Hendra Soewarno" Console.WriteLine(GetChar(Nama,1)) Console.WriteLine(Left(Nama,6)) Console.WriteLine(Right(Nama,8)) Console.WriteLine(Mid(Nama,4,3)) End Sub End Module
Space(x), mengembalikan string yang terdiri dari spasi sejumlah x karakter. Rset(x,y), mengembalikan string rapat kanan dengan panjang y dengan menambah spasi di depan string x.
INDOPROG
47
Hendra, S.T.
Lset(x,y), mengembalikan string rapat kiri dengan panjang y dengan menambah spasi dibelakang string x. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama1 As String = "Hendra" Dim Nama2 As String = "Soewarno" Console.WriteLine(Nama1 & Space(5) & Nama2) 'Hendra Console.WriteLine(RSet(Nama1,9)) '___Hendra Console.WriteLine(LSet(Nama1,9)) 'Hendra___ End Sub End Module
Soewarno
Ltrim(x), mengembalikan string dengan menghilangkan spasi didepan string x. Rtrim(x), mengembalikan string dengan menghilangkan spasi dibelakang string x. Trim(x), mengembalikan string dengan prilaku gabungan Ltrim dan Rtrim. StrReverse(x), mengembalikan string yang membalikan karakter dalam string x. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama As String = "Susan" Console.WriteLine(Nama) Console.WriteLine(StrReverse(Nama)) End Sub End Module
'Susan 'nasuS
InStr(y, x, z), mencari dari depan posisi keberadaan substring z dalam string x mulai posisi y. InStrRev(x, z, y), mencari dari belakang posisi keberadaan substring z dalam string x mulai posisi y. Contoh :
INDOPROG
48
Hendra, S.T.
StrDup(y, x), mengembalikan string yang merupakan duplikasi character x sebanyak y. StrComp(x,y,z), mengembalikan nilai -1, 0, atau 1 yang merupakan perbandingan antara string x dengan string y, dengan metode z, dimana -1 (x < y), 0 (x =y), dan 1 (x > y), dan metode z adalah CompareMethod.Text dan CompareMethod.Binary. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama1 As String = "felicia" Dim Nama2 As String = "FELICIA" Console.WriteLine(StrDup(10,"-")) '---------Console.WriteLine(StrComp(Nama1,Nama2,CompareMethod.Text)) '0 Console.WriteLine(StrComp(Nama1,Nama2,CompareMethod.Binary)) '1 End Sub End Module
Catatan : Pada metode Binary, perbandingan dilakukan berdasarkan nilai ASCII, dimana ASCII huruf kecil > dari huruf besar, contoh A = 65, dan a = 97. Split(x,y), mengembalikan array string yang merupakan hasil pemisahan dari string x dengan delimeter y
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama As String = "Felicia Fortuna" Dim aNama() As String = Split(Nama," ") Console.WriteLine(aNama(0))
'Felicia
INDOPROG
49
Hendra, S.T.
Join(x,y), mengembalikan string yang merupakan hasil gabungan array string x dengan delimeter y
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim aNama() As String = {"Felicia","Fortuna"} Console.WriteLine(Join(aNama,", ")) 'Felicia, Fortuna End Sub End Module
Replace(x,y,z,[1],[2],[3]), mengembalikan string yang merupakan pengantian string y dengan z dalam string x mulai posisi [1] sampai sejumlah karakter [2], dengan metode perbandingan [3]. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama As String = "Hendra" Console.WriteLine(Replace(Nama,"a","o")) 'Hendro End Sub End Module
StrConv(x,y), menghasilkan string yang merupakan hasil konversi dengan metode y dari string x, dimana y (VBStrConv.UpperCase, VBStrConv.LowerCase, VBStrConv.ProperCase) Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Nama As String = "Hendra" Console.WriteLine(StrConv(Nama,VbStrConv.UpperCase)) 'HENDRA Console.WriteLine(StrConv(Nama,VbStrConv.LowerCase)) 'hendra Console.WriteLine(StrConv(Nama,VbStrConv.ProperCase)) 'Hendra End Sub
INDOPROG
50
Hendra, S.T.
FormatDateTime(x,y), menghasilkan string hasil konversi date x dengan format sesuai dengan setting pada komputer, dimana y (DateFormat.GeneralDate, DateFormat.LongDate, DateFormat.ShortDate, DateFormat.LongTime, DateFormat.ShortTime) Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Console.WriteLine(FormatDateTime(Now,DateFormat.LongDate)) 'Sunday, May 22, 2005 End Sub End Module
FormatCurrency(x,y), menghasilan string yang merupakan format currency dari angka x dengan jumlah desimal y. FormatPercent(x,y), menghasilkan string yang merupakan format percent dari angka x dengan jumlah desimal y. FormatNumber(x,y), menghasilkan string yang merupakan format angka dari angka x dengan jumlah desimal y. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim Angka As Decimal = 100000 Dim PPN As Single = 0.1 Console.WriteLine(FormatCurrency(Angka,2)) Console.WriteLine(FormatNumber(Angka,2)) Console.WriteLine(FormatPercent(PPN,2)) End Sub End Module
Format(x,y), menghasilkan string yang merupakan format dari argumen x dengan format y, dengan format yang dapat dilihat pada lampiran 1. Contoh :
INDOPROG
51
Hendra, S.T.
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Console.WriteLine(Format(10000,"#,##0.00")) '10,000.00 Console.WriteLine(Format(Now,"dd/MM/yyyy HH:MM:SS")) '22-05-2005 20:15:01 End Sub End Module
Filter(x,y,[1],[2]), menghasilkan array yang berisi string dari array string x yang mana elemen yang mengandung substring y, dengan ketentuan [1] (true=contain, false = exclude), dengan compare method [2]. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module modStr Sub Main() Dim aNama1() As String = {"Hendra","Susan","Felicia Fortuna"} Dim aNama2() As String = Filter(aNama1,"r",true,CompareMethod.Binary) For Each A As String In aNama2 Console.WriteLine(A) 'Hendra & Felicia Fortuna Next End Sub End Module
Latihan :
1. Buatlah program yang dapat menghasilkan terbilang dari suatu bilangan, contoh 123,456,789 (Seratus dua puluh tiga juta empat ratus lima puluh enam ribu tujuh ratus delapan puluh sembilan).
INDOPROG
52
Hendra, S.T.
Dimana akan memberikan nilai Tanggal 30 Mei 2005 Pukul 8:29:59.900 ke variabel Tanggal.
Contoh :
Option Explicit On Imports System Public Module ModDate
INDOPROG
53
Hendra, S.T.
Sub Main() Dim Tanggal As Date = New Date(2005,5,30,8,29,40,900) Console.WriteLine(Tanggal.Date()) '30-05-2005 Console.WriteLine(Tanggal.TimeOfDay()) '08:29:40.9000000 Console.WriteLine(Tanggal.Day()) '30 Console.WriteLine(Tanggal.Month()) '5 Console.WriteLine(Tanggal.Year()) '2005 Console.WriteLine(Tanggal.Hour()) '8 Console.WriteLine(Tanggal.Minute()) '29 Console.WriteLine(Tanggal.Second()) '40 Console.WriteLine(Tanggal.MilliSecond()) '900 Console.WriteLine(Tanggal.DayOfWeek()) '1 Console.WriteLine(Tanggal.DayOfYear()) '150 Console.WriteLine(Tanggal.Ticks()) '632530385809000000 Console.WriteLine(DateTime.Now()) '30-05-2005 08:30:29 PM Console.WriteLine(Tanggal.Today()) '30-05-2005 Console.WriteLine(Tanggal.UTCNow()) '30-05-2005 1:37:20 PM End Sub End Module
Visual Basic menyediakan berbagai fungsi bantu yang merupakan member dari namespace Microsoft.VisualBasic
AddDays AddMonths AddYears AddHours AddMinutes AddSeconds AddMilliseconds Option Explicit On Imports System Public Module ModDate Sub Main() Dim Tanggal As Date = New Date(2005,5,30,8,29,40,900) Console.WriteLine(Tanggal.AddDays(-10)) '20-5-2005 8:29:40.900 End Sub End Module Parse Mengkonversi string dalam bentuk tanggal dan waktu ke DateTime. Menambah sejumlah hari (+/-) ke instance. Menambah sejumlah bulan (+/-) ke instance Menambah sejumlah tahun (+/-) ke instance Menambah sejumlah jam (+/-) ke instanace Menambah sejumkah menit (+/-) ke instance Menambah sejumlah detik (+/-) ke instance Menambah sejumlah millidetik (+/-) ke instance
Option Explicit On Imports System Public Module ModDate Sub Main() Dim Str As String = "30-5-2005 08:30:50.900"
INDOPROG
54
Hendra, S.T.
Compare
Membandingkan dua instance dari DateTime dam mengembalikan ( < 0 jika tanggal1 < tanggal2, = 0 jika tanggal1 = tanggal2, dan > 0 jika tanggal1 > tanggal2) Mengembalikan jumlah hari dalam tahun dan bulan tertentu. Mengembalikan indikasi apakah tahun yang diberikan kabisat
Public Module ModDate Sub Main() Dim Tanggal1 As Date = New Date(2005,5,30) Dim Tanggal2 As Date = New Date(2005,5,31) Console.WriteLine(DateTime.Compare(Tanggal1,Tanggal2)) Console.WriteLine(DateTime.DaysInMonth(2005,5)) Console.WriteLine(DateTime.IsLeapYear(2005)) End Sub End Module Subtract Option Explicit On Imports System Public Module ModDate Sub Main() Dim Tanggal1 As Date = New Date(2005,5,30) Dim Tanggal2 As Date = New Date(2005,5,31) Console.WriteLine(Tanggal1.Subtract(Tanggal2)) End Sub End Module
'-1 00:00:00
ToLocalTime
ToLongDateString Konversi Instance ke String dengan format setting LongDateString ToLongTimeString Konversi Instance ke String dengan format setting LongTime ToShortDateString Konversi Instance ke String dengan format setting ShortDate ToShortTimeString Konversi Instance ke String dengan format setting ShortTime ToString ToUniversalTime Konversi Instance ke String Konversi Instance ke UTC
INDOPROG
55
Hendra, S.T.
INDOPROG
56
Hendra, S.T.
DateAdd(Interval, Number, DateValue), mengembalikan tanggal dari hasil penjumlahan DateValue terhadap Number dalam arti interval tertentu
Enumeration value String Unit of time interval to add DateInterval.Day d Day; truncated to integral value DateInterval.DayOfYear y Day; truncated to integral value DateInterval.Hour h Hour; rounded to nearest millisecond DateInterval.Minute n Minute; rounded to nearest millisecond DateInterval.Month m Month; truncated to integral value DateInterval.Quarter q Quarter; truncated to integral value DateInterval.Second s Second; rounded to nearest millisecond DateInterval.Weekday w Day; truncated to integral value DateInterval.WeekOfYear ww Week; truncated to integral value DateInterval.Year yyyy Year; truncated to integral value
DateDiff(Interval, Date1, Date2), menghasilkan selisih antara Date2 terhadap Date1 berdasarkan interval tertentu. Returns a Long value specifying the number of time intervals between two Date values. DatePart(Interval, DateValue), mengembalikan nilai Integer yang berkaitan dengan interval dari DataValue Catatan : Visual Basic .NET telah mengantikan Date dan Time dengan Today dan TimeOfDay, kemudian fungsi Date$ dan Time$ dengan DateString dan TimeString.
INDOPROG
57
Hendra, S.T.
Catatan : Sebagaimana telah dinyatakan sebelumnya bahwa secara default string pada Visual Basic adalah variable length, dan untuk membentuk string dengan fixed length kita membutuhkan vbFixedStringAttribute Class, dimana pada awal deklarasi string kita mencantumkan <VBFixedString(ukuran)> Salah satu keunggulan pada Structure di Visual Basic adalah kita dapat menambahkan koding kedalamnya untuk membuat metoda dan property, contoh misalnya kita akan menambah property Rata-rata untuk menghitung nilai rata-rata Tugas, Mid dan Semester, sehingga deklarasi Structure dapat ditulis menjadi :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Module ModStruct Structure Ujian <VBFixedString(10)> Public Nim As String <VBFixedString(30)> Public Nama As String Public Tugas,Mid,Semester As Single Public ReadOnly Property RataRata() As Single Get Return (Tugas+Mid+Semester)/3 End Get End Property End Structure Dim DaftarUjian As Ujian Sub Main() DaftarUjian.Nim = "920403024"
INDOPROG
58
Hendra, S.T.
INDOPROG
59
Hendra, S.T.
Console.WriteLine("----------------------------------------------------------------------")
For Each Record In DaftarUjian Console.WriteLine("{0} {1} {2,6:f2} {3,6:f2} {4,6:f2} {5,6:f2}", _ Record.Nim.PadRight(10), _ Record.Nama.PadRight(30), _ Record.Tugas, _ Record.Mid, _ Record.Semester, _ Record.RataRata) Next End Sub Sub Main() Call BacaData Call CetakData End Sub End Module
Latihan :
1. Kembangkan program diatas untuk mencetak Daftar Ujian Mahasiswa, dimana ditampilkan nilai rata-rata diikuti dengan nilai Huruf (A, B, C, D, atau E), serta tampilkan jumlah yang Lulus (C Keatas), dan Rata-rata kelas, serta NIM mahasiswa peringkat pertama, dengan pendekatan terstruktur. Catatan : Kategori nilai Huruf dicetak dengan membuat Properti NilaiHuruf pada Structure Ujian.
INDOPROG
60
Hendra, S.T.
File Class
Menyediakan metode-metode static untuk pembuatan, menduplikasi, menghapus, dan membuka file. Berikut ini adalah beberapa member File Class : File.Exists(namafile), mendeteksi keberadaan file File.Delete(namafile), menghapus file yang ditentukan File.Copy(asal,tujuan), menduplikasi file asal ke file tujuan File.Move(asal,tujuan), memindahkan file ke lokasi baru dengan nama baru File.GetAttributes(namafile), mendapatkan attribut dari file, dimana mengembalikan salah satu nilai dari member FileAttributes :
Member name Archive Description The file's archive status. Applications use this attribute to mark files for backup or removal. The file is compressed. 32 Value
Compressed
2048
Device
64
Directory
16
INDOPROG
61
Hendra, S.T.
Encrypted
The file or directory is encrypted. For a file, this means that all data in the file is encrypted. For a directory, this means that encryption is the default for newly created files and directories. The file is hidden, and thus is not included in an ordinary directory listing.
16384
Hidden
Normal
The file is normal and has no other attributes set. This attribute is 128 valid only if used alone. The file will not be indexed by the operating system's content indexing service. 8192
NotContentIndexed
Offline
The file is offline. The data of the file is not immediately available. 4096
ReadOnly
ReparsePoint
The file contains a reparse point, which is a block of user-defined 1024 data associated with a file or a directory. The file is a sparse file. Sparse files are typically large files whose 512 data are mostly zeros. The file is a system file. The file is part of the operating system or 4 is used exclusively by the operating system. The file is temporary. File systems attempt to keep all of the data 256 in memory for quicker access rather than flushing the data back to mass storage. A temporary file should be deleted by the application as soon as it is no longer needed.
SparseFile
System
Temporary
File.GetCreationTime(namafile), mendapatkan tanggal dan waktu pembuatan file File.GetLastAccessTime(namafile), mendapatkan tanggal dan waktu file terakhir kali diakses. File.GetLastWriteTime(namafile), mendapatkan tanggal dan waktu file terakhir kali ditulisi. File.SetCreationTime(namafile, waktu) File.SetLastAccessTime(namafile, waktu) File.SetLastWriteTime(namafile,waktu)
62
Hendra, S.T.
File.OpenText(namafile), membuka file yang telah ada sebagai streamreader, dan selanjutnya kita dapat menggunakan metoda Read, ReadLine, kemudian untuk memeriksa keberadaan data untuk dibaca dapat menggunalan fungsi Peek File.AppendText(namafile), membuka file yang telah ada untuk streamwrite. Contoh :
Option Explicit On Imports System Imports System.IO Public Module ModTextFile Sub Main() Dim sw As StreamWriter = File.CreateText("c:\belajar.txt") sw.WriteLine("Buku Belajar Vb.net") sw.Flush() sw.Close() Dim sr As StreamReader = File.OpenText("c:\belajar.txt") Do While sr.Peek() >= 0 Console.WriteLine(sr.ReadLine()) Loop sr.Close() sw = File.AppendText("C:\belajar.txt") sw.WriteLine("Oleh : Hendra Soewarno") sw.Flush() sw.Close() sr = File.OpenText("c:\belajar.txt") Do While sr.Peek() >= 0 Console.WriteLine(sr.ReadLine()) Loop sr.Close() End Sub End Module
INDOPROG
63
Hendra, S.T.
Menulis ke FileStream
Kemudian dapat digunakan metoda write untuk menulis data terhadap FileStream Tertulis = Fs.Write(buffer,index,count)
Menutup FileStream
Anda dapat menggunakan metoda Close untuk menutup FileStream yang terbuka. Fs.Close Contoh Program simulasi perintah copy pada dos:
Option Explicit On Imports System Imports System.IO Public Module ModFS Sub Main(ByVal CmdArgs() As String) Dim Buffer(511) As Byte If CmdArgs.Length < 2 Then Console.WriteLine("Pemakaian : duplikat <fileasal> <filetujuan>") End End If If File.Exists(CmdArgs(0)) Then Dim FSS As FileStream = File.OpenRead(CmdArgs(0)) Dim FST As FileStream = File.Create(CmdArgs(1)) Dim Terbaca As Integer = 0 Dim I As Integer Do Terbaca = FSS.Read(Buffer,0,Buffer.Length()) FST.Write(Buffer,0,Terbaca) Loop Until Terbaca < 512
INDOPROG
64
Hendra, S.T.
FSS.Close() FST.Close() Else Console.WriteLine("File asal tidak ditemukan !") End If End Sub End Module
Contoh Program simulasi perintah copy pada dos dengan constructor FileStream:
Option Explicit On Imports System Imports System.IO
INDOPROG
65
Hendra, S.T.
If CmdArgs.Length < 2 Then Console.WriteLine("Pemakaian : duplikasi <fileasal> <filetujuan>") End End If If File.Exists(CmdArgs(0)) Then Dim FSS As FileStream = new FileStream(CmdArgs(0), _ FileMode.Open, _ FileAccess.Read) Dim FST As FileStream = new FileStream(CmdArgs(1), _ FileMode.Create, _ FileAccess.Write) Dim Terbaca As Integer = 0 Do Terbaca = FSS.Read(Buffer,0,Buffer.Length()) FST.Write(Buffer,0,Terbaca) Loop Until Terbaca < 512 FSS.Close() FST.Close() Else Console.WriteLine("File asal tidak ditemukan !") End If End Sub End Module
INDOPROG
66
Hendra, S.T.
Pada pengolahan random file, kita dapat menggunakan formula berikut untuk menghitung offset pada stream : Offset = (recno 1) * ukuran tiap record Contoh : Fs.Seek((1-1)*Len(Record)) Fs.Seek((10-1)*Len(Record)) INDOPROG 'Pindah ke posisi record 1 'Pindah ke posisi record 10
67
Hendra, S.T.
Untuk menulis ke FileStream, kita dapat menggunakan metoda Serialize pada BinaryFormatter, dan untuk membaca kita dapat menggunakan metoda DeSerialize, Contoh :
Option Explicit On Imports System Imports System.IO Imports Microsoft.VisualBasic Imports System.Runtime.Serialization.Formatters.Binary Public Module ModStruct <Serializable> Structure Ujian <VBFixedString(10)> Public Nim As String <VBFixedString(30)> Public Nama As String Public Tugas,Mid,Semester As Single Public ReadOnly Property RataRata() As Single
INDOPROG
68
Hendra, S.T.
Sub Main() Dim Fs As FileStream = new FileStream("c:\ujian.dat",FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None) Record.Nim = "123" Fm.serialize(Fs,Record) 'Menulis record ke FileStream Record.Nim = "234" Fm.serialize(Fs,Record) 'Menulis record ke FileStream Fs.Seek(0,SeekOrigin.Begin) 'Pindah stream ke record 1 Record = Fm.deserialize(Fs) 'Membaca record Console.WriteLine(Record.Nim) Record = Fm.deserialize(Fs) 'Membaca record Console.WriteLine(Record.Nim) Fs.Close() End Sub End Module
Latihan :
1. Buatlah program yang dapat mengkonversi semua huruf dalam text file ke huruf besar. 2. Buatlah program yang dapat menghitung jumlah baris dan kata yang terdapat pada suatu text file. 3. Kembangkan program untuk melakukan enkripsi/dekripsi terhadap fileasal dan menghasilkan filetujuan yang sudah tersandi dengan suatu kata kunci (dengan menggunakan filestream). 4. Buatlah program yang dapat menyimpan data ujian mahasiswa berdasarkan input dari pemakai dalam bentuk record. 5. Buatlah program yang dapat membaca record dari file yang sudah dibuat pada soal nomor 4, dan mencetak kembali dalam bentuk laporan. Jawaban :
Option Explicit On Imports System Imports System.IO Imports Microsoft.VisualBasic Public Module ModFS Sub Main(ByVal CmdArgs() As String)
INDOPROG
69
Hendra, S.T.
If CmdArgs.Length < 2 Then Console.WriteLine("Pemakaian : en <fileasal> <filetujuan>") End End If If File.Exists(CmdArgs(0)) Then Console.Write("Kata Kunci :") Dim KataKunci As String = Console.ReadLine() Dim Kalimat As String = KataKunci Do While Kalimat.Length() < 512 Kalimat = Kalimat + KataKunci Loop
Dim FSS As FileStream = new FileStream(CmdArgs(0), _ FileMode.Open, _ FileAccess.Read) Dim FST As FileStream = new FileStream(CmdArgs(1), _ FileMode.Create, _ FileAccess.Write) Dim Terbaca As Integer = 0 Dim I As Integer Do Terbaca = FSS.Read(Buffer,0,Buffer.Length()) For I = 0 to Terbaca-1 Buffer(I) = Buffer(I) XOR Asc(Kalimat.Chars(I)) Next I FST.Write(Buffer,0,Terbaca) Loop Until Terbaca < 512 FSS.Close() FST.Close() Else Console.WriteLine("File asal tidak ditemukan !") End If End Sub End Module
INDOPROG
70
Hendra, S.T.
Try...Catch...Finally Statements
TryCatchFinally merupakan cara baru penanganan error di Visual Basic pada saat runtime, adapun tata penulisannya adalah sebagai berikut :.
Try [ tryStatements ] [ Catch [ exception [ As type ] ] [ When expression ] [ catchStatements ] ] [ Exit Try ] ... [ Finally [ finallyStatements ] ] End Try
Contoh :
Option Explicit On Imports System Imports System.IO Public Module ModFS Sub Main(ByVal CmdArgs() As String) Dim Buffer(511) As Byte If CmdArgs.Length < 2 Then Console.WriteLine("Pemakaian : duplikat <fileasal> <filetujuan>") End End If Dim FSS As FileStream Try FSS = File.OpenRead(CmdArgs(0)) Catch ex As Exception Console.WriteLine("Gagal buka file " + CmdArgs(0)) End End Try Dim FST As FileStream = File.Create(CmdArgs(1)) Dim Terbaca As Integer = 0 Dim I As Integer Do Terbaca = FSS.Read(Buffer,0,Buffer.Length()) FST.Write(Buffer,0,Terbaca) Loop Until Terbaca < 512
INDOPROG
71
Hendra, S.T.
INDOPROG
72
Hendra, S.T.
Lampiran 1
Fixed, F, or f Standard, N, or n
Percent
P, or p
Scientific E, or e D, or d
X, or x
Yes/No
INDOPROG
73
Hendra, S.T.
True/False On/Off
Displays False if number is 0; otherwise, displays True. Displays Off if number is 0; otherwise, displays On.
(#)
(.)
(%) INDOPROG
74
Hendra, S.T.
(,)
character (%) is inserted in the position where it appears in the format string. Thousand separator. The thousand separator separates thousands from hundreds within a number that has four or more places to the left of the decimal separator. Standard use of the thousand separator is specified if the format contains a thousand separator surrounded by digit placeholders (0 or #). A thousand separator immediately to the left of the decimal separator (whether or not a decimal is specified) or as the rightmost character in the string means "scale the number by dividing it by 1,000, rounding as needed." For example, you can use the format string "##0,." to represent 100 million as 100,000. Numbers smaller than 1,000 but greater or equal to 500 are displayed as 1, and numbers smaller than 500 are displayed as 0. Two adjacent thousand separators in this position scale by a factor of 1 million, and an additional factor of 1,000 for each additional separator.
Multiple separators in any position other than immediately to the left of the decimal separator or the rightmost position in the string are treated simply as specifying the use of a thousand separator. In some locales, a period is used as a thousand separator. The actual character used as the thousand separator in the formatted output depends on the Number Format recognized by your system. Thus, You should use the comma as the thousand separator in your formats even if you are in a locale that uses a period as a thousand separator. The formatted string will appear in the format correct for the locale. (:) Time separator. In some locales, other characters may be used to represent the time separator. The time separator separates hours, minutes, and seconds when time values are formatted. The actual character used as the time separator in formatted output is determined by your system settings. (/) Date separator. In some locales, other characters may be used to represent the date separator. The date separator separates the day, month, and year when date values are formatted. The actual character used as the date separator in formatted output is determined by your system settings. (E- E+ e- e+) Scientific format. If the format expression contains at least one digit placeholder (0 or #) to the left of E-, E+, e-, or e+, the number is displayed in scientific format and E or e is inserted between the number and its exponent. The number of digit placeholders to the left determines the number of digits in the exponent. Use E- or e- to place a minus sign next to negative exponents. Use E+ or e+ to place a minus sign next to negative exponents and a plus sign next to positive exponents. You must also include digit placeholders to the right of this symbol to get correct formatting. -+$() Literal characters. These characters are displayed exactly as typed in the format string. To display a character other than one of those listed,
INDOPROG
75
Hendra, S.T.
(\)
precede it with a backslash (\) or enclose it in double quotation marks (" "). Displays the next character in the format string. To display a character that has special meaning as a literal character, precede it with a backslash (\). The backslash itself isn't displayed. Using a backslash is the same as enclosing the next character in double quotation marks. To display a backslash, use two backslashes (\\). Examples of characters that can't be displayed as literal characters are the date-formatting and time-formatting characters (a, c, d, h, m, n, p, q, s, t, w, y, /, and :), the numeric-formatting characters (#, 0, %, E, e, comma, and period), and the string-formatting characters (@, &, <, >, and !). Displays the string inside the double quotation marks (" "). To include a string in the style argument from within code, you must use Chr(34) to enclose the text (34 is the character code for a quotation mark (")).
("ABC")
Example The following table contains some sample format expressions for numbers. (These examples all assume that your system's locale setting is English-U.S.) The first column contains the format strings for the Style argument of the Format function; the other columns contain the resulting output if the formatted data has the value given in the column headings. Format (Style)
Zero-length string ("") 0 0.00 #,##0 $#,##0;($#,##0) $#,##0.00; ($#,##0.00) 0% 0.00% 0.00E+00 0.00E-00 5 5 5.00 5 $5 $5.00 500% 500.00% 5.00E+00 5.00E00
"5" formatted as
INDOPROG
76
Hendra, S.T.
Long Date, or D Medium Date Short Date, or d Long Time, or T Medium Time Short Time, or t F F G M, m R, r S U U Y, y
time; for example, 4/3/93 05:34 PM.If there is no fractional part, display only a date, for example, 4/3/93. If there is no integer part, display time only, for example, 05:34 PM. Date display is determined by your system's LocaleID value. Displays a date according to your locale's long date format. Displays a date using the medium date format appropriate for the language version of the host application. Displays a date using your locale's short date format. Displays a time using your locale's long time format; includes hours, minutes, seconds. Displays time in 12-hour format using hours and minutes and the AM/PM designator. Displays a time using the 24-hour format, for example, 17:45. Displays the long date and short time according to your locale's format. Displays the long date and long time according to your locale's format. Displays the short date and short time according to your locale's format. Displays the month and the day of a date. Formats the date and time as Greenwich Mean Time (GMT) Formats the date and time as a sortable index. Formats the date and time as a GMT sortable index. Formats the date and time with the long date and long time as GMT. Formats the date as the year and month.
77
Hendra, S.T.
d dd ddd dddd M
MM MMM MMMM gg h
hh H
HH m
mm s
ss F
that a single-letter format is read as a user-defined format. See below for further details Displays the day as a number without a leading zero (for example, 1). Use %d if this is the only character in your user-defined numeric format. Displays the day as a number with a leading zero (for example, 01). Displays the day as an abbreviation (for example, Sun). Displays the day as a full name (for example, Sunday). Displays the month as a number without a leading zero (for example, January is represented as 1). Use %M if this is the only character in your user-defined numeric format. Displays the month as a number with a leading zero (for example, 01/12/01). Displays the month as an abbreviation (for example, Jan). Displays the month as a full month name (for example, January). Displays the period/era string (for example, A.D.) Displays the hour as a number without leading zeros using the 12-hour clock (for example, 1:15:15 PM). Use %h if this is the only character in your user-defined numeric format. Displays the hour as a number with leading zeros using the 12-hour clock (for example, 01:15:15 PM). Displays the hour as a number without leading zeros using the 24-hour clock (for example, 1:15:15). Use %H if this is the only character in your user-defined numeric format. Displays the hour as a number with leading zeros using the 24-hour clock (for example, 01:15:15). Displays the minute as a number without leading zeros (for example, 12:1:15). Use %m if this is the only character in your user-defined numeric format. Displays the minute as a number with leading zeros (for example, 12:01:15). Displays the second as a number without leading zeros (for example, 12:15:5). Use %s if this is the only character in your user-defined numeric format. Displays the second as a number with leading zeros (for example, 12:15:05). Displays fractions of seconds. For example ff will display hundredths of seconds, whereas ffff will display ten-thousandths of seconds. You may use up to seven f symbols in your user-defined format. Use %f if this is the only character in your user-defined numeric format. Uses the 12-hour clock and displays an uppercase A for any hour before noon; displays an uppercase P for any hour between noon and 11:59 P.M. Use %t if this is the only character in your user-defined numeric format.
INDOPROG
78
Hendra, S.T.
tt
Uses the 12-hour clock and displays an uppercase AM with any hour before noon; displays an uppercase PM with any hour between noon and 11:59 P.M. Displays the year number (0-9) without leading zeros. Use %y if this is the only character in your user-defined numeric format. Displays the year in two-digit numeric format with a leading zero, if applicable. Displays the year in four digit numeric format. Displays the year in four digit numeric format. Displays the timezone offset without a leading zero (for example, -8). Use %z if this is the only character in your user-defined numeric format. Displays the timezone offset with a leading zero (for example, -08) Displays the full timezone offset (for example, -08:00)
The following are examples of user-defined date and time formats for December 7, 1958, 8:50 PM, 35 seconds: Format Displays
M/d/yy 12/7/58 d-MMM 7-Dec d-MMMM-yy 7-December-58 d MMMM 7 December MMMM yy December 58 hh:mm tt 08:50 PM h:mm:ss t 8:50:35 P H:mm 20:50 H:mm:ss 20:50:35 M/d/yyyy H:mm 12/7/1958 20:50
INDOPROG
79
Hendra, S.T.
INDOPROG
80
Hendra, S.T.
Buku ini membahas tentang pembuatan program Windows Form dengan bahasa pemrograman Visual Basic .Net, dan ditujukan kepada siapa saja yang serius untuk mempelajari pembuatan form dan control dengan VB.NET secara koding (tanpa menggunakan fasilitas designer pada Visual Studio .NET). Bagi anda yang belum mengenal bahasa pemrograman VB.NET sebaiknya memulai proses belajar dengan buku Bahasa Pemrograman VB.NET. Untuk mempelajari buku ini anda tidak perlu menginstalasi Visual Studio .NET, tetapi anda cukup menginstalasi .Net Framework yang dapat didownload secara gratis dari website Microsoft. Semua contoh dan latihan dibuku ini dapat dikompilasi langsung dari Dos prompt dengan menggunakan kompiler Visual Basic yang langsung tersedia setelah anda menginstalasi .Net Framework. Dibandingkan dengan Visual Basic 6.0, maka VB.NET adalah benar-benar bahasa pemrograman, dimana pembuatan form dan control dapat dilakukan secara koding 100%, sedangkan pada Visual Basic 6.0 hal tersebut tidak dimungkinkan.
INDOPROG
Hendra, S.T.
Salah satu contoh dari interface SDI adalah aplikasi WordPad. Adapun program aplikasi Windows yang berbasis pada form yang paling sederhana adalah :
Option Explicit On Imports System Public Module MyModule
INDOPROG
Hendra, S.T.
Proses Kompilasi
Kemudian simpan dengan nama form.vb anda dapat melakukan kompilasi dengan perintah : Vbc <namafile> /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll Contoh : Vbc form.vb /r:System.dll /r:System.Windows.Forms.dll Selanjutnya anda dapat menjalankannya sebagaimana program Windows dan menghasilkan tampilan berikut :
INDOPROG
Hendra, S.T.
Option Explicit On Imports System Imports System.Threading Public Module MyModule Dim Form1 As New System.Windows.Forms.Form Sub Main() Form1.Text = "Form ini Form1.Show() For I As Double = 1 To Form1.Opacity = I Form1.Refresh() Thread.Sleep(100) Next I End Sub End Module akan semakin transparan" 0 Step -0.01 'refresh form dengan setting baru 'memperlambat program 100 millidetik
Option Explicit On Imports System Public Module MyModule Dim Form1 As New System.Windows.Forms.Form
INDOPROG
Hendra, S.T.
Sub Main() Form1.Text = "Form ini menggunakan border fixed 3D" Form1.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog Form1.ShowDialog() End Sub End Module
Kita dapat juga mengatur keberadaan button maximize dan minimize, dengan properti MinimizeBox dan MaximizeBox, contoh :
Option Explicit On Imports System Public Module MyModule Dim Form1 As New System.Windows.Forms.Form Sub Main() Form1.Text = "Form ini tanpa tombol Maximize dan Minimize" Form1.MinimizeBox = False Form1.MaximizeBox = False Form1.ShowDialog() End Sub End Module
Catatan : Jika kita tidak menentukan ukuran form, maka default suatu form adalah 300 x 300 pixel
INDOPROG
Hendra, S.T.
Ukuran form juga tergantung pada setting properti WindowState, yang mana dapat diset dengan enumerasi dari FormWindowState berikut :
Member name Maximized Minimized Normal Description Jendela maximized. Jendela minimize Jendela default
Option Explicit On Imports System Public Module MyModule Dim Form1 As New System.Windows.Forms.Form Sub Main() Form1.Text = "Form ini dalam state Maximize" Form1.WindowState = System.Windows.Forms.FormWindowState.Maximized Form1.ShowDialog() End Sub End Module
INDOPROG
Hendra, S.T.
determined by Windows default. WindowsDefaultLocation The form is positioned at the Windows default location and has the dimensions specified in the form's size.
Contoh : Option Explicit On Imports System Public Module MyModule Dim Form1 As New System.Windows.Forms.Form Sub Main() Form1.Text = "Form ini berada ditengah layar" Form1.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Form1.ShowDialog() End Sub End Module
Latihan :
Buatlah program aplikasi windows yang dapatkan menampilkan form dengan ketentuan sebagai berikut : 1. Judul Form : Form saya yang pertama 2. Ukuran : 450 x 450 pixel 3. Berada diposisi : 200,200 4. Bingkai : Fixed Single 5. Opacity : 0.5 Modifikasi program diatas untuk menampilkan form tersebut ditengah layar.
INDOPROG
Hendra, S.T.
Pada program sebelumnya, kita senantiasa menggunakan Form1.ShowDialog() untuk menampilkan Form1 secara modal, sedangkan kalau kita menggunakan Form1.Show(), form hanya ditampilkan sebentar kemudian hilang karena program aplikasi kita segera berakhir sesaat setelah Form1 ditampilkan, dan konsekuensinya Form1 juga dibuang dari memori. Sedangkan perintah System.Windows.Forms.Application.Run(New MyForm), akan mengatur message dari sistem operasi ke program aplikasi, jika program anda tidak mencantumkan baris ini, maka program dapat dikompilasi dan dijalankan tanpa menghasilkan apa-apa. Catatan : Inheritance adalah salah satu ciri-ciri dari pemrograman berorientasi objek. Sebagaimana kita ketahui bahwa Class Form telah tersedia pada .NET terdefinisi pada namespace System.Windows.Forms. Selanjutnya jika kita membuat class baru dengan melakukan inherit dari class Form, maka secara otomatis akan mewarisi semua property, metoda, dan event yang sifatnya protected dan public pada class Form. Jadi kita tidak perlu perlu menulis ulang semua prilaku pada class baru, melainkan cukup melakukan inherit dari parent class yang secara otomatis akan mewariskan semua prilakunya ke child class. Inheritance Salah satu keunggulan dari OOP adalah isu pemanfaatan kembali. Dengan inheritance
INDOPROG
Hendra, S.T.
tugas pemrograman dapat dipemudah. Suatu class yang telah dikembangkan dapat diperbaharui dengan mengembangkan child class (sub class) yang merupakan inheritance dari parent class (super class). Inheritance menyerupai pengembangan produk baru pada suatu perusahaan, dimana engineer tidak perlu membuat produk baru dari awal, tetapi dengan mengacu pada produk yang telah ada, dan dilakukan penambahan dan perbaikan.
Hubungan antara Object dan Class Object merupakan instance dari Class, beberapa object dapat berasal dari Class yang sama, tetapi memiliki properti yang berbeda-beda (dengan bahasa yang lebih sederhana dapat dikatakan bahwa class merupakan blue print dari objek-objek).
Misalnya dalam membangun rumah, maka sebelumnya dilakukan rancangan awal dengan mengambarkan detail dari rumah serta ukuran-ukurannya, kemudian oleh pengembang akan dibangun rumah-rumah yang nyata berdasarkan blue print tersebut. Pada pembuatan program OOP, dimulai dengan pembuatan Class, dan pada saat runtime akan dibuat instance dari Class sebagai Objek, jadi program tersebut berjalan sebagai objek-objek dimemori komputer. Pada Visual Basic, constructor untuk suatu Class ciptaan dapat menggunakan Public Sub New. Contoh :
Option Explicit On Imports System
INDOPROG
Hendra, S.T.
Public Class MyForm Inherits System.Windows.Forms.Form <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.Run(New MyForm) End Sub Public Sub New() Me.Text = "Dengan pendekatan OOP" End Sub End Class 'Constructor
Catatan : Konstruktor merupakan metode khusus pada class, dimana metoda ini otomatis akan dijalankan oleh computer sesaat instance dari class dibuat, misalnya (New MyForm):
System.Windows.Forms.Application.Run(New MyForm)
Pada dunia nyata, setiap objek mengalami kelahiran dan kematian, contoh sebuah rumah mengalai tahap pembuatan (pembangunan) dan akhirnya akan diruntuhkan demikian juga manusia juga mengalami kelahiran dan kematian, pada saat seorang bagi dilahirkan, maka akan membawa property seperti jenis kelamin, berat badan, dan panjang. Sebagaimana objek pada dunia nyata, objek dikomputer pada saat dibuat, tentu saja ada property-properti tertentu yang perlu disetting nilai awalnya, dan hal tersebut dapat dilakukan dengan membuat konstruktor untuk class tersebut.
INDOPROG
10
Hendra, S.T.
Catatan : Penanganan Event menjadi salah satu permasalahan yang dihadapi pemrograman yang mengembangkan aplikasi mereka di lingkungan Windows, sebagaimana kita ketahui bahwa Windows merupakan system operasi multitasking yang mana komunikasi antara program aplikasi dengan system operasi dilakukan berdasarkan message. Pada lingkungan multitasking, berbagai aksi yang dilakukan oleh pemakai pada system operasi dapat mempengaruhi proses pada program kita, seperti klik pada mouse, penekanan pada tombol. Jika anda berasal dari pemrograman lingkungan DOS yang mana proses program berjalan berdasarkan alur yang kita buat dari baris awal sampai baris terakhir, tentu saja akan mengalami kesulitan untuk beralih ke pemrograman Windows dengan cepat, sebab program di Windows berjalan berdasarkan Event. Tetapi saya yakin dengan latihan yang intensif anda dapat dengan segera menyesuaikan diri.
System.EventHandle
Adapun tata cara penulisan event procedure untuk event yang menggunakan EventHandle adalahs sebagai berikut :
Private Sub NamaKontrol_NamaEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.NamaEvent
INDOPROG
11
Hendra, S.T.
System.ComponentModel.CancelEventArgs
Private Sub Form_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
Pada CancelEventArgs tersedia properti Cancel yang dapat diset ke nilai True/False dengan tujuan proses Closing dilanjutkan atau dibatalkan. Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class MyForm Inherits System.Windows.Forms.Form Dim CatatEvent As String <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.Run(New MyForm) End Sub Public Sub New() Me.Text = "Mencoba Event pada Form" End Sub 'Constructor
Private Sub MyForm_Load(sender as Object, e As System.EventArgs) Handles MyBase.Load CatatEvent = "Terjadi Load" & vbCrlf End Sub Private Sub MyForm_Activated(sender as Object, e As System.EventArgs) Handles MyBase.Activated CatatEvent = CatatEvent & "Terjadi Activate" & vbCrlf End Sub Private Sub MyForm_GotFocus(sender as Object, e As System.EventArgs) Handles MyBase.GotFocus CatatEvent = CatatEvent & "Terjadi GotFocus" & vbcrlf End Sub Private Sub MyForm_Move(sender as Object, e As System.EventArgs) Handles MyBase.Move CatatEvent = CatatEvent & "Terjadi Move" & vbcrlf End Sub Private Sub MyForm_Resize(sender as Object, e As System.EventArgs) Handles MyBase.Resize CatatEvent = CatatEvent & "Terjadi Resize" & vbcrlf End Sub Private Sub MyForm_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
INDOPROG
12
Hendra, S.T.
Private Sub MyForm_Closed(sender as Object, e As System.EventArgs) Handles MyBase.Closed CatatEvent = CatatEvent & "Terjadi Closed" & vbCrlf End Sub End Class
Dimana kalau program dijalankan dan kemudian ditutup akan menampilkan kotak pesan yang berisi urutan event yang terjadi pada form mulai dari program dijalankan sampai ditutup.
Dalam tata cara penulisan event procedure untuk event mouse terbagi atas dua jenis argumen yang dikirim ke procedure, yaitu EventHandle, dan MouseEventHandle.
INDOPROG
13
Hendra, S.T.
System.EventHandle
Adapun tata cara penulisan event procedure untuk event yang menggunakan EventHandle adalahs sebagai berikut :
Private Sub NamaKontrol_NamaEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.NamaEvent
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class MyForm Inherits System.Windows.Forms.Form <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.EnableVisualStyles() System.Windows.Forms.Application.Run(New MyForm) End Sub Public Sub New() Me.Text = "Dengan pendekatan OOP" End Sub 'Constructor
Private Sub MyForm_MouseEnter(sender as Object, e As System.EventArgs) Handles MyBase.MouseEnter Msgbox("Terjadi Event MouseEnter") End Sub End Class
System.Windows.Forms.Form.MouseEventHandle
Adapun tata cara penulisan event procedure untuk event yang menggunakan MouseEventHandle adalah sebagai berikut :
Private Sub NamaKontrol_NamaEvent(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.NamaEvent
Contoh :
INDOPROG
14
Hendra, S.T.
Private Sub MyForm_MouseDown(sender as Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown Msgbox("Terjadi Event MouseDown pada " & e.x.tostring() & "," &e.y.tostring()) End Sub End Class
Kalau kita menekan button mouse diatas MyForm, maka msgbox berikut akan ditampilkan.
System.Windows.Forms.KeyEventHandle
Adapun tata cara penulisan event procedure untuk event yang menggunakan KeyEventHandle adalah sebagai berikut :
Private Sub NamaKontrol_NamaEvent(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.NamaEvent
INDOPROG
15
Hendra, S.T.
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class MyForm Inherits System.Windows.Forms.Form <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.Run(New MyForm) End Sub Public Sub New() Me.Text = "Dengan pendekatan OOP" End Sub 'Constructor
Private Sub MyForm_KeyDown(sender as Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown Msgbox("Nilai Alt " & e.Alt & vbCrLf & _ "Nilai Control " & e.Control & vbCrLf & _ "Nilai Handle " & e.Handled & vbCrLf & _ "Nilai KeyCode " & e.KeyCode & vbCrLf & _ "Nilai KeyValue " & e.KeyValue & vbCrLf & _ "Nilai Modifiers " & e.Modifiers & vbCrLf & _ "Nilai Shift " & e.Shift) End Sub End Class
INDOPROG
16
Hendra, S.T.
System.Windows.Forms.KeyPressEventHandle
Adapun tata cara penulisan event procedure untuk event yang menggunakan KeyPressEventHandle adalah sebagai berikut :
Private Sub NamaKontrol_NamaEvent(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.NamaEvent
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class MyForm Inherits System.Windows.Forms.Form <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.Run(New MyForm) End Sub Public Sub New() Me.Text = "Dengan pendekatan OOP" End Sub 'Constructor
Private Sub MyForm_KeyPress(sender as Object, e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress Msgbox("Nilai Handle " & e.Handled & vbCrLf & _ "Nilai KeyChar " & e.KeyChar & vbCrLf) End Sub End Class
INDOPROG
17
Hendra, S.T.
INDOPROG
18
Hendra, S.T.
Public Sub New() 'Constructor Me.Text = "Membuat kontrol pada Form" MyLabel.Text = "Ini adalah Label" MyLabel.Location = New System.Drawing.Point(100,100) 'Lokasi Me.Controls.Add(MyLabel) End Sub End Class
Membuat Textbox
Berikut ini adalah koding untuk menempatkan sebuah textbox diatas form INDOPROG
19
Hendra, S.T.
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class MyForm Inherits System.Windows.Forms.Form Dim CatatEvent As String <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.Run(New MyForm) End Sub Dim MyText As New System.Windows.Forms.Textbox 'Deklarasi
Public Sub New() 'Constructor Me.Text = "Membuat kontrol pada Form" MyText.Text = "Ini adalah Textbox" MyText.Location = New System.Drawing.Point(100,100) 'Lokasi MyText.Size = New System.Drawing.Size(140,250) 'Ukuran Me.Controls.Add(MyText) End Sub End Class
INDOPROG
20
Hendra, S.T.
Untuk menggunakan event pada kontrol, kita perlu mendeklarasikan variabel kontrol beserta WithEvents.
Private Sub NamaTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles NamaTextbox.Validating
Contoh :
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class MyForm Inherits System.Windows.Forms.Form Dim CatatEvent As String <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.EnableVisualStyles() System.Windows.Forms.Application.Run(New MyForm) End Sub Dim WithEvents MyText As New System.Windows.Forms.Textbox Public Sub New() 'Constructor Me.Text = "Membuat kontrol pada Form" MyText.Text = "Ini adalah Textbox" MyText.Location = New System.Drawing.Point(100,100) MyText.Size = New System.Drawing.Size(140,250) Me.Controls.Add(MyText) End Sub Private Sub MyText_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyText.Validating Msgbox("Panjang Text : " & MyText.Text.Length()) End Sub End Class
Membuat button
Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class MyForm Inherits System.Windows.Forms.Form Dim CatatEvent As String <System.STAThread()> _ Public Shared Sub Main() System.Windows.Forms.Application.Run(New MyForm) End Sub
INDOPROG
21
Hendra, S.T.
'Deklarasi
Public Sub New() 'Constructor Me.Text = "Membuat kontrol pada Form" MyButton.Text = "Ini adalah Button" MyButton.Location = New System.Drawing.Point(100,100) MyButton.Size = New System.Drawing.Size(120,25) Me.Controls.Add(MyButton) End Sub End Class
Contoh :
INDOPROG
22
Hendra, S.T.
Private Sub MyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyButton.Click Msgbox("Terjadi event button click") End Sub End Class
Yang kalau dijalankan, dan dilakukan klik pada button akan menampilkan pesan sebagai berikut :
Latihan :
Buatlah program Windows Form untuk menghitung luas persegi panjang !
INDOPROG
23
Hendra, S.T.
MDI Child
Pada dasarnya form MDI Child adalah sama dengan form biasanya, yang kemudian akan ditamplkan oleh MDI Form.
Public Class MyForm Inherits Form Public Sub New() Me.Text = "MDI Child" End Sub End Class
INDOPROG
24
Hendra, S.T.
2. Kemudian kita set property MDIParent ke Form MDI 3. Menampilkan Form MDI Child dengan metoda Show() Contoh :
Option Explicit On Imports System Imports System.Windows.Forms Imports Microsoft.VisualBasic Public Class MyMDI Inherits Form <System.STAThread()> _ Public Shared Sub Main() Application.Run(New MyMDI) End Sub Public Sub New() Me.Text = "Membuat MDI Form" Me.IsMDIContainer = True Dim MyChild As new MyForm MyChild.MdiParent = Me MyChild.Show() End Sub End Class Public Class MyForm Inherits Form Public Sub New() Me.Text = "MDI Child" End Sub End Class 'Constructor 'Instance dari myform 'set MDIParent 'tampilkan MDI Child
Contoh :
INDOPROG
25
Hendra, S.T.
INDOPROG
26
Hendra, S.T.
Membuat Menu
Untuk membuat menu pada form, anda dapat menggunakan langkah-langkah berikut ini : 1. Membuat instance dari komponen MainMenu, dan set sebagai menu untuk form 2. Membuat MenuItem untuk MainMenu, dan tambahkan pada collection object dari MainMenu 3. Membuat SubMenuItem untuk MenuItem, dan tambahkan pada collection masing-masing object MenuItem. Contoh :
Option Explicit On Imports System Imports System.Windows.Forms Imports Microsoft.VisualBasic Public Class MyMDI Inherits Form <System.STAThread()> _ Public Shared Sub Main() Application.Run(New MyMDI) End Sub Public Sub New() Me.Text = "Membuat MDI Form" Me.IsMDIContainer = True AddMenu() End Sub 'Constructor
Private Sub AddMenu() 'Membuat instance dari MainMenu dan set sebagai menu form Dim mnuUtama As new MainMenu() Me.Menu = mnuUtama 'membuat menuitem Dim mnuFile As new MenuItem("&File") Dim mnuWindow As new MenuItem("&Window") mnuUtama.MenuItems.Add(mnuFile) mnuUtama.MenuItems.Add(mnuWindow) 'Tambahkan ke collection
'membuat submenuitem untuk sub menu File Dim mnuFileNew As new MenuItem("&New") Dim mnuFileClose As new MenuItem("&Close") Dim mnuFileExit As new MenuItem("&Exit") mnuFile.MenuItems.Add(mnuFileNew) mnuFile.MenuItems.Add(mnuFileClose) 'Tambahkan ke collection
INDOPROG
27
Hendra, S.T.
Men-disable menuitem
Untuk mendisable menuitem, kita dapat menggunakan property Enabled pada menuitem yang akan diatur keaktifannya. Contoh :
mnuFileClose.Enabled = False
atau
Me.Menu.MenuItems(0).MenuItems(2).Enabled = False
INDOPROG
28
Hendra, S.T.
Menyembunyikan menuitem
Untuk menyembunyikan menuitem, kita dapat menggunakan property Visible pada menuitem yang akan diatur kemunculannya. Contoh :
mnuFileClose.Visible = False
INDOPROG
29
Hendra, S.T.
INDOPROG
30
Hendra, S.T.
INDOPROG
31
Hendra, S.T.
INDOPROG
32
Hendra, S.T.
CtrlF7 CtrlF8 CtrlF9 CtrlG CtrlH CtrlI CtrlIns CtrlJ CtrlK CtrlL CtrlM CtrlN CtrlO CtrlP CtrlQ CtrlR CtrlS CtrlShift0 CtrlShift1 CtrlShift2 CtrlShift3 CtrlShift4 CtrlShift5 CtrlShift6 CtrlShift7 CtrlShift8 CtrlShift9 CtrlShiftA CtrlShiftB CtrlShiftC CtrlShiftD CtrlShiftE CtrlShiftF CtrlShiftF1 CtrlShiftF10 CtrlShiftF11 CtrlShiftF12 CtrlShiftF2 CtrlShiftF3 CtrlShiftF4 CtrlShiftF5 CtrlShiftF6 CtrlShiftF7 CtrlShiftF8 CtrlShiftF9 CtrlShiftG CtrlShiftH CtrlShiftI CtrlShiftJ CtrlShiftK CtrlShiftL CtrlShiftM
The shortcut keys CTRL+F7. The shortcut keys CTRL+F8. The shortcut keys CTRL+F9. The shortcut keys CTRL+G. The shortcut keys CTRL+H. The shortcut keys CTRL+I. The shortcut keys CTRL+INSERT. The shortcut keys CTRL+J. The shortcut keys CTRL+K. The shortcut keys CTRL+L. The shortcut keys CTRL+M. The shortcut keys CTRL+N. The shortcut keys CTRL+O. The shortcut keys CTRL+P. The shortcut keys CTRL+Q. The shortcut keys CTRL+R. The shortcut keys CTRL+S. The shortcut keys CTRL+SHIFT+0. The shortcut keys CTRL+SHIFT+1. The shortcut keys CTRL+SHIFT+2. The shortcut keys CTRL+SHIFT+3. The shortcut keys CTRL+SHIFT+4. The shortcut keys CTRL+SHIFT+5. The shortcut keys CTRL+SHIFT+6. The shortcut keys CTRL+SHIFT+7. The shortcut keys CTRL+SHIFT+8. The shortcut keys CTRL+SHIFT+9. The shortcut keys CTRL+SHIFT+A. The shortcut keys CTRL+SHIFT+B. The shortcut keys CTRL+SHIFT+C. The shortcut keys CTRL+SHIFT+D. The shortcut keys CTRL+SHIFT+E. The shortcut keys CTRL+SHIFT+F. The shortcut keys CTRL+SHIFT+F1. The shortcut keys CTRL+SHIFT+F10. The shortcut keys CTRL+SHIFT+F11. The shortcut keys CTRL+SHIFT+F12. The shortcut keys CTRL+SHIFT+F2. The shortcut keys CTRL+SHIFT+F3. The shortcut keys CTRL+SHIFT+F4. The shortcut keys CTRL+SHIFT+F5. The shortcut keys CTRL+SHIFT+F6. The shortcut keys CTRL+SHIFT+F7. The shortcut keys CTRL+SHIFT+F8. The shortcut keys CTRL+SHIFT+F9. The shortcut keys CTRL+SHIFT+G. The shortcut keys CTRL+SHIFT+H. The shortcut keys CTRL+SHIFT+I. The shortcut keys CTRL+SHIFT+J. The shortcut keys CTRL+SHIFT+K. The shortcut keys CTRL+SHIFT+L. The shortcut keys CTRL+SHIFT+M.
INDOPROG
33
Hendra, S.T.
CtrlShiftN CtrlShiftO CtrlShiftP CtrlShiftQ CtrlShiftR CtrlShiftS CtrlShiftT CtrlShiftU CtrlShiftV CtrlShiftW CtrlShiftX CtrlShiftY CtrlShiftZ CtrlT CtrlU CtrlV CtrlW CtrlX CtrlY CtrlZ Del F1 F10 F11 F12 F2 F3 F4 F5 F6 F7 F8 F9 Ins None ShiftDel ShiftF1 ShiftF10 ShiftF11 ShiftF12 ShiftF2 ShiftF3 ShiftF4 ShiftF5 ShiftF6 ShiftF7 ShiftF8 ShiftF9 ShiftIns
The shortcut keys CTRL+SHIFT+N. The shortcut keys CTRL+SHIFT+O. The shortcut keys CTRL+SHIFT+P. The shortcut keys CTRL+SHIFT+Q. The shortcut keys CTRL+SHIFT+R. The shortcut keys CTRL+SHIFT+S. The shortcut keys CTRL+SHIFT+T. The shortcut keys CTRL+SHIFT+U. The shortcut keys CTRL+SHIFT+V. The shortcut keys CTRL+SHIFT+W. The shortcut keys CTRL+SHIFT+X. The shortcut keys CTRL+SHIFT+Y. The shortcut keys CTRL+SHIFT+Z. The shortcut keys CTRL+T. The shortcut keys CTRL+U The shortcut keys CTRL+V. The shortcut keys CTRL+W. The shortcut keys CTRL+X. The shortcut keys CTRL+Y. The shortcut keys CTRL+Z. The shortcut key DELETE. The shortcut key F1. The shortcut key F10. The shortcut key F11. The shortcut key F12. The shortcut key F2. The shortcut key F3. The shortcut key F4. The shortcut key F5. The shortcut key F6. The shortcut key F7. The shortcut key F8. The shortcut key F9. The shortcut key INSERT. No shortcut key is associated with the menu item. The shortcut keys SHIFT+DELETE. The shortcut keys SHIFT+F1. The shortcut keys SHIFT+F10. The shortcut keys SHIFT+F11. The shortcut keys SHIFT+F12. The shortcut keys SHIFT+F2. The shortcut keys SHIFT+F3. The shortcut keys SHIFT+F4. The shortcut keys SHIFT+F5. The shortcut keys SHIFT+F6. The shortcut keys SHIFT+F7. The shortcut keys SHIFT+F8. The shortcut keys SHIFT+F9. The shortcut keys SHIFT+INSERT.
INDOPROG
34
Hendra, S.T.
Lampiran
StatusBar
NumericUpDown TreeView
PictureBox ImageList
Value setting
Date setting
DateTimePicker MonthCalendar
Dialog boxes
INDOPROG
35
Hendra, S.T.
PrintDialog PrintPreviewDialog SaveFileDialog Menu controls MainMenu ContextMenu Commands Button LinkLabel
Displays a dialog box that allows users to select a printer and set its attributes. Displays a dialog box that displays how a PrintDocument object will appear when printed. Displays a dialog box that allows users to save a file. Provides a design-time interface for creating menus. Implements a menu that appears when the user right-clicks an object. Used to start, stop, or interrupt a process. Displays text as a Web-style link and triggers an event when the user clicks the special text. Usually the text is a link to another window or a Web site. Displays an icon in the status notification area of the taskbar that represents an application running in the background. Contains a collection of button controls. Groups a set of controls on an unlabeled, scrollable frame. Groups a set of controls (such as radio buttons) on a labeled, nonscrollable frame. Provides a tabbed page for organizing and accessing grouped objects efficiently.
NotifyIcon
INDOPROG
36
Hendra, S.T.
Keys Enumeration
Members
Member name A Supported by the .NET Compact Framework. Add Supported by the .NET Compact Framework. Alt Supported by the .NET Compact Framework. Apps Supported by the .NET Compact Framework. Attn Supported by the .NET Compact Framework. B Supported by the .NET Compact Framework. Back Supported by the .NET Compact Framework. BrowserBack BrowserFavorites BrowserForward BrowserHome BrowserRefresh BrowserSearch BrowserStop C Supported by the .NET Compact Framework. Cancel Supported by the .NET Compact Framework. Capital Supported by the .NET Compact Framework. CapsLock The CAPS LOCK key. 20 The CAPS LOCK key. 20 The CANCEL key. 3 The browser back key (Windows 2000 or later). The browser favorites key (Windows 2000 or later). The browser forward key (Windows 2000 or later). The browser home key (Windows 2000 or later). The browser refresh key (Windows 2000 or later). The browser search key (Windows 2000 or later). The browser stop key (Windows 2000 or later). The C key. 166 171 167 172 168 170 169 67 The BACKSPACE key. 8 The B key. 66 The ATTN key. 246 The application key (Microsoft Natural Keyboard). 93 The ALT modifier key. 262144 The add key. 107 The A key. Description 65 Value
INDOPROG
37
Hendra, S.T.
Supported by the .NET Compact Framework. Clear Supported by the .NET Compact Framework. Control Supported by the .NET Compact Framework. ControlKey Supported by the .NET Compact Framework. Crsel Supported by the .NET Compact Framework. D Supported by the .NET Compact Framework. D0 Supported by the .NET Compact Framework. D1 Supported by the .NET Compact Framework. D2 Supported by the .NET Compact Framework. D3 Supported by the .NET Compact Framework. D4 Supported by the .NET Compact Framework. D5 Supported by the .NET Compact Framework. D6 Supported by the .NET Compact Framework. D7 Supported by the .NET Compact Framework. D8 The 8 key. 56 The 7 key. 55 The 6 key. 54 The 5 key. 53 The 4 key. 52 The 3 key. 51 The 2 key. 50 The 1 key. 49 The 0 key. 48 The D key. 68 The CRSEL key. 247 The CTRL key. 17 The CTRL modifier key. 131072 The CLEAR key. 12
INDOPROG
38
Hendra, S.T.
Supported by the .NET Compact Framework. D9 Supported by the .NET Compact Framework. Decimal Supported by the .NET Compact Framework. Delete Supported by the .NET Compact Framework. Divide Supported by the .NET Compact Framework. Down Supported by the .NET Compact Framework. E Supported by the .NET Compact Framework. End Supported by the .NET Compact Framework. Enter Supported by the .NET Compact Framework. EraseEof Supported by the .NET Compact Framework. Escape Supported by the .NET Compact Framework. Execute Supported by the .NET Compact Framework. Exsel Supported by the .NET Compact Framework. F Supported by the .NET Compact Framework. F1 The F1 key. 112 The F key. 70 The EXSEL key. 248 The EXECUTE key. 43 The ESC key. 27 The ERASE EOF key. 249 The ENTER key. 13 The END key. 35 The E key. 69 The DOWN ARROW key. 40 The divide key. 111 The DEL key. 46 The decimal key. 110 The 9 key. 57
INDOPROG
39
Hendra, S.T.
Supported by the .NET Compact Framework. F10 Supported by the .NET Compact Framework. F11 Supported by the .NET Compact Framework. F12 Supported by the .NET Compact Framework. F13 Supported by the .NET Compact Framework. F14 Supported by the .NET Compact Framework. F15 Supported by the .NET Compact Framework. F16 Supported by the .NET Compact Framework. F17 Supported by the .NET Compact Framework. F18 Supported by the .NET Compact Framework. F19 Supported by the .NET Compact Framework. F2 Supported by the .NET Compact Framework. F20 Supported by the .NET Compact Framework. F21 Supported by the .NET Compact Framework. F22 The F22 key. 133 The F21 key. 132 The F20 key. 131 The F2 key. 113 The F19 key. 130 The F18 key. 129 The F17 key. 128 The F16 key. 127 The F15 key. 126 The F14 key. 125 The F13 key. 124 The F12 key. 123 The F11 key. 122 The F10 key. 121
INDOPROG
40
Hendra, S.T.
Supported by the .NET Compact Framework. F23 Supported by the .NET Compact Framework. F24 Supported by the .NET Compact Framework. F3 Supported by the .NET Compact Framework. F4 Supported by the .NET Compact Framework. F5 Supported by the .NET Compact Framework. F6 Supported by the .NET Compact Framework. F7 Supported by the .NET Compact Framework. F8 Supported by the .NET Compact Framework. F9 Supported by the .NET Compact Framework. FinalMode G Supported by the .NET Compact Framework. H Supported by the .NET Compact Framework. HanguelMode HangulMode HanjaMode Help Supported by the .NET Compact Framework. The IME Hanguel mode key. (maintained for compatibility; use HangulMode) The IME Hangul mode key. The IME Hanja mode key. The HELP key. 21 21 25 47 The H key. 72 The IME final mode key. The G key. 24 71 The F9 key. 120 The F8 key. 119 The F7 key. 118 The F6 key. 117 The F5 key. 116 The F4 key. 115 The F3 key. 114 The F24 key. 135 The F23 key. 134
INDOPROG
41
Hendra, S.T.
Home Supported by the .NET Compact Framework. I Supported by the .NET Compact Framework. IMEAceept IMEConvert IMEModeChange IMENonconvert Insert Supported by the .NET Compact Framework. J Supported by the .NET Compact Framework. JunjaMode K Supported by the .NET Compact Framework. KanaMode KanjiMode KeyCode Supported by the .NET Compact Framework. L Supported by the .NET Compact Framework. LaunchApplication1 LaunchApplication2 LaunchMail LButton Supported by the .NET Compact Framework. LControlKey Supported by the .NET Compact Framework. Left Supported by the .NET Compact Framework. LineFeed Supported by the .NET Compact Framework. LMenu
36
The I key.
73
The IME accept key. The IME convert key. The IME mode change key. The IME nonconvert key. The INS key.
30 28 31 29 45
The J key.
74
23 75
The IME Kana mode key. The IME Kanji mode key. The bitmask to extract a key code from a key value.
21 25 65535
The L key.
76
The start application one key (Windows 2000 or later). 182 The start application two key (Windows 2000 or later). 183 The launch mail key (Windows 2000 or later). The left mouse button. 180 1
162
37
10
164
INDOPROG
42
Hendra, S.T.
Supported by the .NET Compact Framework. LShiftKey Supported by the .NET Compact Framework. LWin Supported by the .NET Compact Framework. M Supported by the .NET Compact Framework. MButton Supported by the .NET Compact Framework. MediaNextTrack MediaPlayPause MediaPreviousTrack MediaStop Menu Supported by the .NET Compact Framework. Modifiers Supported by the .NET Compact Framework. Multiply Supported by the .NET Compact Framework. N Supported by the .NET Compact Framework. Next Supported by the .NET Compact Framework. NoName Supported by the .NET Compact Framework. None Supported by the .NET Compact Framework. NumLock Supported by the .NET Compact Framework. The NUM LOCK key. 144 No key pressed. 0 A constant reserved for future use. 252 The PAGE DOWN key. 34 The N key. 78 The multiply key. 106 The bitmask to extract modifiers from a key value. -65536 The media next track key (Windows 2000 or later). The media play pause key (Windows 2000 or later). The media previous track key (Windows 2000 or later). The media Stop key (Windows 2000 or later). The ALT key. 176 179 177 178 18 The middle mouse button (three-button mouse). 4 The M key. 77 The left Windows logo key (Microsoft Natural Keyboard). 91 The left SHIFT key. 160
INDOPROG
43
Hendra, S.T.
NumPad0 Supported by the .NET Compact Framework. NumPad1 Supported by the .NET Compact Framework. NumPad2 Supported by the .NET Compact Framework. NumPad3 Supported by the .NET Compact Framework. NumPad4 Supported by the .NET Compact Framework. NumPad5 Supported by the .NET Compact Framework. NumPad6 Supported by the .NET Compact Framework. NumPad7 Supported by the .NET Compact Framework. NumPad8 Supported by the .NET Compact Framework. NumPad9 Supported by the .NET Compact Framework. O Supported by the .NET Compact Framework. Oem8 OemBackslash OemClear Supported by the .NET Compact Framework. OemCloseBrackets Oemcomma OemMinus
96
97
98
99
100
101
102
103
104
105
The O key.
79
OEM specific. The OEM angle bracket or backslash key on the RT 102 key keyboard (Windows 2000 or later). The CLEAR key.
The OEM close bracket key on a US standard keyboard 221 (Windows 2000 or later). The OEM comma key on any country/region keyboard 188 (Windows 2000 or later). The OEM minus key on any country/region keyboard 189
INDOPROG
44
Hendra, S.T.
(Windows 2000 or later). OemOpenBrackets OemPeriod OemPipe Oemplus OemQuestion OemQuotes OemSemicolon Oemtilde P Supported by the .NET Compact Framework. Pa1 Supported by the .NET Compact Framework. PageDown Supported by the .NET Compact Framework. PageUp Supported by the .NET Compact Framework. Pause Supported by the .NET Compact Framework. Play Supported by the .NET Compact Framework. Print Supported by the .NET Compact Framework. PrintScreen Supported by the .NET Compact Framework. Prior Supported by the .NET Compact Framework. ProcessKey Supported by the .NET Compact Framework. The PROCESS KEY key. 229 The PAGE UP key. 33 The PRINT SCREEN key. 44 The PRINT key. 42 The PLAY key. 250 The PAUSE key. 19 The PAGE UP key. 33 The PAGE DOWN key. 34 The PA1 key. 253 The OEM open bracket key on a US standard keyboard 219 (Windows 2000 or later). The OEM period key on any country/region keyboard (Windows 2000 or later). The OEM pipe key on a US standard keyboard (Windows 2000 or later). The OEM plus key on any country/region keyboard (Windows 2000 or later). The OEM question mark key on a US standard keyboard (Windows 2000 or later). The OEM singled/double quote key on a US standard keyboard (Windows 2000 or later). The OEM semicolon key on a US standard keyboard (Windows 2000 or later). The OEM tilde key on a US standard keyboard (Windows 2000 or later). The P key. 190 220 187 191 222 186 192 80
INDOPROG
45
Hendra, S.T.
Q Supported by the .NET Compact Framework. R Supported by the .NET Compact Framework. RButton Supported by the .NET Compact Framework. RControlKey Supported by the .NET Compact Framework. Return Supported by the .NET Compact Framework. Right Supported by the .NET Compact Framework. RMenu Supported by the .NET Compact Framework. RShiftKey Supported by the .NET Compact Framework. RWin Supported by the .NET Compact Framework. S Supported by the .NET Compact Framework. Scroll Supported by the .NET Compact Framework. Select Supported by the .NET Compact Framework. SelectMedia Separator Supported by the .NET Compact Framework. Shift Supported by the .NET Compact
The Q key.
81
The R key.
82
163
13
39
165
161
92
The S key.
83
145
41
The select media key (Windows 2000 or later). The separator key.
181 108
65536
INDOPROG
46
Hendra, S.T.
Framework. ShiftKey Supported by the .NET Compact Framework. Snapshot Supported by the .NET Compact Framework. Space Supported by the .NET Compact Framework. Subtract Supported by the .NET Compact Framework. T Supported by the .NET Compact Framework. Tab Supported by the .NET Compact Framework. U Supported by the .NET Compact Framework. Up Supported by the .NET Compact Framework. V Supported by the .NET Compact Framework. VolumeDown VolumeMute VolumeUp W Supported by the .NET Compact Framework. X Supported by the .NET Compact Framework. XButton1 Supported by the .NET Compact Framework. XButton2 Supported by the .NET Compact Framework. The second x mouse button (five-button mouse). 6 The first x mouse button (five-button mouse). 5 The X key. 88 The volume down key (Windows 2000 or later). The volume mute key (Windows 2000 or later). The volume up key (Windows 2000 or later). The W key. 174 173 175 87 The V key. 86 The UP ARROW key. 38 The U key. 85 The TAB key. 9 The T key. 84 The subtract key. 109 The SPACEBAR key. 32 The PRINT SCREEN key. 44 The SHIFT key. 16
INDOPROG
47
Hendra, S.T.
Y Supported by the .NET Compact Framework. Z Supported by the .NET Compact Framework. Zoom Supported by the .NET Compact Framework.
The Y key.
89
The Z key.
90
251
INDOPROG
48
Hendra, S.T.
INDOPROG
49
Hendra, S.T.
Buku ini membahas tentang pengolahan grafik pada VB.NET, dan ditujukan kepada siapa saja yang serius untuk mempelajari pemrogrman grafik dengan GDI+ secara koding (tanpa menggunakan fasilitas designer pada Visual Studio .NET). Bagi anda yang belum mengenal bahasa pemrograman VB.NET sebaiknya memulai proses belajar dengan buku Bahasa Pemrograman VB.NET dan Pemrogram Form pada VB.NET Untuk mempelajari buku ini anda tidak perlu menginstalasi Visual Studio .NET, tetapi anda cukup menginstalasi .Net Framework yang dapat didownload secara gratis dari website Microsoft. Semua contoh dan latihan dibuku ini dapat dikompilasi langsung dari Dos prompt dengan menggunakan kompiler Visual Basic yang langsung tersedia setelah anda menginstalasi .Net Framework. Pada akhir tutorial ini, penulisa memberikan contoh pemrograman GDI+ yang diaplikasikan pada pemrograman games Tetris.
INDOPROG
Hendra, S.T.
Dan pada layar computer, koordinat tersebut, merupakan pixel pada layar.
Misalnya kita menggambar sebuah garis mulai dari koordinat 4,2 sampai 12, 8, maka tampilan dilayar adalah sebagai berikut :
INDOPROG
Hendra, S.T.
Public Sub New() 'Constructor Me.Text = "Mengambar garis pada Form" End Sub Private Sub MyForm_Click(Sender As Object, e As System.EventArgs) _
INDOPROG
Hendra, S.T.
Handles MyBase.Click Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3) Dim MyGraphic As System.Drawing.Graphics = Me.CreateGraphics MyGraphic.DrawLine(MyPen,10,10,200,100) End Sub End Class
Proses kompilasi
Proses kompilasi dengan menggunakan perintah : Vbc grafik.vb /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll Dan ketika anda jalankan, dan klik pada form akan menghasilkan tampilan :
Catatan : Mengenai pemrogram form pada VB.NET dapat anda baca di ebook pemrogram form pada VB.NET Salah satu kelemahan dari cara diatas adalah, kalau form mengalami refresh, maka garis yang telah digambarkan tersebut akan hilang (VB.NET tidak menyediakan property AutoRedraw seperti yang terdapat pada VB6) Untuk membuktikannya coba anda minimize dan maximize kembali form diatas, maka garis tersebut akan hilang.
INDOPROG
Hendra, S.T.
Public Sub New() 'Constructor Me.Text = "Membuat garis pada Form dengan OnPaint" End Sub Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red,3) MyBase.OnPaint(e) e.Graphics.DrawLine(MyPen,10,10,200,100) End Sub End Class
Kalau program diatas dijalankan, maka akan menampilkan garis pada form, dan tetap akan ada walaupun form direfresh. Catatan : Pada contoh diatas kita melakukan overriding terhadap metoda OnPaint yang ada pada Base class dengan Metoda baru yang kita buat dimana didalamnya akan mengambarkan garis, sehingga setiap kejadian OnPaint akan menjalankan Event baru tersebut. Kemudian dalam koding kita menulis MyBase.OnPaint(e), yang artinya kita menjalan kembali event OnPaint pada Base class yang telah kita overriding.
INDOPROG
Hendra, S.T.
Akan menghasilkan
INDOPROG
Hendra, S.T.
e.Graphics.DrawRectangle(MyPen,10,10,200,100)
Akan menghasilkan :
Contoh :
e.Graphics.DrawEllipse(MyPen,10,10,200,100)
Akan menghasilkan :
INDOPROG
Hendra, S.T.
Akan menghasilkan :
INDOPROG
Hendra, S.T.
Akan menghasilkan :
Contoh :
Dim Point1 As New System.Drawing.Point(10,10) Dim Point2 As New System.Drawing.Point(200,100) e.Graphics.DrawLine(MyPen,Point1,Point2)
INDOPROG
Hendra, S.T.
yang kalau dijalankan akan menghasilkan garis yang sama dengan perintah :
e.Graphics.DrawLine(MyPen,10,10,200,100)
Akan menghasilkan :
Contoh :
Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyArr As System.Drawing.Point() = _ {new System.Drawing.Point(0,0), _ new System.Drawing.Point(250,130), _ new System.Drawing.Point(190,160)} e.Graphics.DrawPolygon(MyPen,MyArr)
Akan menghasilkan :
INDOPROG
10
Hendra, S.T.
Contoh :
Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyArr As System.Drawing.Point() = _ {new System.Drawing.Point(0,0), _ new System.Drawing.Point(250,130), _ new System.Drawing.Point(190,160)} e.Graphics.DrawCurve(MyPen,MyArr,1.5F)
Akan menghasilkan :
INDOPROG
11
Hendra, S.T.
Kemudian kita dapat juga menggunakan DrawClosedCurve(pen, PointArray) untuk menghasilkan kurva tertutup. Contoh :
Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyArr As System.Drawing.Point() = _ {new System.Drawing.Point(0,0), _ new System.Drawing.Point(250,130), _ new System.Drawing.Point(190,160)} e.Graphics.DrawClosedCurve(MyPen,MyArr)
Akan menghasilkan :
INDOPROG
12
Hendra, S.T.
Pada gambar diatas p1 awal koordinat awal, p2 adalah koordinat akhir, dan c1, c2 adalah koordinat control Bezier.
Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) e.Graphics.DrawBezier(MyPen,0,0,200,200,70,50, 150, 40)
INDOPROG
13
Hendra, S.T.
Menggunakan Path
Path dibentuk oleh kombinasi dari berbagai bentuk seperti :
Dengan perintah AddLine, AddRectangle, AddEllipse, AddArc, AddPolygon, AddCurve, dan AddBezier. Contoh :
Dim MyPen As New System.Drawing.Pen(System.Drawing.Color.Red, 3) Dim MyPath As New System.Drawing.Drawing2D.GraphicsPath() MyPath.AddLine(0,0,65,20) MyPath.AddEllipse(30,20,100,50) MyPath.AddLine(130,45,200,50)
INDOPROG
14
Hendra, S.T.
Akan menghasilkan :
INDOPROG
15
Hendra, S.T.
Menggunakan SolidBrush
SolidBrush(warna) dapat digunakan untuk menggambarkan objek isian seperti FillRectangle(brush, rectangle), FillEllipse(brush, rectangle), FillPie(brush, rectangle, sudutawal, sudutakhir), dengan warna yang ditentukan pada brush. Contoh :
Dim MyBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) e.Graphics.FillRectangle(MyBrush,Rect)
Yang kalau dijalankan akan menghasilkan suatu persegi yang diisi dengan warna merah penuh.
INDOPROG
16
Hendra, S.T.
Menggunakan HatchBrush
HatchBrush(pola, warnagaris, warnalatarbelakang), dapat digunakan untuk menggambar objek isian dengan pola isian tertentu seperti :
INDOPROG
17
Hendra, S.T.
Menggunakan TextureBrush
TextureBrush(gambar), dapat digunakan untuk mengambarkan objek isian yang diisi dengan gambar tertentu
. Contoh :
Dim MyImage As New System.Drawing.Bitmap("c:\windows\greenstone.bmp") Dim MyBrush As New System.Drawing.TextureBrush(MyImage) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) e.Graphics.FillRectangle(MyBrush,Rect)
INDOPROG
18
Hendra, S.T.
Menggunakan GradientBrush
GradientBrush digunakan untuk warna isian yang sifatnya gradual LinearGradientBrush LinierGradientBrush(Point1,Point2,warna1,warna2) akan membuat warna gradient mulai dari Point1 ke Point2 secara gradual dari warna1 ke warna2
INDOPROG
19
Hendra, S.T.
Menggunakan GammaCorrection
Contoh :
Dim Point1 As New System.Drawing.Point(10,10) Dim Point2 As New System.Drawing.Point(100,10) Dim MyBrush As New _ System.Drawing.Drawing2D.LinearGradientBrush(Point1,Point2, _ System.Drawing.Color.FromArgb(255,0,0), _ System.Drawing.Color.FromArgb(0,0,255)) Dim Rect As New System.Drawing.Rectangle(10,10,200,100) MyBrush.GammaCorrection = True e.Graphics.FillRectangle(MyBrush,Rect)
INDOPROG
20
Hendra, S.T.
INDOPROG
21
Hendra, S.T.
INDOPROG
22
Hendra, S.T.
Menampilkan gambar
Jika pada bagian sebelumnya kita telah membahas pembuatan grafik vector dengan GDI+, maka pada bagian ini kita akan melihat bagaimana mengolah gambar.
INDOPROG
23
Hendra, S.T.
' Membuat rectangle asal gambar dengan menggambil 75% gambar Dim sourceRect As New RectangleF(0, 0, 0.75F * width, 0.75F * height) e.Graphics.DrawImage( _ image, _ destinationRect, _ sourceRect, _ GraphicsUnit.Pixel)
Titik asal Titik tujuan Kiri atas (0, 0) (200, 20) Kanan atas (100, 0) (110, 100) Kiri bawah (0, 50) (250, 30)
INDOPROG
24
Hendra, S.T.
Sehingga dalam program Visual Basic ditulis sebagai : 'Membuat array yang berisi ketiga titik tujuan Dim destinationPoints As Point() = { _ New Point(200, 20), _ New Point(110, 100), _ New Point(250, 30)} Memuat file Stripes.bmp Dim image = New Bitmap("Stripes.bmp") ' Tampilkan gambar dikoordinat 0,0 e.Graphics.DrawImage(image, 0, 0) ' Tampilkan gambar sekali lagi berdasarkan titik tujuan e.Graphics.DrawImage(image, destinationPoints)
INDOPROG
25
Hendra, S.T.
Dengan koding berikut : Dim image = New Bitmap("GrapeBunch.bmp") Dim width As Integer = image.Width Dim height As Integer = image.Height 'Menampilkan gambar apa adanya pada koordinat 0,0 e.Graphics.DrawImage( _ image, _ New Rectangle(10, 10, width, height), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel, _ Nothing) ' Mengunakan interpolation kualitas rendah e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor ' Menampilkan gambar sebesar 60% ukuran semula e.Graphics.DrawImage( _ image, _ INDOPROG
26
Hendra, S.T.
New Rectangle(10, 250, CInt(0.6 * width), CInt(0.6 * height)), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel) ' Menggunakan interpolation kualitas menengah e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear ' Menampilkan gambar sebesar 60% ukuran semula e.Graphics.DrawImage( _ image, _ New Rectangle(150, 250, CInt(0.6 * width), _ CInt(0.6 * height)), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel) ' Menggunakan interpolation kualitas tinggi e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic ' Menampilkan gambar sebesar 60% ukuran semula e.Graphics.DrawImage( _ image, _ New Rectangle(290, 250, CInt(0.6 * width), CInt(0.6 * height)), _ 0, _ 0, _ width, _ height, _ GraphicsUnit.Pixel)
INDOPROG
27
Hendra, S.T.
Program Tetris
Oleh : Hendra Soewarno Contoh aplikasi pemrograman GDI+ untuk pembuatan games tetris dengan pendekatan berorientasi objek.
Untuk memahami program ini anda perlu mengerti pemrograman form, event handling, dan array, serta GDI+
INDOPROG
28
Hendra, S.T.
Rancangan program
Program ini menggunakan pendekatan berorientasi objek dengan membuat dua class untuk objek Shape dan objek Grid
Class TShape
Class ini berfungsi menghasilkan bentuk-bentuk dengan system koordinat berikut :
{1,0},{1,1},{1,2},{1,3}
{0,1},{1,1},{2,1},{3,1}
Berikut ini adalah rincian array untuk masing-masing Shape dan rotasinya
{1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1} {1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{0,2},{1,2} {0,0},{0,1},{1,0},{2,0} {0,0},{1,0},{1,1},{1,2} {0,1},{1,1},{2,0},{2,1} {0,0},{0,1},{0,2},{1,1} {0,0},{1,0},{1,1},{2,0} {1,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,1} {0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0} {0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0}
INDOPROG
29
Hendra, S.T.
Contoh :
Yang selanjutnya dipetakan menjadi suatu array 4 dimensi yang berisi koordinat dari masingmasing shape :
'Array 4 dimensi yang berisi nilai sel dari masing-masing bentuk 'serta bentuk rotasinya private sarr(,,,) as integer = {{{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}, _ {{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}}, _ {{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}}, _ {{{0,0},{0,1},{0,2},{1,2}}, _ {{0,0},{0,1},{1,0},{2,0}}, _ {{0,0},{1,0},{1,1},{1,2}}, _ {{0,1},{1,1},{2,0},{2,1}}}, _ {{{0,0},{0,1},{0,2},{1,1}}, _ {{0,0},{1,0},{1,1},{2,0}}, _ {{1,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,1}}}, _ {{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}, _ {{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}}, _ {{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}, _ {{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}}}
INDOPROG
30
Hendra, S.T.
'menyimpan nomor next shape 'menyimpan warna current shape 'menyimpan warna next shape 'nomor rotasi shape
Konstruktor TShape Konstuktor TShape merupakan metoda yang otomatis dijalankan begitu instance dari TShape terbentuk. Misalnya :
private gtshape as new tshape 'instance class tshape
berfungsi menghasilkan bentuk Shape berikutnya yang akan dimunculkan setelah bentuk sekarang dengan memanggil metoda generateshape.
'konstrutor untuk class tshape public sub new() generateshape(nextshape, nextcolor) end sub
Metoda GenerateNextShape Metoda ini berfungsi memindahkan nextshape menjadi currentshape, serta membuat nextshape yang berikutnya.
'Membuat next shape berikutnya, dan menset current shape public sub generatenextshape() currentshape = nextshape currentcolor = nextcolor currentstate = 0 'rotasi ke 0 generateshape(nextshape, nextcolor) 'buat nextshape baru end sub
INDOPROG
31
Hendra, S.T.
Catatan : Parameter pada sub ini dilewatkan secara by refrence, sehingga nilai dapat dikembalikan ke variable shape dan shapecolor. Metoda Rotate Metode ini berfungsi menset nilai currentstate ke nilai rotasi berikutnya (0 ke 1, 1 ke 2, 2 ke 3, 3 ke 0).
'Rotasi ke bentuk berikutnya public sub rotate() currentstate = currentstate + 1 if currentstate = 4 then currentstate = 0 end sub
Metoda DeRotate Metode ini berfungsi menset nilai currentstate ke nilai rotasi sebelumnya (1 ke 0, 2 ke 1, 3 ke 2, 0 ke 3).
'Rotasi ke bentuk sebelumnya public sub derotate() currentstate = currentstate - 1 if currentstate = -1 then currentstate = 3 end sub
'Rotasi sebelumnya
Metoda CurrentShapeSel Properti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan pada array 4 dimensi sarr.
'Mengembalikan sel i,j dari current shape public function currentshapesel(i as integer, j as integer) return sarr(currentshape,currentstate,i,j) end function
Nilai sel yang dikembalikan sangat tergantung pada nilai variable currentshape (bentuk shape), dan currentstate (nomor rotasi) INDOPROG
32
Hendra, S.T.
{1,0},{0,1},{1,1},{1,2}
Dan CurrentShapeSel(0,0) akan menghasilkan 1 CurrentShapeSel(0,1) akan menghasilkan 0 Property NextShapeSel Properti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan pada array 4 dimensi sarr.
'Mengembalikan sel i,j dari next shape public function nextshapesel(i as integer, j as integer) return sarr(nextshape,0,i,j) 'Bentuk awal end function
Nilai sel yang dikembalikan sangat tergantung pada nilai variable nextshape (bentuk shape), dan currentstate defaultnya 0, karena nextshape belum mengalami rotasi.
Class TGrid
Class ini berfungsi menyediakan mekanisme Grid pada permainan Tetris, dimana pada memori computer diwakili dengan array dua dimensi, dengan gambaran sebagai berikut :
INDOPROG
33
Hendra, S.T.
Merupakan array yang mewakili grid dilayar, jika suatu sel terisi gambar, maka nilai parr(x,y) akan berisi nilai 1, dan carr(x,y) akan berisi nilai warna gambar. Kontruktor TGrid Begitu instance dari TGrid terbuat, maka akan mengisi awal array parr menjadi sebagai berikut, yang akan menjadi bingkai dari grid, sehingga area permainan mulai dari (3,0) s/d (12,22)
INDOPROG
34
Hendra, S.T.
'konstruktur class tgrid public sub new() dim i, j as integer for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1 next j next i for i = 3 to 12 for j = 0 to 22 parr(i,j) = 0 next j next i end sub
'isi bingkai
'isi arena
Metoda TestShape Metoda ini berfungsi mengisi nilai dari shape ke posisi x,y dalam grid, dengan syarat parr(x,y) masih 0
'Menempatkan shape pada posisi x,y di grid public sub putshape(x as integer, y as integer, s as tshape) dim i as integer for i = 0 to 3
INDOPROG
35
Hendra, S.T.
Misalnya putshape yang ke 4, keposisi 6,21 pada grid, yang akan mengisi nilai ke parr
Metoda TestShape Metoda ini berfungsi mencoba apakah shape dapat ditempatkan pada posisi x,y dalam grid, dengan syarat parr(x,y) masih 0
'Mengembalikan nilai yang menunjukan apakah 'shape dapat ditempatkan pada grid diposisi x,y public function testshape(x as integer, y as integer, s as tshape)_ as boolean dim i as integer for i = 0 to 3 'apakah sel pada grid telah terisi ( > 0 ) if parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) > 0 then return false end if
INDOPROG
36
Hendra, S.T.
Metoda CheckGrid Metoda ini berfungsi memeriksa apakah ada baris dalam array parr yang berisi nilai 1 dari kolom 3 s/d 12.
'periksa apakah ada baris yang berhasil diselesaikan pemain public function checkgrid() as integer dim i,j as integer dim b,k as integer dim complete as integer complete = 0 i = 22 do while i > 3 j = 3 do while parr(j,i) <> 0 and j < 13 j=j+1 loop if j = 13 then beep 'sound beep complete = complete + 1 for b = i to 4 step -1 for k = 3 to 12 parr(k,b) = parr(k,b-1) carr(k,b) = carr(k,b-1) next k next b else i = i - 1 end if loop return complete end function end class
Misalnya array parr pada baris 22 berisi nilai 1 mulai baris 3 s/d 12, maka setelah metoda ChekGrid dijalankan akan menghapus baris 22 dan mengeser baris diatasnya ke bawah, dan mengembalikan nilai berapa baris yang berhasil diselesaikan.
INDOPROG
37
Hendra, S.T.
Class Tetris
Class ini merupakan class utama permainan Tetris
Konstruktor Tetris
Berfungsi mempersiapkan tampilan form, seperti title form, ukuran form, menempatkan label untuk keterangan score dan gameover, membuat objek Graphics yang akan digunakan untuk menyediakan metoda pengambaran, serta mempersiapkan Shape berikutnya.
public sub new() me.text = "Program Tetris" me.size = new size(450, 600) labelscore.location = new point(61,30) me.controls.add(labelscore) labelgameover.location = new point(200,30) me.controls.add(labelgameover) g = me.creategraphics() score = 0 printscore() nextshape() 'persiapkan shape berikutnya end sub
Metoda NextShape
Metoda ini berfungsi mempersiapkan shape berikutnya, dan menset interval timer 200 millidetik, dan posisi awal shape mulai di posisi (7,0)
'metoda mempersiapkan shape berikutnya private sub nextshape() gtimer.interval = 200
INDOPROG
38
Hendra, S.T.
Metoda MoveShape
Metoda ini berfungsi menggambarkan animasi pergerakan Shape pada posisi x,y sesuai dengan arah gerakan yang ditentukan pada dx dan dy, misalnya bergerak ke kiri, kama dx = -1, dy = 0
'memindahkan shape keposisi x,y private sub movexy(dx,dy) clearshape() x = x + dx y = y + dy drawshape() end sub
Metoda MoveShape
Metoda ini berfungsi memperbaharui nilai score di layar
'metoda untuk mencetak score dilayar private sub printscore() labelscore.text = "Score : " & score.tostring() end sub
Metoda MoveShape
Metoda ini berfungsi mengubah tulisan di labelgameover menjadi Game Over
'metoda untuk mencetak gameover private sub printgameover() labelgameover.text = "Game Over" end sub
Event Tick
Event ini secara otomatis akan dibangkitkan oleh Timer secara berkala untuk mengerakan Shape ke bawah, dengan senantiasa apakah Shape telah mencapai batas gerakan, jika ya, maka akan memanggil metoda putshape pada TGrid. Jika Shape tertahan dibaris < 3 artinya Game Over
'mengerakan shape ke bawah dengan interval waktu tertentu private sub gtimer_tick(sender as object, e as eventargs) _ handles gtimer.tick 'apakah shape masih bisa turun kebawah if gtgrid.testshape(x,y+1,gtshape) then
INDOPROG
39
Hendra, S.T.
movexy(0,1) 'jika ya pindah shape 1 baris ke bawah else gtgrid.putshape(x,y,gtshape) 'tempatkan shape kegrid score = score + gtgrid.checkgrid() 'periksa baris yang lengkap redrawgrid() 'cetak ulang grid printscore() 'cetak score 'jika shape tertahan di baris 3, artinya game over if y < 3 then gtimer.enabled = false 'matikan timer karena gameover printgameover() 'tampil pesan gameover else nextshape() 'persiapkan gambar berikutnya end if end if end sub
Event KeyDown
Event ini secara otomatis akan dibangkitkan apabila adanya penekanan tombol oleh pemakai, Jika panah atas akan merotasi shape jika panah kiri akan mengerakan shape ke kiri jika panah kanan akan mengerakan shape ke kanan jika panah bawah akan mempercepat turunya shape
'deteksi penekanan tombol dengan event keydown pada form private sub tetris_keydown(sender as object, e as keyeventargs) _ handles mybase.keydown select case e.keyvalue case 38, 104, 12,101 : 'Panah atas, 8, 5 gtshape.rotate() 'rotasi 'apakah hasil rotasi dapat ditempatkan diposisi x,y if gtgrid.testshape(x,y,gtshape) then 'kalau ya, rotasi balik kembali gtshape.derotate() clearshape() 'hapus animasi shape gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar else gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) then movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah kanan, 6 if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if case 40, 98 : 'Panah bawah, 2 interval dipercepat gtimer.interval = 10 end select end sub
INDOPROG
40
Hendra, S.T.
Metoda DrawSel
Metoda ini berfungsi menggambar sel Shape ke layar untuk animasi, metoda ini akan dipanggil oleh metoda drawshape dan OnPaint
'menggambar sel dari suatu shape private sub drawsel(pen as pen, brush as brush, _ x as integer, y as integer, _ w as integer, h as integer) if y > 2 then g.fillrectangle(brush,x*21,y*21,w,h) g.drawrectangle(pen,x*21,y*21,w,h) end if end sub
Metoda DrawShape
Metoda ini berfungsi menggambar Shape ke layar dengan memanggil metoda DrawSel untuk masing-masing sel
'mengambar shape secara sementara private sub drawshape() dim i as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(gtshape.currentcolor) for i = 0 to 3 drawsel(pen,brush, _ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1), _ 20,20) next i end sub
Metoda DrawShape
Metoda ini berfungsi menghapus Shape di layar dengan memanggil metoda DrawSel untuk masing-masing sel (warna hitam)
'menghapus shape sementara private sub clearshape() dim i as integer dim pen as new pen(color.black,1) dim brush as new solidbrush(color.black) for i = 0 to 3 drawsel(pen,brush, _ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1),20,20) next i end sub
Metoda ReDrawNextShape
Metoda ini berfungsi menggambar NextShape di layar setiap adanya perubahan nextshape
INDOPROG
41
Hendra, S.T.
Metoda ReDrawGrid
Metoda ini berfungsi menggambar ulang Grid dilayar
'mengambar ulang grid private sub redrawgrid dim i,j as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(color.red) for i = 3 to 12 for j = 3 to 22 if gtgrid.parr(i,j) <> 0 then 'Menggambar ulang isi grid pen.color = color.white brush.color = gtgrid.carr(i,j) drawsel(pen,brush,i,j,20,20) else pen.color = color.black brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next j next i pen.color = color.black g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub
Metoda OnPaint
Metoda OnPaint akan secara otomatis diaktifkan oleh windows setiap kali layar form Tetris digambar ulang (misalnya waktu Maximize dan Minimize)
'melakukan overide terhadap sub onpaint pada base class 'untuk menggambar isi grid setiap proses refresh pada form protected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape() end sub
INDOPROG
42
Hendra, S.T.
Program Kongkret
option explicit on imports system imports system.drawing imports system.windows.forms imports microsoft.visualbasic public class tetris : inherits system.windows.forms.form <system.STAThread> _ public shared sub main() randomize() application.run(new tetris) end sub private private private private private private private private withevents gtimer as new system.windows.forms.timer labelscore as new label labelgameover as new label gtgrid as new tgrid 'instance class tgrid gtshape as new tshape 'instance class tshape g as graphics x,y as integer 'posisi x,y shape pada grid score as integer 'score permainan
public sub new() me.text = "Program Tetris" me.size = new size(450, 600) labelscore.location = new point(61,30) me.controls.add(labelscore) labelgameover.location = new point(200,30) me.controls.add(labelgameover) g = me.creategraphics() score = 0 printscore() nextshape() 'persiapkan shape berikutnya end sub 'metoda mempersiapkan shape berikutnya private sub nextshape() gtimer.interval = 200 gtimer.enabled = true gtshape.generatenextshape() redrawnextshape() x = 7 y = 0 end sub 'memindahkan shape keposisi x,y private sub movexy(dx,dy) clearshape() x = x + dx y = y + dy drawshape() end sub
'set interval 200 millidetik 'mengaktifkan timer 'cetak shape berikutnya 'koordinat awal di 7,0
INDOPROG
43
Hendra, S.T.
'mengerakan shape ke bawah dengan interval waktu tertentu private sub gtimer_tick(sender as object, e as eventargs) _ handles gtimer.tick 'apakah shape bisa turun kebawah if gtgrid.testshape(x,y+1,gtshape) then movexy(0,1) 'pindah shape 1 baris ke bawah else gtgrid.putshape(x,y,gtshape) 'tempatkan shape kegrid score = score + gtgrid.checkgrid() 'periksa baris yang lengkap redrawgrid() 'cetak ulang grid printscore() 'cetak score 'jika shape tertahan di baris 3, artinya game over if y < 3 then gtimer.enabled = false 'matikan timer karena gameover printgameover() 'tampil pesan gameover else nextshape() 'persiapkan gambar berikutnya end if end if end sub 'deteksi penekanan tombol dengan event keydown pada form private sub tetris_keydown(sender as object, e as keyeventargs) _ handles mybase.keydown select case e.keyvalue case 38, 104, 12,101 : 'Panah atas, 8, 5 gtshape.rotate() 'rotasi 'apakah hasil rotasi dapat ditempatkan diposisi x,y if gtgrid.testshape(x,y,gtshape) then 'kalau ya, rotasi balik kembali gtshape.derotate() clearshape() 'hapus animasi shape gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar else gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) then movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah kanan, 6 if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if case 40, 98 : 'Panah bawah, 2 interval dipercepat
INDOPROG
44
Hendra, S.T.
INDOPROG
45
Hendra, S.T.
private sub redrawgrid dim i,j as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(color.red) for i = 3 to 12 for j = 3 to 22 if gtgrid.parr(i,j) <> 0 then 'Menggambar ulang isi grid pen.color = color.white brush.color = gtgrid.carr(i,j) drawsel(pen,brush,i,j,20,20) else pen.color = color.black brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next j next i pen.color = color.black g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub 'melakukan overide terhadap sub onpaint pada base class 'untuk menggambar isi grid setiap proses refresh pada form protected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape() end sub end class
public class tgrid public parr(15,25) as integer grid public carr(15,25) as color grid 'konstruktur class tgrid public sub new() dim i, j as integer for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1 next j next i for i = 3 to 12 for j = 0 to 22 parr(i,j) = 0 next j next i end sub
'Array menyimpan isi sel pada 'Array menyimpan warna sel pada
'isi bingkai
'isi arena
'Mengembalikan nilai yang menunjukan apakah 'shape dapat ditempatkan pada grid diposisi x,y public function testshape(x as integer, y as integer, s as tshape) _ as boolean dim i as integer
INDOPROG
46
Hendra, S.T.
'Menempatkan shape pada posisi x,y di grid public sub putshape(x as integer, y as integer, s as tshape) dim i as integer for i = 0 to 3 parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = 1 carr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = s.currentcolor next i end sub 'periksa apakah ada baris yang berhasil diselesaikan pemain public function checkgrid() as integer dim i,j as integer dim b,k as integer dim complete as integer complete = 0 i = 22 do while i > 3 j = 3 do while parr(j,i) <> 0 and j < 13 j=j+1 loop if j = 13 then beep 'sound beep complete = complete + 1 for b = i to 4 step -1 for k = 3 to 12 parr(k,b) = parr(k,b-1) carr(k,b) = carr(k,b-1) next k next b else i = i - 1 end if loop return complete end function end class public class tshape private currentshape private nextshape as public currentcolor public nextcolor as
INDOPROG
47
Hendra, S.T.
'Array 4 dimensi yang berisi nilai sel dari masing-masing bentuk 'serta bentuk rotasinya private sarr(,,,) as integer = {{{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}, _ {{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}}, _ {{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}}, _ {{{0,0},{0,1},{0,2},{1,2}}, _ {{0,0},{0,1},{1,0},{2,0}}, _ {{0,0},{1,0},{1,1},{1,2}}, _ {{0,1},{1,1},{2,0},{2,1}}}, _ {{{0,0},{0,1},{0,2},{1,1}}, _ {{0,0},{1,0},{1,1},{2,0}}, _ {{1,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,1}}}, _ {{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}, _ {{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}}, _ {{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}, _ {{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}}} 'konstrutor untuk class tshape public sub new() generateshape(nextshape, nextcolor) end sub 'Membuat next shape berikutnya, dan menset current shape public sub generatenextshape() currentshape = nextshape currentcolor = nextcolor currentstate = 0 'rotasi ke 0 generateshape(nextshape, nextcolor) 'buat nextshape baru end sub 'Membuat bentuk dan mengembalikan melalui parameter shape dan shapecolor private sub generateshape(byref shape as integer, _ byref shapecolor as color) dim c as integer shape = int(rnd*6) 'random untuk shape c = int(rnd*8) 'random untuk shape color select case c case 0 : shapecolor = color.red case 1 : shapecolor = color.green case 2 : shapecolor = color.blue case 3 : shapecolor = color.orange case 4 : shapecolor = color.pink case 5 : shapecolor = color.cyan case 6 : shapecolor = color.gray case else shapecolor = color.magenta
INDOPROG
48
Hendra, S.T.
'Rotasi sebelumnya
'Mengembalikan sel i,j dari current shape public function currentshapesel(i as integer, j as integer) return sarr(currentshape,currentstate,i,j) end function 'Mengembalikan sel i,j dari next shape public function nextshapesel(i as integer, j as integer) return sarr(nextshape,0,i,j) 'Bentuk awal end function end class
Kompilasi Program
Vbc tetris.vb /r:system.dll /r:system.drawing.dll /r:system.windows.forms.dll
INDOPROG
49
Hendra, S.T.
Buku ini membahas tentang konsep dasar pemrograman berorientasi objek (OOP) dan bagaimana melakukannya pada VB.NET, serta memberikan contoh-contoh keunggulan OOP dibandingkan dengan pendekatan konvensional. Penguasaan terhadap teknik pengembangan berorientasi objek merupakan suatu nilai tambah bagi programmer dewasa ini, karena trend bahasa pemrograman menuju kearah pendekatan OOP, terutama sejak kemunculan Java yang 100% menerapkan OOP. Penulis yakin bagian ini merupakan hal yang tersulit bagi programmer yang ingin melakukan migrasi dari VB6 ke VB.NET, karena OOP merupakan hal yang benar-benar baru. Untuk mempelajari buku ini anda tidak perlu menginstalasi Visual Studio .NET, tetapi anda cukup menginstalasi .Net Framework yang dapat didownload secara gratis dari website Microsoft. Semua contoh dan latihan dibuku ini dapat dikompilasi langsung dari Dos prompt dengan menggunakan kompiler Visual Basic yang langsung tersedia setelah anda menginstalasi .Net Framework.
INDOPROG
Hendra, S.T.
Dasar OOP
Visual Basic merupakan bahasa yang Object-Based (komponen-komponen program dibuat dalam bentuk objek), sedangkan VB.NET adalah Object Oriented, hal ini berarti bahwa VB.NET merupakan bahasa yang benar-benar berorientasi object dengan mendukung empat pilar utama dari OOP yaitu Polymorphism, Inheritance, Abstraction dan Encapsulation. Kalau anda adalah programmer yang terbiasa dengan pendekatan procedural terstruktur, maka anda akan baru dengan beberapa istilah OOP yang kita sebutkan diatas, dan memang hal tersebut senantiasa menjadi masalah bagi programmer yang berasal dari VB dan ingin beralih ke VB.NET. Lalu timbul pertanyaan, apakah pada kita harus menguasai dan memahami semua istilah diatas baru dapat membuat program aplikasi dengan VB.NET ? Tentu saja jawabannya tidak, tetapi sebagai programmer VB.NET yang baik, maka konsep dari OOP tidak dapat diabaikan.
Menekankan pada data dari pada procedure Program terbagi kedalam objek-objek Data disembunyikan dari akses oleh function-function eksternal Objek dapat berkomunikasi satu dengan yang lain melalui function Data baru dan function dapat dengan mudah ditambahkan pada saat dibutuhkan. Mengikuti pendekatan buttom up.
INDOPROG
Hendra, S.T.
Objek
Objek merupakan dasar dari entitas run-time dalam suatu sistem berorientasi objek. Masalah pada pemrograman adalah menganalisa dalam arti objek dan komunikasi alamiah diantara mereka. Ketika suatu program dijalankan, objek berinteraksi satu dengan yang lain dengan saling mengirim message. Objek-objek yang berbeda berinteraksi satu dengan yang lain tanpa mengetahui detail data dari masing-masing data ataupun koding.
Class
Suatu class adalah suatu koleksi dari objek-objek yang bertipe sama. Setelah suatu class telah didefinisikan, sejumlah dari objek-objek dapat dibuat berdasarkan class tersebut.
Catatan : Istilah Class dan Objek sering dicampuradukan, pada objek merupakan instance dari suatu class pada saat runtime, jadi pada saat design, class merupakan cetak biru bagi objek-objek yang akan dibuat pada saat runtime. Anda dapat mengasosiasikan class dengan gambar denah dari rancangan rumah, dan selanjutnya berdasarkan denah ini akan dibangun rumah-rumah (objek) sebenarnya.
INDOPROG
Hendra, S.T.
Catatan : Sebagaimana contoh sebelumnya bahwa TV merupakan gambaran dari Abstraksi, dimana yang perlu ditonjolkan pada pemakai adalah hal-hal penting bagaimana menghidupkan dan mematikan serta berbagai setting dasar, sedangkan permasalahan teknis yang berada didalam kotak TV seperti rangkaian elektronik disembunyikan dari pemakai. Jadi dalam hal ini TV dianggap suatu black box. Menyimpan data dan fungsi-fungsi ke dalam suatu unit tunggal (class) adalah encapsulation. Data tidak dapat diakses oleh dunia luar dan hanya fungsi-fungsi yang mana berada dalam class tersebut dapat mengaksesnya.
Inheritance
Inheritance adalah proses yang mana objek-objek dapat mengusahakan member dari objek class lain. Pada OOP inheritance menyediakan pemakaian kembali, seperti, menambah kemampuan baru pada class yang telah ada dengan tanpa melakukan modifikasi langsung terhadap class tersebut. Hal ini dilakukan dengan menurunkan suatu class baru dari yang class telah ada. Class baru tersebut memiliki kombinasi dari keduanya. Catatan : Pendekatan inheritance dapat dipahami sebagai pengembangan produk, dimana engineer tidak perlu merancang produk dari awal, tetapi dengan melakukan modifikasi terhadap produk yang telah ada untuk menghasilkan suatu produk baru.
Polymorphism
Polymorphism adalah kemampuan untuk memiliki lebih dari satu bentuk. Suatu operasi dapat menunjukan prilaku yang berbeda pada instance yang berbeda. Prilaku tersebut tergantung kepada tipe data yang digunakan dalam operasi. Polymorphism secara ekstensif digunakan dalam implementasi Inheritance. Dengan polymorphism kita dapat membuat beberapa fungsi dengan nama yang sama tetapi memiliki daftar argument yang berbeda baik dari segi jumlah maupun tipe datanya (Overloading), sehingga dalam implementasinya fungsi akan dioperasikan berdasarkan argumen yang diberikan, sehingga program dapat bereaksi secara tepat sesuai dengan jenis tipe data dan jumlah argument. Kemudian polymorphism juga memiliki fungsi dimana pemanfaatan variable dengan tipe base class untuk menampung instance dari class turunannya dan menjalankan metoda class turunannya.
INDOPROG
Hendra, S.T.
OOP menyediakan struktur modular yang jelas untuk program, yang mana cocok untuk mendefinisikan tipe data abstrak yang merupakan detail dari implementasi disembunyikan serta unit memiliki interface yang telah didefinisikan dengan jelas. OOP memudahkan maintenance dan modifikasi terhadap kode yang telah sebagai objek baru yang dapat dibuat dengan perubahan yang minimal OOP menyediakan suatu kerangka kerja yang baik untuk kode library yang mana menyediakan komponen software yang secara mudah dapat disesuaikan dan dimodifikasi oleh programmer. Hal ini khususnya sangat berguna untuk pengembangan user interface secara grafik.
Catatan : Setelah anda membaca uraian tersebut diatas, awalnya anda akan merasa kesulitan untuk memahami dan menerapkan beberapa konsep-konsep diatas pada program anda, dan hal tersebut adalah wajar. Untuk mentransformasi gaya pemrograman anda dari pendekatan procedural terstruktur menjadi OOP membutuhkan waktu dan usaha. Sebab pada pendekatan procedural terstruktur focus programmer langsung kepada logika dan koding untuk pencapaian hasil, sedangkan pada OOP kita harus melakukan abstraksi terhadap data dan fungsi yang berkaitan menjadi class, dan selanjutnya class-class tersebut berinteraksi dengan message untuk mencapai tujuan akhir. Untuk membantu pengertian dan menunjukan keunggulan konsep OOP, penulis akan memberikan beberapa contoh keunggulan pemanfaatan OOP pada bagian-bagian selanjutnya.
INDOPROG
Hendra, S.T.
Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30)
INDOPROG
Hendra, S.T.
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y > (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f) End Sub End Class
Catatan : Jika anda perhatikan perhatikan rancangan class diatas, maka konsep dari data abstraction akan nampak, dimana sebagai interface keluar hanya terdiri metoda New, Draw, Clear, dan Move, sedangkan pengkodean tersembunyi dari program yang akan memanfaatkan Objek dari Class Pantul Kemudian konsep dari data encapsulation, dimana variable x,y,sx,sy,dx, dan dy disatukan beserta fungsi New, Draw, Clear, dan Move didalam satu Class Pantul.
INDOPROG
Hendra, S.T.
Constructors
Suatu constructor adalah anggota function yang mana memiliki tugas untuk menginisialisasi objek dari classnya. Suatu constructor akan dijalankan ketika objek dari class tersebut diciptakan. Kita dapat mengirim data kepada konstruktor dengan mencantumkannya didalam kurung. Pada Visual Basic suatu konstruktor harus dibuat dengan suatu Sub procedure dengan nama New pada class. Koding berikut mendemonstrasikan pemakaian dari konstruktor di Visual Basic.
Public Sub New(f as form) sx = f.width \ 30 sy = f.height \ 30 x = rnd*(sx-2) + 2 y = rnd*(sy-2) + 2 dx = 1 dy = 1 Draw(f) End Sub 'constructor 'lebar form dibagi 30 'tinggi form dibagi 30 'posisi awal random 'arah diagonal ke bawah
Pada contoh diatas, konstruktor digunakan untuk menginisialisasi nilai awal untuk variable pada Objek seperti sx, sy, x, y, dx, dan dy. Untuk konstruktor diatas, pada saat kita membuat instance dari Class dengan
Dim Bola As Pantul Bola = New Pantul(Me)
Destructors
Destructors akan dijalankan ketika suatu objek dimusnahkan. Didalam suatu destructor kita dapat menempatkan koding untuk membersihkan objek setelah digunakan. Kita menggunakan metode Finalize di Visual Basic untuk membuat destructor yang otomatis akan dijalankan ketika runtime .NET menemukan bahwa objek tidak dibutuhkan lagi. Contoh implementasi pemakaian destructor adalah misalnya pada konstruktor kita membuka data maupun file, sehingga pada saat destructor kita perlu menutup data maupun file yang terbuka. Catatan: Setiap objek didunia nyata memiliki fase awal yaitu kelahiran, dan fase akhir yaitu kematian. Pada saat suatu objek dilahirkan tentu saja telah memiliki nilai property bawaan, seperti seorang bayi yang baru dilahirkan telah memiliki jenis kelamin, berat badan, dan tinggi. Demikian juga objek dalam konsep OOP, yang kadang-kadang membutuhkan pemberian nilai awal kepada beberapa property begitu instance dari class dibuat. Tindakan pemberian nilai awal (inisialisasi) ini dapat dilakukan dengan menggunakan metoda
INDOPROG
Hendra, S.T.
Dari hal ini jelaslah bahwa dengan pendekatan OOP kita tidak melakukan perubahan terhadap rancangan Class Pantul sama sekali, melainkan kita membuat 15 instance dari Class Pantul. Listing lengkap dari program 15 ola pantul dengan pendekatan OOP.
Option Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim WithEvents MyTimer as New Timer Dim Bola(14) As Pantul <Sistem.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub Public Sub New() 'Constructor
INDOPROG
Hendra, S.T.
'Mengerakan objek dengan event tick pada objek MyTimer Private Sub MyTimer_Tick(sender as object, e as eventargs) _ handles MyTimer.Tick For I As Integer = 0 to 14 Bola(I).Move(Me) Next I End Sub End Class Class Pantul Protected x As Single Protected y As Single Private sx As Single Private sy As Single Private dx As Single Private dy As Single Public Sub New(f as form) sx = f.width \ 30 sy = f.height \ 30 x = rnd*(sx-2) + 2 y = rnd*(sy-2) + 2 dx = 1 dy = 1 Draw(f) End Sub
'posisi x dilayar 'posisi y dilayar 'jumlah kolom x 'jumlah baris y 'arah bola terhadap x 'arah bola terhadap y 'constructor 'lebar form dibagi 30 'tinggi form dibagi 30 'posisi awal random 'arah diagonal ke bawah
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy
INDOPROG
10
Hendra, S.T.
INDOPROG
11
Hendra, S.T.
Inheritance
Pemanfaatan Kembali
Kunci dari kemampuan OOP adalah pemakaian kembali. Yang secara nyata akan menghemat waktu jika kita dapat memanfaatkan kembali pada yang pernah kita buat. Pemakaian kembali akan menurunkan pekerjaan untuk testing dan debugging terhadap bagian yang digunakan kembali, karena telah dilakukan sebelumnya. Proses inheritance dilakukan dengan menurunkan suatu class baru dari class yang telah ada. Class yang lama disebut sebagai base class dan class yang baru disebut derived class. Class turunan akan mewarikan semua atau sebagian dari segala sesuatu yang terdapat pada base class. Pada Visual Basic kita menggunakan keyword Inherits untuk menurunkan suatu class: Misalnya kita telah memiliki Class Pantul
Class Pantul member End Class
Selanjutnya misalnya kita ingin mengembangkan Class baru dengan menurunkannya dari Class Pantu
Class Pantul1 : Inherits Pantul member End Class
Maka Class Pantul1 akan mewarisi semua member Pantul yang dideklarasikan sebagai Protected maupun Public.
Overriding
Pada derived class kadang-kadang kita perlu mendefinisikan ulang fungsi maupun sub yang ada pada base class, dalam hal inilah istilash Overriding muncul, dimana kita dapat mendefinisikan ulang fungsi maupun sub pada derived class. Misalnya pada Class Pantul1 gambar yang ingin kita hasilkan adalah persegi, maka kita perlu melakukan Overiding terhadap Sub Draw dan Clear yang ada pada base class. Catatan : Sub maupun Function pada base class harus dideklarasikan sebagai Overridable baru dapat di Overrides pada derived class. Pada Class pantul kita perlu mencantumkan keyword Overridable
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30)
INDOPROG
12
Hendra, S.T.
Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub
Selanjutnya pada class turunannya kita dapat melakukan Overriding terhadap metoda yang dimaksud :
Class Pantul1 : Inherits Pantul Public Sub New(f as form) MyBase.New(f) End Sub 'constructor
Overrides Public Sub Draw(f as form) 'metoda 'gambar persegi ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides Public Sub Clear(f as form) 'metoda 'gambar persegi ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawRectangle(MyPen, x*30,y*30,30,30) End Sub End Class
Shadowing
Jika pada Overriding kita membutuhkan permisi dari base class untuk melakukan overriding dengan keyword Overridable, selain itu kita juga dapat melakukan Shadowing terhadap metoda pada base class yang tidak memberikan permisi Overridable. Contoh : Pada base class :
Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub
INDOPROG
13
Hendra, S.T.
Public Shadows Sub Draw(f as form) 'metoda 'gambar persegi ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub
Catatan : Pemakaian cara Shadowing menyebabkan konsep polymorphism tidak dapat berfungsi sebagaimana pada cara Overriding.
Selanjutnya kita dapat membuat konstruktor (sub New) untuk menginisialisasi keadaan awal dari form kita (misalnya mengatur warna, ukuran, menambah control timer dll)
Public Sub New() 'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle = FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width Me.Height = Screen.PrimaryScreen.Bounds.Height For I As Integer = 0 to 14 Bola(I) = New Pantul(Me) Next I '150 millidetik MyTimer.Interval = 150 MyTimer.Enabled = True End Sub
Pada class MyForm kita dapat juga melakukan overriding terhadap metoda yang telah terdefinisi pada class Form, misalnya untuk metoda paint.
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyBase.OnPaint(e) e.Graphics.DrawLine(MyPen,10,10,200,100) End Sub
INDOPROG
14
Hendra, S.T.
Pada pendekatan OOP, misalnya kita telah memiliki class Pantul yang menampilkan bentuk lingkaran, selanjutnya adalah membuat class Pantul1 yang akan menampilkan bentuk persegi, tetapi kita tidak perlu merancang class Pantul1 dari awal melainkan cukup menurunkannya dari class Pantul dengan melakukan override terhadap metoda draw dan clear. Jadi dalam hal ini kita tidak perlu merancang class dari awal, tetapi cukup memperbaharui maupun mengembangkan class yang telah ada, sehingga waktu pemrograman dapat dipersingkat dan proses debug dapat dikurangi. Listing program menampilkan bola dan persegi pantul dilayar :
Option Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim WithEvents MyTimer as New Timer Dim Bola As Pantul Dim Persegi As Pantul1 <Sistem.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub
'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle = FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width Me.Height = Screen.PrimaryScreen.Bounds.Height Bola = New Pantul(Me) Persegi = New Pantul1(Me) MyTimer.Interval = 150 MyTimer.Enabled = True End Sub Private Sub MyTimer_Tock(sender as object, e as eventargs) _ handles MyTimer.Tick Bola.Move(Me) Persegi.Move(Me) End Sub End Class
Class Pantul Protected x As Single Protected y As Single Private sx As Single Private sy As Single
INDOPROG
15
Hendra, S.T.
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y > (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f) End Sub End Class Class Pantul1 : Inherits Pantul Public Sub New(f as form) MyBase.New(f) End Sub 'constructor 'menjalankan constructor base class
Overrides Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics
INDOPROG
16
Hendra, S.T.
INDOPROG
17
Hendra, S.T.
Polymorphism
Polymorphism merupakan salah satu fasilitas yang krusial pada OOP, yang memiliki arti "satu nama, banyak bentuk". Hal ini disebut juga sebagai Overloading yang berarti menggunakan hal yang sama untuk tujuan yang berbeda. Dengan menggunakan Polymorphism kita dapat membuat banyak fungsi dengan nama yang sama tetapi memiliki daftar argument yang berbeda. Fungsi tersebut dijalankan berdasarkan daftar argument yang digunakan untuk menjalankan fungsi. Misalnya kita memperbaharui class Pantul dimana pada konstruktor kita dapat menentukan warna dari lingkaran.
Class Pantul Protected x As Single 'posisi x dilayar Protected y As Single 'posisi y dilayar Private sx As Single 'jumlah kolom x Private sy As Single 'jumlah baris y Private dx As Single 'arah bola terhadap x Private dy As Single 'arah bola terhadap y Private clr As Sistem.Drawing.Color Public Sub New(f as form) 'constructor me.New(f,Sistem.Drawing.Color.Red) End Sub Public Sub New(f as form, w as sistem.drawing.color) 'constructor sx = f.width \ 30 'lebar form dibagi 30 sy = f.height \ 30 'tinggi form dibagi 30 x = rnd*(sx-2) + 2 'posisi awal random y = rnd*(sy-2) + 2 dx = 1 'arah diagonal ke bawah dy = 1 clr = w Draw(f) End Sub Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Clr,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah
INDOPROG
18
Hendra, S.T.
Dalam hal ini class pantul memiliki dua konstruktor yang masing-masing memiliki daftar argument yang berbeda yaitu :
Public Sub New(f as form) 'constructor
Dan
Public Sub New(f as form, w as sistem.drawing.color)
Sehingga ketika kita membuat instance dari Class Pantul dapat dilakukan dengan :
Bola = New Pantul(Me)
Ataupun :
Bola = New Pantul(Me, Sistem.Drawing.Color.Blue)
Polymorphism juga dapat berupa pemanfaatan variable yang bertype base class untuk mengimplementasikan metoda pada class-class turunannya. Misalnya kita mendeklarasikan variable array bola yang terdiri dari dua elemen Dim Bola(1) As Pantul Bola(0) = New Pantul(Me) Bola(1) = New Pantul1(Me) Dimana variable Bola(n) sebenarnya merupakan variable type Pantul, tetapi dalam pemakaiannya kita gunakan untuk instance Pantul1, selanjutnya : Bola(0).Move(Me) Bola(1).Move(Me) Akan menjalankan metoda Move dari Class yang bersesuaian dengan instance objek yang dibuat.
19
Hendra, S.T.
Dim JlhBola As Integer = Val(Inputbox("Jumlah Bola")) Dim JlhPersegi As Integer = Val(Inputbox("Jumlah Persegi"))
Selanjutnya kita membuat instance dari masing-masing class sesuai dengan jumlah yang ditentukan :
Dim Bola(14) As Pantul Dim Jlh As Integer Dim I As Integer = 0 Do While I < JlhBola Bola(I) = new Pantul(Me) I+=1 Loop Do While I < JlhBola+JlhPersegi Bola(I) = new Pantul1(Me) I+=1 Loop Jlh = JlhBola+JlhPersegi
Dalam hal ini kita mendeklarasikan variable array Bola yang bertipe Pantul, padahal dalam pemakaiannya kita gunakan juga untuk menampung instance untuk class Pantul1. Kemudian untuk mengerakan objek kita gunakan looping :
For I As Integer = 0 To Jlh-1 Bola(I).Move(Me)
INDOPROG
20
Hendra, S.T.
Selanjutnya metoda move yang dijalankan sangat tergantung pada jenis instance dari variable objek. Dapatkah anda bayangkan bagaimana kalau tanpa menggunakan Polymorphism ? Listing program menampilkan bola dan persegi pantul dilayar sesuai dengan jumlah yang diinginkan pemakai :
Option Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim WithEvents MyTimer as New Timer Dim Bola(14) As Pantul Dim Jlh As Integer <Sistem.STAThread()> _ Public Shared Sub Main() Application.Run(New MyForm) End Sub Public Sub New() 'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle = FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width Me.Height = Screen.PrimaryScreen.Bounds.Height Dim JlhBola As Integer = Val(Inputbox("Jumlah Bola")) Dim JlhPersegi As Integer = Val(Inputbox("Jumlah Persegi")) Dim I As Integer = 0 Do While I < JlhBola Bola(I) = new Pantul(Me) I+=1 Loop Do While I < JlhBola+JlhPersegi Bola(I) = new Pantul1(Me) I+=1 Loop Jlh = JlhBola+JlhPersegi MyTimer.Interval = 150 MyTimer.Enabled = True End Sub Private Sub MyTimer_Tock(sender as object, e as eventargs) _ handles MyTimer.Tick For I As Integer = 0 To Jlh-1
INDOPROG
21
Hendra, S.T.
Class Pantul Protected x As Single 'posisi x dilayar Protected y As Single 'posisi y dilayar Private sx As Single 'jumlah kolom x Private sy As Single 'jumlah baris y Private dx As Single 'arah bola terhadap x Private dy As Single 'arah bola terhadap y Private clr As Sistem.Drawing.Color Public Sub New(f as form) 'constructor me.New(f,Sistem.Drawing.Color.Red) End Sub Public Sub New(f as form, w as sistem.drawing.color) 'constructor sx = f.width \ 30 'lebar form dibagi 30 sy = f.height \ 30 'tinggi form dibagi 30 x = rnd*(sx-2) + 2 'posisi awal random y = rnd*(sy-2) + 2 dx = 1 'arah diagonal ke bawah dy = 1 clr = w Draw(f) End Sub Overridable Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Clr,3) MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen, x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y > (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f)
INDOPROG
22
Hendra, S.T.
Overrides Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawRectangle(MyPen, x*30,y*30,30,30) End Sub
End Class
INDOPROG
23
Hendra, S.T.
Interfaces
Interfaces memungkinkan kita untuk membuat definisi untuk interaksi komponen. Interface juga menyediakan cara lain untuk mengimplementasikan polymorphism. Melalui interface, kita dapat menentukan metoda yang mana suatu komponen harus miliki tanpa menentukan bagaimana metoda tersebut diimplementasikan (koding detail untuk metoda tersebut). Jadi dalam hal ini interface menyerupai prototype bagi class lain yang akan dikembangkan. Anda bisa membayangkan interface sebagai suatu standard pengembangan berbagai fasilitas dalam objek yang dibakukan, jika class mendukung standard interface tersebut, maka wajib memenuhi tata cara penulisan yang telah didefinisikan dalam interface. Misalnya kita membuka pusat layanan pelanggan dimana semua pelayan diwajibkan melakukan sapaan pembukan kepada para tamu yang dating berkunjung, dan kata pembuka sapaan telah distandarisasi untuk pagi, sore, dan malam.
Public Sub Sub Sub Interface Sapaan Pagi() Sore() Malam()
End Interface
Kita menggunakan keyword Interface untuk membuat suatu interface dan keyword implements untuk mengimplementasikan interface tersebut. Selanjutnya sapaan akan disampaikan dalam dua bahasa sesuai dengan asal pengunjung, sehingga kita dapat memgembangkan class dengan mengimplementasikan interface sapaan yang telah dibuat :
Public Class Indonesia : Implements Sapaan Sub Pagi() Implements Sapaan.Pagi Console.WriteLine("Selamat Pagi") End Sub Sub Sore() Implements Sapaan.Sore Console.WriteLine("Selamat Sore") End Sub Sub Malam() Implements Sapaan.Malam Console.WriteLine("Selamat Malam") End Sub End Class Public Class English : Implements Sapaan Sub Pagi() Implements Sapaan.Pagi Console.WriteLine("Good Morning") End Sub Sub Sore() Implements Sapaan.Sore
INDOPROG
24
Hendra, S.T.
INDOPROG
25
Hendra, S.T.
INDOPROG
26
Hendra, S.T.
Abstract Classes
Suatu class abstrak tidak dapat digunakan untuk membuat objek. Suatu class abstrak dirancang untuk berlaku sebagai suatu base class (untuk diwariskan ke class lain). Suatu abstrak class digunakan sebagai konsep design yang menjadi acuan pengembangan bagi class-class yang akan dikembangkan. Class abstrak menyerupai interface. Setelah suatu class abstrak dideklarasikan, dia tidak dapat di buat objek instancenya, melainkan harus diturunkan.
Kemudian pada contoh diatas pada masing-masing metoda sapaan kita menambahkan keyword MustOverride bahwa metoda Pagi, Sore, dan Malam harus di override pada class turunannya.
Option Explicit On Imports Sistem Public Module MyModule Sub Main() Dim Domestik As New Indonesia Dim Internasional As New English Domestik.Pagi() Internasional.Pagi() End Sub MustInherit Public Class Sapaan MustOverride Sub Pagi() MustOverride Sub Sore() MustOverride Sub Malam() End Class Public Class Indonesia : Inherits Sapaan Overrides Sub Pagi() Console.WriteLine("Selamat Pagi") End Sub Overrides Sub Sore() Console.WriteLine("Selamat Sore") End Sub Overrides Sub Malam()
INDOPROG
27
Hendra, S.T.
INDOPROG
28
Hendra, S.T.
Program Tetris
Oleh : Hendra Soewarno Contoh aplikasi pemrograman GDI+ untuk pembuatan games tetris dengan pendekatan berorientasi objek.
Untuk memahami program ini anda perlu mengerti pemrograman form, event handling, dan array, serta GDI+
INDOPROG
29
Hendra, S.T.
Rancangan program
Program ini menggunakan pendekatan berorientasi objek dengan membuat dua class untuk objek Shape dan objek Grid
Class TShape
Class ini berfungsi menghasilkan bentuk-bentuk dengan sistem koordinat berikut :
{1,0},{1,1},{1,2},{1,3}
{0,1},{1,1},{2,1},{3,1}
Berikut ini adalah rincian array untuk masing-masing Shape dan rotasinya
{1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1} {1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{0,2},{1,2} {0,0},{0,1},{1,0},{2,0} {0,0},{1,0},{1,1},{1,2} {0,1},{1,1},{2,0},{2,1} {0,0},{0,1},{0,2},{1,1} {0,0},{1,0},{1,1},{2,0} {1,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,1} {0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0} {0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0}
INDOPROG
30
Hendra, S.T.
Contoh :
Yang selanjutnya dipetakan menjadi suatu array 4 dimensi yang berisi koordinat dari masingmasing shape :
'Array 4 dimensi yang berisi nilai sel dari masing-masing bentuk 'serta bentuk rotasinya private sarr(,,,) as integer = {{{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}, _ {{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}}, _ {{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}}, _ {{{0,0},{0,1},{0,2},{1,2}}, _ {{0,0},{0,1},{1,0},{2,0}}, _ {{0,0},{1,0},{1,1},{1,2}}, _ {{0,1},{1,1},{2,0},{2,1}}}, _ {{{0,0},{0,1},{0,2},{1,1}}, _ {{0,0},{1,0},{1,1},{2,0}}, _ {{1,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,1}}}, _ {{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}, _ {{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}}, _ {{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}, _ {{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}}}
INDOPROG
31
Hendra, S.T.
'menyimpan warna current shape 'menyimpan warna next shape 'nomor rotasi shape
Konstruktor TShape Konstuktor TShape merupakan metoda yang otomatis dijalankan begitu instance dari TShape terbentuk. Misalnya :
private gtshape as new tshape 'instance class tshape
berfungsi menghasilkan bentuk Shape berikutnya yang akan dimunculkan setelah bentuk sekarang dengan memanggil metoda generateshape.
'konstrutor untuk class tshape public sub new() generateshape(nextshape, nextcolor) end sub
Metoda GenerateNextShape Metoda ini berfungsi memindahkan nextshape menjadi currentshape, serta membuat nextshape yang berikutnya.
'Membuat next shape berikutnya, dan menset current shape public sub generatenextshape() currentshape = nextshape currentcolor = nextcolor currentstate = 0 'rotasi ke 0 generateshape(nextshape, nextcolor) 'buat nextshape baru end sub
INDOPROG
32
Hendra, S.T.
Catatan : Parameter pada sub ini dilewatkan secara by refrence, sehingga nilai dapat dikembalikan ke variable shape dan shapecolor. Metoda Rotate Metode ini berfungsi menset nilai currentstate ke nilai rotasi berikutnya (0 ke 1, 1 ke 2, 2 ke 3, 3 ke 0).
'Rotasi ke bentuk berikutnya public sub rotate() currentstate = currentstate + 1 if currentstate = 4 then currentstate = 0 end sub
Metoda DeRotate Metode ini berfungsi menset nilai currentstate ke nilai rotasi sebelumnya (1 ke 0, 2 ke 1, 3 ke 2, 0 ke 3).
'Rotasi ke bentuk sebelumnya public sub derotate() currentstate = currentstate - 1 if currentstate = -1 then currentstate = 3 end sub
'Rotasi sebelumnya
Metoda CurrentShapeSel Properti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan pada array 4 dimensi sarr.
'Mengembalikan sel i,j dari current shape public function currentshapesel(i as integer, j as integer) return sarr(currentshape,currentstate,i,j) end function
Nilai sel yang dikembalikan sangat tergantung pada nilai variable currentshape (bentuk shape), dan currentstate (nomor rotasi)
INDOPROG
33
Hendra, S.T.
{1,0},{0,1},{1,1},{1,2}
Dan CurrentShapeSel(0,0) akan menghasilkan 1 CurrentShapeSel(0,1) akan menghasilkan 0 Property NextShapeSel Properti ini berfungsi mengembalikan nilai sel yang ke i,j dari array shape yang tersimpan pada array 4 dimensi sarr.
'Mengembalikan sel i,j dari next shape public function nextshapesel(i as integer, j as integer) return sarr(nextshape,0,i,j) 'Bentuk awal end function
Nilai sel yang dikembalikan sangat tergantung pada nilai variable nextshape (bentuk shape), dan currentstate defaultnya 0, karena nextshape belum mengalami rotasi.
Class TGrid
Class ini berfungsi menyediakan mekanisme Grid pada permainan Tetris, dimana pada memori computer diwakili dengan array dua dimensi, dengan gambaran sebagai berikut :
INDOPROG
34
Hendra, S.T.
Merupakan array yang mewakili grid dilayar, jika suatu sel terisi gambar, maka nilai parr(x,y) akan berisi nilai 1, dan carr(x,y) akan berisi nilai warna gambar. Kontruktor TGrid Begitu instance dari TGrid terbuat, maka akan mengisi awal array parr menjadi sebagai berikut, yang akan menjadi bingkai dari grid, sehingga area permainan mulai dari (3,0) s/d (12,22)
INDOPROG
35
Hendra, S.T.
'konstruktur class tgrid public sub new() dim i, j as integer for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1 next j next i for i = 3 to 12 for j = 0 to 22 parr(i,j) = 0 next j next i end sub
'isi bingkai
'isi arena
Metoda TestShape Metoda ini berfungsi mengisi nilai dari shape ke posisi x,y dalam grid, dengan syarat parr(x,y) masih 0
'Menempatkan shape pada posisi x,y di grid public sub putshape(x as integer, y as integer, s as tshape) dim i as integer for i = 0 to 3
INDOPROG
36
Hendra, S.T.
Misalnya putshape yang ke 4, keposisi 6,21 pada grid, yang akan mengisi nilai ke parr
Metoda TestShape Metoda ini berfungsi mencoba apakah shape dapat ditempatkan pada posisi x,y dalam grid, dengan syarat parr(x,y) masih 0
'Mengembalikan nilai yang menunjukan apakah 'shape dapat ditempatkan pada grid diposisi x,y public function testshape(x as integer, y as integer, s as tshape)_ as boolean dim i as integer for i = 0 to 3 'apakah sel pada grid telah terisi ( > 0 ) if parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) > 0 then return false end if
INDOPROG
37
Hendra, S.T.
Metoda CheckGrid Metoda ini berfungsi memeriksa apakah ada baris dalam array parr yang berisi nilai 1 dari kolom 3 s/d 12.
'periksa apakah ada baris yang berhasil diselesaikan pemain public function checkgrid() as integer dim i,j as integer dim b,k as integer dim complete as integer complete = 0 i = 22 do while i > 3 j = 3 do while parr(j,i) <> 0 and j < 13 j=j+1 loop if j = 13 then beep 'sound beep complete = complete + 1 for b = i to 4 step -1 for k = 3 to 12 parr(k,b) = parr(k,b-1) carr(k,b) = carr(k,b-1) next k next b else i = i - 1 end if loop return complete end function end class
Misalnya array parr pada baris 22 berisi nilai 1 mulai baris 3 s/d 12, maka setelah metoda ChekGrid dijalankan akan menghapus baris 22 dan mengeser baris diatasnya ke bawah, dan mengembalikan nilai berapa baris yang berhasil diselesaikan.
INDOPROG
38
Hendra, S.T.
Class Tetris
Class ini merupakan class utama permainan Tetris
Konstruktor Tetris
Berfungsi mempersiapkan tampilan form, seperti title form, ukuran form, menempatkan label untuk keterangan score dan gameover, membuat objek Graphics yang akan digunakan untuk menyediakan metoda pengambaran, serta mempersiapkan Shape berikutnya.
public sub new() me.text = "Program Tetris" me.size = new size(450, 600) labelscore.location = new point(61,30) me.controls.add(labelscore) labelgameover.location = new point(200,30) me.controls.add(labelgameover) g = me.creategraphics() score = 0 printscore() nextshape() 'persiapkan shape berikutnya end sub
Metoda NextShape
Metoda ini berfungsi mempersiapkan shape berikutnya, dan menset interval timer 200 millidetik, dan posisi awal shape mulai di posisi (7,0)
'metoda mempersiapkan shape berikutnya private sub nextshape() gtimer.interval = 200
INDOPROG
39
Hendra, S.T.
Metoda MoveShape
Metoda ini berfungsi menggambarkan animasi pergerakan Shape pada posisi x,y sesuai dengan arah gerakan yang ditentukan pada dx dan dy, misalnya bergerak ke kiri, kama dx = -1, dy = 0
'memindahkan shape keposisi x,y private sub movexy(dx,dy) clearshape() x = x + dx y = y + dy drawshape() end sub
Metoda MoveShape
Metoda ini berfungsi memperbaharui nilai score di layar
'metoda untuk mencetak score dilayar private sub printscore() labelscore.text = "Score : " & score.tostring() end sub
Metoda MoveShape
Metoda ini berfungsi mengubah tulisan di labelgameover menjadi Game Over
'metoda untuk mencetak gameover private sub printgameover() labelgameover.text = "Game Over" end sub
Event Tick
Event ini secara otomatis akan dibangkitkan oleh Timer secara berkala untuk mengerakan Shape ke bawah, dengan senantiasa apakah Shape telah mencapai batas gerakan, jika ya, maka akan memanggil metoda putshape pada TGrid. Jika Shape tertahan dibaris < 3 artinya Game Over
'mengerakan shape ke bawah dengan interval waktu tertentu private sub gtimer_tick(sender as object, e as eventargs) _ handles gtimer.tick 'apakah shape masih bisa turun kebawah if gtgrid.testshape(x,y+1,gtshape) then
INDOPROG
40
Hendra, S.T.
movexy(0,1) 'jika ya pindah shape 1 baris ke bawah else gtgrid.putshape(x,y,gtshape) 'tempatkan shape kegrid score = score + gtgrid.checkgrid() 'periksa baris yang lengkap redrawgrid() 'cetak ulang grid printscore() 'cetak score 'jika shape tertahan di baris 3, artinya game over if y < 3 then gtimer.enabled = false 'matikan timer karena gameover printgameover() 'tampil pesan gameover else nextshape() 'persiapkan gambar berikutnya end if end if end sub
Event KeyDown
Event ini secara otomatis akan dibangkitkan apabila adanya penekanan tombol oleh pemakai, Jika panah atas akan merotasi shape jika panah kiri akan mengerakan shape ke kiri jika panah kanan akan mengerakan shape ke kanan jika panah bawah akan mempercepat turunya shape
'deteksi penekanan tombol dengan event keydown pada form private sub tetris_keydown(sender as object, e as keyeventargs) _ handles mybase.keydown select case e.keyvalue case 38, 104, 12,101 : 'Panah atas, 8, 5 gtshape.rotate() 'rotasi 'apakah hasil rotasi dapat ditempatkan diposisi x,y if gtgrid.testshape(x,y,gtshape) then 'kalau ya, rotasi balik kembali gtshape.derotate() clearshape() 'hapus animasi shape gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar else gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) then movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah kanan, 6 if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if case 40, 98 : 'Panah bawah, 2 interval dipercepat gtimer.interval = 10 end select end sub
INDOPROG
41
Hendra, S.T.
Metoda DrawSel
Metoda ini berfungsi menggambar sel Shape ke layar untuk animasi, metoda ini akan dipanggil oleh metoda drawshape dan OnPaint
'menggambar sel dari suatu shape private sub drawsel(pen as pen, brush as brush, _ x as integer, y as integer, _ w as integer, h as integer) if y > 2 then g.fillrectangle(brush,x*21,y*21,w,h) g.drawrectangle(pen,x*21,y*21,w,h) end if end sub
Metoda DrawShape
Metoda ini berfungsi menggambar Shape ke layar dengan memanggil metoda DrawSel untuk masing-masing sel
'mengambar shape secara sementara private sub drawshape() dim i as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(gtshape.currentcolor) for i = 0 to 3 drawsel(pen,brush, _ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1), _ 20,20) next i end sub
Metoda DrawShape
Metoda ini berfungsi menghapus Shape di layar dengan memanggil metoda DrawSel untuk masing-masing sel (warna hitam)
'menghapus shape sementara private sub clearshape() dim i as integer dim pen as new pen(color.black,1) dim brush as new solidbrush(color.black) for i = 0 to 3 drawsel(pen,brush, _ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1),20,20) next i end sub
Metoda ReDrawNextShape
Metoda ini berfungsi menggambar NextShape di layar setiap adanya perubahan nextshape
INDOPROG
42
Hendra, S.T.
Metoda ReDrawGrid
Metoda ini berfungsi menggambar ulang Grid dilayar
'mengambar ulang grid private sub redrawgrid dim i,j as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(color.red) for i = 3 to 12 for j = 3 to 22 if gtgrid.parr(i,j) <> 0 then 'Menggambar ulang isi grid pen.color = color.white brush.color = gtgrid.carr(i,j) drawsel(pen,brush,i,j,20,20) else pen.color = color.black brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next j next i pen.color = color.black g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub
Metoda OnPaint
Metoda OnPaint akan secara otomatis diaktifkan oleh windows setiap kali layar form Tetris digambar ulang (misalnya waktu Maximize dan Minimize)
'melakukan overide terhadap sub onpaint pada base class 'untuk menggambar isi grid setiap proses refresh pada form protected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape() end sub
INDOPROG
43
Hendra, S.T.
Program Kongkret
option explicit on imports sistem imports sistem.drawing imports sistem.windows.forms imports microsoft.visualbasic public class tetris : inherits sistem.windows.forms.form <sistem.STAThread> _ public shared sub main() randomize() application.run(new tetris) end sub private private private private private private private private withevents gtimer as new sistem.windows.forms.timer labelscore as new label labelgameover as new label gtgrid as new tgrid 'instance class tgrid gtshape as new tshape 'instance class tshape g as graphics x,y as integer 'posisi x,y shape pada grid score as integer 'score permainan
public sub new() me.text = "Program Tetris" me.size = new size(450, 600) labelscore.location = new point(61,30) me.controls.add(labelscore) labelgameover.location = new point(200,30) me.controls.add(labelgameover) g = me.creategraphics() score = 0 printscore() nextshape() 'persiapkan shape berikutnya end sub 'metoda mempersiapkan shape berikutnya private sub nextshape() gtimer.interval = 200 gtimer.enabled = true gtshape.generatenextshape() redrawnextshape() x = 7 y = 0 end sub 'memindahkan shape keposisi x,y private sub movexy(dx,dy) clearshape() x = x + dx y = y + dy drawshape() end sub
'set interval 200 millidetik 'mengaktifkan timer 'cetak shape berikutnya 'koordinat awal di 7,0
INDOPROG
44
Hendra, S.T.
'mengerakan shape ke bawah dengan interval waktu tertentu private sub gtimer_tick(sender as object, e as eventargs) _ handles gtimer.tick 'apakah shape bisa turun kebawah if gtgrid.testshape(x,y+1,gtshape) then movexy(0,1) 'pindah shape 1 baris ke bawah else gtgrid.putshape(x,y,gtshape) 'tempatkan shape kegrid score = score + gtgrid.checkgrid() 'periksa baris yang lengkap redrawgrid() 'cetak ulang grid printscore() 'cetak score 'jika shape tertahan di baris 3, artinya game over if y < 3 then gtimer.enabled = false 'matikan timer karena gameover printgameover() 'tampil pesan gameover else nextshape() 'persiapkan gambar berikutnya end if end if end sub 'deteksi penekanan tombol dengan event keydown pada form private sub tetris_keydown(sender as object, e as keyeventargs) _ handles mybase.keydown select case e.keyvalue case 38, 104, 12,101 : 'Panah atas, 8, 5 gtshape.rotate() 'rotasi 'apakah hasil rotasi dapat ditempatkan diposisi x,y if gtgrid.testshape(x,y,gtshape) then 'kalau ya, rotasi balik kembali gtshape.derotate() clearshape() 'hapus animasi shape gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar else gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) then movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah kanan, 6 if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if case 40, 98 : 'Panah bawah, 2 interval dipercepat
INDOPROG
45
Hendra, S.T.
INDOPROG
46
Hendra, S.T.
private sub redrawgrid dim i,j as integer dim pen as new pen(color.white,1) dim brush as new solidbrush(color.red) for i = 3 to 12 for j = 3 to 22 if gtgrid.parr(i,j) <> 0 then 'Menggambar ulang isi grid pen.color = color.white brush.color = gtgrid.carr(i,j) drawsel(pen,brush,i,j,20,20) else pen.color = color.black brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next j next i pen.color = color.black g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub 'melakukan overide terhadap sub onpaint pada base class 'untuk menggambar isi grid setiap proses refresh pada form protected overrides sub onpaint(e as painteventargs) redrawgrid() redrawnextshape() end sub end class
public class tgrid public parr(15,25) as integer grid public carr(15,25) as color grid 'konstruktur class tgrid public sub new() dim i, j as integer for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1 next j next i for i = 3 to 12 for j = 0 to 22 parr(i,j) = 0 next j next i end sub
'Array menyimpan isi sel pada 'Array menyimpan warna sel pada
'isi bingkai
'isi arena
'Mengembalikan nilai yang menunjukan apakah 'shape dapat ditempatkan pada grid diposisi x,y public function testshape(x as integer, y as integer, s as tshape) _ as boolean dim i as integer
INDOPROG
47
Hendra, S.T.
'Menempatkan shape pada posisi x,y di grid public sub putshape(x as integer, y as integer, s as tshape) dim i as integer for i = 0 to 3 parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = 1 carr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = s.currentcolor next i end sub 'periksa apakah ada baris yang berhasil diselesaikan pemain public function checkgrid() as integer dim i,j as integer dim b,k as integer dim complete as integer complete = 0 i = 22 do while i > 3 j = 3 do while parr(j,i) <> 0 and j < 13 j=j+1 loop if j = 13 then beep 'sound beep complete = complete + 1 for b = i to 4 step -1 for k = 3 to 12 parr(k,b) = parr(k,b-1) carr(k,b) = carr(k,b-1) next k next b else i = i - 1 end if loop return complete end function end class public class tshape private currentshape private nextshape as public currentcolor public nextcolor as
INDOPROG
48
Hendra, S.T.
'Array 4 dimensi yang berisi nilai sel dari masing-masing bentuk 'serta bentuk rotasinya private sarr(,,,) as integer = {{{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}, _ {{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}}, _ {{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}}, _ {{{0,0},{0,1},{0,2},{1,2}}, _ {{0,0},{0,1},{1,0},{2,0}}, _ {{0,0},{1,0},{1,1},{1,2}}, _ {{0,1},{1,1},{2,0},{2,1}}}, _ {{{0,0},{0,1},{0,2},{1,1}}, _ {{0,0},{1,0},{1,1},{2,0}}, _ {{1,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,1}}}, _ {{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}, _ {{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}}, _ {{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}, _ {{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}}} 'konstrutor untuk class tshape public sub new() generateshape(nextshape, nextcolor) end sub 'Membuat next shape berikutnya, dan menset current shape public sub generatenextshape() currentshape = nextshape currentcolor = nextcolor currentstate = 0 'rotasi ke 0 generateshape(nextshape, nextcolor) 'buat nextshape baru end sub 'Membuat bentuk dan mengembalikan melalui parameter shape dan shapecolor private sub generateshape(byref shape as integer, _ byref shapecolor as color) dim c as integer shape = int(rnd*6) 'random untuk shape c = int(rnd*8) 'random untuk shape color select case c case 0 : shapecolor = color.red case 1 : shapecolor = color.green case 2 : shapecolor = color.blue case 3 : shapecolor = color.orange case 4 : shapecolor = color.pink case 5 : shapecolor = color.cyan case 6 : shapecolor = color.gray case else shapecolor = color.magenta
INDOPROG
49
Hendra, S.T.
'Rotasi sebelumnya
'Mengembalikan sel i,j dari current shape public function currentshapesel(i as integer, j as integer) return sarr(currentshape,currentstate,i,j) end function 'Mengembalikan sel i,j dari next shape public function nextshapesel(i as integer, j as integer) return sarr(nextshape,0,i,j) 'Bentuk awal end function end class
Kompilasi Program
Vbc tetris.vb /r:sistem.dll /r:sistem.drawing.dll /r:sistem.windows.forms.dll
INDOPROG
50
C/C++ Programming
Hendra, S.T.
Kata Pengantar
Bahasa pemrograman C/C++ merupakan bahasa yang popular didalam pengajaran pada computer sains maupun pada kalangan programmer yang mengembangkan system software maupun aplikasi. Bahasa C/C++ sifatnya portable, karena compilernya tersedia hampir pada semua arsitektur computer maupun system operasi, sehingga investasi waktu dan tenaga yang anda lakukan dalam mempelajari bahasa pemrograman ini memiliki nilai strategis yang sangat menjanjikan. Bahasa C/C++ merupakan bahasa yang sangat ketat dalam pemakaian type data maupun penulisannya yang case sensitif, hal ini berarti programmer di tuntut kedisiplinannya dalam penulisan program. Sesuatu fasilitas yang tersedia dalam C/C++ yang tidak ditemukan pada bahasa pemrogaman lainnya adalah pointer, dengan pemanfaatan pointer programmer dapat melakukan manipulasi memori secara langsung. Dewasa ini beberapa bahasa yang memiliki syntax penulisan yang menyerupai C/C++ adalah Java, Javascript dan PHP, yang artinya bahwa kemampuan pemrograman dengan C/C++ akan mempermudah anda untuk mempelajari bahasa modern seperti Java maupun C# (dibaca C sharp). Akhirnya penulis mengucapkan selamat belajar dan semoga buku ini dapat memberi manfaat yang sebesarnya dalam pembelajaran mata kuliah C/C++ Programming. Medan, 1 Maret 2004
Indoprog
C/C++ Programming
Hendra, S.T.
Daftar Isi
Section 0 Section 1 Section 2 Section 3 Section 4 Section 5 Section 6 Section 7 Section 8 Section 9 Section 10 Section 11 Section 12 Section 13 Section 14 Section 15 Section 16 Section 17 Section 18 Appendix A Appendix B Appendix C Appendix D History of programming language .........................................................3 Software development and the sofware life cycle ...............................11 Structured programming ......................................................................15 Structure of a C++ program .................................................................24 Comunication throught console ...........................................................38 Control structures.................................................................................42 Function (I) ..........................................................................................53 Function (II) .........................................................................................59 Array ....................................................................................................67 Strings of characters.............................................................................76 Pointers ................................................................................................82 Advanced pointers ...............................................................................89 Dynamic memory.................................................................................93 Structures ...........................................................................................100 Input/output with files........................................................................109 Classes................................................................................................118 C++ and Object oriented programming .............................................130 Exception handing .............................................................................143 User defined type ...............................................................................147 Preprocessor directives C++ formatting and documentation Programming patterns Tips & Tricks
Indoprog
C/C++ Programming
Hendra, S.T.
Section 0
Indoprog
C/C++ Programming
Hendra, S.T.
artinya adalah pada saat kebutuhan bisnis berubah, program dengan mudah dapat dikembangkan tanpa adanya biaya yang sangat besar.
C programming language
C adalah bahasa pemrograman yang dikembangkan oleh Dennis Ritchie pada tahun 1970 untuk pemakaian pada sistem operasi UNIX, dan sampai sekarang bahasa ini telah dipergunakan secara praktis pada hampir semua sistem operasi. Bahasa C merupakan bahasa yang paling populer untuk menulis sistem software, dan aplikasi. serta banyak digunakan dalam pelajaran Komputer Sains.
Features
C adalah bahasa yang lebih low-level dibandingkan dengan bahasa pemrograman lainnya. Walaupun kadang-kadang disebutkan sebagai "high-level-language", sebenarnya ia hanya lebih high-level dibandingkan dengan bahasa assembly. C memiliki dua keunggulan utama dibandingkan dengan assembly. Pertama, kodenya lebih mudah dibaca dan ditulis, terutama untuk program yang panjang. Kedua, kode assembly biasanya hanya bisa diterapkan pada arsitektur komputer yang tertentu saja, sedangkan program C dapat di pindahkan ke berbagai arsitektur dimana kalau compiler dan librarynya tersedia. Sebaliknya efisiensi dari kode C adalah sangat bergantung pada kemampuan dari compiler untuk mengoptimisasi bahasa mesin yang dihasilkan, yang mana hal ini berada diluar kendali programmer. Demikian juga keunggulan dan kelemahan antara C dengan bahasa high-level lainnya dimana efisiensi yang dihasilkan oleh kode C dapat lebih terkontrol, dan konsekuensinya adalah lebih sulit dibaca dan ditulis, tetapi perlu dicatat bahwa C adalah bahasa tingkat tinggi yang portabel, karena sampai saat ini hampir semua arsitektur komputer menyediakan compiler C dan librarynya. Sesuatu fasilitas dari C yang perlu menjadi perhatian programmer adalah kemampuan dalam mengatur isi memori komputer. C Standar tidak menyediakan fasilitas array bounds checking yang dengan mudah akan menyebabkan bug dalam kaitannya dengan operasi memori, seperti buffer overflows, serta computer insecurity. Beberapa fasilitas C adalah:
Suatu bahasa dengan (kernel) inti yang sederhana, dimana fungsi-fungsi yang kurang penting tersedia sebagai kumpulan rutin-rutin pustaka (library) yang di standarisasi. Terfokus pada paradigma pemrograman procedural, dengan fasilitas pemrograman yang terstruktur.
Indoprog
C/C++ Programming
Hendra, S.T.
Memiliki suatu bahasa preprocessor Memiliki perfomance O(1) untuk semua operator. Akses secara Low-level pada memori komputer melalui pointer. Parameter selalu dilewatkan ke function secara by value, bukan by reference.
History
Early developments
Pengembangan C mula-mula dilakukan di laboratoriun AT&T Bell antara tahun 1969 dan 1973; menurut Ritchie, periode yang paling kreatif adalah 1972. Namanya C karena banyak fasilitasnya diambil dari bahasa sebelumnya yang disebut sebagai "B". Pada tahun 1973, bahasa C menjadi cukup powerfull dimana biasanya kernel UNIX aslinya ditulis dengan menggunakan bahasa assembly PDP-11/20, telah ditulis kembali dengan menggunakan C. Ini merupakan pertama kali kernel suatu sistem operasi yang ditulis dengan bahasa selain assembly.
K&R C
Pada tahun 1978, Ritchie dan Brian Kerhighan mempubikasikan suatu buku edisi pertama dengan judul The C Programming Language. Buku ini dikenal oleh para programmer C sebagai "K&R". K&R mengenalkan fasilitas berikut pada bahasa tersebut :
Type data struktur (struc) Type data long int Type data unsigned int Operator =+ diganti dengan +=, karena (=+ membingungkan lexical analyzer Compiler C).
function dan void * data type fungsi pengembalian struct atau union type nama field struct dipisahkan dengan sebuah spasi setelah type struct. assignment untuk type data struct const qualifier untuk membuat suatu object read-only suatu standard library yang terdiri dari banyak fungsi yang di sediakan oleh berbagai vendor. enumerations type single-precision float
void
Indoprog
C/C++ Programming
Hendra, S.T.
Sejak tahun 1970, C mulai mengantikan BASIC sebagai pemimpin bahasa pemrograman mikrokomputer. Sejak 1980 mulai diadopsi pemakaiannya pada IBM PC, dan popularitasnya mulai bertambah secara nyata. Pada saat yang bersamaan Bjarne Stroustrup pada Bell Labs mulai bekerja untuk menambah konstruksi object-oriented pada C. Bahasa yang mereka produksi disebut sebagai C++, dan sekarang merupakan bahasa yang banyak dipergunakan pada sistem operasi Microsoft Windows; sedangkan C tetap merupakan bahasa yang poluler di Unix. Pada tahun 1983, American National Standards Institute (ANSI) membentuk suatu komite, X3J11, untuk mengembangkan suatu spesifikasi standard untuk C. Melalui proses yang panjang, standard tersebut berhasil diselesaikan pada tahun 1989 (satu tahun setelah standard ANSI pertama untuk C++!) dan diratifikasikan sebagai ANSI X3.1591989 "Programming Language C". Versi bahasa ini sering disebut sebagai ANSI C. Pada tahun 1990, ANSI C standard (dengan beberapa modifikasi kecil) telah diadopsi oleh International Standards Organization (ISO) sebagai ISO/IEC 9899:1990. ANSI C didukung oleh kebanyakan compiler. Banyak kode C yang ditulis sekarang didasarkan pada ANSI C. Semua program yang ditulis dengan standard C dijamin akan berfungsi dengan baik pada platform lain yang memiliki C. Tetapi banyak juga program C yang hanya dapat di kompilasi pada platform tertentu dengan compiler tertentu sehubungan dengan library non standard, misalnya untuk graphic.
C99
Setelah proses standarisasi oleh ANSI, sepesikasi bahasa C masih relatif statis untuk beberapa saat, sedangkan C++ terus berevolusi. (Normalnya penyempurnaan 1 telah menghasilkan suatu versi C yang baru pada tahun 1995, tetapi versi yang ini jarang diketahui.) Sedangkan, revisi standard tahun 1990, mengawali publikasi sebagai ISO 9899:1999 pada tahun 1999. Standard ini disebut sebagai "C99" telah diadopsi sebagai ANSI standard pada 2000. Kemampuan baru C99 meliputi:
fungsi inline function membebaskan pembatasan terhadap tempat deklarasi variabel (seperti pada C++) menambah beberapa type data baru, termasuk long long int (untuk mengurangi kesulitan transisi 32-bit ke 64-bit), type data boolean, dan suatu yang baru untuk bilangan complex. array variable-length dukungan resmi terhadap one-line comment yang dimulai dengan //, dipinjam dari C++ beberapa fungsi library baru, seperti snprintf() beberapa header file baru, seperti stdint.h
Dukungan terhadap C99 cukup beragam, dimana GCC dan beberapa compiler lainnya mendukung fasilitas C99, tetapi compiler yang dibuat oleh Microsoft dan Borland tidak.
Indoprog
C/C++ Programming
Hendra, S.T.
"Hello, World!" in C
Berikut ini adalah aplikasi sederhana untuk mencetak "Hello, World!" ke suatu standard output file (yang biasanya berupa screen, tetapi bisa saja berupa suatu file atau peralatan hardware lainnya). Versi dari program ini muncul pertama kali di K&R.
#include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; }
Undefined behaviors
Sesuatu yang menarik (walaupun tidak selamanya persis) aspek dari standard C adalah prilaku dari beberapa kode yang disebut sebagai "undefined". Dalam praktek, hal ini berarti program yang dihasilkan dari kode ini tidak dapat diprediksi, dari (secara tidak sengaja) dimana akan membuat sistem macet setiap kali di run Sebagai contoh, kode berikut menghasilkan prilaku undefined, karena variabel b dioperasikan lebih dari sekali dalam ekspresi a = b + b++;:
#include <stdio.h> int main (void) { int a, b = 1; a = b + b++; printf ("%d\n", a); return 0; }
Indoprog
C/C++ Programming
Hendra, S.T.
C Plus Plus
C++ (dibaca sebagai "see plus plus"; aslinya dikenal sebagai: C with Classes) adalah suatu bahasa pemrograman komputer yang telah diperluas dengan kemampuan object oriented. Sejak 1990, C++ merupakan bahasa pemrograman komersil yang paling populer.
History of C++
Stroustrup mulai bekerja dengan bahasa ini pada tahun 1979, diinspirasi oleh Simula67. AT&T pertama kali menggunakan bahasa tersebut pada Agustus 1983. Compiler aslinya adalah C front. Dikomersialisasikan pertama kali pada bulan Oktober. Suatu gabungan komite standarisasi C++ ANSI-ISO, pada tahun 1998 (ISO/IEC 14882-1998). ANSI standard adalah suatu usaha untuk memastikan bahwa C++ adalah portable dimana kode yang anda tulis pada Microsoft compiler akan dapat dikompilasi tanpa kesalahan dengan menggunakan kompiler dari vendor lain pada platform yang berbeda seperti Mac, Window dan Alpha.
Technical Overview
Pada tahun 1998 C++ Standard terdiri dari dua bagian yaitu: Core Language dan Standard Library; yang meliputi Standard Template Library dan C Standard Library.
Ownership of C++
Tidak ada yang memiliki C++. Stroustrup dan AT&T tidak menerima royalti dari pemakaian C++.
C++ Examples
Contoh 1 Berikut ini adalah sebuah contoh dari program dimana tidak melakukan apa-apa. Terdiri dari satu hal yaitu: sebuah main() fungsi. main() merupakan awal dari program C++.
Indoprog
C/C++ Programming
int main() { return 0; }
Hendra, S.T.
Standard C++ membutuhkan main() mengembalikan type int, dalam hal ini 0 artinya program berakhir normal.
C++ Library
[[C++ standard library]] umumnya berupa superset dari C standard library. Sebagian besar bagian dari library C++ adalah terdiri dari Standard Template Library (STL). STL menyediakan fasilitas berguna seperti iterators (merupakan high-level dari pointer) dan containers (menyerupai array yang dapat bertumbuh secara otomatis pada saat penambahan elemen baru). Sebagaimana dalam C, fasilitas dari library dapat diakses dengan menggunakan direktif #include untuk memasukan suatu standard header. C++ menyediakan enam puluh sembilan header standard. C++ merupakan superset dari C artinya semua program C yang legal juga merupakan program C++ yang legal, perkembangan dari C ke C++ adalah sangat nyata. C++ memetik banyak keuntungan dari hubungannya dengan C, dimana programmer C dapat dengan mudah menggunakan C++. Untuk dapat menggunakan keunggulan C++, banyak programmer menemukan bahwa mereka tidak perlu mempelajari hal-hal yang mendasar, tetapi cukup mengembangkan diri dengan mempelajari konsep baru (OOP) dalam pemecahan masalah pemrograman.
Future Development
C++ terus berevolusi untuk memenuhi kebutuhan masa depan, ketika pembuat-pembuat compiler masih berjuang untuk mendukung semua fasilitas C++, situasi tersebut berkembang persisnya dari tahun 1998 sampai 2003.
Pertanyaan
1. Tuliskan pengertian tentang High Level Language dan Low Level Language. 2. Berikan contoh bahasa komputer yang tergolong kepada High Level Language dan Low Level Language. 3. Tuliskan perbedaan cara kerja Interpreter dan Compiler. Indoprog
C/C++ Programming
Hendra, S.T.
4. 5. 6. 7. 8.
Tuliskan pengertian bahasa C adalah bahasa yang portabel. Sebutkan tujuan penetapan standard C oleh ANSI. Tuliskan pengertian bahasa C++ merupakan superset dari bahasa C. Tuliskan struktur program C dan C++ yang paling sederhana. Dengan pemanfaatan fasilitas search engine di internet, carilah jenis-jenis compiler C/C++ yang tersedia oleh berbagai vendor, dan platform.
Latihan
1. Buatlah program C anda yang pertama untuk mencetak "Hello World !" ke layar, dan bagaimana melakulannya dalam C++. 2. Tulis suatu program C++ yang mana membaca dua nilai berjenis float, dan mencetak hasil sum (penjumlahan), product (perkalian) dan quotient (hasil bagi). Tambahkan informasi hasil pencetakan yang jelas.
Indoprog
10
C/C++ Programming
Hendra, S.T.
Section 1
Requirements specification (spesifikasi kebutuhan) mengacu pada layanan apa saja yang harus disediakan oleh software dan di berada dibawah atasan apa sotfware tersebut dioperasikan. Kebutuhan yang akurat sering kali sulit ditentukan karena bidang komputer sangat berkaitan dengan kompleksnya sosial manusia dan dunia secara organisasi. Proses dari systems analysis and design (analisa dan perancangan sistem) akan menentukan fungsi-fungsi akurat yang dibutuhkan untuk memenuhi kebutuhan dan hardware (perangkat keras) yang dibutuhkan untuk mengoperasionalkannya. Hal ini mungkin meliputi sub system yang tidak berkaitan dengan komputer-komputer, bersama dengan suatu definisi lengkap dari (human role) peranan manusia. Bayangkan contoh sebuah aircraft system (system angkutan udara) : disana akan terdiri dari sejumlah komputer monitoring (pemantau) dan controlling (pengendali) aspek dari penerbangan dengan banyak alat display (peraga), dan berinteraksi dengan ground systems (sistem di daratan); peran dari pilot juga menentukan. Indoprog
11
C/C++ Programming
Hendra, S.T.
Detailed design akan berkaitan dengan pemecahan system atau subsystem kedalam modul-modul definisi yang lebih jelas. Perulangan subdivision (pembagian kepada bagian-bagian) atau secara fungsi akan penting sampai suatu keterangan yang jelas dapat dipenuhi oleh modul-modul yang mana menjadi blok bangunan dari system. Kita akan melihat pada beberapa teknik untuk mengambarkan detail dari program pada level ini. Implementation and testing berkaitan dengan penulisan kode untuk menghasilkan suatu program yang dapat dijalankan untuk pada modul (penerapan) dan percobaan pada program untuk memastikan program dapat bekerja. Hal ini biasanya berkaitan dengan perbaikan pada kode (debugging) sampai program berjalan dengan benar. Ini adalah area pekerjaan programmer. Integration and testing berkaitan dengan membawa program kedalam subsystem, dengan dengan berbagai interface (antar muka) antar program, dan demikian juga subsystem kedalam system. Testing dibutuhkan untuk memastikan bahwa programprogram berjalan dengan benar ketika mereka digabungkan, dan fungsi dari system benar. Pada saat testing ditemukan kesalahan, rancangan ulang atau pengkodean ulang mungkin dibutuhkan. Ketika software tersebut telah sempurna haruslah diinstalasi dan pemakai harus dilatih. Sebagaimana ketika digunakan pada lingkungan target kesalahan baru mungkin akan timbul. Juga oleh waktu kebutuhan tersebut dapat berubah. Jika perangkat lunak telah memasuki tahap ini disebut sebagai maintenance (pemeliharaan). Pada saat yang sama siklus manfaat dari software telah berlalu dan suatu system baru dibutuhkan.
12
C/C++ Programming
Hendra, S.T.
source code. Pada tahap ini desk-check untuk memeriksa kebenarannya, dan diperbaiki, pada tahap ini anda membutuhkan Editor. 4. Compile program tersebut menjadi machine-language. Bahasa mesin yang dihasilkan disebut sebagai object code. Pada tahap ini compiler akan mencari Syntax errors dalam program. 5. Object code yang dihasilkan oleh compiler akan di link dengan berbagai function library disediakan oleh system. Pada tahap ini diperlukan suatu program linker yang akan mengabung object code yang dimuat kememori oleh sebuah program yang disebut sebagai loader. 6. Jalankan hasil link, dan periksalah apakah adanya Logical errors. Kesalahan lain yang dapat saja terjadi adalah run-time error.
Gambar 1.4 Tahapan kompilasi Jika ada kesalahan pada tahap ini, maka program harus diperbaiki kembali mulai dari langkah (3), (4) dan (5), sampai hasilnya memuaskan. 7. Sekarang program telah dapat digunakan, dan perlu adanya documentation untuk keperluan perbaikan dikemudian hari
Pertanyaan
1. Tuliskan langkah-langkah yang harus dilakukan mulai dari spesifikasi permasalahan untuk menghasilkan suatu program yang dapat berjalan untuk pemecahan masalah tersebut. 2. Jenis kesalahan apa saja yang dapat timbul dalam tahapan produksi program ? 3. Ketika program sedang berjalan dan menghasilkan suatu bilangan yang terlalu besar untuk ditempatkan pada tempat yang telah dialokasi dalam memori, sebutkan kategori jenis kesalahan tersebut?
Indoprog
13
C/C++ Programming
Hendra, S.T.
4. Sebuah program yang berjalan tanpa kesalahan, tetapi menghasilkan output yang tidak benar, jenis kesalahan apa yang menyebabkan hal tersebut? 5. Sebutkan pengertian dari source code, object code dan executable code. 6. Tuliskan pengertian tentang istilah Editor, Compile, Linker dan Libraries.
Indoprog
14
C/C++ Programming
Hendra, S.T.
Section 2
Structured programming
Secara garis besar, kita dapat mengidentifikasi kurva belajar dari seseorang yang mempelajari pemrograman adalah sebagai berikut : Pemrograman tidak terstruktur Pemrograman procedural Pemrograman modular dan Pemrograman berorientasi objek
Unstructured programming
Biasanya orang mulai belajar pemrograman dengan menulis sebuah program kecil dan sederhana yang terdiri dari hanya satu program utama, pada program utama ini rangkaian perintah-perintah yang secara langsung melakukan modifikasi data global dalam program.
Teknik pemrograman ini memiliki berbagai kelemahan, terutama ketika program tersebut berkembang menjadi lebih besar. Sebagai contoh, jika sejumlah perintah yang sama dibutuhkan pada beberapa bagian program yang sama, maka perintah-perintah tersebut harus diduplikasi ke bagian yang membutuhkannya. Hal ini menimbulkan suatu ide bagaimana kalau kita keluarkan rangkaian perintah tersebut menjadi suatu program kecil (dikenal sebagai istilah procedure) yang memiliki nama, kemudian program kecil tersebut akan dipanggil oleh bagian program yang membutuhkannya.
Procedural programming
Pada pemrograman prosedural, anda dapat mengelompokan rangkaian perintah-perintah yang sering digunakan pada satu tempat menjadi suatu procedure, kemudian suatu procedure call dapat digunakan untuk membangkitkan procedure tersebut. Setelah procedure tersebut diproses, aliran kendali proses akan dikembalikan ke posisi baris perintah setelah perintah call (pemanggilan).
Indoprog
15
C/C++ Programming
Hendra, S.T.
Salah satu keunggulan dari pemrograman prosedural adalah program menjadi lebih terstruktur dan tingkat kesalahan dapat ditekan. Sebagai contoh, ketika suatu procedure telah benar, maka setiap kali procedure tersebut digunakan akan tetap menghasilkan hasil yang benar. Konsekuensinya adalah ketika kita melakukan pencarian kesalahan, maka area pencarian dapat dipersempit ke daerah yang belum terbukti kebenarannya. Pada pemrograman prosedural, program dapat dilihat sebagai rangkaian dari procedure calls. Program utama akan melewatkan data ke procedure, dan data tersebut akan diproses oleh procedure, dan setelah prosedure selesai, data hasil telah tersedia. Selanjutnya aliran dari data dapat diilustrasikan sebagai suatu hierarchical graph (grafik hirarki), suatu tree (pohon), sebagaimana yang ditunjukan gambar berikut :
Sekarang kita telah memiliki suatu program yang mana terbagi atas potongan-potongan kecil yang disebut sebagai procedure
Modular programming
Pada pemrograman modular, Procedure dengan fungsi yang umum dikelompokan menjadi suatu modul secara terpisah, sehingga suatu program tidak hanya terdiri dari satu bagian, tetapi terpisah menjadi beberapa bagian yang lebih kecil secara terpisah yang berinteraksi satu sama yang lain dengan melalui procedure call yang membentuk keseluruhan program.
Indoprog
16
C/C++ Programming
Hendra, S.T.
Masing-masing modul memiliki data tersendiri. Hal ini memungkinkan masing-masing modul mengatur status internal yang mana dimodifikasi oleh pemanggilan procedure dalam modul tersebut.
Structured programming
Pemrograman terstruktur dapat dipandang sebagai bagian atau sub-disiplin dari procedural programming, satu dari paradigma besar (dan mungkin yang paling popular) untuk pemrograman komputer. Berdasarkan sejarah, beberapa teknik terstruktur telah dikembangkan untuk menulis program yang terstruktur. Dua diantaranya yang paling umum adalah Jackson Structured Programming, yang mana didasarkan pada pemerataan struktur dengan struktur program. dan Dijkstra's structured programming, yang mana didasarkan pada pemisahan program kedalam sub-sections, dimana masing-masing terdiri dari satu titik masuk dan satu titik keluar Sejak 1970 ketika pemrograman terstruktur mulai populer sebagai suatu teknik pemrograman, banyak bahasa pemrograman procedural yang menambah fasilitas untuk mendukung pemrograman terstruktur, (dan beberapa diantaranya telah meninggalkan fasilitas yang dapat membuat pemrograman menjadi tidak terstruktur). Bahasa pemrograman terstruktur yang terkenal baik adalah
Pascal Ada
Pada program yang pendek, pemrograman terstruktur secara sederhana menekankan pada hirarki struktur aliran program. Hal ini dapat dilakukan pada hampir semua bahasa modern dengan menggunakan konstruksi looping terstruktur seperti "while", "repeat",
Indoprog
17
C/C++ Programming
Hendra, S.T.
"for". Juga disarankan agar setiap looping hanya ada satu titik masuk dan satu titik keluar, dan pada beberapa bahasa telah menekankan hal ini. Pada pemrograman terstruktur, programmer harus memecahkan kode yang besar kedalam sub rutin yang lebih pendek sebagai kesatuan logika yang lebih kecil (procedure dan function), sehingga dapat dimengerti secara mudah. Pada pemrograman terstruktur diusahakan untuk menggunakan variabel global sedikit mungkin; dan sebagai gantinya, sub rutin harus menggunakan variabel lokal serta menggunakan argumen (parameter) sebagai referensi data diantaranya. Catatan: Pada saat program anda menjadi besar dan kompleks, adalah semakin susah untuk mencari bugs (kesalahan) yang kemungkinan terkandung didalamnya. Pemakaian variabel global yang terlalu banyak akan mempersulit penanganan bugs, karena data global dapat diubah oleh seluruh fungsi/prosedur dalam program. Berdasarkan pengalaman bertahun-tahun dianjurkan kepada programmer untuk menangani data secara lokal sebisa mungkin Pemrograman terstruktur sering (tidak selamanya) berkaitan dengan perancangan dengan pendekatan "top-down". Dengan cara ini perancang memetakan garis besar struktur program kedalam operasi-operasi yang lebih kecil, menerapkan dan mencoba operasi yang lebih kecil, dan mengikat mereka kedalam suatu program secara keseluruhan. Pada akhir abad ke 20, umumnya programmer professional menganut konsep pemrograman prosedural terstruktur. Beberapa diantaranya menyatakan lebih mudah untuk mengerti program terstruktur, lebih reliabel dan lebih mudah di tangani (maintanance). Bahasa tidak terstruktur mendefinisikan aliran program dengan pemakaian perintah GOTO yang mana memindahkan titik eksekusi ke suatu label tertentu dalam kode, sedangkan bahasa pemrograman terstruktur menyediakan konstruksi (sering disebut sebagai "if-then-else", "unless", "while", "until", dan "for") untuk menciptakan berbagai variasi loop (perulangan) dan percabangan kondisi. Perlu ditekankan bahwa pada suatu bahasa pemrograman terstruktur, di setiap struktur kode harus memiliki satu titik masuk dan satu titik keluar, banyak bahasa seperti C memungkinkan banyak cara untuk keluar dari suatu struktur (seperti "continue", "break", dan "return"), yang mana dapat memberikan keuntungan dan kerugian dalam pembacaan dan penulisan program.
Indoprog
18
C/C++ Programming
Hendra, S.T.
pemecahan solusi, dan kemudian lanjutkan dengan mengembangkan detail dari masingmasing komponen tersebut dengan cara yang sama, dan seterusnya. Misalnya kita akan membuat sebuah program untuk menghitung luas (area) dan keliling (perimeter) dari suatu persegi panjang (rectangle), dimana panjang (length) dan lebar (width) dimasukan akan oleh pamakai. Suatu algoritma awal yang mungkin adalah sebagai berikut :
1. Masukan panjang dan lebar dari persegi panjang. 2. Hitung luas dan keliling dari persegi panjang. 3. Cetak luas dan keliling.
Selanjutnya masing-masing garis besar tersebut diatas dapat di kembangkan menjadi langkah-langkah yang lebih rinci sebagai berikut :
1. Masukkan 1.1 Tampilkan pesan untuk memasukan panjang 1.2 Terima data panjang 1.3 Tampilkan pesan untuk memasukan lebar 1.4 Terima data lebar 2. Menghitung 2.1 Menghitung keliling sebagai dua kali panjang tambah lebar 2.2 Menghitung luas sebagai perkalian panjang dan lebar 3. Keluaran 3.1 Cetak keliling 3.2 Cetak luas
Sampai pada tahap ini, masalah tersebut telah dipecahkan secara sempurna tanpa tergantung pada bahasa pemrograman yang akan digunakan.
Structured Design. Top-down design of algorithms using sequence and selection only.
Perhatikan masalah berikut: Buatlah sebuah program yang menerima jumlah jam kerja dalam satu minggu dan upah perjam untuk seorang karyawan. Program harus mampu mencetak upah mingguan (wage) dari karyawan tersebut. Karyawan dibayar dengan tarif normal untuk 40 (empat puluh) jam pertama, dan satu setengah dari tarif normal untuk setiap kelebihannya. Solusi untuk masalah diatas dapat langsung dimodelkan sebagai berikut :
1. Masukan jumlah jam kerja dan upah per-jam.
Indoprog
19
C/C++ Programming
2. Hitung upah mingguan. 3. Cetak upah mingguan.
Hendra, S.T.
Tetapi usaha untuk mengembangkan langkah 2, tidak sederhana seperti mengalikan jam kerja dengan upah per-jam, tetapi kita perlu memeriksa apakah jam kerja yang dimasukan tidak lebih dari 40 jam. Sehingga dalam mengembangkannya kita perlu menggunakan pernyataan kondisi seperti berikut ini :
1. Masukan 1.1 Tanyakan user untuk memasukan jumlah jam kerja. 1.2 Baca jumlah jam kerja. 1.3 Tanyakan user untuk memasukan upah per-jam. 1.4 Baca upah per-jam. 2. Hitung upah mingguan 2.1 Jika jumlah kerja lebih atau sama dengan 40 jam kemudian 2.1.1 hitung upah mingguan normal. otherwise 2.1.2 hitung upah mingguan normal dan kelebihannya. 3. Cetak upah mingguan
Indoprog
20
C/C++ Programming
terima nilai berikutnya. } jika tidak ada nilai yang dimasukan kemudian cetak `tidak ada data yang dimasukan' jika tidak { hitung rata-rata. cetak hasilnya. }
Hendra, S.T.
Berdasarkan ekspansi proses nilai diatas, maka hal yang perlu dilakukan sebelum masuk ke perulangan adalah: 1. sebuah variabel untuk akumulasi jumlah harus dimulai dari (0) nol. 2. sebuah variabel untuk jumlah data harus dimulai dari (0) nol. 3. variabel untuk menyimpan maximum dan minimum pada awalnya berisi nilai yang pertama kali dimasukkan. Selanjutnya bagian tahap awal dari program dapat dikembangkan menjadi:
set nol ke akumulasi. set nol ke jumlah. terima nilai yang pertama. set minimum dan maksimum dengan nilai pertama.
Jika tidak ada data yang dimasukan, maka hal ini dapat diketahui dengan nilai jumlah yang berisi 0. Sehingga secara keseluruhan solusi menjadi:
set nol ke akumulasi. set nol ke jumlah. terima nilai yang pertama. set minimum dan maksimum dengan nilai pertama. terima nilai pertama. ketika (nilai adalah positif) kerjakan { tambahkan nilai ke akumulasi. tambahkan satu ke jumlah. tambahkan nilai ke akumulasi jumlah. tambahkan satu pada jumlah.
Indoprog
21
C/C++ Programming
jika nilai lebih besar dari maximum yang tersimpan kemudian simpan nilai sebagai maximum. jika nilai lebih kecil dari minimum yang tersimpan kemudian simpan nilai sebagai minimum. terima nilai berikutnya. } jika tidak ada nilai yang dimasukan kemudian cetak `tidak ada data yang dimasukan' jika tidak { hitung rata-rata. cetak hasilnya. }
Hendra, S.T.
akan memodulkan proses upah mingguan menjadi suatu sub program yang lebih kecil, sehingga algoritma dapat ditulis menjadi :
ulangi terima jumlah jam kerja dan upah per-jam. Panggil function hitungUpah(jam kerja, upah per-jam, upah mingguan). cetak upah mingguan. tanyakan user `ada data yang lain?' baca jawaban sampai jawaban tidak
Pertanyaan
1. Sebutkan tahapan kurva belajar seseorang yang mempelajari teknik pemrograman. 2. Sebutkan garis besar ide dasar dari masing-masing teknik pemrogram tersebut pada soal nomor 1. 3. Sebutkan fasilitas yang biasanya disediakan oleh suatu bahasa pemrograman yang menyediakan fasilitas pemrograman terstruktur, dan berikan pendapat anda tentang pemakaian GOTO. Indoprog
22
C/C++ Programming
Hendra, S.T.
4. Sebutkan ide dasar dari teknik pemrograman terstruktur dengan pendekatan Top Down Design.
Latihan
Rancanglah sebuah program dengan pendekatan terstruktur top-down untuk pemecahan masalah berikut : 1. Buatlah sebuah program untuk menghitung jumlah konsumsi bahan bakar suatu mobil, dengan input kilometer awal dan akhir perjalanan, isi awal dan akhir tangki dalam liter, kemudian program mencetak jarak tempuh, jumlah konsumsi, dan konsumsi per kilometer. 2. Modifikasi program diatas dimana input tetap dalam kilometer dan liter, tetapi menghasilkan perhitungan dalam gallon dan mil. ( gunakan konstanta) 3. Buatlah sebuah program yang mana menerima jumlah jam kerja dalam minggu dan upah perjam seorang tenaga kerja. Program tersebut harus menghitung penghasilan dari pekerja tesebut. Pekerja tersebut dibayar secara normal untu 40 jam pertama, dan satu setengah kali upah normal untuk kelebihan jam berikutnya. Petunjuk 1 US gallon = 3.7854118 litres, 1 mile = 1.6093 kilometres
Indoprog
23
C/C++ Programming
Hendra, S.T.
Section 3
} Simpan program anda ke file dengan nama first.cpp, lakukan kompilasi (dalam hal ini menggunakan Borland free C++ compiler, dapat di download pada http://www.borland.com) BCC32 First Jalankan program anda : First Dan di layar akan tercetak tulisan "Hello World!", Marilah kita analisa bagian program tersebut satu per satu.
// my first program in C++
Ini adalah baris comment (komentar/keterangan). Semua baris yang dimulai dengan tanda (//) dianggap sebagai comment.
#include <iostream.h>
Perintah yang dimulai dengan tanda (#) adalah directives (petunjuk) untuk preprocessor. Baris ini tidak akan dieksekusi, tapi merupakan directives bagi compiler. Dalam hal ini kalimat #include <iostream.h> memberitahukan kepada preprocessor compiler untuk include (memasukan) header file standar iostream. File ini berisi deklarasi input-output standar library didalam C++ yang diperlukan pada bagian berikutnya dalam program ini.
int main ()
Baris ini merupakan deklarasi main function (fungsi utama). Main function merupakan titik dimana dimana program akan mulai dijalankan. selalu diikuti oleh tanda kurung () karena merupakan sebuah function. Pada C++ semua function. Isi dari function main diapit dengan tanda kurawal ({}), sebagai berikut :
main
Indoprog
24
C/C++ Programming
cout << "Hello World"; Cout merupakan standard
Hendra, S.T.
output stream pada C++ (biasanya ke layar), yang dalam hal ini akan mencetak tulisan "Hello World". Cout dideklarasikan dalam header file iostream.h, sehingga untuk memanfaatkannya perlu di #include. Catatan : setiap perintah C++ diakhiri dengan karakter semicolon (;).
return 0;
Perintah return menyebabkan selesainya function main() dan mengembalikan suatu nilai, dalam hal ini 0. Dalam hal ini berarti eksekusi selesai tanpa kesalahan.
Comments (Komentar/keterangan).
Ketika anda sedang menulis sebuah program, segalanya adalah jelas tentang pada yang sedang anda kerjakan. Tetapi setelah satu bulan, anda kembali melihat program tersebut, mungkin saja anda telah lupa dan merasa bingung. Untuk mengurangi keraguan tersebut, anda perlu membuat komentar secukupnya pada kode anda. Komentar adalah bagian dari source code yang akan diabaikan oleh compiler. Ada dua cara penulisan komentar pada C++:
// line comment /* block comment */
Yang pertama adalah mengawali setiap baris komentar dengan tanda (//), sedangkan bentuk kedua mengawali komentar dengan /* dan diakhiri dengan */ , jenis komentar ini cocok untuk komentar/keterangan yang lebih dari satu baris. Perhatikan contoh berikut :
/* my second program in C++ with more comments */ #include <iostream.h> int main () { cout << "Hello World! "; // says Hello World! cout << "I'm a C++ program"; // says I'm a C++ program return 0;
} Catatan: Indoprog
25
C/C++ Programming
Hendra, S.T.
Adalah praktek yang baik untuk senantiasa membuat komentar pada awal dari setiap program yang anda buat. Mengenai bentuk komentar tersebut diserahkan kepada masingmasing individu, tetapi setiap header program harus memiliki informasi berikut ini: Nama dari fungsi atau program Nama file Apa yang dikerjakan oleh fungsi atau program Keterangan tentang bagaimana program bekerja Nama pengarang Sejarah revisi (catatan pada setiap perubahan dilakukan) Jenis kompiler, linker, dan tools yang digunakan untuk membuat program tersebut. Catatan tambahan secukupnya.
Berikut ini adalah contoh komentar yang mungkin pada program Hello World :
/************************************************************ Program: Hello World File: Hello.cpp Function: Main (complete program listing in this file) Description: Prints the words "Hello world" to the screen Author: Jesse Liberty (jl) Environment: Turbo C++ version 4, 486/66 32mb RAM, Windows 3.1 DOS 6.0. EasyWin module. Notes: This is an introductory, sample program. Revisions: 1.00 10/1/94 (jl) First release 1.01 10/2/94 (jl) Capitalized "World" ************************************************************/
dalam hal ini a dan b adalah variable, jadi variable di program komputer menyerupai variable pada matematika. Sehingga, kita dapat mendefinsikan variable sebagai bagian dari memori untuk menyimpan nilai, dalam hal ini a dan b disebut sebagai identifier (pengenal)
Indoprog
26
C/C++ Programming
Hendra, S.T.
Identifiers
Suatu identifier harus memenuhi syarat berikut : 1. Terdiri dari huruf, angka dan symbol garis bawah ( _ ). 2. Untuk compiler tertentu maksimum 32 karakter. 3. Tidak boleh pakai spasi atau tanda baca lainnya . 4. Boleh diawali dengan symbol garis bawah ( _ ), tetapi biasanya dicadangkan untuk external link. 5. Tidak boleh sama dengan keyword (kata kunci) Key word standar menurut ANSI-C++ yang tidak boleh anda gunakan sebagai identifier:
asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t
Sangat penting diingat: Bahasa C++ language adalah "case sensitive", hal ini berarti bahwa identifier yang ditulis dengan huruf besar dan kecil adalah tidak sama. Jadi, variable HASIL tidak sama dengan variable hasil ataupun variable Hasil.
Data types
Dalam pemrograman, kita menggunakan variable sebagai fasilitas untuk menyimpan dan mengambil nilai di memori komputer. Data pada memory komputer diorganisasikan dalam bentuk byte (8 bit) 0 s/d 255, dan oleh bahasa pemrograman C++ data tersebut dapat dinyatakan menjadi berbagai data type sebagai berikut : DATA TYPES
Name char short long Bytes* Description 1 2 4 character or integer 8 bits length. integer 16 bits length. integer 32 bits length. Range* signed: -128 to 127 unsigned: 0 to 255 signed: -32768 to 32767 unsigned: 0 to 65535 signed:-2147483648 to 2147483647
Indoprog
27
C/C++ Programming
Hendra, S.T.
unsigned: 0 to 4294967295
int
Integer. Its length traditionally depends on the length of the system's Word type, thus in MSDOS it is 16 bits long, whereas in 32 bit systems (like See short, long Windows 9x/2000/NT and systems that work under protected mode in x86 systems) it is 32 bits long (4 bytes). floating point number. double precision floating point number. long double precision floating point number. Boolean value. It can take one of two values: true or false NOTE: this is a type recently added by the ANSI-C++ standard. Not all compilers support it. Consult section bool type for compatibility information. 3.4e + / - 38 (7 digits) 1.7e + / - 308 (15 digits) 1.2e + / - 4932 (19 digits)
4 8 10
bool
true or false
wchar_t 2
Wide character. It is designed as a type to store international characters of a two-byte character set. NOTE: this is a wide characters type recently added by the ANSI-C++ standard. Not all compilers support it.
Declaration of variables
Pada C++ suatu variabel adalah tempat untuk menyimpan informasi. Suatu variabel adalah suatu lokasi pada memori komputer anda yang mana dapat menyimpan sebuah nilai dan dari sana anda dapat mengambil kembali nilai yang tersimpan. Sebagaimana dengan Pascal, setiap variable dalam C++, kita harus mendeklarasikannya terlebih dahulu. Adapun tata cara pendeklarasian variabel pada C++ adalah menuliskan type data yang diinginkan (misalnya int, short, float...) kemudian diikuti dengan identifier variable yang sah (lihat bagian identifier). Sebagai contoh:
int a; float mynumber;
Dapat juga mendeklarasikan beberapa variable dengan data type yang sama :
int a, b, c;
Khusus variable type Integer (char, short, long dan int) dapat ditentukan apakah signed dan unsigned (defaultnya adalah signed). Sebagai contoh:
unsigned short NumberOfSons; signed int MyAccountBalance;
Indoprog
28
C/C++ Programming
Hendra, S.T.
Catatan: Kebanyakan programmer yang berpengalaman menggunakan notasi Hungarian untuk identifier variabel yang digunakan. Adapun dasar ide notasi Hungarian adalah mengawali setiap identifier variabel dengan sejumlah karakter yang menerangkan type variabel, seperti i untuk integer, l untuk long. Notasi lain yang mungkin adalah untuk membedakan variabel global, pointer dan lainnya.
Initialization of variables
Pada C++, nilai awal suatu variable adalah tidak tertentu. Anda dapat memberikan nilai awal pada saat deklarasi dengan penulisan :
int a = 0; int a (0); // Cara deklarasi di C // atau cara deklarasi di C++
Constants: Literals.
Suatu konstanta adalah ekspresi yang memiliki nilai tetap yang dapat berupa data type Integer, Floating-Point, Character dan String Integer Numbers
75 0113 0x4b // decimal // octal // hexadecimal
Indoprog
29
C/C++ Programming
Hendra, S.T.
Konstanta karakter memiliki beberapa pengecualian, seperti kode escape, yang merupakan karakter spesial yang tidak dapat diekspresikan kecuali dalam source code, seperti newline (\n) atau tab (\t). Berikut ini adalah daftar dari kode escape :
\n \r \t \v \b \f \a \' \" \? \\
newline carriage return tabulation vertical tabulation backspace page feed alert (beep) single quotes (') double quotes (") question (?) inverted slash (\)
Contoh :
'\n' '\t' "Left \t Right" "one\ntwo\nthree"
Sebagai tambahannya, anda dapat menulis karakter dengan menggunakan ASCII code seperti \23 atau \40, atau secara hexadesimal seperti \x20 atau \x4A. Konstanta string dapat dibagi menjadi lebih dari satu baris dengan mengakhirinya dengan slash (\):
"string expressed in \ two lines"
Indoprog
30
C/C++ Programming
Hendra, S.T.
Sebagai contoh:
#define PI 3.14159265 #define NEWLINE '\n' #define WIDTH 100
Sesuatu yang haris diingat adalah bahwa directive #define bukan merupakan baris perintah, tetapi merupakan directive untuk preprocessor, sehingga anda tidak perlu memberikan semicolon (;) pada akhirannya.
Dalam hal ini, jika type tidak ditentukan (seperti pada contoh terakhir), maka compiler akan mengasumsikan type-nya sebagai int.
Operators.
Sebagaimana pada Pascal untuk mengoperasikan variable dan konstanta kita membutuhkan operator, adapun operator yang disediakan oleh C++ adalah sebagai berikut : Assignation (=). Operator assignation berfungsi memberikan nilai pada suatu variabel. Contoh :
int a = b = a = b = a, b; 10; 4; b; 7; // // // // // a:? b:? a:10 b:? a:10 b:4 a:4 b:4 a:4 b:7
Salah satu fasilitas C++ yang tidak terdapat pada bahasa pemrograman lainnya adalah operation assignation, Contoh:
Indoprog
31
C/C++ Programming
a = 2 + (b = 5);
Hendra, S.T.
dan contoh :
a = b = c = 5;
memberikan nilai lima ke variable a, b dan c. Arithmetic operators ( +, -, *, /, % ) Adapun operasi yang dilakukan adalah: + addition - subtraction * multiplication / division % module Saya yakin operasi seperti penjumlahan, pengurangan, perkalian,pembagian dan module sudah jelas bagi anda. Compound assignation operators (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=) Salah satu fasilitas C++ yang cukup ditakuti adalah pemakaian operator compound assignation (+=, -=, *= and /= among others) :
value += increase; adalah sama dengan value = value + increase; a -= 5; adalah sama dengan a = a - 5; a /= b; adalah sama dengan a = a / b; price *= units + 1; adalah sama dengan price = price * (units + 1);
Increase and decrease. Contoh lain dari penyingkatan penulisan operator adalah pemakaian increase operator (++) dan decrease operator (--). Mereka menambahkan atau mengurangi variable dengan 1. Contoh :
a++; a+=1; a=a+1; a--; a-=1; a=a-1;
Indoprog
32
C/C++ Programming
Hendra, S.T.
Salah satu karakteristik dari pemakaian operator ini adalah dapat digunakan sebagai prefix atau sebagai suffix. Yang berarti dapat dituliskan sebelum dan sesudah variabel (++a) atau (a++). Pada dasarnya a++ atau ++a memiliki arti yang sama, Cuma bedanya adalah urutan operasi, contoh: Example 1 Example 2
Pada contoh 1, nilai B ditambah satu sebelum diberikan ke A. Sedangkan pada contoh 2, nilai dari B diberikan ke A dan selanjutnya nilai B di tambah satu. Relational operators ( = =, !=, >, <, >=, <= ) Untuk evaluasi perbandingan antara dua ekspresi, kita dapat menggunakan operator Relational operators yang akan menghasilkan true atau false. Berikut ini adalah operator Relational pada C++: Equal != Different > Greater than < Less than >= Greater or equal than <= Less or equal than Contoh : (7 == 5) akan menghasilkan false. (5 > 4) akan menghasilkan true. (3 != 2) akan menghasilkan true. (6 >= 6) akan menghasilkan true. (5 < 5) akan menghasilkan false.
==
Logic operators ( !, &&, || ). Operator ! adalah sama dengan operator boolean NOT, dan hanya memiliki satu operand yang berada dikanannya. Contoh : mengembalikan false karena ekspresi (5 == 5) !(5 == 5) menghasilkan true. !(6 <= 4) mengembalikan true. !true mengembalikan false. !false mengembalikan true. Operator Logical && (AND) || (OR), dengan hasil operasi berikut:
Indoprog
33
C/C++ Programming
First Operand a true true false false true false true false Second Operand b Result a && b true false false false Result a || b true true true false
Hendra, S.T.
Contoh:
( (5 == 5) && (3 > 6) ) ( (5 == 5) || (3 > 6) )
Conditional operator ( ? ). Operator conditional melakukan evaluasi dan mengembalikan nilai yang berbeda tergantung kepada hasil evaluasi, apakah true atau false. Dengan format:
condition ? result1 : result2
Jika condition adalah true ekspresi akan mengembalikan result1, jika tidak akan mengembalikan result2. returns 3 since 7 is not equal to 5. 7==5+2 ? 4 : 3 returns 4 since 7 is equal to 5+2. 5>3 ? a : b returns a, since 5 is greater than 3. a>b ? a : b returns the greater one, a or b.
7==5 ? 4 : 3
Bitwise Operators ( &, |, ^, ~, <<, >> ). Operator Bitwise melakukan modifikasi terhadap variable yang didasarkan kepada nilai bit yang tersimpan .
op & | ^ ~ << >> asm AND OR XOR NOT SHL SHR Description Logical AND Logical OR Logical exclusive OR Complement to one (bit inversion) Shift Left Shift Right
Explicit type casting operators Operator Type casting memungkinkan anda untuk melakukan konversi terhadap suatu data ke type yang lain. Cara yang paling baik adalah mengawali data dengan nama type baru yang ditulis dalam kurung ():
Indoprog
34
C/C++ Programming
int i; float f = 3.14; i = (int) f;
Hendra, S.T.
Kode diatas mengubah angka 3.14 ke suatu nilai integer (3). sizeof() Operator ini memiliki satu parameter, dapat berupa variable maupun type variable, dan mengembalikan ukurannya dalam byte:
a = sizeof (char);
Priority of operators
Ketika membuat ekspresi yang kompleks dengan beberapa operand, kita akan ragu operand mana yang akan dievaluasi terlebih dahulu, sebagai contoh :
a = 5 + 7 % 2
Jawaban yang benar adalah ekspresi yang kedua Berikut ini adalah prioritas tertinggi sampai prioritas yang terendah:
Priority 1 2 Operator :: () [ ] -> . sizeof ++ -~ ! 3 &* (type) +4 5 6 7 8 */% +<< >> < <= > >= == != increment/decrement Complement to one (bitwise) unary NOT Reference and Dereference (pointers) Type casting Unary less sign arithmetical operations arithmetical operations bit shifting (bitwise) Relational operators Relational operators Left Left Left Left Left Right Description scope Associativity Left Left
Indoprog
35
C/C++ Programming
9 10 11 12 13 &^| && || ?: = += -= *= /= %= >>= <<= &= ^= |= , Bitwise operators Logic operators Conditional Assignation Comma, Separator Left Left Right Right Left
Hendra, S.T.
Pertanyaan
1. Tuliskan pengertian bahasa C/C++ merupakan bahasa case sensitif. 2. Tuliskan dasar ide pengunaan notasi Hungarian. 3. Tuliskan pengertian keyword, dan mengapa keyword tidak boleh digunakan sebagai identifier. 4. Tuliskan fungsi #include paga program C/C++. 5. Tuliskan perbedaan pemakaian komentar // dengan /* */. 6. Tuliskan pengertian escape code, dan rincikan daftar escape code dalam C/C++. 7. Tuliskan perbedaan antara integer dan float, bagaimana dengan unsigned short int dengan long int. 8. Tuliskan ekspresi dalam bahasa C++ untuk formula berikut ini :
11. Type data apa yang sesuai untuk mewakili hasl berikut ini? o Jumlah mahasiswa dalam ruang kelas. o Nilai huruf hasil ujian mahasiswa. o Nilai rata-rata kelas. o Jarak antara dua titik o Jumlah populasi suatu kota o Berat dari suatu surat
Indoprog
36
C/C++ Programming
Hendra, S.T.
12. Tuliskan deklarasi yang sesuai untuk pertanyaan nomor 4. Pilihkan identifiers yang sesuai. 13. Tuliskan perbedaan antara int dengan unsigned integer.
Latihan
1. Tuliskan deklarasi konstanta untuk menyimpan jumlah hari dalam satu minggu, dan jumlah minggu dalam satu tahun. Secara terpisah deklarasikan juga konstanta untuk pi sebagai 3.1415927. 2. Tuliskan deklarasi variabel integer I dan j, variabel float x dan y. Kembangkan deklarasi variabel I dan j dengan nilai awal 1, dan 10.0 untuk y. 3. Ketik dan jalankan program berikut, dan analisa hasil outputnya. #include <iostream.h> int main() { cout << "The size of an int is:\t\t" << sizeof(int) << " bytes.\n"; cout << "The size of a short int is:\t" << sizeof(short) << " bytes.\n"; cout << "The size of a long int is:\t" << sizeof(long) << " bytes.\n"; cout << "The size of a char is:\t\t" << sizeof(char) << " bytes.\n"; cout << "The size of a float is:\t\t" << sizeof(float) << " bytes.\n"; cout << "The size of a double is:\t" << sizeof(double) << " bytes.\n"; return 0; }
Indoprog
37
C/C++ Programming
Hendra, S.T.
Section 4
Output (cout)
Stream cout digunakan dalam hubungannya dengan overloaded operator << (sepasangan tanda "less than" ).
cout << "Output sentence"; // prints Output sentence on screen // prints number 120 on screen cout << 120; cout << x; // prints the content of variable x on screen
Operator insertion (<<) dapat digunakan lebih dari sekali pada kalimat yang sama:
cout << "Hello, " << "I am " << "a C++ sentence";
hasil cetak:
First sentence. Second sentence.
Input (cin).
Menangani standard input pada C++ dilakukan dengan menerapkan operator overloaded operator atau extraction (>>) pada stream cin. Hal ini harus diikuti oleh variable yang akan menyimpan data yang akan dibaca, sebagai contoh :
int age; cin >> age;
// i/o example
Indoprog
38
C/C++ Programming
#include <iostream.h> int main () { int i; cout << "Please enter an integer value: "; cin >> i; cout << "The value you entered is " << i; cout << " and its double is " << i*2 << ".\n"; return 0; }
Hendra, S.T. The value you entered is 702 and its double is 1404.
Anda dapat juga menggunakan cin untuk menanyakan lebih dari satu data:
cin >> a >> b;
Dalam hal diatas, anda perlu memasukan dua data, satu untuk variabel a dan variable b yang harus dipisahkan dengan spasi kosong atau baris baru.
iostream Manipulators
iomanip merupakan bagian dari Standard C++ I/O Library yang digunakan untuk memanipulasi tampilan I/O pada perintah cout. Berikut ini adalah beberapa contoh pemakaian iomanip dan hasil outputnya.
// setprecision example #include <iostream> #include <iomanip> using namespace std; int main () { double f =3.14159; cout << setprecision (5) << f << endl; cout << setprecision (9) << f << endl; return 0; }
Indoprog
39
C/C++ Programming
int main () { cout << setw (10); cout << 77 << endl; return 0; }
Hendra, S.T.
This code uses setfill to set the fill character to 'x'. The output of this example shall be similar to:
xxxxxxxx77 // setbase example #include <iostream> #include <iomanip> using namespace std; int main () { cout << setbase (16); cout << 100 << endl; return 0; } This code uses setbase manipulator to
set hexadecimal as the basefield. The output of this example is the hexadecimal value of 100, i.e. 64.
// resetiosflags example #include <iostream> #include <iomanip> using namespace std; int main () { cout << hex << setiosflags (ios_base::showbase); cout << 100 << endl; cout << resetiosflags (ios_base::showbase); cout << 100 << endl; return 0; }
This code first sets flag showbase and then resets it using resetiosflags manipulator. The execution of this example shall display:
0x64 64
Indoprog
40
C/C++ Programming
Hendra, S.T.
Pertanyaan
1. Tuliskan perintah C++ untuk menanyakan tiga buah bilangan yang akan disimpan kedalam variabel integer first, second dan third. 2. Tuliskan perintah C++ untuk menghasilkan output dari variabel x dengan tampilan sebagai berikut :
Nilai dari x adalah .....
dimana nilai dari , area dan circumference disimpan dalam variabel rad, area, dan circum.
Latihan
1. Buatlah program yang menghasilkan tampilan berikut dengan menggunakan cout:
XXXXX X X XXX X X XXXXX
2. Buatlah program yang membaca empat karakter dan mencetak kembali pada masing-masing baris dengan diapit oleh tanda petik tunggal. 3. Buatlah sebuh program yang menampilkan pesan kepada pemakai untuk memasukan dua bilangan integer dan satu float serta mencetak kembali ke layar. Indoprog
41
C/C++ Programming
Hendra, S.T.
Section 5
Control Structures
Suatu program biasanya tidak hanya berupa suatu urutan linear dari instruksi-instruksi. Dalam prosesnya mungkin bercabang, berulangan atau membuat keputusan. Untuk keperluan tersebut, C++ menyediakan struktur kendali yang ditujukan untuk menentukan apa yang akan dilakukan pada program kita.
dimana condition adalah ekspresi yang akan di evaluasi. Jika kondisi ini true, statement akan dieksekusi. Jika false, statement akan diabaikan (tidak dieksekusi) dan program berlanjut ke instruksi berikutnya setelah struktur conditional. Sebagai contoh, potongan program berikut akan mencetak x is 100 hanya jika nilai yang tersimpan dalam variabel x adalah 100:
if (x == 100) cout << "x is 100";
Jika anda menginginkan lebih dari satu instruksi dijalankan kalau condition adalah true , anda dapat memberikan blok instruksi dengan mengunakan kurung kurawal { }:
if (x == 100) { cout << "x is "; cout << x; }
Kita dapat menentukan apa yang akan dilakukan kalau condition tidak terpenuhi dengan menggunakan keyword else. Bentuk penulisannya adalah:
if (condition) statement1 else statement2
Contoh:
if (x == 100) cout << "x is 100"; else cout << "x is not 100";
mencetak pada layar x is 100 jika x bernilai 100, dan x is not 100 jika sebaliknya.
Indoprog
42
C/C++ Programming
Hendra, S.T.
Struktur if + else dapat digabungkan untuk memeriksa sejumlah nilai seperti contoh berikut :.
if (x > 0) cout << "x else if (x < cout << "x else cout << "x is positive"; 0) is negative"; is 0";
Ingat, jika instruksi yang akan dijalankan lebih dari satu, kita harus mengelompokannya dengan menggunakan kurung kurawal { }. Catatan : Didalam penulisan perintah terstruktur kita perlu melakukan Indentasi, dimana untuk memudahkan pembacaan program, berikut ini adalah beberapa contoh style yang sering dilakukan oleh programmer * Menempatkan tanda kurawal pembuka pada baris yang sama dengan if. if (expression){ statements } * Menempatkan tanda kurawal pada baris baru tetapi sejajar dengan if if (expression) { statements } * Menempatkan tanda kurawal pada baris baru dan sejajar dengan statement.. if (expression) { statements } Pemilihan Indentasi Style diserahkan kepada programmer, sepanjang pemakaiannya konsisten.
43
C/C++ Programming
Hendra, S.T.
Formatnya adalah:
while (expression) statement
dan secara sederhananya fungsi ini akan mengulangi statement ketika expression adalah benar.
Sebagai contoh, kita akan membuat program untuk menghitung dengan suatu while loop:
// custom countdown using while #include <iostream.h> int main () { int n; cout << "Enter the starting number > "; cin >> n; while (n>0) { cout << n << ", "; --n; } cout << "FIRE!"; return 0; }
Fungsinya hampir sama dengan while loop kecuali bahwa condition pada dowhile di evaluasi setelah eksekusi statement
Indoprog
44
C/C++ Programming
Hendra, S.T.
Contoh:
// number echoer #include <iostream.h> int main () { unsigned long n; do { cout << "Enter number (0 to end): "; cin >> n; cout << "You entered: " << n << "\n"; } while (n != 0); return 0; }
Enter number You entered: Enter number You entered: Enter number You entered:
dan fungsi utamanya adalah mengulangi statement ketika condition masih benar, menyerupai while loop. Tetapi tambahannya adalah, for menyediakan tempat untuk menentukan suatu instruksi initialization dan suatu increase instruction. Jadi loop ini khusus dirancang untuk melakukan suatu aksi perulangan berdasarkan counter.
Indoprog
45
C/C++ Programming
Hendra, S.T.
Cara kerjanya adalah sebagai berikut: 1, initialization dijalankan. Umumnya adalah menentukan nilai awal untuk variable counter. Bagian ini hanya dieksekusi sekali. 2, condition diperiksa, jika true maka loop dilanjutkan, selain itu loop berakhir dan statement diloncati. 3, statement dijalankan. Pada umumnya dapat berupa instruksi tunggal atau sekumpulan instruksi yang diapit dengan kurung kurawal { }. 4, akhirnya, sebagaimana yang dinyatakan field increase akan dijalankan dan loop kembali ke langkah 2 Berikut ini adalah contoh of countdown dengan menggunakan for loop.
// countdown using a for loop #include <iostream.h> int main () { for (int n=10; n>0; n--) { cout << n << ", "; } cout << "FIRE!"; return 0;
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE!
Indoprog
46
C/C++ Programming
}
Hendra, S.T.
Field initialization dan increase adalah bersifat optional. Mereka dapat diabaikan dengan semicolon diantaranya. Sebagai contoh anda dapat menulis: for (;n<10;) jika tidak ingin menentukan initialization dan increase; atau for (;n<10;n++) jika kita ingin menggunakan increase tetapi tidak untuk initialization. Secara optinal, pemakaian operator comma (,) kita dapat menentukan lebih dari satu instruksi dalam field didalam suatu for loop, Contoh :
for ( n=0, i=100 ; n!=i ; n++, i-- ) { // whatever here... } ini akan dijalankan 50 kali, jika n atau i tidak dimodifikasi
Loop
dalam loop:
Indoprog
47
C/C++ Programming
Hendra, S.T.
Instruksi continue menyebabkan program loncat ke akhir dari loop, dan melanjutkan ke iterasi berikutnya, contoh :
// break loop example #include <iostream.h> int main () { for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; } cout << "FIRE!"; return 0; }
10, 9, 8, 7, 6, 4, 3, 2, 1, FIRE!
The goto instruction. Perintah ini memungkinkan anda untuk melakukan loncatan absolut ke suatu bagian program tertentu. Anda harus menggunakan fasilitas ini secara hati-hati dalam kaitannya dengan struktur program anda. Titik tujuan diidentifikasi oleh suatu label, dimana digunakan sebagai argumen untuk instruksi goto. Penulisan label yang benar diikuti dengan sebuah colon (:). Berikut ini adalah contoh pemakaian goto untuk melakukan perulangan yang tidak terstruktur :
// goto loop example #include <iostream.h> int main () { int n=10; loop: cout << n << ", "; n--; if (n>0) goto loop; cout << "FIRE!"; return 0; }
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE!
The exit function. exit terdefinisi dalam library cstdlib (stdlib.h). Tujuan dari exit adalah untuk menghentikan program yang berjalan dengan kode exit tertentu. Prototypenya adalah sebagai berikut:
void exit (int exit code);
digunakan oleh system operasi tertentu yang mana memanggil program tersebut. Secara konvensi, suatu exit code 0 berarti program berakhir secara normal dan nilai lain berarti suatu kesalahan telah terjadi.
Kode exit
Indoprog
48
C/C++ Programming
Hendra, S.T.
Cara kerjanya adalah sebagai berikut: switch mengevaluasi expression dan memeriksa jika nilainya ekuivalen dengan constant1, jika ya, jalankan block of instructions 1 sampai menemukan keyword break, kemudian program meloncat ke akhir dari struktur seleksi switch. Jika expression tidak sama dengan constant1 , maka pemeriksaan dilakukan pada constant2. Jika ya, block of instructions 2 akan dijalankan sampai ditemukan keyword break. Akhirnya, jika nilai dari expression tidak sama dengan konstanta-konstanta sebelumnya, maka bagian default: akan dijalankan. Kedua koding berikut menghasilkan hal yang sama: switch example
switch (x) { case 1: cout << "x is 1"; break; case 2: cout << "x is 2"; break; default: cout << "value of x unknown"; }
if-else equivalent
if (x == 1) { cout << "x is 1"; } else if (x == 2) { cout << "x is 2"; } else { cout << "value of x unknown"; }
Pertanyaan
1. Tuliskan fungsi blok { dan } dalam C/C++. Indoprog
49
C/C++ Programming
Hendra, S.T.
2. Jika x memliki nilai 3.5 ketika perintah berikut ini dijalankan, nilai berapa yang akan disimpan ke y?
if (x + 1 <= 3.6) y = 1.0; else y = 2.0;
3. Jelasnkan fungsi pernyatan berikut ? Mengapa secara sintaksisnya salah? Bagaimana memperbaikinya sehingga menjadi benar?
if (x >= y) sum += x; cout << "x is bigger" << endl; else sum += y; cout << "y is bigger" << endl;
4. Tuliskan suatu pernyataan if-else yang mana akan menambah suatu variabel x ke variabel possum jika x adalah positif dan akan menambahkan x ke negsum jika varibel x bernilai negatif. 5. Kembangkan solusi pertanyaan sebelumnya sehingga jika x adakah positif, maka suatu variabel poscount ditambah 1 dan sebaliknya variable negcount yang akan ditambah 1. 6. Seorang mahasiswa diberi nilai dari `A' ke `F' dalam suatu ujian. Sehingga ratarata dapat dihitung berdasarkan nilai yang diberikan pada grade tersebut sebagaimana, `A' adalah 10, `B' adalah 8, `C' adalah 6, `D' adalah 4, `E' adalah 2 dan `F' adalah 0. Pada C++ ada dua metode untuk melakukan hal tersebut, apakah itu? Tuliskan perintah yang bersesuaian untuk metoda yang anda pilih. Seorang mahasiswa memiliki suatu penilaian berdasarkan kriteria berikut ::
>=70 60-69 50-59 40-49 30-39 <30 `A' `B' `C' `D' `E' `F'
Dapatkah suatu perintah switch digunakan untuk penentuan kriteria penilaian tersebut? Jika tidak bisa, bagaimana melakukan tersebut? Dan tuliskan perintah untuk penanganan masalah diatas.
Latihan
Untuk setiap latihan berikut, gambarkan algoritma yang digunakan dalam bentuk flowchart, baru dilanjutkan dengan penulisan program.
Indoprog
50
C/C++ Programming
Hendra, S.T.
1. Buatlah sebuah program yang mana menghasilkan selisih nilai absolut dari dua bilangan integer (bulat) x dan y, dimana (x-y) atau (y-x) adalah positif. Pikirkan segala kemungkinan yang dapat terjadi, dan buatlah solusi untuk menangani semua kemungkinan tersebut. 2. Penilaian terhadap nilai ujian mahasiswa ditampilkan dalam kriteria Pass (lulus) atau Fail (gagal) berdasarkan tiga nilai yang dimasukan. Adapun kriteria untuk lulus adalah sebagai berikut: Seorang siswa lulus kalau ketiga nilai tersebut bernilai >= 60, atau hanya gagal disalah satu mata kuliah dengan nilai rata-rata >= 60. 3. Buatlah sebuah program C++ yang mana dapat menghitung luas dari suatu
persegi ( ) atau segitiga ( ) setelah menampilkan pertanyaan jenis perhitungan yang akan dilakukan (persegi atau segitiga). 4. Tuliskan suatu program yang akan menghasilkan jumlah nilai dari barisan:
Indoprog
51
C/C++ Programming
Hendra, S.T.
dari hasil perhitungan, jika nilai n cukup besar, maka ankan menghasilkan nilai yang mendekati 0.7854 ( /4). 7. Buatlah suatu program yang menghasilkan suatu tabel perkalian n x n ( dimana nilai n lebih kecil atau sama dengan 10). Sebagai contoh, jika n bernilai 4 (empat), maka akan ditampilkan tabel perkalian berikut :
1 2 3 4 1 1 2 3 4 2 2 4 6 8 3 3 6 9 12 4 4 8 12 16
Indoprog
52
C/C++ Programming
Hendra, S.T.
Section 6
Functions (I)
Pemakaian function akan membuat program anda menjadi lebih terstruktur (baca kembali section 2 jika anda tidak mengerti pernyataan ini). Sebuah function adalah blok dari instruksi-instruksi yang akan dijalankan ketika dipanggil dari bagian lain program, berikut ini adalah formatnya:
type name ( argument1, argument2, ...) statement
dimana:
type adalah type data yang akan dikembalikan oleh function. name adalah nama yang digunakan untuk memanggil function. arguments. Masing-masing argument terdiri dari type data yang diikuti oleh identifier, seperti dalam deklarasi variabel (sebagai contoh, int x) dan perlakuannya
dalam function menyerupai variabel. statement adalah badan dari function. Dapat berupa satu instruksi tunggal atau blok dari instruksi-instruksi. Berikut ini adalah contoh function:
// function example #include <iostream.h> int addition (int a, int b) { int r; r=a+b; return (r); } int main () { int z; z = addition (5,3); cout << "The result is " << z; return 0; }
The result is 8
Catatan : Ketika program anda melakukan pemanggilan terhadap function, maka posisi alamat pemangilan (alamat register ip) akan di push ke stack, dan ketika function berakhir, maka alamat tersebut akan di pop kembali dari stack ke register ip, sehingga program dapat kembali ke proses berikutnya.
Indoprog
53
C/C++ Programming
Hendra, S.T.
anda akan melihat bahwa, penulisannya harus diawali dengan suatu type, yang mana merupakan type data yang akan dikembalikan oleh function dengan perintah return. Tetapi bagaimana kalau kita tidak ingin mengembalikan suatu nilai? Bayangkan misalnya kita ingin membuat function yang hanya mencetak pesan ke layar. Kita tidak memerlukan pengembalian suatu nilai, dan juga tidak membutuhkan parameter. Dalam hal ini dapat digunakan type void. Perhatikan contoh berikut:
// void function example #include <iostream.h> void dummyfunction (void) { cout << "I'm a function!"; } int main () { dummyfunction (); return 0; }
I'm a function!
Sesuatu hal yang perlu diperhatikan adalah kita memanggil function tersebut harus mengakhiri nama function dengan kurung :
dummyfunction ();
Hal ini untuk membedakan function, terhadap nama variable ataupun hal yang lain.
Scope of variables
Pada C, variable harus dideklarasikan pada awal setiap function (untuk variable local) atau pada bagian badan program diluar function (untuk variable global). Suatu perbedaan antara C dan C++ adalah variable dapat dideklarasikan pada saat dibutuhkan.
Indoprog
54
C/C++ Programming
Hendra, S.T.
Pada C++, jangkauan dari variable local adalah berada di blok dimana ia dideklarasikan (suatu blok adalah kumpulan instruksi yang dikelompokan dalam tanda kurawal {}). Jika dideklarasikan dalam function, maka jangkauan variable itu adalah dalam function tersebut, sedangkan kalau dalam loop, maka jangkauannya hanya dalam loop tersebut. Variable Global dapat digunakan pada seluruh program, didalam function, dimanapun setelah deklarasi. Jangkauan dari local variables adalah terbatas pada bagian dimana mereka dideklarasikan. Jika mereka dideklarasikan pada awal dari suatu function (seperti pada main) jangkauan mereka adalah pada keseluruhan function main. Catatan : Programmer pemula sering sekali mendeklarasikan semua variabel yang dibutuhkan dalam program menjadi variabel global. Hal ini akan menyebabkan sulitnya pengendalian nilai variabel pada program yang besar, karena variabel global dapat dimanipulasi oleh semua bagian dalam program.
inverse cosine, -1 <= x <= +1, returns value in radians in range 0 to PI asin(x) inverse sine, -1 <= x <= +1, returns value in radians in range 0 to PI atan(x) inverse tangent, returns value in radians in range -PI/2 to PI/2 cos(x) mengembalikan nilai cosinus x, x dalam radianin radians
Indoprog
55
C/C++ Programming
Hendra, S.T.
returns sine of x, x in radians tan(x) returns tangent of x, x in radians exp(x) exponential function, e to power x log(x) natural log of x (base e), x > 0 sqrt(x) square root of x, x >= 0 fabs(x) absolute value of x floor(x) largest integer not greater than x ceil(x) smallest integer not less than x rand() an integer value between 0 to RAND_MAX srand(x) initialize a random seed
sin(x)
Contoh
/* rand/srand example */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { /* initialize random generator */ srand ( time(NULL) ); /* generate some random numbers */ printf ("A number between 0 and 100: %d\n", rand()%100); printf ("A number between 20 and 30: %d\n", rand()%10+20); return 0; }
Output:
A number between 0 and 100: 93 A number between 20 and 30: 21
Semua function diatas menggunakan parameter x yang bernilai floating point. Berikut beberapa contoh pemakaian fungsi yang dimaksud diatas:
y = sin(3.14159); z = cos(a) + sin(a); factor = sin(theta)/(sin(delta) - sin(delta-theta)); theta = acos(1.0/sqrt(1 - x*x)); if (sin(x) > 0.7071) cout << "Angle is greater than 45 degrees"; cout << "The value is " << exp(-a*t)*sin(a*t);
Indoprog
56
C/C++ Programming
Hendra, S.T.
Sesuatu hal yang perlu diingat bahwa anda perlu memasukan file math.h kedalam program, Library math.h juga telah mendefinisikan beberapa konstanta seperti M_PI untuk dan M_E untuk .
Pertanyaan
1. Sebutkan fungsi pemakaian function? 2. Apa peran parameter pada suatu function? 3. Tuliskan perbedaan antara variabel global dan variabel local. 4. Apa fungsi dari function berikut ini?
void example(int n) { int i; for (i=0; i<n; i++) cout << '*'; cout << endl; }
Bagaimana anda memanggil function ini dalam program? Bagaimana anda mengunakan fungsi tersebut untuk menghasilkan output berikut ini ke layar?
* ** *** ****
Indoprog
57
C/C++ Programming
} void main() { int x; x = 0; change(); cout << x << endl; }
Hendra, S.T.
b)
void change(int x) { x = 1; } void main() { int x; x = 0; change(x); cout << x << endl; }
6. Tuliskan suatu function prototype untuk suatu function yang memiliki dua paramter dengan type float dan mengembalikan true (1) jika parameter perta lebih besar dari paramater yang kedua, dan sebaliknya mengembalikan false (0). 7. Suatu function dengan nama ex1 memiliki sebuah variabel local dengan nama i dan function lainnya ex2 juga memiliki suatu variabel local bernama i. Kedua function tersebut digunakan bersama dalam suatu program utama yang memiliki sebuah variabel bernama i. Andaikan tidak adalah kesalahan lainnya. Apakah program ini dapat dikompilasi dengan tanpa kesalahan? Akankah program tersebut dijalankan tanpa kesalahan waktu run-time?
Latihan
1. Buatlah sebuah function yang akan mencetak suatu barisan sejumlah n tanda asterisk, n akan dilewatkan sebagai parameter ke function tersebut. Tuliskan suatu program yang akan menampilkan blok m x n tanda asterik berdasarkan nilai input m dan n oleh pemakai. 2. Kembangkan function pada soal nomor satu, sehingga jika nilai n melewati 80, maka tidak ada yang dicetak, dan function akan mengembalikan nilai false, dan sebaliknya true. Kemudian program utama akan memeriksa nilai pengembalian dari function, serta menampilkan pesan kesalahan overflow jika nilai false. 3. Buatlah suatu function yang dapat menghitung nilai simpanan di bank dengan parameter, present value, term, dan rate.
Indoprog
58
C/C++ Programming
Hendra, S.T.
Section 7
Tetapi dalam kasus-kasus tertentu, anda perlu memanipulasi nilai dari dalam function terhadap variable external. Untuk keperluan diatas kita perlu menggunakan arguments passed by reference, sebagaimana yang ditunjukan pada contoh function duplicate berikut ini :
// passing parameters by reference #include <iostream.h> void duplicate (int& a, int& b, int& c) { a*=2; b*=2; c*=2; } int main () { int x=1, y=3, z=7; duplicate (x, y, z); cout << "x=" << x << ", y=" << y << ", z=" << z; return 0; }
6 5
Indoprog
59
C/C++ Programming
{ int r; r=a/b; return (r); } int main () { cout << divide (12); cout << endl; cout << divide (20,4); return 0; }
Hendra, S.T.
Overloaded functions.
Dua function yang berbeda dapat memiliki nama yang sama kalau prototype dari argumen-argumenya berbeda, hal ini berarti bahwa anda dapat memberikan nama yang sama pada lebih dari satu function jika memiliki jumlah argumen atau type yang berbeda pada argumennya, contoh :
// overloaded function #include <iostream.h> int divide (int a, int b) { return (a/b); } float divide (float a, float b) { return (a/b); } int main () { int x=5,y=2; float n=5.0,m=2.0; cout << divide (x,y); cout << "\n"; cout << divide (n,m); cout << "\n"; return 0;
}
2 2.5
Dalam hal ini kita telah mendefinisikan dua function dengan nama yang sama, tetapi salah satu darinya menerima dua argumen type int dan yang lainnya menerima type float. Compiler akan mengetahui yang mana akan dipanggil dengan menganalisa type ketika pemanggilan function.
inline functions.
Indoprog
60
C/C++ Programming
Hendra, S.T.
Directive inline dapat diikutsertakan sebelum deklarasi dari function untuk menentukan function mana yang harus di kompilasi sebagai kode sebagaimana ketika mereka dipanggil. Hal ini adalah sama dengan deklarasi sebuah makro. Hal ini bermanfaat kalau function tersebut sangat pendek. Format dari deklarasi tersebut adalah:
inline type name ( arguments ... ) { instructions ... }
Recursivity.
Recursivity adalah kemampuan function untuk memanggil dirinya sendiri. Hal ini berguna untuk tugas-tugas seperti sorting dan factorial, sebagai contoh untuk mendapatkan factorial dari bilangan (n), dimana formula matematikanya adalah:
n! = n * (n-1) * (n-2) * (n-3) ... * 1
Indoprog
61
C/C++ Programming
Hendra, S.T.
Catatan : Salah satu permasalahan yang sering timbul pada program yang mana functionnya yang menggunakan teknik rekursif adalah kehabisan tempat stack (Stack Overflow). dan contoh program fibonacci adalah:
// fibonacci calculator #include <iostream.h> long fib(int n) { if ((n == 0) || (n == 1)) return 1; else return fib(n - 1) + fib(n - 2); } int main () { long l; cout << fib(4); }
Indoprog
62
C/C++ Programming
Hendra, S.T.
Analisis : Processing fib(4)... Call fib(2) and fib(3). Processing fib(2)... Call fib(0) and fib(1). Processing fib(0)... Return 1! Processing fib(1)... Return 1! Processing fib(3)... Call fib(1) and fib(2). Processing fib(1)... Return 1! Processing fib(2)... Call fib(0) and fib(1). Processing fib(0)... Return 1! Processing fib(1)... Return 1! Catatan : Sesuatu hal yang penting untuk diketahui adalah ketika suatu function memangil dirinya (rekursif), maka suatu duplikasi dari fungsi tersebut akan dijalankan. Variabel local dari fungsi tersebut adalah terpisah antara satu sama yang lainnya dan tidak dapat mempengaruhi yang lain secara langsung.
Prototyping functions.
Indoprog
63
C/C++ Programming
Hendra, S.T.
Sampai saat ini, kita mendefinisikan function sebelum pemanggilannya Tetapi ada cara lain untuk menghindari penulisan semua kode function sebelum function main, yaitu dengan melakukan prototyping functions. Bentuk prototyping:
type name ( argument_type1, argument_type2, ...);
Hal ini adalah sama persis dengan header dari suatu function, kecuali:
Tidak diikuti oleh statement untuk function tersebut. Diakhir dengan tanda semicolon (;).
For example:
// prototyping #include <iostream.h> void odd (int a); void even (int a); int main () { int i; do { cout << "Type a number: (0 to exit)"; cin >> i; odd (i); } while (i!=0); return 0; } void odd (int a) { if ((a%2)!=0) cout << "Number is odd.\n"; else even (a); } void even (int a) { if ((a%2)==0) cout << "Number is even.\n"; else odd (a); }
Banyak programmer menyarankan anda untuk melakukan prototyped terhadap semua function. Karena dengan prototyped akan memudahkan kita untuk melihat bagaimana penulisan untuk memanggil suatu function.
Pertanyaan
1. Tuliskan tujuan pemakaian prototype pada function. Indoprog
64
C/C++ Programming
Hendra, S.T.
2. Tuliskan perbedaan antara variabel global, dan local. 3. Tuliskan pengertian function overloading. 4. Bagaimana suatu informasi dijadikan sebagai input ke suatu function? Bagaimana suatu informasi dapat dikembalikan ke program yang memanggilnya? 5. Apa yang akan menjadi output dari program berikut ini?
void change(int& y) { y = 1; } void main() { int x; x = 0; change(x); cout << x << endl; }
Latihan
1. Tuliskan suatu function void timetopart(float t, int& h, int& m) dimana akan mengkonversi waktu menjadi komponen jam dan menit, contoh jika nilai t adalah 2.5, maka akan dikembalikan 2 pada parameter h dan 30 pada parameter m. 2.5 = 2 jam 30 menit. 2. Kembangkan program berikut untuk kemampuan membaca terbilang sampai nilai triliunan
//Program baca angka //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas function #include <iostream.h> #include <conio.h> #include <string.h> void bacaratusan(int n, char kata[]); int main() { char *kata; clrscr(); bacaratusan(101,kata); cout << kata; return 0; } // pada type array, variabel dilewatkan secara by reference // prototype fungsi
Indoprog
65
C/C++ Programming
Hendra, S.T.
void bacaratusan(int n, char kata[]) { char angka[20][20] = {"nol","satu","dua","tiga","empat","lima", "enam","tujuh","delapan","sembilan","sepuluh", "sebelas","duabelas","tigabelas","empatbelas","limabelas", "enambelas","tujuhbelas","delapanbelas","sembilanbelas"}; int ratusan,puluhan,satuan,sisa; char hasil[255]=""; ratusan = n/100; // ambil digit ratusan if (ratusan > 0) if (ratusan == 1) strcat(hasil,"seratus"); else { strcat(hasil,angka[ratusan]); strcat(hasil,"ratus"); } sisa = n - (ratusan*100); // ambil sisa if (sisa < 20 && sisa > 0) // jika bernilai 0 s/d 19 strcat(hasil,angka[sisa]); // langsung dibaca dari array else { puluhan = sisa/10; // ambil digit puluhan if (puluhan > 0) { strcat(hasil,angka[puluhan]); strcat(hasil,"puluh"); } satuan = sisa - (puluhan*10); // ambil sisa if (satuan > 0) strcat(hasil,angka[satuan]); } strcpy(kata,hasil); // duplikasi ke return variabel }
3. Kembangkan program soal no 2 untuk kemampuan membaca angka yang mengandung Sen. 4. Contoh Pemanfaatan teknik rekursif untuk mencari faktor dari suatu bilangan :
#include <iostream.h> void printfactor(int n); int main() { cout << "faktor dari 100 adalah" << endl; printfactor(100); return 0; } void printfactor(int n) { int factor = 2; while (factor<n && n % factor) factor++; cout << factor << " " << n / factor<<endl; if (factor < n) printfactor(n/factor); }
Indoprog
66
C/C++ Programming
Hendra, S.T.
Section 8
Arrays
Arrays adalah serial dari elemen-elemen (variable-variabel) yang memiliki type yang sama dan ditempatkan secara berurutan pada memory sehingga dapat dinyatakan dengan menambah index pada nama variable tersebut. Hal ini berarti bahwa, sebagai contoh, kita dapat menempatkan 5 nilai yang bertype int tampa harus mendeklarasikan 5 variabel yang berbeda untuk masing-masing nilai. Sebagai gantinya kita dapat menggunakan array untuk menyimpan kelima nilai tersebut. Sebagai contoh, suatu array mengandung lima nilai type int yang bernama billy dapat digambarkan sebagai berikut:
dimana setiap kotak kosong mewakili element dari array, dimana dalam hal ini adalah nilai integer dari type int. Index array tersebut dimulai dari 0 sampai 4. Sama seperti variable lainnya, suatu array harus dideklarasikan terlebih dahulu sebelum pemakaiannya, deklarasi array pada C++:
type name [elements];
dima type adalah type data (int, float...), name adalah nama variabel dan elements adalah jumlah element yang diinginkan, dalam hal ini diapit oleh brackets (kurung siku) []. Selanjutnya, contoh penulisan deklarasi:
int billy [5];
CATATAN: Elements harus berupa nilai constant (konstanta), karena array merupakan blok dari memory static yang harus diberikan, sehingga compiler dapat mengetahui jumlah memory yang diperlukan array sebelum instruksi.
Initializing arrays.
Ketika kita mendeklarasi suatu array local (berada didalam function), jika kita tidak menentukannya nilai awalnya, maka isinya adalah tak tentu.
Indoprog
67
C/C++ Programming
Hendra, S.T.
Jika kita mendeklarasi array global (diluar dari function), nilai awalnya adalah nol. Maka jika kita mendeklarasikan array global berikut:
int billy [5];
Kita juga dapat mendeklarasikan suatu Array, berikut dengan nilainya dengan menuliskan nilainya dalam tanda kurawal { }. Sebagai contoh:
int billy [5] = { 16, 2, 77, 40, 12071 };
Sebagai contoh, untuk menyimpan nilai 75 pada elemen kelima pada billy, penulisan yang sesuai adalah:
billy[2] = 75;
dan, untuk menyimpan nilai elemen ketiga dari variable billy ke variable a, kita dapat menulis:
a = billy[2];
// arrays example #include <iostream.h> int billy [] = {16, 2, 77, 40, 12071}; int n, result=0;
12206
Indoprog
68
C/C++ Programming
int main () { for ( n=0 ; n<5 ; n++ ) { result += billy[n]; } cout << result; return 0; }
Hendra, S.T.
Multidimensional Arrays
Array multidimensional dapat digambarkan sebagai array dari array.
adalah suatu bidimensional array 3 baris 5 kolom dengan type int. Cara deklarasinya adalah sebagai berikut:
Misalnya jimmy int jimmy [3][5];
dan, cara untuk menyebutkan elemen baris kedua, kolom keempat adalah dengan ekspresi berikut :
jimmy[1][3]
(sesuatu yang harus anda ingat adalah index dari array selalu dimulai dengan 0). Array Multidimensional tidak hanya terbatas pada dua dimensi saja. Mereka dapat memiliki dimensi sesuai dengan kebutuhan, walaupun sebenarnya jarang melebihi 3 dimensi. Contoh:
char century [100][365][24][60][60];
Indoprog
69
C/C++ Programming
Hendra, S.T.
Menentukan type char untuk setiap detik dalam satu abad, yang terdiri lebih dari 3 milyar chars! Hal ini akan menggunakan memory sebesar 3000 megabytes dari RAM jika kita mendeklarasikannya.
Arrays as parameters
Jika anda perlu melewatkan suatu array ke sebuah function sebagai parameter. Untuk hal ini kita perlu mendeklarasikan function ini sebagai array berdasarkan type, contoh:
void procedure (int arg[])
Memungkinkan suatu parameter dengan type "Array of int" yang bernama arg. Untuk dilewatkan kedalam function ini suatu array dideklarasikan sebagai berikut:
int myarray [40];
5 10 15 2 4 6 8 10
Dalam deklarasi suatu function, jika dimungkinkan untuk mengikutsertakan suatu array multidimensi. Format untuk array tiga dimensi adalah sebagai berikut:
base_type[][depth][depth]
sebagai contoh, suatu function dengan array tiga dimensi sebagai parameternya :
void procedure (int myarray[][3][4])
Indoprog
70
C/C++ Programming
Contoh Program : //Program permainan tic tac toe //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas array dan graphic #include <graphics.h> #include <conio.h> int matrix[3][3] = {{0,0,0},{0,0,0},{0,0,0}}; // function prototype int checkgame(int x) void drawarena() void drawcircle(int i,int j) void drawcross(int i,int j) void drawselector(int i,int j) void clearselector(int i,int j) void think() // program utama int main() { int gdriver, gmode; int gameover; int row =0; int col = 0; char key; detectgraph(&gdriver,&gmode); initgraph(&gdriver,&gmode,"egavga.bgi"); drawarena(); gameover = 0; while (!gameover) { drawselector(row,col); key = getch(); if (key==0) key = getch(); clearselector(row,col); switch (key) { case 27 : gameover = 3; break; case 32 : drawcross(row,col); gameover = checkgame(1); think(); if (gameover ==0) gameover = checkgame(9); break; case 72 : row--; if (row < 0) row = 0; case 80 : row++; if (row > 2) row = 2; case 75 : col--; if (col < 0) col = 0; case 77 : col++; if (col > 2) col = 2; } } setcolor(15);
Hendra, S.T.
//matrix permainan
//memeriksa apakah permainan selesai //mengambar kotak 3 x 3 dilayar //mengambar lingkaran di posisi i,j //mengambar tanda silang di posisi i,j //mengambar kotak seleksi //menghapus kotak seleksi //komputer berpikir menyerang/bertahan
//jika scan code //baca nilai extended //periksa nilai key //esc //space (manusia) //manusia menang ? //giliran komputer //jika belum game //komputer menang ? break; break; break; break; //up //down //left //right
Indoprog
71
C/C++ Programming
if (gameover==1) outtextxy(20,20,"Permainan dimenangkan oleh manusia"); else if (gameover==9) outtextxy(20,20,"Permaiaan dimenangkan oleh komputer"); else outtextxy(20,20,"Berakhir tanpa pemenang"); getch(); closegraph(); return 0; } int checkgame(int x) { if (matrix[0][0] == x return x; else if (matrix[1][0] return x; else if (matrix[2][0] return x; else if (matrix[0][0] return x; else if (matrix[0][1] return x; else if (matrix[0][2] return x; else if (matrix[0][0] return x; else if (matrix[0][2] return x; else return 0; }
Hendra, S.T.
&& matrix[0][1] == x && matrix[0][2] == x) == x && matrix[1][1] == x && matrix[1][2] == x) == x && matrix[2][1] == x && matrix[2][2] == x) == x && matrix[1][0] == x && matrix[2][0] == x) == x && matrix[1][1] == x && matrix[2][1] == x) == x && matrix[1][2] == x && matrix[2][2] == x) == x && matrix[1][1] == x && matrix[2][2] == x) == x && matrix[1][1] == x && matrix[2][0] == x)
void drawarena() { setcolor(15); for (int i=0;i<3;i++) for (int j=0;j<3;j++) rectangle(250+j*50,50+i*50,250+(j+1)*50,50+(i+1)*50); } void drawcircle(int i,int j) { setcolor(15); circle(250+j*50+25,50+i*50+25,20); matrix[i][j] = 9; } void drawcross(int i,int j) { setcolor(15); line(250+j*50+2,50+i*50+2,250+(j+1)*50-2,50+(i+1)*50-2); line(250+j*50+2,50+(i+1)*50-2,250+(j+1)*50-2,50+i*50+2); matrix[i][j] = 1;
Indoprog
72
C/C++ Programming
} void drawselector(int i,int j) { setcolor(4); rectangle(250+j*50+2,50+i*50+2,250+(j+1)*50-2,50+(i+1)*50-2); }
Hendra, S.T.
void clearselector(int i,int j) { setcolor(0); rectangle(250+j*50+2,50+i*50+2,250+(j+1)*50-2,50+(i+1)*50-2); } void think() { // algoritma berpikir ini telah dioptimasi sehingga komputer tidak pernah kalah (kecerdasan yang terprogram) int r[3]; int c[3]; int d[2]; int i,j,ok; r[0] = matrix[0][0]+matrix[0][1]+matrix[0][2]; r[1] = matrix[1][0]+matrix[1][1]+matrix[1][2]; r[2] = matrix[2][0]+matrix[2][1]+matrix[2][2]; c[0] = matrix[0][0]+matrix[1][0]+matrix[2][0]; c[1] = matrix[0][1]+matrix[1][1]+matrix[2][1]; c[2] = matrix[0][2]+matrix[1][2]+matrix[2][2]; d[0] = matrix[0][0]+matrix[1][1]+matrix[2][2]; d[1] = matrix[2][0]+matrix[1][1]+matrix[0][2]; ok = 0; //bertahan atau menyerang pada masing-masing kolom dan baris for (i=0;i<3;i++) for (j=0;j<3;j++) if (matrix[i][j]==0 && (r[i]==2 || c[j]==2 || r[i]==18 || c[j]==18)) { drawcircle(i,j); ok = 1; } //bertahan atau menyerang pada masing-masing diagonal if (!ok) { if (matrix[0][0]==0 && (d[0]==2 || d[0]==18)) {drawcircle(0,0); ok=1;} else if (matrix[2][0]==0 && (d[1]==2 || d[1]==18)) {drawcircle(2,0); ok=1;} else if (matrix[0][2]==0 && (d[1]==2 || d[1]==18)) {drawcircle(0,2); ok=1;} else if (matrix[2][2]==0 && (d[0]==2 || d[0]==18)) {drawcircle(2,2); ok=1;} }
Indoprog
73
C/C++ Programming
Hendra, S.T.
//menyerang pada posisi kosong, dengan prioritas titik tengah if (!ok) { if (matrix[1][1]==0) drawcircle(1,1); else if (matrix[0][0]==0 && (r[0]==1 || c[0]==1 || d[0]==1 || d[0]==9)) {drawcircle(0,0); ok=1;} else if (matrix[2][0]==0 && (r[2]==1 || c[0]==1 || d[1]==1 || d[1]==9)) {drawcircle(2,0); ok=1;} else if (matrix[0][2]==0 && (r[0]==1 || c[2]==1 || d[1]==1 || d[1]==9)) {drawcircle(0,2); ok=1;} else if (matrix[2][2]==0 && (r[2]==1 || c[2]==1 || d[0]==1 || d[0]==9)) {drawcircle(2,2); ok=1;} else if (matrix[1][0]==0 && (r[1]==1 || c[0]==1)) {drawcircle(1,0); ok=1;} else if (matrix[0][1]==0 && (r[0]==1 || c[1]==1)) {drawcircle(0,1); ok=1;} else if (matrix[2][1]==0 && (r[2]==1 || c[1]==1)) {drawcircle(2,1); ok=1;} else if (matrix[1][2]==0 && (r[1]==1 || c[2]==1)) {drawcircle(1,2); ok=1;} } }
Pertanyaan
1. Jika suatu array memiliki 100 element, sebutkan range subscript yang diperbolehkan! 2. Apa perbedaan dari ekspresi a4 dan a[4]? 3. Tuliskan sebuah deklarasi untuk suatu array float 100 elemen. Termasuk memberikan nilai awal untuk 4 elemen pertama yaitu 1.0, 2.0, 3.0 dan 4.0. 4. Suatu array dengan nama day dideklarasikan sebagai berikut:
int day[] = {mon, tue, wed, thu, fri};
Berapa banyak element dari array day ? Bagaimana kalau deklarasi diganti menjadi
int day[7] = {mon, tue, wed, thu, fri};
5. Apa yang akan menjadi output dari potongan program C++ berikut ini?
int A[5] = {1 , 2, 3, 4}; int i; for (i=0; i<5; i++) { A[i] = 2*A[i]; cout << A[i] << " "; }
Indoprog
74
C/C++ Programming
Hendra, S.T.
Latihan
1. Salah satu metoda penyajian data adalah dengan Histogram. Suatu histogram menghitung jumlah data yang jatuh pada interval tertentu, dan menampilkannya dalam bentuk barchart. Buatlah suatu program yang menghasilkan n bilangan bulat random yang berada dalam jangkauan 0-99 dan menghasilkan suatu Histogram dari data tersebut. Asumsikan bahwa kita kita akan membagi data tersebut menjadi interval 0-9, 1019, 20-29, ........., 90-99. Kemudian cetak Histrogram yang bersesuaian
0 - 9 10 - 19 20 - 29 dll. 16 13 17 XXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXX
2. Kembangkan function pencarian dengan pendekatan binary search dengan memanfaatkan teknik pemrograman rekursif pada function.
Indoprog
75
C/C++ Programming
Hendra, S.T.
Section 9
Strings of Characters.
Dalam semua program yang telah kita buat, kita hanya menggunakan variable numeric, dan menggunakan ekspresi numeric. Selain numeric sebenarnya masih ada karakter string Pada C untuk menyimpan karakter string kita dapat menggunakan type char, yang mana merupakan urutan dari elemen char Sebagai contoh, array berikut (atau karakter string):
char jenny [20];
Ukuran maksimum dari 20 karakter tidak selamanya akan digunakan secara keseluruhan. Dapat saja hanya berisi tulisan "Hello" ataupun "Merry christmas", sehingga perlu diakhiri dengan suatu karakter null, yang ditulis sebagai 0 atau '\0'. Sehingga dapat digambarkan sebagai berikut :
Initialization of strings
Karena sebenarnya karakter string adalah array, sehingga cara mengisinya sama dengan array biasanya, contoh :
char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
Dalam hal ini, kita akan mendeklarasikan suatu karakter string (array) yang terdiri dari 6 elemen type char dengan nilai Hello diikuti dengan suatu karakter null '\0'. Berikut ini adalah cara lain untuk deklarasi karakter string dengan nama mystring dengan hasil yang sama :
Indoprog
76
C/C++ Programming
char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' }; char mystring [] = "Hello";
Hendra, S.T.
Tetapi tentu saja cara demikian adalah sangat tidak praktis. Umumnya untuk memberikan nilai pada suatu array, khususnya untuk karakter string kita dapat menggunakan fungsi seperti strcpy. strcpy (string copy) dimana didefinisikan dalam library cstring (string.h) yang dapat digunakan dengan penulisan berikut:
strcpy (string1, string2);
Hal ini akan menduplikasi isi dari string2 kedalam string1. string2 dapat berupa suatu array, suatu pointer, atau suatu constant string, contoh :
strcpy (mystring, "Hello");
Contoh :
// setting value to string #include <iostream.h> #include <string.h> int main () { char szMyName [20]; strcpy (szMyName,"J. Soulie"); cout << szMyName; return 0; }
J. Soulie
Perhatikan bahwa kita perlu melakukan include <string.h> pada bagian header agar dapat digunakan function strcpy. Walaupun kita juga dapat menulis suatu fungsi sederhana seperti setstring berikut dengan operasi yang menyerupai strcpy:
// setting value to string #include <iostream.h>
J. Soulie
Indoprog
77
C/C++ Programming
Hendra, S.T.
void setstring (char szOut [], char szIn []) { int n=0; do { szOut[n] = szIn[n]; } while (szIn[n++] != '\0'); } int main () { char szMyName [20]; setstring (szMyName,"J. Soulie"); cout << szMyName; return 0; }
Metode lain yang sering dipergunakan untuk memasukan nilai ke suatu array adalah dengan langsung memasukannya melalui input stream (cin). Dalam hal ini nilai string diberikan oleh user pada saat eksekusi program. Ketika cin digunakan dengan string atau karakter biasanya menggunakan metode getline, yang dapat dipanggil dengan prototype berikut:
cin.getline ( char buffer[], int length, char delimiter = ' \n');
dimana buffer adalah alamat untuk menyimpan input (dalam hal ini adalah array), length adalah panjang maksimum dari buffer (ukuran dari array) dan delimiter adalah karakter yang digunakan untuk mengakhiri user input, dimana defaultnya adalah newline character ('\n'). Berikut ini adalah contoh sederhana pemakaian cin.getline pada string:
// cin with strings #include <iostream.h> int main () { char mybuffer [100]; cout << "What's your name? "; cin.getline (mybuffer,100); cout << "Hello " << mybuffer << ".\n"; cout << "Which is your favourite team? "; cin.getline (mybuffer,100); cout << "I like " << mybuffer << " too.\n"; return 0; }
What's your name? Juan Hello Juan. Which is your favourite team? Inter Milan I like Inter Milan too.
Indoprog
78
C/C++ Programming
Hendra, S.T.
Sebenarnya kita dapat saja menggunakan perintah berikut untuk membaca string ke suatu variable array:
cin >> mybuffer;
Hanya dapat menerima satu kata tunggal (bukan kalimat lengkap) karena metode ini menggunakan karakter kosong sebagai delimeternya, seperti spasi, tabulator,. Tidak dimungkinkan untuk membatasi ukuran buffer. Hal ini akan membuat program anda menjadi tidak stabil jikalau input oleh user melebihi ukuran array.
Untuk alas an ini, kami menyarankan anda untuk menggunakan cin.getline sebagai penganti dari cin >>.
atoi: melakukan konversi string ke type int. atol: melakukan konversi string ke type long. atof: melakukan konversi string ke type float.
Semua fungsi diatas membutuhkan satu parameter dan mengembalikan suatu nilai berdasarkan tyoe yang dikehendaki (int, long or float). contoh:
// cin and ato* functions #include <iostream.h> #include <stdlib.h> int main () { char mybuffer [100]; float price; int quantity; cout << "Enter price: "; cin.getline (mybuffer,100); price = atof (mybuffer); cout << "Enter quantity: "; cin.getline (mybuffer,100); quantity = atoi (mybuffer); cout << "Total price: " << price*quantity; return 0; }
79
C/C++ Programming
Hendra, S.T.
Library cstring (string.h) mendefinisikan banyak fungsi untuk melakukan operasi manipulasi terhadap string pada C (seperti yang diterangakan pada strcpy). Berikut ini adalah ringkasan fungsi yang sering digunakan: strcat: char* strcat (char* dest, const char* src); Menambahkan src string pada akhir dari dest string. Mengembalikan dest. strchr: char* strchr (const char* string, int c ); Mengembalikan pointer pada karakter pertama ditemukan dan null jika tidak ditemukan. strcspn: size_t strcspn ( const char * string1, const char * string2 ); Mencari dalam string1 character demi character, mengembalikan posisi pertama yang mengandung salah satu character pada string 2, fungsi akan mengembalikan nilai panjang dari string1 kalau tidak ada character string2 didalam string1, karena masing-masing diakhiri dengan null. Example.
/* strcspn example */ #include <stdio.h> #include <string.h> int main () { char str1[] = "fcba73"; char str2[] = "1234567890"; int i; i = strcspn (str1,str2); printf ("The first number in str1 is str1[%d]\n",i); return 0; }
Output:
The first number in str1 is str1[4]
strcmp: int strcmp (const char* string1, const char* string2); Membandingkan string string1 dan string2. Mengembalikan 0 jika keduanya serupa. strcpy: char* strcpy (char* dest, const char* src); Menduplikasi isi dari src ke dest. Mengembalikan dest. strlen: size_t strlen (const char* string); Mengembalikan panjang dari string. CATATAN: char* adalah sama dengan char[]
Latihan
1. Buatlah program untuk mengkonversi Desimal ke Biner, Octal dan Hexa dengan menggunakan C null terminated character string. Indoprog
80
C/C++ Programming
//Program konversi Descimal ke Hexa //Oleh : Hendra Soewarno //Dengan memanfaatkan C null terminated character string #include <iostream.h> #include <string.h> #include <conio.h> void dectohex(int dec, char hex[]); int main() { char hex[10]=""; clrscr(); dectohex(1000,hex); cout << hex; return 0; }
Hendra, S.T.
void dectohex(int dec, char *hex) { char digit[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D', 'E','F'}; while (dec > 0) { *hex = digit[dec%16]; dec = dec / 16; hex++; }
*hex = \0; }
2. Buatlah program untuk mengkonversi bilangan Binary, Octal dan Hexa ke Desimal.
Indoprog
81
C/C++ Programming
Hendra, S.T.
Section 10
Pointers
Kita telah melihat bagaimana variable-variable yang berada dalam sel di memory dapat kita akses dengan suatu identifier (nama variabel). Secara fisik variabel tersebut i disimpan pada tempat tertentu di memori. Suatu contoh dari memori komputer adalah suatu jalan didalam kota. Pada semua rumah diatas jalan tersebut dinomori secara unik, jika kita ingin ke alamat Jl. Jurung No. 6, maka kita dapat dengan mudah menemukannya. Demikian juga sistem operasi akan mengorganisasikan memori dengan nomor berurutan secara unik, jika kita berbicara tentang lokasi 1234 dalam memori, maka hanya ada satu lokasi dengan nomor tersebut.
akan mengisi variabel ted dengan alamat dari variabel andy. Misalnya variabel andy ditempatkan pada alamat memori 1776 dan penulisan berikut:
andy = 25; fred = andy; ted = &andy;
Indoprog
82
C/C++ Programming
Hendra, S.T.
Variabel yang menyimpan alamat dari variabel lain (seperti ted pada contoh sebelumnya) kita sebut sebagai pointer. Pointer pada C++ memiliki beberapa keunggulan dan sering digunakan.
(dimana dapat dibaca sebagai: "beth sama dengan value pointed by ted") beth akan berisi nilai 25, karena ted adalah 1776, dan nilai yang ditunjuk oleh 1776 adalah 25.
Operator of address or dereference (&) Digunakan untuk mengawali suatu variabel dan di baca sebagai "address of", sehingga: &variable1 dapat dibaca sebagai "address of variable1" Operator of reference (*) Menunjukan apa yang terdapat pada alamat yang ditunjuk oleh suatu variabel. Dibaca sebagai "value pointed by".
Indoprog
83
C/C++ Programming
type * pointer_name;
Hendra, S.T.
dimana type adalah type dari data yang ditunjuk, bukan type dari pointer itu sendirinya, contoh:
int * number; char * character; float * greatnumber;
Perlu ditekankan bahwa pemakaian asterisk (*) pada saat deklarasi pointer menunjukan bahwa itu adalah pointer Berikut ini adalah contoh pemakaian pointer :
// more pointers #include <iostream.h> int main () { int value1 = 5, value2 = 15; int *p1, *p2; p1 = &value1; // p1 = address of value1 p2 = &value2; // p2 = address of value2 *p1 = 10; // value pointed by p1 = 10 *p2 = *p1; // value pointed by p2 = value pointed by p1 p1 = p2; // p1 = p2 (value of pointer copied) *p1 = 20; // value pointed by p1 = 20 cout << "value1==" << value1 << "/ value2==" << value2; return 0; }
value1==10 / value2==20
Dalam hal ini p akan menunjuk pada akan menunjuk pada elemen pertama dari numbers sehingga pada contoh berikut dapat dilakukan hal berikut :
Indoprog
84
C/C++ Programming
// more pointers #include <iostream.h> int main () { int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0; }
Pointer initialization
Ketika mendeklarasikan pointer, kita dapat melakukan secara explicit dengan langsung menunjuk pada variabel yang kita inginkan,
int number; int *tommy = &number;
Sebagaimana array, compiler juga memungkinkan kasus special dimana kita ingin menginisialisasi isi dari ponter pada saat deklarasi variabel pointer:
char * terry = "hello";
dalam hal ini static storage dicadangkan untuk menyimpan "hello" dan suatu pointer pada char pertama dari memori blok (dalam hal ini adalah 'h') di assign ke terry. Perhatikan gambar berikut :
Indoprog
85
C/C++ Programming
terry[4] = '!'; *(terry+4) = '!';
Hendra, S.T.
dalam hal ini penulisan terry[4] adalah sama dengan menulis *(terry+4):
Arithmetic of pointers
Operasi aritmatika yang dilakukan terhadap suatu pointer akan berbeda berdasarkan type datanya, hal ini sangat tergantung pada ukuran byte dari masing-masing type data. Misalnya :
char *mychar; short *myshort; long *mylong;
dan bayangkan masing-masing menunjuk pada lokasi memori 1000, 2000 dan 3000 secara berurutan. operasi berikut :
mychar++; myshort++; mylong++; akan menyebabkan mychar menjadi nilai 1001, myshort mylong menjadi 3004.
Indoprog
86
C/C++ Programming
Hendra, S.T.
Pointers to pointers
C++ juga memungkinkan pemakaian pointer untuk menunjuk pada pointer, dalam hal ini berarti menunjuk pada data. Dalam hal ini kita perlu menambah tanda asterisk (*) pada setiap tingkat referensi:
char a; char * b; char ** c; a = 'z'; b = &a; c = &b;
Dalam hal ini bayangkan memori dari masing-masing variabel adalah 7230, 8092 dan 10502, dapat digambarkan berikut:
(didalam sel terdapat isi dari variabel) Sesuatu yang baru dari contoh ini adalah variabel c, dimana kita dapat membicarakannya dalam tiga cara yang berbeda, dimana masing-masing dari nilainya akan bersesuaian dengan nilai yang berbeda:
c adalah variabel type (char **) dengan nilai 8092 *c adalah varibel type (char*) dengan nilai 7230 **c adalah variabel type (char) dengan suatu nilai'z'
Pertanyaan
1. Operator apa yang digunakan untuk mendapatkan alamat dari suatu variabel? 2. Operator apa yang digunakan untuk mendapatkan nilai yang tersimpan pada alamat yang tersimpan dalam pointer? 3. Apa yang dimaksud dengan pointer? 4. Apa perbedaan antara alamat yang tersimpan pada suatu pointer dengan nilai pada alamat tersebut?
Indoprog
87
C/C++ Programming
Hendra, S.T.
5. Apa perbedaan antara indirection operator dan address of operator? 6. Apa perbedaan antara const int * ptrOne dan int * const ptrTwo?
Latihan
1. Buatlah sebuah function untuk menghitung jumlah kata dari string yang diberikan dengan fasilitas pointer. 2. Buatlah function untuk membuat setiap huruf pertama dari string yang diberikan menjadi huruf besar dengan fasilitas pointer. 3. Buatlah program yang menyimpan nilai yang dimasukan oleh pemakai, urut nilai tersebut secara descending, dan coba temukan nilai yang dimasukan oleh pemakai.
Indoprog
88
C/C++ Programming
Hendra, S.T.
Section 11
6, 10, 13
adalah suatu operator yang integrasi dalam bahasa C++ yang akan mengembalikan suatu nilai konstanta dengan ukuran byte dari parameternya, maka, sizeof(char) adalah 1, karena type char panjangnya 1 byte.
sizeof
Pointers to functions
C++ memungkinkan operasi pointer terhadap function. Pemakaian yang paling umum adalah untuk melewatkan suatu function sebagai parameter pada fungsi lain. Untuk mendeklarasikan suatu pointer ke suatu function kita harus mendeklarasikannya seperti
Indoprog
89
C/C++ Programming
Hendra, S.T.
prototype dari function, cuma nama function diapit dengan tanda parenthesis () dan sebuah pointer asterisk (*) disisipkan sebelum nama tersebut :
// pointer to functions #include <iostream.h> int addition (int a, int b) { return (a+b); } int subtraction (int a, int b) { return (a-b); } int (*minus)(int,int) = subtraction; int operation (int x, int y, int (*functocall)(int,int)) { int g; g = (*functocall)(x,y); return (g); } int main () { int m,n; m = operation (7, 5, addition); n = operation (20, m, minus); cout <<n; return 0; } 8
Pada contoh diatas, minus adalah sebuah variabel global pointer pada suatu function yang memiliki dua parameter type int, hal itu langsung menunjuk pada function subtraction, semuanya dalam satu baris tunggal:
int (* minus)(int,int) = subtraction;
Mencari key dalam array pada pointer base dengan metode linier search, dan akan mengembalikan alamat pertama elemen yang berhasil ditemukan.
Indoprog
90
C/C++ Programming
Hendra, S.T.
bsearch : void*
bsearch ( const void * key, const void * base, size_t num, size_t width, int (*fncompare)(const void *, const void * ) );
Mencari key dalam array pada pointer base dengan metode binary search, dan akan mengembalikan alamat pertama elemen yang berhasil ditemukan. Adapun paramater dari masing-masing function diatas adalah : key Pointer ke objek sebagai key yang akan dicari. base Pointer ke base dari array dimana pencarian akan dilakukan. num Jumlah elemen dalam array yang di tunjuk base. width Ukuran dalam byte masing-masing elemen dari array tersebut. fncompare Function untuk membandingkan dua elemen. Hal ini harus disediakan oleh programmer dengan deklarasi sebagai berikut : int fncompare (const void * elem1, const void * elem2 ); Function ini akan menerima dua parameter (elem1 dan elem2) yang menunjuk pada elemen, dan harus mengembalikan suatu nilai integer sebagai hasil perbandingan: return value description
<0 0 >0 *elem1 < *elem2 *elem1 == *elem2 *elem1 > elem2
Contoh :
/* qsort, lsearch, and bsearch example */ #include <stdio.h> #include <stdlib.h> int values[] = { 40, 10, 100, 90, 20, 25 }; int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int main () { int * pItem;
Indoprog
91
C/C++ Programming
int n; qsort (values, 6, sizeof(int), compare); for (n=0; n<6; n++) { printf ("%d ",values[n]); }
Hendra, S.T.
pItem = (int*) lsearch (&key, values, 6, sizeof (int), compare); if (pItem!=NULL) printf ("%d using linear search is in the array",*pItem); else printf ("%d is not in the array",key);
int key = 40; pItem = (int*) bsearch (&key, values, 6, sizeof (int), compare); if (pItem!=NULL) printf ("%d using binary search is in the array",*pItem); else printf ("%d is not in the array",key); return 0; }
Output:
10 20 25 40 90 100 40 using linear search is in the array 40 using binary search is in the array
Indoprog
92
C/C++ Programming
Hendra, S.T.
Section 12
Dynamic memory.
Kadang-kadang kita membutuhkan variabel dengan ukuran yang baru dapat ditentukan pada saat runtime, misalnya kita menanyakan jumlah data pada user, mengalokasikan memori untuk menyimpan data. Dalam hal ini kita membutuhkan dynamic memory, dimana pada C++ dapat digunakan operator new dan delete. Operator new dan delete adalah khusus untuk C++.
Operators new and new[ ] Dalam usaha untuk memesan dynamic memory, digunakan operator new. new diikuti dengan suatu data type dan secara optional jumlah elemen yang diperlukan dalam brackets []. Akan mengembalikan suatu pointer pada awal dari blok memori yang berhasil dialokasi. Bentuknya adalah:
pointer = new type // deklarasi 1 elemen
atau
pointer = new type [elements] // deklarasi array
Contoh:
int * bobby; bobby = new int [5];
dalam hal ini, akan dialokasi 5 elemen dengan type int pada suatu heap dan mengembalikan sebuah pointer yang menunjuk pada alamat awal ke variabel bobby.
Sesuatu hal yang perlu diperhatikan bahwa dynamic memori tidak selamanya akan berhasil dialokasi karena kehabisan memori. Jika hal ini terjadi maka permintaan operator new, akan mengembalikan suatu null pointer. Untuk alasan tersebut, maka disarankan untuk selalu memeriksa apakah pointer yang dikembalikan adalah NULL setelah pemanggilan new.
Indoprog
93
C/C++ Programming
int * bobby; bobby = new int [5]; if (bobby == NULL) { // error assigning memory. Take measures. };
Hendra, S.T.
Operator delete. Jika dynamic memory yang dialokasi tidak dibutuhkan lagi, maka dapat dihapus dari memori dengan menggunakan operator delete:
delete pointer;
or
delete [] pointer;
Contoh Program :
//Program mencari rata-rata //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas alokasi dinamis new dan delete #include <iostream.h> #include <stdlib.h> int *pdat; int jd; void void void void void tanyajd(); alokasimemory(); bacadata(); hitungrata(); dealokasimemory();
int main() { tanyajd(); alokasimemory(); bacadata(); hitungrata(); dealokasimemory(); return 0; } void tanyajd() { cout << "jumlah data :"; cin >> jd; } void alokasimemory() { pdat = new int[jd]; if (pdat == NULL)
Indoprog
94
C/C++ Programming
{ cout << "gagal alokasi memory"<<endl; exit(0); } } void bacadata() { for (int i=0;i<jd;i++) { cout << "data ke -" << i+1 << " : "; cin >> pdat[i]; } } void hitungrata() { float rata; rata = 0; for (int i=0;i<jd;i++) rata = rata + (float) pdat[i]/jd; cout << "nilai rata-rata :"<<rata<<endl; } void dealokasimemory() { delete pdat; }
Hendra, S.T.
dimana nbytes adalah jumlah byte yang akan diberikan ke pointer. Function ini akan mengembalikan sebuah pointer dengan type void*, oleh karena itu kita perlu melakukan type cast terhadap nilai pointer yang ingin dihasilkan, contoh:
char * ronny; ronny = (char *) malloc (10);
Hal ini akan memberikan pada pointer ronny suatu blok 10 byte yang dapat digunakan.
Indoprog
95
C/C++ Programming
Hendra, S.T.
Jika kita ingin memberikan suatu blok data dengan type data yang bukan char (berukuran lebih dari 1 byte) kita harus mengalikan jumlah elemen yang diinginkan dengan ukuran elemen dari tiap-tiap elemen, dalam hal ini kita dapat menggunakan operator sizeof :
int * bobby; bobby = (int *) malloc (5 * sizeof(int));
Kode ini akan memberikan pada bobby sebuah pointer yang terdiri dari 5 data integer. The function calloc. calloc hampir menyerupai operasi malloc, perbedaan utamanya adalah pada prototype:
void * calloc (size_t nelements, size_t size);
menggunakan dua parameter, yang pertama (nelements) adalah jumlah elemen dan kedua (size) adalah ukuran masing-masing elemen. Alokasi untuk bobby dapat ditulis menjadi:
int * bobby; bobby = (int *) calloc (5, sizeof(int));
Perbedaan lain antara malloc dan calloc adalah calloc menginisialisasi semua elemennya menjadi 0. The function realloc. Mengubah ukuran dari suatu blok memori yang telah diberikan pada suatu pointer.
void * realloc (void * pointer, size_t size);
parameter menerima sebuah pointer yang telah diberikan suatu blok memori atau null pointer, dan size menentukan ukuran baru dari memori blok yang diinginkan. Dalam hal ini isi pointer lama tidak akan berubah. Jika proses alokasi tambahan gagal akan mengembalikan suatu null pointer, sedangkan isi pointer sebelumnya tidak berubah.
pointer
The function free. Membebaskan blok dynamic memory yang sebelumnya telah diberikan dengan malloc, calloc atau realloc.
void free (void * pointer);
Fungsi ini hanya dapat digunakan untuk membebaskan memori yang diberikan dengan fungsi malloc, calloc dan realloc. Contoh program :
//Program mencari rata-rata //Oleh : Hendra Soewarno
Indoprog
96
C/C++ Programming
Hendra, S.T.
//Dengan memanfaatkan fasilitas alokasi dinamis malloc dan free #include <iostream.h> #include <stdlib.h> int *pdat; int jd; void void void void void tanyajd(); alokasimemory(); bacadata(); hitungrata(); dealokasimemory();
int main() { tanyajd(); alokasimemory(); bacadata(); hitungrata(); dealokasimemory(); return 0; } void tanyajd() { cout << "jumlah data :"; cin >> jd; } void alokasimemory() { pdat = (int*) malloc(jd * sizeof(int)); //pdat = (int*) calloc(jd, sizeof(int)); if (pdat == NULL) { cout << "gagal alokasi memory"<<endl; exit(0); } } void bacadata() { for (int i=0;i<jd;i++) { cout << "data ke -" << i+1 << " : "; cin >> pdat[i]; } } void hitungrata() { float rata; rata = 0; for (int i=0;i<jd;i++) rata = rata + (float) pdat[i]/jd; cout << "nilai rata-rata :"<<rata<<endl; }
Indoprog
97
C/C++ Programming
Hendra, S.T.
void dealokasimemory() { free(pdat); } //Program mencari rata-rata //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas alokasi dinamis realloc dan free #include <iostream.h> #include <stdlib.h> int *pdat; int jd; void bacadata(); void hitungrata(); void dealokasimemory(); int main() { bacadata(); hitungrata(); dealokasimemory(); return 0; } void bacadata() { int dat; jd = 0; do { cout << "data ke -" << jd+1 << " : "; cin >> dat; if (!dat==0) { if (realloc(pdat,dat*sizeof(int)) == NULL) { cout << "gagal alokasi memory !"<<endl; exit(0); } else { pdat[jd] = dat; jd++; } } } while (!dat==0); } void hitungrata() { float rata; rata = 0; for (int i=0;i<jd;i++) rata = rata + (float) pdat[i]/jd; cout << "nilai rata-rata :"<<rata<<endl; }
Indoprog
98
C/C++ Programming
void dealokasimemory() { free(pdat); }
Hendra, S.T.
Pertanyaan
1. 2. 3. 4. Bagaimana mengalokasikan memory dinamis ? Bagaimana kita mengetahui suatu alokasi memori berhasil atau tidak ? Terangkan perbedaan cara untuk alokasi memori dinamis pada C dan C++! Bagaimana kita mengetahui ukuran dari suatu data type ?
Latihan
1. Buatlah suatu program untuk menyimpan data yang dimasukan oleh pemakai, urut data tersebut dalam urutan descending, kemudian coba cari data yang dimasukan oleh pemakai. Petunjuk : Tanyakan jumlah data terlebih dahulu dengan memanfaatkan alokasi memori dinamis.
Indoprog
99
C/C++ Programming
Hendra, S.T.
Section 13
Structures
Suatu structure adalah suatu himpunan dari berberapa type data yang berbeda dikelompokan menjadi satu deklarasi yang unik. Bentuknya adalah sebagai berikut:
struct model_name { type1 element1; type2 element2; type3 element3; . . } object_name;
dimana model_name adalah nama untuk model structure type dan object_name bersifat optional sebagai variabel dengan structure object tersebut. Diantara curly brackets { } adalah type dan sub-identifiers yang bersesuaian dengan elemen-elemen yang membentuk structure tersebut. Contoh :
struct products { char name [30]; float price; } ; products apple; products orange, melon;
Dimana apple, orange, dan melon adalah variabel yang memiliki structure products. atau dapat juga ditulis :
struct products { char name [30]; float price; } apple, orange, melon;
Dalam hal ini masing-masing variabel (apple, orange and melon) memiliki member name dan price., dimana penulisannya adalah nama variabel dan nama member dipisahkan dengan suatu point (.) :
apple.name apple.price orange.name orange.price melon.name melon.price
Indoprog
100
C/C++ Programming
Hendra, S.T.
Contoh program :
//Program data terstruktur //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas struct. #include #include #include #include <iostream.h> <iomanip.h> <string.h> <conio.h>
struct siswa { char nim[10]; char nama[20]; float teori,praktek; } dsiswa[100]; int jd; void tanyajd(); void bacadata(); void cetakdata(); int main() { clrscr(); tanyajd(); bacadata(); cetakdata(); return 0; } void tanyajd() { cout << "jumlah data :"; cin >> jd; } void bacadata() { int i; char nim[10]; cin.ignore(); for (i=0;i<jd;i++) { cout << "Record ke -" << i+1 << endl; cout << "Nim : "; cin.getline(nim,10); if (nim[0] != 0) { strcpy(dsiswa[i].nim,nim); cout << "Nama : "; cin >> dsiswa[i].nama; cout << "Teori : "; cin >> dsiswa[i].teori; cout << "Praktek: "; cin >> dsiswa[i].praktek; cin.ignore(); } } // global variabel
Indoprog
101
C/C++ Programming
}
Hendra, S.T.
void cetakdata() { int i; cout << "--------------------------------"<< endl; cout << " Nim Nama Teori Praktek "<< endl; cout << "--------------------------------"<< endl; for (i=0;i<jd;i++) { cout << setw(5) << dsiswa[i].nim; cout << setw(20) << dsiswa[i].nama; cout << setw(5) << setprecision(2) << dsiswa[i].teori; cout << setw(5) << setprecision(2) << dsiswa[i].praktek<<endl; }
Pointers to structures
Menyerupai type lain, structure dapat ditunjuk dengan menggunakan pointer. Aturannya adalah sama dengan type data lainnya, yaitu Pointer tersebut perlu dideklarasikan sebagai pointer pada structure tersebut:
struct siswa { char nim[10]; char nama[20]; float teori,praktek; } dsiswa[100]; siswa *psiswa;
Dalam hal ini amovie adalah suatu obejk dari structure movies_t dan pmovie adalah sebuah pointer ke objek type movies_t. Maka penulisan berikut adalah sah:
psiswa = &siswa[0];
Indoprog
102
C/C++ Programming
Hendra, S.T.
void tanyajd(); void bacadata(); void cetakdata(); int main() { clrscr(); tanyajd(); bacadata(); cetakdata(); return 0; } void tanyajd() { cout << "jumlah data :"; cin >> jd; } void bacadata() { int i; char nim[10]; cin.ignore(); for (i=0;i<jd;i++) { psiswa = &dsiswa[i]; cout << "Record ke -" << i+1 << endl; cout << "Nim : "; cin.getline(nim,10); if (nim[0] != 0) { strcpy(psiswa->nim,nim); cout << "Nama : "; cin >> psiswa->nama; cout << "Teori : "; cin >> psiswa->teori; cout << "Praktek: "; cin >> psiswa->praktek; cin.ignore(); } } } void cetakdata() { int i; cout << "--------------------------------"<< endl; cout << " Nim Nama Teori Praktek "<< endl; cout << "--------------------------------"<< endl; for (i=0;i<jd;i++) { psiswa = &dsiswa[i]; cout << setw(5) << psiswa->nim; cout << setw(20) << psiswa->nama; cout << setw(5) << setprecision(2) << psiswa->teori; cout << setw(5) << setprecision(2) << psiswa->praktek<<endl;
Indoprog
103
C/C++ Programming
} }
Hendra, S.T.
Pada contoh diatas kita menemukan operator ->. Operator ini digunakan khusus oleh pointer untuk menunjuk ke member dari suatu structure, contoh :
psiswa->nim
baik psiswa->nim dan (*psiswa).nim adalah sah yang berarti kita ingin mengevaluasi field nim dari structure yang ditunjuk oleh psiswa.
Nesting structures
Structures dapat juga di nested yang berarti bahwa suatu structure dapat memiliki elemen yang berupa structure
struct ujian { float teori,praktek; }; struct siswa { char nim[10]; char nama[20]; ujian nilai; } dsiswa[100]; siswa *psiswa;
Contoh Program
//Program data terstruktur //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas nested struct dan pointer. #include #include #include #include <iostream.h> <iomanip.h> <string.h> <conio.h>
Indoprog
104
C/C++ Programming
Hendra, S.T.
struct ujian { float teori,praktek; }; struct siswa { char nim[10]; char nama[20]; ujian nilai; } dsiswa[100]; int jd; siswa *psiswa; void tanyajd(); void bacadata(); void cetakdata(); int main() { clrscr(); tanyajd(); bacadata(); cetakdata(); return 0; } // program utama
void tanyajd() { cout << "jumlah data :"; cin >> jd; } void bacadata() { int i; char nim[10]; cin.ignore(); for (i=0;i<jd;i++) { psiswa = &dsiswa[i]; cout << "Record ke -" << i+1 << endl; cout << "Nim : "; cin.getline(nim,10); if (nim[0] != 0) { strcpy(psiswa->nim,nim); cout << "Nama : "; cin >> psiswa->nama; cout << "Teori : "; cin >> psiswa->nilai.teori; cout << "Praktek: "; cin >> psiswa->nilai.praktek; cin.ignore(); } } } void cetakdata() {
Indoprog
105
C/C++ Programming
Hendra, S.T.
int i; cout << "--------------------------------"<< endl; cout << " Nim Nama Teori Praktek "<< endl; cout << "--------------------------------"<< endl; for (i=0;i<jd;i++) { psiswa = &siswa[i]; cout << setw(5) << psiswa->nim; cout << setw(20) << psiswa->nama; cout << setw(5) << setprecision(2) <<psiswa->nilai.teori; cout << setw(5) << setprecision(2) <<psiswa->nilai.praktek<<endl; } } //Program data terstruktur //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas nested struct dan dynamic memory allocation. #include #include #include #include <iostream.h> <iomanip.h> <string.h> <conio.h>
struct ujian { float teori,praktek; }; struct siswa { char nim[10]; char nama[20]; ujian nilai; } *dsiswa; int jd; siswa *psiswa; void void void void void tanyajd(); alokasimemory(); bacadata(); cetakdata(); dealokasimemory(); // program utama
Indoprog
106
C/C++ Programming
void tanyajd() { cout << "jumlah data :"; cin >> jd; } void alokasimemory() { dsiswa = new siswa[jd]; } void bacadata() { int i; char nim[10]; cin.ignore(); for (i=0;i<jd;i++) { psiswa = &dsiswa[i]; cout << "Record ke -" << i+1 << endl; cout << "Nim : "; cin.getline(nim,10); if (nim[0] != 0) { strcpy(psiswa->nim,nim); cout << "Nama : "; cin >> psiswa->nama; cout << "Teori : "; cin >> psiswa->nilai.teori; cout << "Praktek: "; cin >> psiswa->nilai.praktek; cin.ignore(); } } }
Hendra, S.T.
void cetakdata() { int i; cout << "--------------------------------"<< endl; cout << " Nim Nama Teori Praktek "<< endl; cout << "--------------------------------"<< endl; for (i=0;i<jd;i++) { psiswa = &dsiswa[i]; cout << setw(5) << psiswa->nim; cout << setw(20) << psiswa->nama; cout << setw(5) << setprecision(2) << psiswa->nilai.teori; cout << setw(5) << setprecision(2) << psiswa>nilai.praktek<<endl; } } void dealokasimemory() { delete dsiswa; }
Pertanyaan
Indoprog
107
C/C++ Programming
Hendra, S.T.
1. Apa yang dimaksud dengan suatu struct ? 2. Bagaimana mendeklarasikannya ? 3. Tulis suatu deklarasi struct untuk menyimpan alamat teman anda.
Latihan
1. Tuliskan suatu program untuk menyimpan alamat dari teman anda, sediakan fasilitas tambah, perbaiki, hapus, tampil, dan cari (berdasarkan nama). Petunjuk : gunakan pendekatan pemrograman terstruktur.
Indoprog
108
C/C++ Programming
Hendra, S.T.
Section 14
Open a file
Operasi pertama yang dilakukan pada object ini adalah mengasosiasikannya dengan suatu file, yang mana disebutkan sebagai membuka file. File yang terbuka dinyatakan dalam program sebagai suatu objek stream (suatu instant dari salah satu class diatas) dan setiap input atau output pada object stream tersebut akan dilakukan terhadap file fisiknya Untuk membuka suatu file dengan suatu object strean, kita dapat menggunakan fungsi open():
void open (const char * filename, openmode mode);
dimana filename adalah suatu karakter string dari nama file yang akan dibuka dan mode adalah kombinasi dari flag berikut :
ios::in ios::out
Indoprog
109
C/C++ Programming
ios::ate ios::app ios::trunc ios::binary
Hendra, S.T.
Initial position: end of file Every output is appended at the end of file If the file already existed it is erased Binary mode
Flag-flag ini dapat dikombinasikan dengan menggunakan operator bitwise OR: |. Sebagai contoh, jika kita ingin membuka file "example.bin" dalam mode binary untuk menambah data, kita dapat melakukannya dengan memanggil fungsi open:
ofstream file; file.open ("example.bin", ios::out | ios::app | ios::binary);
Berikut adalah default mode yang akan digunakan pada masing-masing class ofstream, ifstream dan fstream : class default mode to parameter
Default value hanya diaplikasikan jika fungsi dibuka tanpa menyebutkan suatu parameter mode. Kita dapat juga menggunakan konstruktor dari masing-masing class dengan penulisan berikut :
ofstream file ("example.bin", ios::out | ios::app | ios::binary);
Kita dapat memeriksa apakah file telah terbuka dengan benar dengan menggunakan fungsi is_open():
bool is_open();
yang mana akan mengembalikan suatu nilai bool dengan nilai true jika object berasosiasi dengan suatu file yang terbuka dan sebaliknya false.
Closing a file
Ketika kita telah selesai membaca, dan menulis maka file tersebut harus ditutup dengan memanggil fungsi close(), hal ini akan mencurahkan seluruh isi buffer yang tertahan ke file yang ditutup. Bentuknya cukup sederhana:
Indoprog
110
C/C++ Programming
void close ();
Hendra, S.T.
Begitu anggota dari fungsi ini dipanggil, objek stream dapat digunakan untuk membuka file lain, dan file tersebut juga dapat dibuka oleh proses lain. Dalam hal ini, jika objek dihapus dengan masih adanya asosiasi file yang terbuka, maka destructor akan secara otomatis memanggil fungsi close.
Data input dari file dapat juga dilakukan dengan cara yang sama seperti yang kita lakukan pada cin:
// reading a text file #include <iostream.h> #include <fstream.h> #include <stdlib.h> int main () { char buffer[256]; ifstream examplefile ("example.txt"); if (! examplefile.is_open()) { cout << "Error opening file"; exit (1); } while (! examplefile.eof() ) { examplefile.getline (buffer,100);
Indoprog
111
C/C++ Programming
cout << buffer << endl; } return 0; }
Hendra, S.T.
Binary files
Pada binary file proses input/ouput data tidak dapat menggunakan operator seperti << dan >> serta fungsi seperti getline. Untuk binary file class fstream memiliki prototype write dan read berikut :
write ( char * buffer, streamsize size ); read ( char * buffer, streamsize size );
Contoh :
file.write((char*)&x, sizeof(x)); file.read((char*)&x, sizeof(x));
Dimana buffer adalah alamat dari memory block yang menyimpan data hasil pembacaan atau yang akan ditulis.
// reading binary file #include <iostream.h> #include <fstream.h> const char * filename = "example.txt"; int main () { char * buffer; long size; ifstream file (filename, ios::in|ios::binary|ios::ate); size = file.tellg(); file.seekg (0, ios::beg); buffer = new char [size]; file.read (buffer, size); file.close(); cout << "the complete file is in a buffer"; delete[] buffer; return 0; }
112
C/C++ Programming
Hendra, S.T.
bad()
Mengembalikan true kalau ada kegagalan dalam operasi membaca atau menulis
fail()
Mengembalikan true dalam kasus yang sama pada bad() khususnya dalam kasus dimana terjadi format error, seperti mencoba membaca suatu nilai integer dan yang diterima adalah character.
eof()
Mengembalikan true jika sebuah file yang terbuka untuk dibaca telah mencapai end of file.
good()
Seperti namanya, mengembalikan false atau true berdasarkan hasil operasi terakhir. Untuk melakukan reset terhadap state flags dapat digunakan function clear().
demikian juga istream, memiliki get pointer yang menunjuk pada lokasi elemen berikutnya yang akan dibaca. ofstream, demikian juga ostream, memiliki put pointer yang menunjuk pada lokasi penulisan elemen berikutnya. Akhirnya fstream, demikian juga iostream, memiliki get and put
ifstream,
Pointer-pointer Stream ini dapat dimanipulasi dengan beberapa member function berikut : dan tellp() Mengembalikan nilai integer yang menunjukan posisi dari get stream pointer dan put stream pointer. seekg() dan seekp() Member function ini untuk mengatur posisi get stream pointer dan put stream pointer dengan prototypes:
tellg() seekg ( pos_type position ); seekp ( pos_type position );
Indoprog
113
C/C++ Programming
ios::beg ios::cur ios::end
Hendra, S.T.
offset specified from the beginning of the stream offset specified from the current position of the stream pointer offset specified from the end of the stream
Contoh berikut menggunakan member fungsi diatas untuk mendapatkan ukuran dari suatu binary file:
// obtaining file size #include <iostream.h> #include <fstream.h> const char * filename = "example.txt"; int main () { long l,m; ifstream file (filename, ios::in|ios::binary); l = file.tellg(); file.seekg (0, ios::end); m = file.tellg(); file.close(); cout << "size of " << filename; cout << " is " << (m-l) << " bytes.\n"; return 0; }
Ketika file di tutup: sebelum suatu file ditutup semua buffer akan di sinkron Ketika buffer telah penuh: Buffer memiliki ukuran tertentu, ketika telah penuh secara otomatis akan di sinkron. Ditegaskan dengan perintah: Ketika perintah perintah seperti flush dan endl yang menyebabkan proses sinkron. Ditegaskan dengan function sync(): Pemanggilan function sync() (tanpa parameter) menyebabkan sinkron dilakukan.
Indoprog
114
C/C++ Programming
Hendra, S.T.
#include "iostream.h" #include "fstream.h" struct { char nama[20]; int age; }teman; int main() { ifstream fin; fin.open("teman.rec",ios::in || ios::binary); fin.seekg(0); fin.read((char*)&teman, sizeof(teman)); cout << teman.nama << endl; cout << teman.age << endl; fin.seekg(sizeof(teman)); fin.read((char*)&teman, sizeof(teman)); cout << teman.nama << endl; cout << teman.age << endl; fin.close(); return 0; }
115
C/C++ Programming
Hendra, S.T.
//Program random access file //Oleh : Hendra Soewarno //Dengan memanfaatkan fasilitas fstream. #include #include #include #include <iostream.h> <iomanip.h> <fstream.h> <string.h>
struct siswa { char nim[10]; char nama[20]; float teori,praktek; } dsiswa; fstream fsource; void void void void bukafile(char namafile[]); bacadata(); cetakdata(); tutupfile();
int main() { bukafile("c:\siswa.dat"); bacadata(); cetakdata(); tutupfile(); return 0; } void bukafile(char namafile[]) { fsource.open(namafile,ios::in | ios::out | ios::binary); } void bacadata() { float recno; char nim[10]; fsource.seekg(0,ios::end); do { recno = fsource.tellg()/sizeof(dsiswa); cout << "Record ke -" << recno+1 << endl; cout << "Nim : "; cin.getline(nim,10); if (nim[0] != 0) { strcpy(dsiswa.nim,nim); cout << "Nama : "; cin >> dsiswa.nama; cout << "Teori : "; cin >> dsiswa.teori; cout << "Praktek: "; cin >> dsiswa.praktek; cin.ignore(); fsource.write((char*) &dsiswa,sizeof(dsiswa)); }
Indoprog
116
C/C++ Programming
} while (nim[0] != 0); }
Hendra, S.T.
void cetakdata() { fsource.seekg(0,ios::beg); cout << "--------------------------------"<< endl; cout << " Nim Nama Teori Praktek "<< endl; cout << "--------------------------------"<< endl; while (!fsource.eof()) { fsource.read((char *) &dsiswa,sizeof(dsiswa)); if (fsource.gcount() == 0) break; cout << setw(10) << dsiswa.nim; cout << setw(20) << dsiswa.nama; cout << setw(5) << setprecision(2) << dsiswa.teori; cout << setw(5) << setprecision(2) << dsiswa.praktek<<endl; } } void tutupfile() { fsource.close(); }
Pertanyaan
1. Apa tujuan pemakaian fungsi open pada suatu stream? 2. Tuliskan suatu deklarasi untuk suatu input stream dan hubungkan dengan suatu file yang disebut 'datain.txt'. Bagaimana anda membaca suatu nilai real dari stream ini ke suatu vairabel float? 3. Tuliskan suatu deklarasi untuk suatu output stream dan hubungkan dengan suatu file yang disebut sebagai result 'results'. Andaikan telah tersedia variabel float x dan y, bagaimana anda mencetak pesan nilai dari x dan y adalah kedalam file tersebut?
Latihan
1. Tuliskan sebuah program untuk menyimpan data teman anda ke dalam suatu binary file, sediakan fasilitas tambah, perbaiki, hapus, tampil, cari (dengan nama), dan fasilitas cetak ke printer. Petunjuk : gunakan suatu pendekatan pemrograman terstruktur.
Indoprog
117
C/C++ Programming
Hendra, S.T.
Section 15
Classes
Class merupakan fasilitas baru yang diperkenalkan sejak C++ untuk mendukung pemrograman berorientasi objek. Sebuah class adalah suatu metode secara logika untuk mengorganisasi data dan fungsi dalam struktur yang sama (encapsulation). Mereka dideklarasikan dengan menggunakan keyword class, yang mana akan berfungsi sama seperti keyword struct, pada C tetapi dengan kemungkinan untuk mengikutkan function sebagai member, daripada hanya data. Bentuknya adalah:
class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name;
dimana class_name adalah nama dari class (user defined type) dan field optional adalah object_name, atau beberapa, suatu identifier objek yang sah. Badan dari deklarasi dapat mengandung members, dimana dapat berupa deklarasi data atau function, dan secara optional permission labels, dimana dapat berupa salah satu keyword berikut: private:, public: atau protected:. Mereka membuat acuan pada permission yang mana dapat diperoleh pada members
member-member dari suatu class yang hanya dapat diakses oleh anggota dari class yang sama atau dari class-class "friend" mereka. protected member-member yang dapat diakses akses oleh anggota dari class yang sama atau dari class-class friend mereka, dan juga oleh anggota class-class dari class-class derived. Akhirnya, public member-member yang dapat diakses dari semua tempat dimana class tersebut nampak.
private
Jika kita mendeklarasikan member-member dari suatu class tanpa mengawalinya dengan suatu permission label, maka defaultnya member-member tersebut dianggap sebagai private. Pemakaian private maupun protected merupakan suatu konsep data hiding dimana untuk menghindari akses langsung terhadap member dari class yang dapat merusak integritas class. Sebagai contoh:
class CRectangle { int x, y;
Indoprog
118
C/C++ Programming
public: void set_values (int,int); int area (void); } rect;
Hendra, S.T.
Mendeklarasikan class CRectangle dan sebuah objek dengan nama rect. Class ini mengandung empat member: dua variabel type int (x dan y) pada bagian private (karena private adalah default permission) dan dua function pada bagian public: set_values() dan area(), dimana kita hanya mencantumkan prototype-nya. Dan untuk mengakses member-member public dari objek rect dapat digunakan penulisan berikut :
rect.set_value (3,4); myarea = rect.area();
tetapi harus diingat kita tidak dapat mengakses x atau y karena mereka adalah member private, contoh kongkret dari CRectangle:
// classes example #include <iostream.h> class CRectangle { int x, y; public: void set_values (int,int); int area (void) {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); } area: 12
Pada contoh diatas kita menemui scope operator baru :: yang digunakan untuk deklarasi suatu member diluar dari class-nya Penulisannya diawali dengan nama class yang memiliki member tersebut diikuti oleh scope operator (::) dan nama member yang bersesuaian. Anda dapat juga dapat melengkapi member didalam class secara langsung, contoh:
// class example #include <iostream.h> rect area: 12 rectb area: 30
Indoprog
119
C/C++ Programming
class CRectangle { int x, y; public: void set_values (int,int); int area (void) {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect, rectb; rect.set_values (3,4); rectb.set_values (5,6); cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; }
Hendra, S.T.
Pada contoh diatas ukuran rect.area() dan rectb.area() akan menghasilkan ukuran yang berbeda karena mereka adalah dua objek yang berbeda dan memiliki variables x dan y masing-masing.
Catatan : Sesuatu hal yang sering dikacaukan adalah perbedaan antara Class dan Object. Pada dasarnya Object merupakan Instance dari suatu Class. Dan Class merupakan cetak biru dari suatu Object.
Indoprog
120
C/C++ Programming
} int main () { CRectangle rect (3,4); CRectangle rectb (5,6); cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; }
Hendra, S.T.
Sehingga pada saat kita melakukan instance terhadap class tersebut menjadi:
CRectangle rect (3,4); CRectangle rectb (5,6);
Sedangkan Destructor akan otomatis dipanggil pada saat suatu objek di release dari memory, atau ketika keberadaanya telah selesai (misalnya jika kita mendefinisikan objek sebagai suatu variabel lokal dalam suatu function dan function tersebut berakhir) atau di release dengan operator delete. Destructor memiliki nama yang sama dengan class dan diawali dengan sebuah tilde (~) dan tidak mengembalikan nilai. Pemakaian destructor cocok kalau pada object ada menggunakan dynamic memory during, sehingga perlu dimusnahkan pada saat objek tersebut di release dari memory.
// example on constructors and destructors #include <iostream.h> class CRectangle { int *width, *height; public: CRectangle (int,int); ~CRectangle (); int area (void) {return (*width * *height);} }; CRectangle::CRectangle (int a, int b) { width = new int; height = new int; *width = a; *height = b; } CRectangle::~CRectangle () { delete width; delete height; } int main () { CRectangle rect (3,4), rectb (5,6); cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl;
Indoprog
121
C/C++ Programming
return 0; }
Hendra, S.T.
Contoh program :
//Program bola pantul //Oleh : Hendra Soewarno //Hanya berjalan di Turbo C++ 3.0 //Dengan pendekatan OOP dan memanfaatkan fasilitas Graphics. #include #include #include #include <graphics.h> <stdlib.h> <conio.h> <dos.h>
class bola { private : int x,y,dx,dy,c; public : bola(int cl); ~bola(); void paint(int cl); void move(); } bola::bola(int cl) { x = random(640); y = random(480); dx = 10; dy = 10; c = cl; paint(c); } bola::~bola() { } void bola::paint(int cl) { setfillstyle(1,cl); bar(x-5,y-5,x+5,y+5); }
// properties
Indoprog
122
C/C++ Programming
if (x > 630) { x = 630; dx = -dx; } if (y < 10) { y = 10; dy = -dy; } if (y > 470) { y = 470; dy = -dy; } paint(c); } int main() { int gd,gm; detectgraph(&gd,&gm); initgraph(&gd,&gm,"egavga.bgi"); bola *obola[5]; int i; for (i=0;i<5;i++) obola[i] = new bola(i); do { for (i=0;i<5;i++) obola[i]->move(); delay(100); } while (!kbhit()); for (i=0;i<5;i++) delete obola[i]; closegraph(); return 0; } //Program snake //Oleh : Hendra Soewarno //Hanya berjalan di Turbo C++ 3.0 //Dengan pendekatan OOP dan memanfaatkan fasilitas Graphics. #include #include #include #include <graphics.h> <stdlib.h> <conio.h> <dos.h>
Hendra, S.T.
class snack { private : int x,y,life; public : snack(); void paint(); int hmm(int sx,int sy); }; snack::snack() { x = random(30)*20+25; y = random(22)*20+25; life = 1; paint(); } void snack::paint() {
Indoprog
123
C/C++ Programming
setfillstyle(1,7); bar(x-5,y-5,x+5,y+5); } int snack::hmm(int sx,int sy) { if (life) { if (x==sx && y==sy) { life = 0; sound(1000); delay(100); nosound(); return 1; } else return 0; } else return 0; } class snake { private : int x[255],y[255],len; int dx,dy; void paint(int x,int y,int cl); void checklife(); public : int life; snake(); void move(); void eat(snack void up() { void down() { void left() { void right() { };
Hendra, S.T.
snake::snake() { len = 1; life = 1; x[0] = 325; y[0] = 245; for(int i=1;i<255;i++) { x[i]=0;y[i]=0; } dx = 10; dy = 0; paint(x[0],y[0],2); } void snake::paint(int x,int y,int cl) { setfillstyle(1,cl);
Indoprog
124
C/C++ Programming
bar(x-5,y-5,x+5,y+5); } void snake::move() { if (!x[len-1]==0) paint(x[len-1],y[len-1],0); for (int i=len-1;i>0;i--) { x[i]=x[i-1]; y[i]=y[i-1]; } x[0]+=dx; y[0]+=dy; checklife(); paint(x[0],y[0],2); }
Hendra, S.T.
void snake::checklife() { life = life && (x[0]>10) && (x[0]<630) && (y[0]>10) && (y[0]<470); for (int i=1;i<len;i++) life = life && !(x[0]==x[i] && y[0]==y[i]); } void snake::eat(snack *target) { len = len+target->hmm(x[0],y[0]); }
void initcanvas() { setfillstyle(1,7); bar(0,0,getmaxx(),getmaxy()); setfillstyle(1,0); bar(10,10,getmaxx()-9,getmaxy()-9); } int main() { int gd,gm; detectgraph(&gd,&gm); initgraph(&gd,&gm,"egavga.bgi"); initcanvas(); snack *osnack[50]; snake *osnake = new snake; for (int i=0;i<50;i++) osnack[i] = new snack; do { if (!kbhit()) { osnake->move(); for (i=0;i<50;i++) osnake->eat(osnack[i]); delay(100); } else {
Indoprog
125
C/C++ Programming
if (!getch()) switch (getch()) { case 72: osnake->up(); break; case 75: osnake->left(); break; case 77: osnake->right(); break; case 80: osnake->down(); break; } } } while(osnake->life); for (i=0;i<50;i++) delete osnack[i]; closegraph(); return 0; }
Hendra, S.T.
Pertanyaan
1. 2. 3. 4. 5. Apa fungsi dari operator titik (dot)? Apa perbedaan antara public dan private data member? Dapatkah suatu member function (method) dibuat menjadi private? Dapatkah data member (property) dibuat menjadi public? Jika anda mendeklarasikan dua object Cat, dapatkah mereka memiliki nilai yang berbeda pada property itsAge? 6. Apa nama function yang digunakan untuk menginitialisasi suatu class?
Latihan
1. Develop and use the following class
//Program object random file //Oleh : Hendra Soewarno //Hanya berjalan di Turbo C++ 3.0 //Dengan pendekatan OOP dan memanfaatkan fasilitas Graphics. #include "iostream.h" #include "fstream.h" class rs { public : rs(); // constructor rs(char *fname, char *structure, int rsize); //constructor overloading ~rs(); //desctructor void open(char *fname, char *structure, int rsize); int endoffile(); long reccount(); long recno(); void addnew(); void update();
Indoprog
126
C/C++ Programming
Hendra, S.T.
protected : fstream fsource; char *fields; int recsize; long absoluteposition; long filesize(); void refresh(); }; //constructor rs::rs() { } rs::rs(char *fname, char *structure, int rsize) { fsource.open(fname,ios::in | ios::out | ios::binary); fields = structure; recsize = rsize; absoluteposition = 0; refresh(); } //destructor rs::~rs() { fsource.close(); } void rs::open(char *fname, char *structure, int rsize) { rs(fname,structure,rsize); } int rs::endoffile() { return fsource.eof(); } long rs::filesize() { long nfilesize; absoluteposition = fsource.tellg(); fsource.seekg(0,ios::end); nfilesize = fsource.tellg(); fsource.seekg(absoluteposition,ios::beg); return nfilesize; } long rs::recno() { return fsource.tellg()/recsize; } long rs::reccount() {
Indoprog
127
C/C++ Programming
return filesize()/recsize; } void rs::refresh() { if (!endoffile()) { absoluteposition = fsource.tellg(); fsource.read(fields,recsize); fsource.seekg(absoluteposition,ios::beg); } } void rs::addnew() { absoluteposition = filesize(); } void rs::update() { fsource.seekg(absoluteposition,ios::beg); fsource.write(fields,recsize); fsource.seekg(absoluteposition,ios::beg); }
Hendra, S.T.
Indoprog
128
C/C++ Programming
cout << "Nilai :"; cin >> rsiswa.nilai; cin.ignore(); ors->update(); } } while (nim[0]); delete ors; return 0; }
Hendra, S.T.
Indoprog
129
C/C++ Programming
Hendra, S.T.
Section 16
Pada model merupakan suatu pandangan abstrak terhadap permasalahan. Dalam hal ini model hanya terfokus pada permasalahan dimana : Data apa saja yang terpengaruh Operasi apa yang perlu dilakukan
Misalnya ketika seorang dosen ingin membuat laporan hasil ujian, maka data yang perlu adalah Nim, Nama, Nilai, dan operasi yang dilakukan adalah mentotalkan, dan menghitung nilai rata-rata. Suatu ADT terdiri dari suatu struktur data abstrak dan operasi-operasi, hanya operasioperasi yang dapat dilihat dari luar sebagai interface (antar muka), sedangkan detail proses disembunyikan dari pemakai.
Indoprog
130
C/C++ Programming
Hendra, S.T.
Encapsulation dan Data Hiding Prinsip menyembunyikan dengan mengunakan struktur data dan hanya menyediakan operasi-operasi untuk interface dengan luar dikenal sebagai encapsulation dan data hiding. Data hiding merupakan karakteristik yang bernilai tinggi dari yang dapat digunakan oleh suatu objek tanpa diketahui oleh user bagaimana kerja internal dari objek tersebut. Anda dapat membayangkan objek itu sebagai suatu mobil, dimana untuk bisa mengendari mobil, anda tidak perlu mengetahui bagaimana kerja internal dari mobil tersebut, yang penting anda dapat menyetir, masuk gigi, menambah kecepatan, dan menghentikan. Class pada C++ mengambarkan suatu ADT, dimana terdiri dari properti dan metoda sebagai interface. Hubungan antara Object dan Class Object merupakan instance dari Class, beberapa object dapat berasal dari Class yang sama, tetapi memiliki properti yang berbeda-beda. Pada pembuatan program OOP, dimulai dengan pembuatan Class, dan pada saat runtime akan dibuat instance dari Class sebagai Objek, jadi program tersebut berjalan sebagai objek-objek dimemori komputer.
Indoprog
131
C/C++ Programming
Hendra, S.T.
Objek-objek dalam program akan berkomunikasi antara satu dengan yang lain menggunakan pengiriman message. Inheritance Salah satu keunggulan dari OOP adalah isu pemanfaatan kembali. Dengan inheritance tugas pemrograman dapat dipemudah. Suatu class yang telah dikembangkan dapat disempurnakan dengan mengembangkan child class (sub class) yang merupakan inheritance dari parent class (super class). Pada inheritance semua properti dan metode dari super class akan tersedia untuk diakses oleh sub class. Inheritance menyerupai pengembangan produk baru pada suatu perusahaan, dimana engineer tidak perlu membuat produk baru dari awal, tetapi dengan mengacu pada produk yang telah ada, dan dilakukan penambahan dan perbaikan. Overriding Dalam melakukan inheritance terhadap suatu parent class, kadang-kadang pada sub class kita perlu mendefinisi ulang metoda. Dari hal inilah istilah overriding muncul, dimana overriding adalah mengubah implementasi suatu metoda pada super class di sub class. Polymorphyms Pada polymorphyms, suatu variabel dengan type super class dapat digunakan untuk mengacu terhadap sub class yang merupakan inheritance dari super class tersebut. Contoh :
//Program inheritance class rs //Oleh : Hendra Soewarno //Hanya berjalan di Turbo C++ 3.0 //Dengan pendekatan OOP dan memanfaatkan fasilitas Graphics. #include "objrs.cpp" class rse : public rs { public : rse(); rse(char *fname, char *structure, int rsize); void open(char *fname, char *structure, int rsize); // overiding void movefirst(); void movelast(); void moveprevious(); void movenext(); }; rse::rse(char *fname, char *structure, int rsize) {
Indoprog
132
C/C++ Programming
open(fname,structure,rsize); } void rse::open(char *fname, char *structure, int rsize) { rs::open(fname,structure,rsize); }
Hendra, S.T.
void rse::movefirst() { fsource.seekg(0,ios::beg); refresh(); } void rse::movelast() { fsource.seekg(-recsize,ios::end); refresh(); } void rse::moveprevious() { if (fsource.tellg()-recsize > 0) fsource.seekg(fsource.tellg()-recsize,ios::beg); else movefirst(); refresh(); } void rse::movenext() { if (fsource.tellg()+recsize < filesize()) fsource.seekg(fsource.tellg()+recsize,ios::beg); else fsource.seekg(0,ios::end); refresh(); }
Indoprog
133
C/C++ Programming
Hendra, S.T.
int main() { char nim[10]; rse *ors = new rse("c:\csiswa.rec", (char *) &rsiswa, sizeof(rsiswa)); while (!ors->endoffile()) { cout << "Data ke-" << ors->recno() + 1<< endl; cout << "Nim :" << rsiswa.nim; cout << "Nama :" << rsiswa.nama; cout << "Nilai:" << rsiswa.nilai; ors->movenext(); } delete ors; return 0; }
Indoprog
134
C/C++ Programming
{ protected: int nrotate; void savematrix(); public: int matrix[5][6], lmatrix[5][6], umatrix[5][6],color; shape(); virtual void rotate(); //polymorphys void unrotate(); }; shape::shape() { nrotate=1; color=random(6)+9; } //shape constructor
Hendra, S.T.
void shape::savematrix() { memcpy(umatrix,matrix,sizeof(umatrix)); } void shape::rotate() { int i,j; savematrix(); if (nrotate == 1) memcpy(lmatrix,matrix,sizeof(lmatrix)); for (i=1;i<5;i++) for(j=1;j<5;j++) if (nrotate == 1) matrix[i][j] = lmatrix[j][5-i]; else matrix[i][j] = lmatrix[i][j]; nrotate = -nrotate; } void shape::unrotate() { memcpy(matrix,umatrix,sizeof(matrix)); } //buat shape1 dimana merupakan inherit dari shape class shape1: public shape { public : shape1() {memcpy(matrix,block1,sizeof(matrix));} }; //buat shape2 dimana merupakan inherit dari shape class shape2: public shape { public : shape2() {memcpy(matrix,block2,sizeof(matrix));}
Indoprog
135
C/C++ Programming
void rotate() {savematrix();} }; //overiding
Hendra, S.T.
//buat shape3 dimana merupakan inherit dari shape class shape3: public shape { public : shape3() {memcpy(matrix,block3,sizeof(matrix));} }; //buat shape2 dimana merupakan inherit dari shape class shape4: public shape { public : shape4() {memcpy(matrix,block4,sizeof(matrix));} void rotate(); // overiding }; void shape4::rotate() { int i,j; savematrix(); switch (nrotate) { case 1: memcpy(lmatrix,matrix,sizeof(lmatrix)); for (i=1;i<5;i++) for(j=1;j<5;j++) matrix[i][j] = lmatrix[j][5-i]; break; case 2: memcpy(matrix,rblock4,sizeof(matrix)); break; case 3: memcpy(lmatrix,rblock4,sizeof(lmatrix)); for (i=1;i<5;i++) for(j=1;j<5;j++) matrix[i][j] = lmatrix[j][5-i]; break; default: memcpy(matrix,block4,sizeof(matrix)); nrotate=0; } nrotate++; } //header file score.hpp class scoreboard { private: int score; void paint(); public: scoreboard(); void addscore(int value) { score +=value; paint();} };
Indoprog
136
C/C++ Programming
Hendra, S.T.
//constructor
void scoreboard::paint() { char temp1[20]; char temp2[10]; strcpy(temp1,"score :"); itoa(score,temp2,10); strcat(temp1,temp2); setfillstyle(1,0); bar(1,1,100,50); // clear scoreboard setcolor(15); outtextxy(10,15,temp1); // print new score } //program tetris.cpp //pada bagian ini akan memanfaatkan virtual dan polymorphyms #include #include #include #include #include #include #include <graphics.h> <string.h> <stdlib.h> <conio.h> <dos.h> <shape.hpp> <score.hpp>
// mengkalkulasi titik koordinat game ke layar void maptoscreen(int x, int y, int &x1, int &y1, int &x2, int &y2) { x1 = x*20; y1 = y*20; x2 = (x+1)*20-1; y2 = (y+1)*20-1; } // mengambar 1 sel void drawcell(int x, int y, int c) { int x1,y1,x2,y2; maptoscreen(x,y,x1,y1,x2,y2); setfillstyle(1,c); bar(x1,y1,x2,y2); // membuat efek 3 D setcolor(15); line(x1,y1,x1,y2);line(x1,y1,x2,y1); setcolor(8); line(x2,y1,x2,y2);line(x1,y2,x2,y2); } // menghapus 1 sel void clearcell(int x, int y) { int x1,y1,x2,y2; maptoscreen(x,y,x1,y1,x2,y2); setfillstyle(1,0); bar(x1,y1,x2,y2);
Indoprog
137
C/C++ Programming
} // class untuk menampilkan bentuk berikutnya class shapeboard { private : shape *cshape; void paint(); public : void setshape(shape *nextshape) {cshape = nextshape; paint();} void getshape(shape *currentshape) {currentshape = cshape;} }; void shapeboard::paint() { int i,j; for(i=0;i<5;i++) for(j=0;j<6;j++) if (cshape->matrix[i][j]) drawcell(j+23,i+1,cshape->color); else clearcell(j+23,i+1); } // class cell, visibel dan warna class cell { public: int visible,color; }; // tempat permainan class gameboard { private: cell matrix[24][16]; void paint(); public: gameboard(); int testshape(int row,int col, shape *shapex); void pasteshape(int row,int col, shape *shapex); void clearshape(int row,int col, shape *shapex); void putshape(int row,int col, shape *shapex); int checkcomplete(); } gameboard::gameboard() { int i,j; for (i=0; i<24; i++) for (j=0; j < 15; j++) matrix[i][j].visible = 1; for (i=0; i<21; i++) for (j=2; j < 12; j++)
Hendra, S.T.
Indoprog
138
C/C++ Programming
matrix[i][j].visible = 0; paint(); } void gameboard::paint() { int i,j; setcolor(15); line(10*20-1,1*20,10*20-1,(1+20)*20); line((10+10)*20+1,1*20,(10+10)*20+1,(1+20)*20); line(10*20-1,(1+20)*20+1,(10+10)*20+1,(1+20)*20+1); for (i=0; i<21; i++) for (j=2; j < 12; j++) if (matrix[i][j].visible==1) drawcell(10+j-2,i,matrix[i][j].color); else clearcell(10+j-2,i); }
Hendra, S.T.
int gameboard::testshape(int row,int col, shape *shapex) { int i,j; for (i=0;i<5;i++) for (j=0;j<6;j++) if(matrix[i+row][j+col].visible + shapex->matrix[i][j] > 1) return 0; return 1; } void gameboard::pasteshape(int row,int col, shape *shapex) { int i,j; for (i=0;i<5;i++) for (j=0;j<6;j++) { if (shapex->matrix[i][j] !=0) drawcell(10+j+col-2,i+row,shapex->color); } } void gameboard::clearshape(int row,int col, shape *shapex) { int i,j; for (i=0;i<5;i++) for (j=0;j<6;j++) { if (shapex->matrix[i][j] !=0) clearcell(10+j+col-2,i+row); } } void gameboard::putshape(int row,int col, shape *shapex) { int i,j; for (i=0;i<5;i++) for (j=0;j<6;j++) if (shapex->matrix[i][j]==1) { matrix[i+row][j+col].visible = 1;
Indoprog
139
C/C++ Programming
matrix[i+row][j+col].color = shapex->color; } } int gameboard::checkcomplete() { int lineok,score; score = 0; for (int i=20; i>0; i--) { lineok = 1; for (int j=2; j < 12 && lineok; j++) lineok = matrix[i][j].visible; if (!lineok==0) { sound(500); delay(100); nosound(); for (int k=i; k>0; k--) for (int l=2;l<12;l++) matrix[k][l] = matrix[k-1][l]; for (int m=1;m<11; m++) matrix[0][m].visible = 0; score+=10; i++; } } paint(); return score; } class gametetris { private: int row,col,finish,next,second; char key; gameboard *gb; scoreboard *sb; shapeboard *sh; shape *s0,*s1; public: gametetris(); ~gametetris(); void play(); } gametetris::gametetris() { gb = new gameboard(); sb = new scoreboard(); sh = new shapeboard(); finish = 0; next = 1; }
Hendra, S.T.
Indoprog
140
C/C++ Programming
Hendra, S.T.
gametetris::~gametetris() { delete(gb); delete(sb); delete(sh); delete(s1); } void gametetris::play() { s0 = new shape1; do { if (next==1) { switch (random(4)+1) { case 1: s1 = new shape1; break; case 2: s1 = new shape2; break; case 3: s1 = new shape3; break; default: s1 = new shape4; break; } sh->setshape(s1); row = 0; col = 4; second=250; next = 0; } if (kbhit()) { key = getch(); if (key==0) key = getch(); switch (key) { case 27:finish=1;break; case 76:s0->rotate(); if (!gb->testshape(row,col,s0)) s0->unrotate(); break; case 75:if (gb->testshape(row,col-1,s0)) col--; break; case 77:if (gb->testshape(row,col+1,s0)) col++; break; case 80:second=0; break; } } else if (gb->testshape(row,col,s0)) { gb->pasteshape(row,col,s0); delay(second); if (gb->testshape(row+1,col,s0)) { gb->clearshape(row,col,s0); row++; } else { gb->putshape(row,col,s0); sb->addscore(gb->checkcomplete()); delete s0; s0 = s1;
// esc // 5
// left
// right
// down
Indoprog
141
C/C++ Programming
next = 1; if (row < 2) finish = 1; } } else finish = 1; } while (!finish==1); } //program utama int main() { int gdriver,gmode; randomize(); detectgraph(&gdriver,&gmode); initgraph(&gdriver,&gmode,""); gametetris *gt = new gametetris; gt->play(); delete(gt); closegraph(); return 0; }
Hendra, S.T.
Indoprog
142
C/C++ Programming
Hendra, S.T.
Section 17
Exception handling
Exception handling merupakan fasilitas baru yang diperkenalkan pada ANSI-C++ standard. Jika anda menggunakan compiler C++ yang tidak mendukung fasilitas ini, maka anda tidak dapat memanfaatkan fasilitas ini. Pengembangan program tidak terlepas dari kesalahan dan kesilapan, untuk menangani masalah tersebut diperlukan suatu Exception handling. Untuk keperluan tersebut C++ menyediakan operator baru untuk membantu kita yaitu: try, throw and catch. Adapun bentuk strukturnya adalah sebagai berikut:
try { // code to be tried throw exception; } catch (type exception) { // code to be executed in case of exception }
dan secara operational: - Kode didalam blok try akan dijalankan secara normal. Dalam hal ini kalau suatu exception (pengecualian) terjadi, kode ini harus menggunakan keyword throw (lempar) suatu parameter ke suatu exception. - Jika suatu exception terjadi, maka instruksi throw didalam blok try akan dijalankan, blok catch dijalankan dengan menerima parameter yang dilewatkan oleh throw. Sebagai contoh:
// exceptions #include <iostream.h> int main () { char myarray[10]; try { for (int n=0; n<=10; n++) { if (n>9) throw "Out of range"; myarray[n]='z'; } } catch (char * str) {
Indoprog
143
C/C++ Programming
cout << "Exception: " << str << endl; } return 0; }
Hendra, S.T.
Pada contoh diatas, didalam n loop, saat nilai n lebih besar dari pada 9 maka suatu exception akan dilempar. Ketika throw dijalankan, blok try akan berakhir dan setiap objek yang dibuat didalam blok try akan dimusnahkan. Setelah itu, kendali di lewatkan ke blok catch yang bersesuian. Akhirnya program akan dilanjutkan ke program setelah blok catch. Blok catch dapat dioverloaded menurut type dari parameternya, contoh :
// exceptions: multiple catch blocks #include <iostream.h> int main () { try { char * mystring; mystring = new char [10]; if (mystring == NULL) throw "Allocation failure"; for (int n=0; n<=100; n++) { if (n>9) throw n; mystring[n]='z'; } } catch (int i) { cout << "Exception: "; cout << "index " << i << " is out of range" << endl; } catch (char * str) { cout << "Exception: " << str << endl; } return 0; }
Kita dapat juga dapat mendefinisikan suatu blok catch yang akan menangkap semua exception tanpa tergantung pada type yang digunakan untuk memperhatikan type yang digunakan pada saat memanggil throw. Dalam hal ini kita cukup menulis tiga buah titik ( ...) sebagai penganti dari nama type, contoh :
try { // code here } catch (...) { cout << "Exception occurred"; }
Indoprog
144
C/C++ Programming
Hendra, S.T.
Standard exceptions
Beberapa function dalam bahasa C++ standard library mengirim exception-exception yang dapat ditangkap kalau kita mengikutkannya dalam blok try. Exception ini akan dikirim dengan suatu class yang diturunkan dari std::exception sebagai type. Class ini (std::exception) didefinisikan dalam C++ standard header file <exception> dan melayani sebagai suatu pola untuk hirarki standard dari exception-exception berikut:
exception bad_alloc bad_cast bad_exception bad_typeid logic_error domain_error invalid_argum ent length_error out_of_range runtime_error overflow_erro r range_error (thrown by new) (thrown by dynamic_cast when fails with a referenced type) (thrown when an exception doesn't match any catch) (thrown by typeid)
Indoprog
145
C/C++ Programming
underflow_err or ios_base::failu (thrown by ios::clear) re
Hendra, S.T.
Karena class ini adalah hirarki, jika anda mengikutkan suatu blok catch untuk menangkap salah satu dari exception tersebut gunakan argumen dengan reference (tambahkan suatu ampersand & setelah type) anda juga dapat menangkap semua turunannya (aturan dari inheritanceance di C++). Contoh berikut akan menangkap (catch) suatu bad_typeid exception (diturunkan dari exception):
// standard exceptions #include <iostream.h> #include <exception> #include <typeinfo> class A {virtual f() {}; }; int main () { try { A * a = NULL; typeid (*a); } catch (std::exception& e) { cout << "Exception: " << e.what(); } return 0; }
Indoprog
146
C/C++ Programming
Hendra, S.T.
Section 18
Contoh pemakaian:
typedef typedef typedef typedef char C; unsigned int WORD; char * string_t; char field [50];
Sekarang kita telah mendefinisikan empat type data baru yaitu: C, WORD, string_t sehingga dapat digunakan untuk deklarasi variable:
C achar, anotherchar, *ptchar1; WORD myword; string_t ptchar2; field name;
dapat berguna untuk type-type yang sering digunakan, khususnya yang memiliki nama yang panjang.
typedef
Unions
Union memperbolehkan suatu bagian dari memory diakses sebagai type data yang berbeda, dimana masing-masing dari mereka memiliki lokasi yang sama di memori. Deklarasi dan pemakaiannya sama dengan suatu structure, tetapi fungsinya berbeda sama sekali :
union model_name { type1 element1; type2 element2; type3 element3; . . } object_name;
Indoprog
147
C/C++ Programming
Hendra, S.T.
Semua elemen dari deklarasi union menggunakan tempat memory yang sama. Ukurannya sama dengan elemen yang terbesar. Contoh :
union mytypes_t { char c; int i; float f; } mytypes;
masing-masing memiliki type data yang berbeda, tetapi sama-sama menggunakan lokasi memori yang sama, modifikasi terhadap suatu elemen akan mempengaruhi nilai dari elemen lain. Salah satu kegunaan union adalah untuk menyatukan suatu type yang lebih panjang dari elemen-elemen type lainnya. Contoh :
union mix_t{ long l; struct { short hi; short lo; } s; char c[4]; } mix;
mendefinisikan tiga nama yang memungkinkan kita mengakses group yang sama dari 4 byte: mix.l, mix.s dan mix.c, dimana gambaran masing-masing field dimemori adalah sebagai berikut
Anonymous unions
Pada C++ kita memiliki option bahwa union dapat berupa anonymous. Jika kita mengikutkan suatu union dalam structure tanpa nama object (biasaya ditempatkan setelah tanda curly brackets { }) union akan menjadi anonymous dan kita akan dapat mengakses
Indoprog
148
C/C++ Programming
Hendra, S.T.
elemen secara langsung dengan berdasarkan namanya. Sebagai contoh, perhatikan perbedaan antara dua deklarasi berikut: union
struct { char title[50]; char author[50]; union { float dollars; int yens; } price; } book;
anonymous union
struct { char title[50]; char author[50]; union { float dollars; int yens; }; } book;
Perbedaan satu-satunya antara kedua potongan kode diatas adalah yang pertama kita memberi satu nama pada union (price) dan pada yang kedua kita tidak Perbedaannya adalah ketika kita mengakses anggota dari dollars dan yens dari objek book. Pada kasus pertama adalah:
book.price.dollars book.price.yens
Satu hal lagi yang perlu anda ingat adalah, field dollars dan yens menggunakan tempat yang sama dimemory sehingga tidak dapat digunakan untuk menyimpan dua nilai yang berbeda.
Enumerations (enum)
Enumerations digunakan untuk membuat data types untuk mengandung sesuatu yang berbeda baik numeric, character ataupun konstanta true dan false. Memiliki bentuk sebagai berikut:
enum model_name { value1, value2, value3, . . } object_name;
Sebagai contoh, kita dapat membuat suatu type baru yang bernama color untuk menyimpan warna-warna dengan deklarasi berikut:
enum colors_t {black, blue, green, cyan, red, purple, yellow, white};
Indoprog
149
C/C++ Programming
Hendra, S.T.
Pada kenyataannya enumerated data type dikompilasi sebagai suatu integer dan nilai yang mungkin. Jika tidak ditentukan, nilai integer yang ekuivalen pertama yang mungkin adalah 0 and berikutnya adalah a +1. Kita dapat juga melengkapi suatu nilai integer untuk enumerated type (misalnya untuk elemen yang pertama), contoh ::
enum months_t { january=1, february, march, april, may, june, july, august,
Indoprog
150
C/C++ Programming
Hendra, S.T.
Appendix A
Preprocessor directives
Preprocessor directives are orders that we include within the code of our programs that are not instructions for the program itself but for the preprocessor. The preprocessor is executed automatically by the compiler when we compile a program in C++ and is in charge of making the first verifications and digestions of the program's code. All these directives must be specified in a single line of code and they do not have to include an ending semicolon ;.
#define
At the beginning of this tutorial we have already spoken about a preprocessor directive: #define, that serves to generate what we called defined constantants or macros and whose form is the following:
#define name value
Its function is to define a macro called name that whenever it is found in some point of the code is replaced by value. For example:
#define MAX_WIDTH 100 char str1[MAX_WIDTH]; char str2[MAX_WIDTH];
#undef
#undef
fulfills the inverse functionality of #define. It eliminates from the list of defined constants the one that has the name passed as a parameter to #undef:
#define MAX_WIDTH 100 char str1[MAX_WIDTH]; #undef MAX_WIDTH #define MAX_WIDTH 200 char str2[MAX_WIDTH];
Indoprog
151
C/C++ Programming
Hendra, S.T.
For example:
#ifdef MAX_WIDTH char str[MAX_WIDTH]; #endif
In this case, the line char str[MAX_WIDTH]; is only considered by the compiler if the defined constant MAX_WIDTH has been previously defined, independently of its value. If it has not been defined, that line will not be included in the program. serves for the opposite: the code between the #ifndef directive and the #endif directive is only compiled if the constant name that is specified has not been defined previously. For example:
#ifndef #ifndef MAX_WIDTH #define MAX_WIDTH 100 #endif char str[MAX_WIDTH];
In this case, if when arriving at this piece of code the defined constant MAX_WIDTH has not yet been defined it would be defined with a value of 100. If it already existed it would maintain the value that it had (because the #define statement won't be executed). The #if, #else and #elif (elif = else if) directives serve so that the portion of code that follows is compiled only if the specified condition is met. The condition can only serve to evaluate constant expressions. For example:
#if MAX_WIDTH>200 #undef MAX_WIDTH #define MAX_WIDTH 200 #elsif MAX_WIDTH<50 #undef MAX_WIDTH #define MAX_WIDTH 50 #else #undef MAX_WIDTH
Indoprog
152
C/C++ Programming
#define MAX_WIDTH 100 #endif char str[MAX_WIDTH];
Hendra, S.T.
Notice how the structure of chained directives #if, #elsif and #else finishes with #endif.
#line
When we compile a program and errors happen during the compiling process, the compiler shows the error that happened preceded by the name of the file and the line within the file where it has taken place. The #line directive allows us to control both things, the line numbers within the code files as well as the file name that we want to appear when an error takes place. Its form is the following one:
#line number "filename"
Where number is the new line number that will be assigned to the next code line. The line number of successive lines will be increased one by one from this. is an optional parameter that serves to replace the file name that will be shown in case of error from this directive until another one changes it again or the end of the file is reached. For example:
filename #line 1 "assigning variable" int a?;
This code will generate an error that will be shown as error in file "assigning variable", line 1.
#error
This directive aborts the compilation process when it is found returning the error that is specified as the parameter:
#ifndef __cplusplus #error A C++ compiler is required #endif
This example aborts the compilation process if the defined constant __cplusplus is not defined.
#include
Indoprog
153
C/C++ Programming
Hendra, S.T.
This directive has also been used assiduously in other sections of this tutorial. When the preprocessor finds an #include directive it replaces it by the whole content of the specified file. There are two ways to specify a file to be included:
#include "file" #include <file>
The only difference between both expressions is the directories in which the compiler is going to look for the file. In the first case where the file is specified between quotes, the file is looked for in the same directory that includes the file containing the directive. In case that it is not there, the compiler looks for the file in the default directories where it is configured to look for the standard header files. If the file name is enclosed between angle-brackets <> the file is looked for directly where the compiler is configured to look for the standard header files.
#pragma
This directive is used to specify diverse options to the compiler. These options are specific for the platform and the compiler you use. Consult the manual or the reference of your compiler for more information on the possible parameters that you can define with #pragma.
Indoprog
154
C/C++ Programming
Hendra, S.T.
Appendix B
Programming Patterns
A lot of programming is based on using existing patterns. This section presents a number of simple, but commonly used, programming patterns. If you are working on a problem that fits one of these, pull it out and use it, adapting it as needed. This is usually much faster than trying to invent something new.
In general, the pattern is given by the following outline, which is written in a mixture of English and C++.
if (All is OK) Action to sometimes skip; else Output a warning message;
155
C/C++ Programming
Hendra, S.T.
This plan forces the user to enter an acceptable data item. For instance, the acceptable items might be Y, y, N, and n. The Unacceptable function shown below might, of course, be replaced by a simple condition. There is no need to write a function here unless the algorithm for determining unacceptable items is fairly complex.
cout << "Enter an item: "; cin >> Item; while (Unacceptable(Item)) { cout << "Re-enter: "; cin >> Item; }
As an example, let's write out more detail of how to use EOF as a sentinel. Suppose we want to enter and process a sequence of integers, with CTRL z used to indicate the end of data entry. Then we would use something like this:
int Item; cin >> Item; while (! cin.fail()) { Process(Item); cin >> Item; }
The fail function returns true whenever the previous stream operation failed to input an integer. The usual reasons for such failure are that the user pressed CTRL z or that the user entered something (such as abcd) that could not be interpreted as an integer. Although the code shown above reads data from the keyboard, it could easily be adapted to read the data from a file. The most general form of this pattern is as follows. Again, we use part English and part C++.
Indoprog
156
C/C++ Programming
Get a data item. while (we haven't reached the sentinel) { Process the data item; Get another data item; }
Hendra, S.T.
Menu-Driven Plan
This is similar to the previous plan, but adds a menu that is printed to show the user possible commands, here assumed to be the letters a, b, c, and q. The letter q is used as the signal that the user wants to quit. Of course, you can use integers or whatever is convenient. After getting the user's choice the plan picks out the proper task to execute. Then, as long as the choice is not to quit, loop around and present the menu again, etc.
do { PrintMenu(); cin >> Choice; if (Choice == 'a') DoA(); else if (Choice == 'b') DoB(); else if (Choice == 'c') DoC(); else if (Choice != 'q') cout << "Invalid choice" << endl; } while (Choice != 'q');
Indoprog
157
C/C++ Programming
Hendra, S.T.
variable that is initialized to zero and incremented each time a new data item is read. Here is how this is done:
int Count; Count = 0; cin >> Item; while (Item != Sentinel) { Count++; Process(Item); cin >> Item; }
Indoprog
158
C/C++ Programming
Hendra, S.T.
cout << "Average: " << Average << endl; } else cout << "No data. The average cannot be computed." << endl;
Indoprog
159
C/C++ Programming
Hendra, S.T.
Appendix C
Documentation
If you provide good documentation, that maintenance programmer is going to bless you, not curse you! There is both internal and external documentation. The internal documentation is contained within the program file(s) and includes a description at the top giving the inputs, overall processing, and outputs of the program. This section of documentation is essentially a brief user manual. A stranger who reads this section should know what your program does as well as how to set it up and run it. The documentation at the top of a program file should list the date, the name of the author, the names of any other people who contributed to it, and any references used in any significant way (books, web sites, etc.). This allows both you and others to know at a glance what sources were used in producing this program. Internal documentation also includes a comment section for each function, listing what is being passed into it via the parameters, what the function's main task is, and what values are being passed back out via the parameters or function name. (For object-oriented programming, the implicit object is also used to send values in and out.) The Given/Task/Return style of function comments is suggested. In this, the "Given" section lists each parameter that is used to send a value into the function. Beside the name of the parameter, a description of its meaning is listed. The "Task" section describes the overall
Indoprog
160
C/C++ Programming
Hendra, S.T.
task of this function. It tells the reader what this function does if the function is called. Always describe the task in terms of the parameters. Try NOT to use items outside of the function in this description. The "Return" section lists each parameter (and its meaning) that is used to send a value back out of the function. It also lists any value returned in the function name and its meaning. Internal documentation also includes a description of each user-defined class. External documentation is separate from the program and may consist of items like the specifications, various diagrams, a record of testing, etc.
Example
/* Filename: Author: area3.cpp Br. David Carlson None
Revised:
This program asks the user to enter the length and width of a rectangle. It then computes and prints the area of the rectangle. A warning is printed if the user enters a width larger than the length, but the program still prints the area in such a case. */ #include <iostream> using namespace std;
// Function prototypes: void Explanation(void); void GetValues(float & Length, float & Width); float ComputeArea(float Length, float Width); void PrintArea(float Area);
int main(void) { float Length, Width, Area; Explanation(); GetValues(Length, Width); if (Width > Length)
Indoprog
161
C/C++ Programming
Hendra, S.T.
{ cout << "Warning: the width you entered is larger than the length."; cout << endl << "The area will still be found." << endl; } Area = ComputeArea(Length, Width); PrintArea(Area); return 0; }
Nothing. To ask the user for the length and width of a rectangle, on positive values for both, and to return these values via
two parameters. Return: Length The length entered by the user. Width The width entered by the user. */ void GetValues(float & Length, float & Width) { cout << "Enter the rectangle's length: "; cin >> Length; while (Length <= 0) { cout << "Error: Length must be positive. cin << Length; } cout << "Enter the rectangle's width: "; cin >> Width; while (Width <= 0) { cout << "Error: Width must be positive. cin >> Width; } }
Re-enter: ";
Re-enter: ";
/* Given:
Length The length of the rectangle. Width The width of the rectangle. Task: To compute the area of this rectangle. Return: The area in the function name.
/* Given: Task:
Indoprog
162
C/C++ Programming
Hendra, S.T.
Return: Nothing. */ void Explanation(void) { cout << "This program computes the area of a rectangle." << endl; cout << "You will be prompted to enter both the length and width."; cout << endl << "Enter a real number for each." << endl; cout << "The program will then compute and print the area."; cout << endl << endl; }
/* Given: Area The area of a rectangle. Task: To print Area. Return: Nothing. */ void PrintArea(float Area) { cout << "The area is: " << Area << endl << endl; }
Other Concerns
Efficiency is also of some importance. Don't needlessly waste computer time or memory space. In particular, don't waste a lot of it. If there is a tradeoff between efficiency and a clear design, having a clear design is probably better (unless you would waste a lot of time or space to get it). Of course, it also does not make sense to waste a lot of your own time (or your employer's) to make minor speed improvements to a program that will be rarely used and runs fast enough as is. Here are some "thou shalt not" rules of thumb: Don't use an obscure method when clear methods are available. Do not have a variable do double duty, as in using a variable called Total to hold both the total of some data items, and later the average of these data items. (The name Total indicates that it should hold a sum, not an average. Don't confuse the readers of your program!) Do not have a section of program do double duty in a non-obvious way. The intention of each section of code should be reasonably clear.
Indoprog
163
C/C++ Programming
Hendra, S.T.
Appendix D
The program below is an example of how to use this method of clearing the screen.
#include <iostream.h> #include <stdlib.h> int main() { cout << "Text before the clear screen." << endl; system("CLS"); cout << "Text following the clear screen." << endl; return 0; }
Indoprog
164
C/C++ Programming
int main() { ofstream print; // stream variable declaration print.open("LPT1"); // open stream // Print Text (the character \f will produce a form feed) print << "This text will print on the printer.\f"; print.close(); // close stream return 0; }
Hendra, S.T.
Important Note:
Blindly directing text to a printer port assumes some things are true. 1. It assumes that you have a printer attached to the specified port or that the port is being captured and redirected to a printer. 2. It assumes that the printer is capable of accepting plain text. For example, a PostScript printer will not print unless the data comes through a PostScript printer driver. The code above does not make use of any drivers.
Indoprog
165
C/C++ Programming
Object Oriented Programming: An Introduction
Magazine Archives - Technologies Object Oriented Programming: An Introduction By Shailesh Khanal Jan/Feb, 1994-CORE
Hendra, S.T.
Object oriented programming is not just another buzz word of software developers. Object-oriented programming is a relatively new method for designing and implementing software systems. We see them in literature, we hear about them and many of us actually use them without knowing what object oriented software really is. Nowadays softwares based on this concept is pretty ubiquitous, Microsoft's Windows is one of them. Its major goals are to improve programmer productivity by increasing software extensibility and reusability and to control the complexity and cost of software maintenance. It rewards the development of generic functions which can be used with different data types e.g. integer, real etc.. The conventional method of programming using languages as Pascal, basic, C etc. is called imperative or declarative programming. A fundamental flaw of imperative programming is that global variables can potentially be accessed (and updated) by every part of the program. Large programs that lack any discipline tend to be unmanageable. The reason for this is that no module (a group of program codes) that accesses a global variable can be developed and understood independent of other modules that also access that global variable. Object-oriented programming enables us to create software that can be readily comprehended and shared with others. Unlike more traditional programming methods that are based on concepts such as data flow or mathematical logic, object-oriented programming directly models the application. There are as many different views of what object-oriented programming is as there are computer scientists and programmers. But basically a language must have following four elements to support object-oriented programming : encapsulation message passing inheritance and late biding. What is an object An object is a logical entity that contains both data and code that manipulates that data within an object, some of the code and/or data may be private to the object and inaccessible to anything outside the object. Thus an object is a variable equipped with operations that have the exclusive rights to access it. Programs perform computations by passing messages between active objects, which are computer analogy of entities in the real world. For example an object oriented financial application might see Customer objects sending debit and credit messages to Accounts objects. Objects can be reused in similar applications in the same area. Reusing, rather than reinventing software speeds the development and maintenance of large applications. What is a class Object and class are fundamental concepts of object oriented programming. An object class is a set of objects that share the same operations. In most object-oriented languages, a class definition describes the behavior of the underlying abstract data type by defining the interface to all the operations that can be performed on the underlying type. Each class definition also specifies the implementation details or data structure of the type. The data structure which are accessible only within the scope of the class is called a private type. And the one which are accessible outside the class are called public. The operations that are defined on the type are also generally classified as either public or private. The public operations are those that are accessible outside the scope of the class. The private operations are accessible only within the scope of the class. Methods and message Passing In object-oriented programming, the operations that are defined for a class
Indoprog
166
C/C++ Programming
Hendra, S.T.
are called methods. These methods are analogous to procedures and functions in non-object oriented languages. Actions may be performed on an object by invoking one or more of the methods defined in the class definition. The process of invoking a method is called sending a message to the object. Such a message typically contains parameters just as in a procedure or functions call invocation in a non-object-oriented languages. The invocation of a method (sending a message to an object) typically modifies the data stored in the particular object. Encapsulation Encapsulation is the technical name for information hiding. An object in object oriented programming allows some part of its code and/data to be inaccessible outside the object. In this way, an object provides a significant of protection against some other, unrelated part of the program accidentally modifying or incorrectly using the private parts of the object. This linkage of code and data is often referred to as encapsulation. Instead of organizing programs into procedures that share global data, the data is packaged with the procedures that access data. This concept is often called data abstraction or modular programming. The goal here is to separate the user of the object from its implementer. The user is no longer aware of how the object is implemented. Users can only operate on an object using those messages that the implementer provides. This has the obvious benefit that you can change the implementation of the encapsulated object without affection the applications using it. Inheritance Inheritance is the major feature distinguishing an OOPS from other programming systems.Every OOPS provides simple inheritance in one form or another. Inheritance increases code sharing by allowing the language rather than the programmer to reuse code form one class in another related class. Inheritance enables programmers to create classes and, therefore, objects that are specializations of other objects. For example, we might create an object, vehicle, that is a specialization of a car, which is a specialization of sports car. A sports car inherits behavior that is appropriate for car, and vehicle. Creating a specialization of an existing class is called subclass.The new class is a subclass of the existing class, and the existing class is the superclass of the new class. The subclass inherits instance variables,class variables and methods from its superclass. The subclass may add instance variables, class variables and methods that are appropriate to more specialized objects. Late binding and Polymorphism It is quite common in object-oriented systems to code multiple classes of an object that respond to the same messages. The ability of different objects to respond differently to the same message is known as polymorphism. This approach is clearly superior to using a huge case statement for all the known graphical data types in a single global draw procedure. Polymorphism is partly responsible for a well-known characteristic of object-oriented systems, a style of programming sometimes referred to as differential programming or programming by modifications. At the design level, when a software engineer is deciding what type of action is appropriate for a given object, he or she should not be concerned about how the object interprets the action (message) and implements the methods but only what the effect of the action is on the object. Object-oriented languages like C++ and Smalltalk allow a programmer to send identical messages to dissimilar but related objects and achieve identical actions while letting the software system decide how to achieve the required action for the given object. A key issue associated with polymorphism is the timing of the software system's implementations decision. If the system decides how to implement an action at compile time, this is called early binding. If the decision is made dynamically at run-time,it is called late biding. Generally late biding offers the advantages of flexibility and a high level of problem abstraction. C++ and Object-Oriented Programming C++ is based on C and is a superset of C. C++ retains C's power and flexibility to deal with the hardware-software interface and low-level systems programming. The efficiency, economy, and power of expression of C are retained in C++. More importantly, however, C++ provides a platform to support object-oriented programming and high-level problem abstraction. C++ goes further than ADA in its support for object-oriented programming and is similar to MODULAR-2 in its simplicity and support for modularity,while retaining the cutting-edge efficiency and compactness of C. C++ is a hybrid language. The object-oriented paradigm can be exploited fully to produce a purely objectoriented solution to a problem, or C++ can be treated as a procedural language that contains some additional constructs beyond C. In practice, C++ software reflects both the procedural programming
Indoprog
167
C/C++ Programming
Hendra, S.T.
paradigm as well as the newer object-oriented paradigm. This duality in C++ presents a special challenge to the beginning C++ programmer. Not only is there a new language to learn, but there is also a new way of problem solving and thinking. C++ was developed by Bjarne Stroustrup at Bell Labs in the early 1980s. C++ is designed to support software development on a large scale. The most significant aspect of the C++ language is its support for the object-oriented programming . Classes are what make C++ suitable for developing object-oriented programs. The class structure meets the requirements for creating objects. However, object-oriented programming is also supported by C++'s strong typing, operator overloading, and less reliance on the preprocessor. In a more formal definition, a class defines the properties and attributes that depict the actions of an object that is an instance of that class. Object-Oriented Design Methods At the current stage of evolution, OOD methodology combines elements of all three design categories : data design, architectural design, and procedural design. By identifying objects, data abstractions are created. By defining operations, modules are specified and a structure for the software is established. The steps for OOD are as follows : Define the problem. Develop an informal strategy for the software realization of the real-world problem domain. Formalize the strategy using the following substeps : a. Identify objects and their attributes b. Identify operations that may be applied to objects c. Establish interfaces by showing the relationship between objects and operations. d. Decide on detailed design issues that will provide an implementation description for objects. Mapping from real-world domain to software domain. Although object oriented system design is the design method for the future, its effect can be hardly felt on smaller programs (less than 3000 lines). For large applications like Windows you know the effect. You might have noticed that in Windows every pop up menu have similar options e.g. move, size. etc., this means the code is being reused many times which reduces the program length and execution time. And that's what object oriented programming is all about.
Indoprog
168
C/C++ Programming
Hendra, S.T.
Daftar Pustaka http://www.cplusplus.com, The C++ resources network http://www.research.att.com/~bs/C++.html, Stroustrup: C++ http://cis.stvincent.edu/carlsond/swdesign/swd.html, software design using C++
Indoprog
169
Dasar Pemrograman
KATA PENGANTAR
Selamat datang di dunia pemrograman komputer. Dewasa ini, jurusan komputer telah menjadi salah satu jurusan favorit bagi lulusan SMU untuk melanjutkan pendidikannya di perguruan tinggi. Sebagai salah satu mahasiswa jurusan komputer, tentu saja topik algoritma dan pemrograman merupakan mata kuliah wajib, karena kesuksesan sebagai seorang mahasiswa jurusan komputer adalah kemampuan pemanfaatan komputer dan kemampuan menghasilkan berbagai aplikasi yang dapat bermanfaat bagi perusahaan maupun masyarakat. Sesuatu yang harus disadari para mahasiswa adalah dalam mempelajari pemrograman komputer bukanlah sesuatu yang mudah, karena sangat membutuhkan minat dan bakat, dan buku ini memcoba membimbing anda secara step-by-step menuju ke dunia pemrograman komputer. Akhirnya, selamat belajar dan berlatih. Medan, 17 Agustus 2003
Hendra, ST.
Indoprog
Dasar Pemrograman
BAHASA KOMPUTER
Agar suatu komputer dapat mengenali instruksi yang anda berikan, instruksi tersebut perlu ditulis dalam bahasa yang dimengerti oleh komputer.
Indoprog
Dasar Pemrograman
Ketika anda menggunakan suatu compiler, ia akan membaca perintah source code ... dan menulis kode mesin. Setelah selesai keseluruhan kode mesin akan disimpan untuk pemakaian selanjutnya. Ketika anda ingin menjalankan program tersebut, system operasi akan menjalankan kode mesin yang telah disimpan dalam hal ini source code tidak diperlukan lagi. Eksekusi menjadi lebih cepat, dan dapat dijalankan dikomputer lain (dalam hal ini pada komputer dan system operasi yang sama)
Indoprog
Dasar Pemrograman
PSEUDOCODE
PSEUDOCODE adalah cara sederhana untuk menggambarkan algoritma tanpa salah satu bahasa pemrograman. Pseudocode sering digunakan pada buku-buku Computer science dalam contoh mereka sehingga dapat dimengerti oleh para programmer dengan bahasa komputer yang berbeda. Contoh notasi pseudocode: <variable> = <expression> Berhubungan dengan kondisi: if <condition> lakukan sesuatu else lakukan hal yang lain Berhubungan dengan looping: while <condition> lakukan sesuatu for <variable> from <nilai awal> to <nilai akhir> by <step> lakukan sesuatu Pemanggilan fungsi: <function>(<arguments>) Deklarasi fungsi: function <function name>(<arguments>) lakukan sesuatu dengan arguments return sesuatu (optional) Deklarasi variabel: declare <variable-name> as <type> Deklarasi array: declare <array-name>[<lower-bound> to <upper-bound>] of <type> Struktur data: struct <name_of_new_type> <declaration(s) of internal variables> Mengakses field yang terdapat pada struktur: <structure variable name>.<field name>
FLOWCHART
FLOWCHART adalah salah satu cara menggambarkan algoritma dengan menggunakan simbol. Start dan End
Indoprog
Dasar Pemrograman
Proses
Kondisi
Konektor
Aliran
Tugas : 1. Tuliskan pengertian anda tentang Program Komputer, Bahasa Komputer, dan Algoritma ! 2. Tuliskan algoritma yang anda lakukan dari rumah menuju ke tempat kuliah ! 3. Apa perbedaan menurut anda antara Program Komputer dan Pseudocode ? 4. Apa persamaan dan perbedaan antara pseudocode dengan flowchart ? Tugas rumah : Carilah nama-nama bahasa komputer dan pembuatnya, minimal 10.
Indoprog
Dasar Pemrograman
Indoprog
Dasar Pemrograman
110 120 130 140 150 PRINT "Goodbye "; FOR I = 1 TO 200 PRINT A$; " "; NEXT I PRINT
5. Testing the program to make sure it works; if not, return to step 3 (see code and fix).
TYPE DATA
Data Type Strings Integers Long Integers Single Double User defined Suffix $ % & ! # Maximum 32,767 chars 32,767 2,147,483,647 +-3.402823 E+38 +-1.7976931 D+308 Minimum 0 chars -32,767 -2,147,483,648 +-1.401298 E-45 +-4.940656 D-324 Size 2 4 4 8
OPERATOR
Arithmetic operators : melakukan tugas perhitungan Operator Kegunaan Operator Kegunaan
Indoprog
Relational operators : membandingkan strings dan nilai numerik Operator = <> < > <= >= Kegunaan Sama dengan Tidak sama dengan Lebih kecil Lebih besar Lebih kecil atau sama dengan Lebih besar atau sama dengan
Logical operators : test kondisi dan manipulasi bits Expresi1 Expresi2 Not And T T F T T F F F F T T F F F T F
Or T T T F
Xor F T T F
Eqv T F F T
Imp T F T T
Indoprog
Dasar Pemrograman
Contoh 1 : REM Program mencari Isi Bujursangkar INPUT "MASUKKAN SISI BUJURSANGKAR :",S ISI = S * S PRINT "ISI DARI BUJURSANGKAR ADALAH :",ISI END Contoh 2 : REM Program Isi Data INPUT "MASUKKAN NAMA ANDA ";NM$ INPUT "MASUKKAN UMUR ANDA ";UR% INPUT "MASUKKAN TGL,BLN,THN HARI INI ";TG%,BL%,TH% PRINT "NAMA : ";NM$ PRINT "UMUR : ";UR% PRINT "TANGGAL : ";TG% PRINT "BULAN : ";BL% PRINT "TAHUN : ";TH% END
Catatan : Untuk memberi keterangan pada program dapat digunakan REM atau '
LATIHAN 1. Tuliskan hasil evaluasi ekspresi berikut Ekspresi : 1 + 2 2 - 1 2 * 3 5 / 2 5 \ 2 5 Mod 2 3^2 1+2*6^2/4-1 (1+2)*6^2/4-1 Hasilnya ? _____ _____ _____ _____ _____ _____ _____ _____ _____ Penjumlahan Pengurangan Perkalian Pembagian mengapa ? ____________ Pembagian bulat mengapa ? ____________ Sisa bagi Pangkat Urutan operasi Prioritas operasi
Tuliskan kesimpulan anda tentang : 1. Pembagian bulat ____________________________________________ 2. Sisa bagi __________________________________________________ 3. Urutan operasi _____________________________________________ 4. Prioritas operasi __________________________________________ 1 1 2 2 1 3 > 2 < 1 = 2 >= 2 <= 2 <> 3 _____ _____ _____ _____ _____ _____ lebih besar lebih kecil sama dengan lebih besar atau sama lebih kecil atau sama tidak sama dengan
Mengapa True (-1) dan False (0) ? (1 > 2) (1 > 2) (1 < 2) and (2 = 2) and (1 < 2) and (2 = 2) _____ Operasi And _____ Operasi And _____ Operasi And
Indoprog
Dasar Pemrograman
(3 <> 2) and (1 > 2) (1 (1 (1 (3 (1 (1 (1 (3 (1 (1 (1 (3 (1 (1 (1 (3 > 2) > 2) < 2) <> 2) > 2) > 2) < 2) <> 2) > 2) > 2) < 2) <> 2) > 2) > 2) < 2) <> 2) and and and and Xor Xor Xor Xor Eqv Eqv Eqv Eqv Imp Imp Imp Imp (2 (1 (2 (1 (2 (1 (2 (1 (2 (1 (2 (1 (2 (1 (2 (1 = < = > = < = > = < = > = < = > 2) 2) 2) 2) 2) 2) 2) 2) 2) 2) 2) 2) 2) 2) 2) 2) _____ Operasi And _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Operasi Or Or Or Or Xor Xor Xor Xor Eqv Eqv Eqv Eqv Imp Imp Imp Imp
Not (1 > 2) Or (2 = 2) And (3 < 2) ______ Urutan operasi Tuliskan kesimpulan anda tentang urutan operasi pada operator logika. 2. Ketiklah ekspresi berikut pada jendela immedietly : A = 123 B = 1234567890 C% = 32767 D% = 100000 D& = 100000 E$ = "Indoprog" F$ = 123 G = "hendra" H_1 = 123 nilai ujian = 90 next = 5 cls = 6 A% A% = 1.2 = 1.5
Overflow, mengapa ? Type mismatch, mengapa ? Type mismatch, mengapa ? expected : end-of-statement, mengapa ? Syntax error, mengapa ? expected : variable or end-of-statement ? expected : variable or end-of-statement ? Berapa nilai A% ? Berapa nilai A% ?
Tuliskan kesimpulan anda tentang variabel dan nama variabel 1 + 1 1 + "100" "A" + "B" ______ Type mismatch, mengapa ? ______
Tuliskan kesimpulan anda operator pada type data. Print "Untuk kemajuan Indonesia"
Indoprog
10
Dasar Pemrograman
Hasilnya : __________________________________ Print "Untuk","kemajuan","Indonesia" Hasilnya : __________________________________ Print "Untuk";"kemajuan";Indonesia" Hasilnya : __________________________________ Print "Untuk" Print "Kemajuan" Print "Indonesia" Hasilnya : _____________ _____________ _____________ Print "Untuk"; Print "Kemajuan"; Print "Indonesia" Hasilnya : __________________________________ Print 1,2,3 Hasilnya : __________________________________, mengapa ? Print 1;2;3 Hasilnya : __________________________________, mengapa ? Print tab(10),"Hendra";tab(30);"Soewarno" Hasilnya : __________________________________, mengapa ?
Input nama$ print nama$ Hasilnya :? Hendra __________________________________ Input "Masukkan nama :", nama$ print nama$ Hasilnya :Masukkan nama : Hendra __________________________________
Indoprog
11
Dasar Pemrograman
Input "Masukkan nama "; nama$ print nama$ Hasilnya :Masukkan nama ? Hendra __________________________________ Input "Masukkan nama "; nama print nama Hasilnya : Masukkan nama ? Hendra Redo from start, mengapa ? 2. Program anda yang pertama Aktifkan ke jendela Editor Ketiklah CODE berikut : REM Program saya yang pertama CLS PRINT "Hello semua" END Simpan CODE diatas ke file Bab1F.Bas (gunakan menu File Save) Jalankan program diatas (gunakan menu Run Start atau tekan F5) 3. Program dengan proses input/output Gunakan menu File New untuk memulai program baru Ketiklah CODE berikut : REM Program menghitung luas persegi panjang CLS INPUT "Masukkan sisi panjang :", panjang INPUT "Masukkan sisi lebar :", lebar LUAS = panjang * lebar PRINT "Luas persegi panjang :", LUAS END Simpan CODE diatas ke file Bab1G.Bas Tugas 4. Buatlah program menghitung luas lingkaran. 5. Buatlah program konversi suhu Celcius ke Farenheit, Kelvin, Reamur. Jawaban :
REM DIM DIM DIM DIM CLS Program Konversi Celcius ke Reamur, Kelvin dan Fahrenheit c AS SINGLE r AS SINGLE k AS SINGLE f AS SINGLE
Indoprog
12
Dasar Pemrograman
INPUT "Masukkan Derajat Celcius ? ", c r = 4 / 5 * c k = 273 + c f = 9 / 5 * c + 32 PRINT "Derajat Reamur : ", r PRINT "Derajat Kelvin : ", k PRINT "Derajat Fahrenheit : ", f END
Indoprog
13
Dasar Pemrograman
PILIH TAMBAHAN
If ekspresi logika Then Statement ... End If
Contoh :
PTKP = 240000 If Nikah$ = "Y" Then PTKP = PTKP + 120000 End If
Keterangan : Jika status nikah adalah "Y" (Ya), maka PTKP (Penghasilan Tidak Kena Pajak) ditambah 120000
Contoh :
If JlhAnak > 3 Then PTKP = PTKP + (3 * 120000) Else PTKP = PTKP + (JlhAnak * 120000) End If
Keterangan : Jika Jumlah Anak diatas 3 Orang, maka PTKP ditambah 360000, sebaliknya adalah JlhAnak dikali 120000.
Indoprog
14
Dasar Pemrograman
ElseIF ekspresi logika 2 Then Statement2 ... Else Endif
Berfungsi menentukan Block statement yang mana akan dijalankan oleh komputer sesuai dengan ekspresi logika yang menghasilkan nilai benar. Contoh :
PKP = Penghasilan - PTKP PKPT = PKP * 12 ' Penghasilan Kena Pajak 1 Bulan ' Penghasilan Kena Pajak 1 Tahun
If PKPT <= Then PPH = 0 ElseIF PKPT <= 25000000 Then PPH = PKP * 0.05 ElseIF PKPT <= 50000000 Then PPH = 1250000 + (PKPT-25000000)* 0.1 ElseIF PKPT <= 100000000 Then PPH = 1250000 + 2500000 + (PKPT-50000000)*0.25 ElseIF PTKP <= 200000000 Then PPH = 1250000 + 2500000 + 7500000 + (PKPT-100000000)*0.25 Else PPH = 1250000 + 2500000 + 7500000 + 25000000 + (PKPT-100000000)*0.35 End If PPHB = PPH / 12 ' Pajak Penghasilan Bulan Tersebut
Contoh :
Select Case PKPT Case <= 0 PPH = 0 Case <= 25000000 PPH = PKP * 0.05 Case <= 50000000 PPH = 1250000 + (PKPT-25000000)* 0.1
Indoprog
15
Dasar Pemrograman
Case <= 100000000 PPH = 1250000 + 2500000 + (PKPT-50000000)*0.15 Case <= 200000000 PPH = 1250000 + 2500000 + 7500000 + (PKPT-100000000)*0.25 Case ELSE PPH = 1250000 + 2500000 + 7500000 + 25000000 + (PKPT- 100000000)*0.35 End Select
Latihan Buatlah program perhitungan Pajak Penghasilan Perorangan untuk penghasilan bulanan ! Tugas 1. Buatlah program untuk mencetak kata sesuai dengan bilangan yang dimasukan oleh pemakai ( 1 s/d 9 ) Contoh : Input : 1 Output : Satu 2. Buatlah program untuk menentukan bilangan yang dimasukan pemakai genap atau ganjil. Jawaban :
REM Program memeriksa bilangan Genap atau Ganjil DIM bil AS INTEGER INPUT "Masukkan Bilangan ?", bil IF bil MOD 2 = 0 THEN PRINT "Genap" ELSE PRINT "Ganjil" END IF END
3. Buatlah program untuk menentukan tahun yang dimasukan pemakai kabisat atau bukan.
Indoprog
16
Dasar Pemrograman
LOOPING COUNTER
Digunakan untuk proses berulang yang jumlah perulangannya ditentukan berdasarkan perhitungan (sistem counter). FOR counter = mulai TO selesai [STEP selisih] Statement ... NEXT [counter] Contoh : Mencetak bilangan 0123456789
For I = 0 To 9 Step 1 Print I Next I
LOOPING TRAPPING
Perulangan jenis ini ditentukan berdasarkan kondisi tertentu. Pemeriksaan diawal
DO [{WHILE | UNTIL} ekspresi logika] Statement ... LOOP Contoh : Mencari KPK dari dua bilangan Input "Bilangan pertama :", pertama Input "Bilangan kedua :", kedua If pertama Lipat = Bagi = Else Lipat = Bagi = End IF N = 1 Do While ((Lipat*N) Mod Bagi) <> 0 'Kelipatan dinaikan jika > kedua Then pertama kedua kedua pertama 'Jika bilangan pertama lebih besar
Indoprog
17
Dasar Pemrograman
N = N + 1 Loop 'sisa bagi belum nol
Contoh : Program password, program akan terus menanyakan password sampai jawabannya benar.
password$ = "INDOPROG" DO Color 7,0 Print "Password"; Color 0,0 Input pass$ LOOP until pass$ = password$ Print "Selamat bergabung !" END
Indoprog
18
Dasar Pemrograman
11111 22222 33333 44444 55555 12345 1234 123 12 1 Jawaban A: REM Jawaban soal A
DIM i AS INTEGER DIM j AS INTEGER FOR i = 1 TO 5 STEP 1 FOR j = 1 TO 5 STEP 1 PRINT j; NEXT j PRINT NEXT i Jawaban B: REM DIM DIM FOR Jawaban Soal B i AS INTEGER j AS INTEGER i = 5 TO 1 STEP -1 FOR j = 1 TO i STEP 1 PRINT j; NEXT j PRINT NEXT i
INPUT "Jumlah Suku ?", i f1 = 1 f2 = 1 FOR n = 1 TO i STEP 1 IF n = 1 THEN PRINT f1; ELSEIF n = 2 THEN PRINT f2; ELSE fi = f1 + f2 PRINT fi; f1 = f2 f2 = fi
Indoprog
19
Dasar Pemrograman
END IF NEXT n END
Tugas 1. Buatlah program menentukan bilangan yang dimasukkan merupakan bilangan PRIMA atau tidak. Jawaban :
REM Menentukan bilangan prima atau bukan DIM bil AS LONG DIM bagi AS INTEGER DIM akar AS SINGLE INPUT "Bilangan yang akan diperiksa ?", bil IF bil < 2 THEN PRINT "Bukan Prima" ELSEIF bil < 4 THEN PRINT "Prima" ELSE akar = sqrt(bil) bagi = 2 WHILE bagi <= akar AND bil MOD bagi <> 0 bagi = bagi + 1 WEND IF bagi <= akar THEN PRINT "Bukan Prima" ELSE PRINT "Prima" END IF END IF END
2. Buatlah program mencetak tabel pertumbuhan simpanan anda di bank. Jumlah simpanan ? Suku bunga bank/tahun ? Lama simpanan ? Tabel pertumbuhan -----------------------------------------------------------Tahun Awal Tahun Bunga/tahun Pajak Akhir Tahun -----------------------------------------------------------1 2 . . . Awal Tahun 1 = Jumlah simpanan Bunga/tahun = Awal Tahun * Suku bunga bank/100 Pajak dihitung berdasarkan : Jika Awal Tahun + Bunga/tahun > 7500000 Pajak = 20% dari Bunga/tahun Jika tidak Pajak = 0 Akhir Tahun = Awal Tahun + Bunga/tahun - Pajak Awal Tahun ke n = Akhir Tahun n - 1
Indoprog
20
Dasar Pemrograman
Contoh :
DIM A(20) As Integer
Akan menciptakan variabel array yang bernama A yang memiliki 20 elemen (mulai dari index 0 s/d 19), yang masing-masing dapat menampung data integer, dan memiliki nilai awal 0 (nol).
Akan mengisi nilai 100 ke elemen pertama, 200 ke elemen kedua,dan 300 ke elemen ketiga. Catatan : Elemen pertama dari array dimulai dengan nomor index 0 Contoh lain :
For I = 0 To 19 Step 1 Input "Masukkan Nilai :",A(I) Next I
Akan menanyakan kepada pemakai untuk mengisi elemen pertama s/d elemen keduapuluh. Contoh lain :
Total = 0 For I = 0 To 19 Step 1 Total = Total + A(I) Next I Print "Total :",Total
Indoprog
21
Dasar Pemrograman
Akan menjumlahkan nilai elemen pertama s/d elemen keduapuluh ke variabel total. Dalam Basic, kita mengenal dua jenis variabel array, yakni dynamic array dan static array. Static array dapat kita bentuk tanpa perintah khusus, tetapi terbatas sampai nomor index ke 10 saja tanpa dipengaruhi jumlah dimensi. Contoh :
For I = 0 To 10 Step 1 Input "Masukkan Nilai :",B(I) Next I Total = 0 For I = 0 To 10 Step 1 Total = Total + B(I) Next I Print "Total :",Total
Program diatas dapat dijalankan tanpa kesalahan walaupun variabel array B tidak dideklarasikan sebagai variabel array. Hal ini karena kita menggunakan Static array yang otomatis disediakan oleh Basic, tetapi hanya terbatas sampai nomor index ke 10 saja. Pada defaultnya index awal dari variabel array adalah dimulai dari 0, tetapi hal ini bisa diubah dengan perintah OPTION BASE 1.
Contoh : OPTION BASE 1 DIM A(30) For I = 1 To 30 Input "Masukkan Nilai :",A(I) Next I
Index awal dari variabel array dapat juga ditentukan pada saat deklarasi. Contoh :
DIM C(5 To 15) For I = 5 To 15 Step 1 Input "Masukkan Nilai :",A(I) Next I
Akan menghasilkan variabel array C, dengan elemen pertama memiliki nomor index 5, dan elemen terakhir memiliki nomor index 15. Anda dapat juga menggunakan fungsi LBound dan UBound untuk mendapatkan index awal dan index akhir dari suatu array. Contoh :
DIM C(5 To 15)
Indoprog
22
Dasar Pemrograman
For I = LBound(C) To UBound(C) Step 1 Input "Masukkan Nilai :",A(I) Next I Latihan
1. Susun sebuah program dengan ketentuan berikut : - program menanyakan jumlah data - program menerima data sesuai dengan jumlah data satu persatu - program mengurut data tersebut secara ascending - program menghitung : 1. data terbesar 2. data terkecil 3. rata-rata 4. median
DIM jd AS INTEGER DIM i AS INTEGER DIM j AS INTEGER INPUT "Masukkan Jumlah Data ?", jd DIM dat(jd) AS INTEGER 'Baca Data FOR i = 1 TO jd STEP 1 PRINT "Masukan data ke-"; i; INPUT dat(i) NEXT i 'Urut Data FOR i = jd - 1 TO 1 STEP -1 FOR j = 1 TO i STEP 1 IF dat(j) > dat(j + 1) THEN temp = dat(j) dat(j) = dat(j + 1) dat(j + 1) = temp END IF NEXT j NEXT i 'Menghitung Total DIM Total AS LONG Total = 0 FOR i = 1 TO jd STEP 1 Total = Total + dat(i) NEXT i DIM rata AS SINGLE rata = Total / jd DIM median AS INTEGER IF jd MOD 2 = 0 THEN median = (dat(jd \ 2) + dat(jd \ 2 + 1)) / 2 ELSE median = dat(jd \ 2 + 1) END IF PRINT "Data Terbesar :", dat(i) PRINT "Data Terkecil :", dat(jd) PRINT "Ratat-rata :", rata PRINT "Median :", median END
Indoprog
23
Dasar Pemrograman
Tugas 1. Buatlah program faktur sederhana dengan ketentuan : - program menanyakan Tanggal dan Penjual - program menanyakan 1. Jumlah 2. Satuan 3. Nama barang secara berulang sampai jumlah yang dimasukkan 0 (nol) - hasil menghasilkan tampilan faktur berikut : FAKTUR PENJUALAN Tanggal : 01-Jan-1995 Penjual : Hendra Soewarno -------------------------------------------------------No. Jlh Satuan Nama Barang Harga @ Jumlah ======================================================== 1. 30 Kotak Diskette 3M 15,000.00 450,000.00 2. 10 Buah Pita printer 7,000.00 70,000.00 ======================================================== Total : 520,000.00 --------------------------------------------------------
Indoprog
24
Dasar Pemrograman
Akan mengisi nilai sinus sudut 30 derajat ke variabel B Tanpa mengunakan fungsi bantu Sinus, programmer dapat mengembangkan program sendiri untuk melakukan hal yang sama, tetapi hal ini tentu saja menuntut pengetahuan yang lebih mendalam. Contoh : Dengan menggunakan Ekspansi Trigonometris, suatu nilai Sinus dapat diturunkan.
DIM S AS DOUBLE DIM Sinus AS DOUBLE S = 30 * 3.14 / 180 ' Sudut 30 derajat F = 1 Tanda = 1 Sinus = S FOR I = 2 TO 11 F = F * I ' Menghitung nilai IF I MOD 2 = 1 THEN ' Suku 3, 5, 7, 9, Tanda = -Tanda ' Tanda -1, 1, -1, Sinus = Sinus + (S ^ I / F * Tanda) END IF NEXT I B = Sinus
dalam radian
faktorial 11 1, dst
Potongan program diatas akan menghasilkan nilai Sinus 30 derajat ke variabel B. Dengan menggunakan fungsi bantu bawaan yang telah tersedia pekerjaan programmer akan lebih terfokus pada program yang akan dikembangkan.
Indoprog
25
Dasar Pemrograman
RIGHT$ (stringexpression,n) Mengembalikan sejumlah karakter string dari suatu data string dari sebelah kanan. Contoh :
Print Right$("IndoProg",4) ' Akan mencetak Prog
MID$(stringexpression,start[,length]) Mengembalikan sejumlah karakter string dari suatu string mulai posisi tertentu. Contoh :
Print Mid$("1234567890",3,4) Print Mid$("1234567890",3) ' Akan mencetak 3456 ' Akan mencetak 34567890
RTRIM$(stringexpression) Mengembalikan string dengan menghilangkan spasi sebelah kanan. INSTR([start,]stringexpression1,stringexpression2) Mencari posisi suatu string pada string lain (0 jika tidak ditemukan). Contoh :
Print INSTR("ABCD","B") Print INSTR(4,"ABCDABCD","A") Print INSTR("ABCD","a") 'Akan mencetak 2 'Akan mencetak 5 'Akan mencetak 0
LCASE$(stringexpression) Mengembalikan suatu string yang telah diubah ke huruf kecil. Contoh :
Print LCase$("IndoProg") 'Akan mencetak indoprog
Indoprog
Dasar Pemrograman
Print Space$(30), "IndoProg"
STRING$(m,n) atau STRING$(m,stringexpression) Mengembalikan string yang mengandung sejumlah character yang berulang. Contoh :
Print String$(10,65) Print String$(10,"A") ' Akan mencetak AAAAAAAAAA ' Akan mencetak AAAAAAAAAA
Indoprog
27
Dasar Pemrograman COS(numeric-expression) TAN(numeric-expression) ATN(numeric-expression) Mengembalikan nilai trigonometri. numeric-expression dinyatakan dalam radian (sudut*3.14/180). Cukup jelas EXP(numeric-expression) Mengembalikan nilai exponential. Cukup jelas LOG(numeric-expression) Mengembalikan nilai logaritma natural. Cukup jelas SQR(numeric-expression) Mengembalikan nilai akar pangkat dua. Contoh :
Print Sqr(9) 'Akan mencetak 3
Indoprog
28
Dasar Pemrograman DATE$ Mengembalikan tanggal system dalam string dengan format mm-dd-yyyy. TIME$ Mengembalikan waktu komputer dalam string dengan format hh:mm:ss. TIMER Mengembalikan jumlah detik sejak pukul 00:00:00 TIMER dapat digunakan pada perintah RANDOMIZE TIMER. Contoh :
PROGRAM TEBAK ANGKA CLS RANDOMIZE TIMER :HASIL = INT(RND*100)+1 N = 0 DO N = N + 1 INPUT "MASUKKAN TEBAKAN ANDA (1-100)";TEBAK IF TEBAK > HASIL THEN PRINT "TERLALU BESAR" IF TEBAK < HASIL THEN PRINT "TERLALU KECIL" LOOP UNTIL HASIL=TEBAK PRINT "TEBAKAN ANDA SEBANYAK ";N;" KALI" END
Latihan : 1. Bandingkan hasil Sinus dengan fungsi bantu Sin dan Ekspansi Trigonometris. 2. Buatlah program putar String "Indonesia Programmer" dari kiri ke kanan.
REM Tulisan Putar DIM tulisan AS STRING CLS INPUT "Tulisan anda :", tulisan DO LOCATE 13, (80 - LEN(tulisan)) \ 2 PRINT tulisan tulisan = RIGHT$(tulisan, 1) + LEFT$(tulisan, LEN(tulisan) - 1) LOOP UNTIL INKEY$ <> "" END
3. Bagaimana kalau putar dari kanan ke kiri. 4. Cobalah program tebak angka, berapa kali anda mampu selesai menebaknya?
Indoprog
29
Dasar Pemrograman
type data yang dikembalikan ditentukan oleh akhiran pada nama tersebut(%, &, !, #, atau $) yang masing-masing adalah INTEGER, LONG, SINGLE, DOUBLE dan STRING. Contoh :
FUNCTION SLN#(cost AS double, salvage AS double, life AS single) SLN# = (cost-salvage)/life END FUNCTION
Fungsi diatas adalah fungsi ciptaan untuk menghitung depresiasi dengan metode garis lulus. Contoh Lain :
FUNCTION FV#(pv AS double, rate AS single, term AS integer) Dim npv as double, i as integer npv = pv FOR i = 1 TO term STEP 1 npv = npv + npv*rate 'nilai akhir = pokok + bunga NEXT i FV# = npv END FUNCTION atau dengan rumus pertumbuhan FUNCTION FV#(pv AS double, rate AS single, term AS integer) FV# = np*(1+rate)^term END FUNCTION
Fungsi diatas adalah fungsi ciptaan untuk menghitung Future Value dari suatu nilai uang, jika diketahui suku bunga per periode dan jumlah periode yang diinginkan.
Indoprog
30
Dasar Pemrograman
Contoh : Misalnya anda memiliki uang Rp. 1.000.000 (satu juta), anda menyimpannya ke Bank dengan suku bunga 10% per tahun, berapa uang anda setelah disimpan 3 tahun ? Catatan : Pada Basic, fungsi ciptaan disimpan pada lokasi yang berlainnan dengan program utama, untuk beralih ke program utama maupun fungsi ciptaan anda dapat menggunakan tombol F2 Anda dapat menggunakan perintah EXIT FUNCTION untuk keluar dari fungsi. Contoh :
FUNCTION PRIMA! (bilangan AS LONG) DIM i AS INTEGER IF bilangan < 2 THEN PRIMA! = 0 'semua bilangan < 2 bukan prima ELSEIF bilangan < 4 THEN PRIMA! = 1 'bilangan 2 dan 3 adalah prima ELSE i = 2 'bagi bilangan tersebut mulai DO WHILE i <= SQR(bilangan) 'dari 2 s/d Akar dari bilangan IF (bilangan MOD i) = 0 THEN PRIMA! = 0 'jika habis dibagi, bukan prima EXIT FUNCTION END IF i = i + 1 LOOP PRIMA! = 1 'jika tidak habis dibagi, prima END IF END FUNCTION
SUB RUTIN
Sub Rutin merupakan sebagian dari program. Adapun keuntungan dari pembentukan adalah menghindari pengetikan yang berulang-ulangterhadap bagian program yang sama, dan membuat program lebih terstruktur. Pada Basic tata cara penulisan Sub Rutin adalah sebagai berikut:
SUB namasub [(Parameterlist)] [STATIC] [statementblock]
Indoprog
31
Dasar Pemrograman
END SUB
Contoh : Sub KOTAK(Y1%,X1%,Y2%,X2%) posisiX% = POS(0) 'Simpan posisi kursor sekarang posisiY% = CRSLIN LOCATE Y1%,X1% PRINT Chr$(218);String$(X2-X1-2,196);Chr$(191) FOR I%=Y1% TO Y2% STEP 1 LOCATE I%,X1% : PRINT Chr$(179) LOCATE I%,X2% : PRINT Chr$(179) NEXT I% LOCATE Y2%,X1% PRINT Chr$(192);String$(X2-X1-2,196);Chr$(217) LOCATE POSISIY%,POSISIX% END SUB
Sub diatas akan mengambar suatu kotak ASCII single berdasarkan koordinat yang diberikan. Contoh :
CALL KOTAK(5,10,20,70)
pengiriman argumen pada Sub Procedure terdapat dua cara antara lain : Secara referensi, Argumen yang diberikan dengan cara ini kepada procedure dan diolah, kemudian hasil akhirnya akan didefinisikan pada variabel tersebut pada main program. Dengan Value/Nilai, Argumen ini hanya berupa nilai yang dipergunakan oleh procedure pada saat pengolahan. Contoh :
SUB contoh(A as INTEGER) A = 10 END SUB
Jadi anda perlu berhati-hati dalam pemakaian Variabel yang digunakan sebagai parameter pada saat pemanggilan SUB RUTIN. static, menyatakan nilai variabel local dalam function tidak dibuang ketika fungsi atau sub berakhir.
Indoprog
32
Dasar Pemrograman
Dalam Basic anda dapat menentukan tingkatan/sifat variabel yang mengatur dimana variabel itu digunakan(level of access). Inilah tingkatan tersebut : Variabel Local, hanya bisa digunakan pada Sub Procedure atau function tersebut telah selesai dikerjakan, maka variabel lokal tersebut dibuang dari memory dan tidak lagi dipergunakan oleh bagian program lain. Variabel Shared, atau variabel global bisa digunakan pada seluruh bagian program maupun Sub Procedure tertentu. Nilai variabel ini dapat berubah selama program tersebut berjalan. Variabel Static, adalah variabel local, tetapi variabel ini nilainya tetap dipertahankan sampai pemanggilan berikutnya.
Latihan : 1. Buatlah sub kotak double dan contoh pemakaiannya. 2. Buatlah fungsi ciptaan angka yang akan mencetak nama dari suatu angka yang diberikan. (0 = nol, 1 = satu, 2 = dua, , 9 = sembilan). 3. Kembangkan fungsi yang dapat menghasilkan terbilang sampai angka ribuan. (1250 = Seribu duaratus limapuluh rupiah). Tugas 1. Kembangkan fungsi yang dapat menghasilkan terbilang sampai triliunan rupiah, serta kemampuan SEN.
Indoprog
33
Dasar Pemrograman
Contoh :
Type PESERTA Nomor AS String*10 Nama AS String*20 Email AS String*30 Umur AS Integer End Type
Mendeklarasikan type data PESERTA yang merupakan kumpulan dari data Nomor, Nama, Email, dan Umur.
Mendeklarasikan variabel DataPeserta yang memiliki type PESERTA, sehingga variabel DataPeserta memiliki komponen Nomor, Nama, Email dan Umur.
Indoprog
34
Dasar Pemrograman
Dim Temp As PESERTA = = = = = = = = 9224 "Hendra Soewarno" "hendra@indoprog.com" 27 9241 "Limada" "limada@hsbc.com" 26 'komponen 'komponen 'Komponen 'Komponen 'komponen 'komponen 'Komponen 'Komponen Nomor Nama Email Umur Nomor Nama Email Umur
Record Type banyak digunakan dalam pengolahan data, dan random file karena menawarkan fleksibilitas dan kemudahan dalam pemakaiannya. Contoh :
Temp = Peserta1 Peserta1 = Peserta2 Peserta2 = Temp
atau
SWAP Peserta1, Peserta2
Menukar data Peserta1 dengan Peserta2 dan sebaliknya, tanpa perlu menyebutkan sub komponennya. Dapatkah saudara bayangkan kalau hal tersebut tidak menggunakan Record Type ? Contoh :
'Program isi data siswa dan sortir 'DEKLARASI Type SISWA NOINDUK NAMA TEORI PRAKTEK RATA End Type RECORD TYPE SISWA AS AS AS AS AS STRING * 10 STRING * 15 SINGLE SINGLE SINGLE
Input "Masukkan jumlah siswa ";JS Dim DSiswa(JS) AS SISWA 'MENGISI DATA For I = 1 TO JS STEP Print "RECORD KE Input "NO.INDUK Input "NAMA Input "TEORI Input "PRAKTEK DSISWA(I).RATA = NEXT I 'Deklarasi Array DSiswa 'berdasarkan Record Type SISWA
Indoprog
35
Dasar Pemrograman
'MENGURUT DATA BERDASARKAN NILAI RATA-RATA For I = (JS-1) TO 1 STEP -1 Sempurna = 1 For J = 1 TO I If DSISWA(J).RATA < DSISWA(J+1).RATA THEN SWAP DSISWA(J),DSISWA(J+1) Sempurna = 0 End If Next J If Sempurna = 1 I = 0 End If Next I
CLS Print " HASIL UJIAN SISWA" Print " BASIC PROGRAMMING MEI 2001" Print Print "-------------------------------------------------------------------" Print "NO.INDUK NAMA TEORI PRAKTEK RATA-RATA LULUS " Print "-------------------------------------------------------------------" POLA$="\ \ \ \ ###.## ###.## ###.## \ \ " VIEW PRINT 4 TO 23 For I = 1 TO JS IF DSISWA(I).RATA < 60 THEN LULUS$="TIDAK" ELSE LULUS$ = "YA" PRINT USING POLA$;DSISWA(I).NOINDUK;DSISWA(I).NAMA;DSISWA(I).TEORI; DSISWA(I).PRAKTEK;DSISWA(I).RATA;LULUS$ Next I END LATIHAN 1. Buatlah program untuk mengisi data berikut. NAMA SURYAJAYA SUTIMAN JUSMAN WIJAYA YUSNI TUTI GOL A C B A B A JAM KERJA 50 48 60 50 48 45
menghasilkan laporan dengan ketentuan. - Gaji Pokok PEGAWAI ditentukan sebagai berikut : Golongan Gaji Pokok/Bulan A Rp. 175.000,00 B Rp. 220.000,00 C Rp. 350.000,00 - jika jam kerja > 48 jam diberikan Bonus = (jam kerja - 48) * 5000/jam - jika jam kerja < 48 jan dikenakan Potongan = (48 - jam kerja) * 1000/jam - Total Gaji = Gaji Pokok + Bonus - Potongan Output yang diharapkan (berurut berdasarkan nama):
Indoprog
36
Dasar Pemrograman
P.T. JAYA WIJAYA JL. Kemerdekaan Barat No. 12 ============================
LAPORAN GAJI PEGAWAI ======================================================== Nama Gol Jam Gaji Bonus Potongan Total Pegawai Kerja Pokok (Rp) (Rp) (Rp) -------------------------------------------------------Suryajaya C 50 350,000 10,000 360,000 Sutiman B 48 200,000 200,000 ======================================================== Total : 560,000 ========================================================
Indoprog
37
Dasar Pemrograman
dimana mode terdiri dari : INPUT, membuka file untuk proses INPUT OUTPUT, membuka file baru untuk proses OUTPUT APPEND, membuka file untuk untuk proses OUTPUT dimana data baru bagian akhir. Contoh :
Open "Siswa.Dat" For Append AS #1
ditambahkan pada
Akan membuka Siswa.Dat sebagai OUPUT dimana data baru ditambahkan pada bagian akhir. Jika file Siswa.Dat belum ada, maka akan dibuat yang baru.
PROSES INPUT/OUTPUT
Perintah proses INPUT/OUTPUT pada sequential file sangat tergantung kepada bentuk perlakuan terhadap data. Untuk penulisan yang berorientasi pada baris, anda dapat menggunakan perintah Indoprog 38
Dasar Pemrograman
PRINT, dan pembacaanya dapat menggunakan LINEINPUT. Penulisan yang berorientasi kepada data, anda dapat menggunakan perintah WRITE dan INPUT untuk proses pembacaannya. Syntax :
PRINT #filenumber,[USING stringexpressin;]expression list WRITE #filenumber[,expressionlist] INPUT #filenumber, variablelist LINEINPUT #filenumber, variable-string
Contoh :
Write #1, "920403024","Hendra Soewarno",80,90
menulis ke file nomor 1, dan data dapat dibaca kembali dengan perintah :
Input #1,Nim$,Nama$,Teori,Praktek
Catatan : Anda dapat menggunakan fungsi bantu EOF(filenumber) untuk memeriksa apakah berada diposisi akhir file.
PROSES CLOSE
Untuk menutup file dapat digunakan perintah CLOSE. Syntax :
CLOSE #filenumber
Contoh :
CLOSE #1
Indoprog
39
Dasar Pemrograman
OPEN "SISWA.DAT" FOR INPUT AS #1 PRINT "-------------------------------------------------------------------" PRINT "NO.INDUK NAMA TEORI PRAKTEK RATA-RATA LULUS " PRINT "-------------------------------------------------------------------" POLA$="\ \ \ \ ###.## ###.## ###.## \ \ " VIEW PRINT 4 TO 23 WHILE NOT EOF(1) INPUT #1, NO_INDUK$,NAMA$,TEORI,PRAKTEK RATA = (TEORI+PRAKTEK)/2 IF RATA < 60 THEN LULUS$="TIDAK" ELSE LULUS$ = "YA" ENDIF PRINT USING POLA$;NO_INDUK$;NAMA$;TEORI;PRAKTEK;RATA;LULUS$ WEND CLOSE #1 END Latihan
Indoprog
40
Dasar Pemrograman
FILE ACAK
File acak didalam pengolahannya data ditempatkan dalam bentuk record yang memiliki panjang yang tertentu. Dengan sistem pengolahan yang demikian suatu record data dapat langsung dibaca ataupun ditulis tanpa harus memproses record sebelumnya. Dalam hal ini type data record akan berperan. Contoh :
TYPE SISWA NOINDUK NAMA TEORI PRAKTEK RATA END TYPE Dim DAT As AS AS AS AS AS STRING * 10 STRING * 15 SINGLE SINGLE SINGLE
SISWA
Contoh :
OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT)
Membuka file "siswa.rec" untuk diolah secara acak sebagai file nomor 1 dan ukuran tiap record adalah sama dengan ukuran variabel DAT. Indoprog 41
Dasar Pemrograman
Jumlah record dalam file ACAK adalah ukuran keseluruhan file ACAK dibagi dengan ukuran tiap record.
PUT #1,JlhRec+1,DAT
Menyimpan data dari variabel DAT ke file ACAK nomor 1, sebagai (JlhRec+1).
Contoh :
GET #1,1,DAT
Membaca data record nomor 1 dari file ACAK nomor 1 ke variabel DAT.
Menutup file acak nomor 1. Contoh sederhana program pengolahan data dengan file ACAK.
'PROGRAM MENGISI DATA KE FILE SISWA.REC
Indoprog
42
Dasar Pemrograman
TYPE SISWA NOINDUK AS STRING * 10 NAMA AS STRING * 15 TEORI AS SINGLE PRAKTEK AS SINGLE RATA AS SINGLE END TYPE DIM DAT AS SISWA DIM NOINDUK AS STRING OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT) RECNO = LOF(1)/LEN(DAT) DO PRINT "DATA SISWA KE -";I INPUT "NO.INDUK :",NOINDUK IF NOINDUK <> "" THEN DAT.NOINDUK = NOINDUK INPUT "NAMA :",DAT.NAMA INPUT "TEORI :",DAT.TEORI INPUT "PRAKTEK :",DAT.PRAKTEK DAT.RATA = (DAT.TEORI+DAT.PRAKTEK)/2 PUT #1,RECNO+1,DAT RECNO = RECNO + 1 ENDIF LOOP UNTIL NOINDUK = "" CLOSE #1 END 'PROGRAM MENGURUT DATA DI FILE SISWA.REC TYPE SISWA NOINDUK AS STRING * 10 NAMA AS STRING * 15 TEORI AS SINGLE PRAKTEK AS SINGLE RATA AS SINGLE END TYPE DIM DAT1 AS SISWA DIM DAT2 AS SISWA OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT) JD = LOF(1)/LEN(DAT) FOR I = (JD-1) TO 1 STEP -1 Sempurna = 1 FOR J = 1 TO I STEP 1 GET #1,J,DAT1 GET #1,J+1,DAT2 IF DAT1.NAMA > DAT2.NAMA THEN PUT #1,J,DAT2 PUT #1,J+1,DAT1 Sempurna = 0 ENDIF NEXT J If Sempurna = 1 Then I = 0 End IF NEXT I CLOSE #1 END
Indoprog
43
Dasar Pemrograman
PROGRAM BACA DATA DARI SISWA.REC DAN MENCETAK KE LAYAR CLS TYPE SISWA NOINDUK AS STRING * 10 NAMA AS STRING * 15 TEORI AS SINGLE PRAKTEK AS SINGLE RATA AS SINGLE END TYPE DIM DAT AS SISWA OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT) JD = LOF(1)/LEN(DAT) PRINT -------------------------------------------------------------------" PRINT "NO.INDUK NAMA TEORI PRAKTEK RATA-RATA ULUS " PRINT "-------------------------------------------------------------------" POLA$="\ \ \ \ ###.## ###.## ###.## \ \ " VIEW PRINT 4 TO 23 FOR I = 1 TO JD STEP 1 GET #1,I,DAT IF DAT.RATA < 60 THEN LULUS$="TIDAK" ELSE LULUS$ = "YA" PRINT USING POLA$;DAT.NOINDUK;DAT.NAMA$;DAT.TEORI; DAT.PRAKTEK;DAT.RATA;LULUS$ NEXT I CLOSE #1 END LATIHAN Buatlah program yang dapat menyimpan data latihan Modul 10 ke Siswa.rec.
Indoprog
44
Dasar Pemrograman
Contoh :
OPEN "Sandi.bin" FOR BINARY AS #1
Membuka file "Sandi.bin" untuk diolah secara binary sebagai file nomor 1. Mendapatkan jumlah byte pada file binary yang telah terbuka.
JlhByte = LOF(1)
Fungsi LOF (Length Of File) akan mengembalikan ukuran file binary dalam ukuran byte.
Catatan : 1 KB = 1024 Byte, 1 MB = 1024*1024
Contoh :
MyData = 10 PUT #1, 101, MyData Menulis karakter ASCII 10 (line feed) pada posisi byte ke 101 dalam file nomor 1.
Dasar Pemrograman
Contoh :
Dim MyChar As String*1 GET #1, 101, MyChar
Indoprog
46
Dasar Pemrograman
FOR I = 1 TO FSize GET #1, I, MyChar
'Baca byte posisi ke i 'dari source MyChar = CHR$(255 - ASC(MyChar)) 'Enkripsi dengan NOT PUT #2, I, MyChar 'Tulis ke posisi ke i 'Pada Target
Indoprog
47
Dasar Pemrograman
Program diatas tidak pernah berhenti. karena nilai N tidak pernah sama dengan 10. Kesalahan Logika dapat juga terjadi karena kesalahan pengetikan nama variabel, dan ini merupakan salah satu kelemahan bahasa pemrograman Basic, jika dibandingan dengan Pascal muapun C Language dimana variabel harus dideklarasikan terlebih dahulu. Contoh :
GajiPokok = 1000000 Bonus = 10000 GajiBersih = GajiPokol + Bonus Print GajiBersih
3. Runtime Error, adalah kesalahan yang disebabkan oleh tidak tersedianya sumber daya atau kondisi yang normal bagi program untuk berjalan dengan baik, misalnya kekurangan memori komputer, disk full, atau pintu drive tidak terkunci, dll. Sebagai programmer yang baik, tentu saja harus mampu menghasilkan program dengan tingkat kesalahan yang minimal, dan usaha untuk meminimalisasi tingkat kesalahan program disebut proses debug. Pada Basic tersedia berbagai fasilitas untuk menangani kesalahan yang mungkin dilakukan oleh programmer, misalnya :
Indoprog
48
Dasar Pemrograman
4. Fasilitas Syntax Checking pada menu Option yang sangat berguna untuk mendeteksi kesalahan jenis "Syntax Error". 5. Menu Debug, yang memiliki fasilitas yang sangat bermanfaat untuk melacak Logical Error, tetapi keberhasilannya sangat tergantung kepada pemahaman programmer akan masalah yang terjadi. Adapun fasilitas pada menu Debug adalah sebagai berikut : Step atau F8, digunakan untuk menjalankan program baris per baris, sehingga programmer dapat mengamati alur program secara baris perbaris sambil mengevaluasi hasil output yang dihasilkan. Procedure Step atau F10, digunakan untuk menjalankan program baris per baris tanpa masuk ke bagian sub rutin, artinya sub rutin dianggap sebagai satu baris dari program. Fasilitas ini digunakan jika programmer telah yakin pada kebenaran sub rutin yang dibuat, sehingga proses pencarian lebih terfokus pada bagian tertentu. Trace On, digunakan untuk memberikan sorotan pada baris yang sedang dijalankan. Toggle BreakPoint, digunakan untuk menandai baris dimana proses eksekusi Pause dan masuk ke modus Step, fasilitas ini dapat digunakan programmer untuk memperkecil jangkauan pencarian kesalahan dengan modus Step karena tidak perlu melakukan Step dari awal, tetapi Step dilakukan mulai pada baris dimana sumber kesalahan dicurigai. Clear Breakpoint, digunakan untuk menghapus semua Breakpoint. On Error Goto label, digunakan untuk error handling, dimana jika terjadi kesalahan, maka proses program dialihkan ke label tertentu, dan jenis kesalahan dapat ditelusuri dari fungsi ERR yang akan mengembalikan nomor kesalahan, dan proses dapat diulangi dengan RESUME atau RESUME NEXT , dan anda dapat juga menggunakan On Error Resume Next untuk mengabaikan kesalahan. Fasilitas ini cocok untuk mengatasi Run Time Error, Contoh :
ON ERROR GOTO Salah OPEN "A:Sumber.Dat" FOR INPUT AS #1 DO WHILE NOT EOF(1) LINE INPUT #1, Baris$ PRINT Baris$ LOOP END Salah: SELECT CASE ERR CASE 53 PRINT "File Sumber.Dat tidak ada" END CASE 71 PRINT "Drive tidak siap, [U]lang, [B]atal"; INPUT tanya$ IF tanya$ = "U" OR tanya$ = "u" THEN RESUME ELSE END END IF
Indoprog
49
Dasar Pemrograman
END SELECT END
Catatan : Nomor Error dapat dilihat pada bagian Help Basic "Runtime Error Code"
Indoprog
50
Hendra, S.T.
Menjalankan IDE
Salah satu cara untuk mengaktifkan IDE Visual Basic adalah menjalankannya dari Menu Start, pilih menu Command, dan pilih Microsoft Visual Basic 6.0 dan akhirnya Microsoft Visual Basic 6.0.
Indoprog
Hendra, S.T.
Catatan : Seperti aplikasi Windows umumnya, anda dapat juga mengaktifkan IDE Visual Basic dengan melakukan open terhadap file yang berkaitan dengan Visual Basic, misalnya file *.vbp yang merupakan file project dari Visual Basic.
Gambar 1-2. Dialog box New Project ditampilkan sesaat anda menjalankan IDE Visual Basic 6.
Jendela IDE
IDE Visual Basic 6 menggunakan model MDI (Multiple Document Interface). Berikut ini adalah gambar yang menunjukan bagian-bagian dan nama-nama jendela yang dapat tampil pada IDE Visual Basic. Mungkin pada IDE anda hanya ditampilkan sebagian
Indoprog
Hendra, S.T.
jendela dibandingkan dengan Gambar 1-3 anda tidak perlu terkejut, karena penampilan dari jendela-jendela tersebut dapat diatur dengan perintah pada menu View. Sebagai langkah awal dari proses belajar, tidak semua jendela akan kita gunakan, tetapi hanya beberapa yang penting, sedangkan yang lainnya bersifat khusus.
Gambar 1-3. IDE Visual Basic dengan jendela-jendela yang terbuka. Sebagaimana dengan proses belajar ini, kita akan fokus pada beberapa jendela yang penting terlebih dahulu sehingga konsentrasi tidak menjadi pecah, dan peserta belajar menjadi bingung. Adapun jendela-jendela yang perlu anda perhatikan adalah sebagai berikut :
Menu Bar, digunakan untuk memilih tugas-tugas tertentu seperti menyimpan project, membuka project, dll
Indoprog
Hendra, S.T.
Main Toolbar, digunakan untuk melakukan tugas-tugas tertentu dengan cepat. Jendela Project, jendela ini berisi gambaran dari semua modul yang terdapat dalam aplikasi anda. Anda dapat menggunakan icon Toggle Folders untuk menampilkan modul-modul dalam jendela tersebut secara di group atau berurut berdasarkan nama. Anda dapat menggunakan Ctrl+R untuk menampilkan jendela project, ataupun menggunakan icon Project Explorer. Jendela Form Designer, jendela ini merupakan tempat anda untuk merancang user interface dari aplikasi anda. Jadi jendela ini menyerupai kanvas bagi seorang pelukis. Jendela Toolbox, jendela ini berisi komponen-komponen yang dapat anda gunakan untuk mengembangkan user interface. Jendela Code, merupakan tempat bagi anda untuk menulis koding. Anda dapat menampilkan jendela ini dengan menggunakan kombinasi Shift-F7. Jendela Properties, merupakan daftar properti-properti object yang sedang terpilih. Sebagai contohnya anda dapat mengubah warna tulisan (foreground) dan warna latarbelakang (background). Anda dapat menggunakan F4 untuk menampilkan jendela properti. Jendela Color Palette, adalah fasilitas cepat untuk mengubah warna suatu object. Jendela Form Layout, akan menunjukan bagaimana form bersangkutan ditampilkan ketika runtime.
Jika jendela-jendela tersebut tidak ada, anda dapat memunculkannya dengan Menu View dan pilih :
Project Explorer (Ctrl+R) Properties Windows (F4) Form Layout Windows Property Pages (Shift+F4) Toolbox Color Pallete Toolbars
Toolbox
Jendela Toolbox merupakan jendela yang sangat penting bagi anda. Dari jendela ini anda dapat mengambil komponen-komponen (object) yang akan ditanamkan pada form untuk membentuk user interface.
Indoprog
Hendra, S.T.
Gambar 1-3. Toolbox Visual Basic 6 dengan semua kontrol intrinsic. Adapun secara garis besar fungsi dari masing-masing intrinsic kontrol tersebut adalah sebagai berikut :
Pointer bukan merupakan suatu kontrol; gunakan icon ini ketika anda ingin memilih kontrol yang sudah berada pada form. PictureBox adalah kontrol yang digunakan untuk menampilkan image dengan format: BMP, DIB (bitmap), ICO (icon), CUR (cursor), WMF (metafile), EMF (enhanced metafile), GIF, dan JPEG. Label adalah kontrol yang digunakan untuk menampilkan teks yang tidak dapat diperbaiki oleh pemakai.
Indoprog
Hendra, S.T.
TextBox adalah kontrol yang mengandung string yang dapat diperbaiki oleh pemakai, dapat berupa satu baris tunggal, atau banyak baris. Frame adalah kontrol yang digunakan sebagai kontainer bagi kontrol lainnya. CommandButton merupakan kontrol hampir ditemukan pada setiap form, dan digunakan untuk membangkitkan event proses tertentu ketika pemakai melakukan klik padanya. CheckBox digunakan untuk pilihan yang isinya bernilai yes/no, true/false. OptionButton sering digunakan lebih dari satu sebagai pilihan terhadap beberapa option yang hanya dapat dipilih satu. ListBox mengandung sejumlah item, dan user dapat memilih lebih dari satu (bergantung pada property MultiSelect). ComboBox merupakan konbinasi dari TextBox dan suatu ListBox dimana pemasukkan data dapat dilakukan dengan pengetikkan maupun pemilihan. HScrollBar dan VScrollBar digunakan untuk membentuk scrollbar berdiri sendiri. Timer digunakan untuk proses background yang diaktifkan berdasarkan interval waktu tertentu. Merupakan kontrol non-visual. DriveListBox, DirListBox, dan FileListBox sering digunakan untuk membentuk dialog box yang berkaitan dengan file. Shape dan Line digunakan untuk menampilkan bentuk seperti garis, persegi, bulatan, oval. Image berfungsi menyerupai image box, tetapi tidak dapat digunakan sebagai kontainer bagi kontrol lainnya. Sesuatu yang perlu diketahui bahwa kontrol image menggunakan resource yang lebih kecil dibandingkan dengan PictureBox Data digunakan untuk data binding OLE dapat digunakan sebagai tempat bagi program eksternal seperti Microsoft Excel, Word, dll.
Mengatur Editor
Indoprog
Hendra, S.T.
Catatan penulis: Sebagai programmer pemula, penulis menyarankan agar senantiasa mengaktifkan Require Variable Declaration yang berarti bahwa setiap variabel yang dipakai dalam program yang akan kita buat harus dideklarasikan terlebih dahulu.
Indoprog
Hendra, S.T.
Mengatur Environment
Indoprog
Hendra, S.T.
Indoprog
Hendra, S.T.
Catatan Penulis : Pada latihan berikut ini mengandung pembelajaran step by step, tetapi sebelum anda memulai latihan ini sebaiknya anda membaca semua tulisan modul ini. Penulis tidak akan berpanjang lebar dengan teori-teori pemrograman, tetapi sebaiknya kita dapat langsung bekerja dan memahami dasar-dasar dari Visual Basic. Semua latihan ini dirancang berdasarkan pengalaman penulis dalam pengajaran untuk proses pembelajaran yang efektif
Latihan 1
Judul : Mengenal IDE Visual Basic
Petunjuk, sebaiknya lembar latihan ini anda cetak ke printer. 1. Aktifkan IDE Visual Basic anda dengan memilih Start, kemudian Programs, kemudian Microsoft Visual Basic 6, dan Microsoft Visual Basic 6.
2. Pada dialog box New Project, pilihlah Standard EXE, kemudian klik pada Open
3. Pada hadapan anda akan muncul IDE Visual Basic, dan kenali masing-masing bagian berikut : Indoprog
10
Hendra, S.T.
Menu Bar Main Toolbar Jendela Toolbox Jendela Form Jendela Project Explorer Jendela Properties
4. Sekarang Perhatikan Jendela Toolbox, dan kenali kontrol-kontrol berikut : Pointer PictureBox Label Textbox Frame CommandButton Checkbox OptionButton Combobox Listbox Image
Indoprog
11
Hendra, S.T.
5. Sekarang Perhatikan Jendela Project Explorer Perhatikan Icon-icon berikut : Icon Fungsi View Code View Object Toggle Forder Lakukan klik pada Form1 (Form1), dan klik pada icon View Code, maka akan ditampilkan Jendela Code
Lakukan klik pada icon View Object, maka akan ditampilkan Form1
6. Periksalah setting IDE Visual Basic, dan aktifkan hal-hal berikut pada menu Tools, Option :
Auto Syntax Check, secara otomatis memeriksa kebenaran pengetikan program. Require Variable Declaration, secara otomatis menambahkan perintah Option Explicit pada form dan module.
Indoprog
12
Hendra, S.T.
Auto List Member, secara otomatis menampilkan syntax penulisan perintah dan fungsi
Keluar dari IDE Visual Basic, dengan memilih menu File, pilih Exit, atau menekan Alt+Q
Indoprog
13
Hendra, S.T.
Type Variabel
Dibandingkan dengan type data yang terdapat pada bahasa basic, maka pada VBA, type data yang disediakan lebih banyak, seperti type Currency, Decimal, Object, dan Variant.. Variant merupakan type variabel yang istimewa, karena dapat berubah dari satu type ke type yang lain, sesuai dengan evaluasi ekspresi oleh Visual Basic. Ketepatan pemilihan type variabel akan sangat menentukan pemakaian resources oleh aplikasi yang dihasilkan, adalah tugas programmer untuk memilih type yang sesuai untuk menghasilkan program yang efisien dan berperfomance tinggi.
Type Data Byte Boolean Integer Long Single Double Currency Decimal Date Object String (panjang variabel) String (panjang tetap) Variant (dengan angka) Ukuran Storage 1 byte 2 byte 2 byte 4 byte 4 byte 8 byte 8 byte 14 byte 8 byte 4 byte panjang dari string 16 byte Jangkuan 0 s/d 255 True atau False -32,768 s/d 32767 -2,147,483,648 s/d 2,147,483,647 -3.402823E38 s/d -1.401298E-45 (-) 1.401298E-45 s/d 3.402823E38 (+) -1.79769313486232E308 s/d -4.94065645841247E-324 (-) -922,337,203,685,477.5808 s/d 922,337,203,685,477.5807 +/-79,228,162,514,264,337,593,543,950,335 1 Januari 100 s/d 31 Desember 9999 Mengacu pada objek tertentu 1 sampai lebih kurang 65,400 Sembarang angka sampai jangkauan jenis Double
Variant (dengan karakter) 22 byte + panjang string Sama dengan jangkauan variabel String
Tabel 1-1. Type variabel, pemakaian storage dan jangkauan masing-masing Catatan penulis : Sebagai awal proses belajar, anda tidak perlu terlalu dipusingkan oleh banyaknya tipe data yang disediakan oleh Visual Basic, yang penting adalah kalau anda membutuhkan tipe data berupa kondisi benar (true) atau salah (false), anda dapat menggunakan tipe Boolean. Kalau anda membutuhkan bilangan bulat (integer), anda dapat memilih salah satu dari byte, integer, long sesuai dengan jangkauan yang dibutuhkan, sedangkan kalau anda membutuhkan tipe pecahkan (floating point) anda dapat memilih single, double, dan decimal sesuai dengan ketelitian yang dibutuhkan. Khusus untuk uang dapat digunakan Indoprog
14
Hendra, S.T.
currency, khusus untuk tanggal dan waktu dapat digunakan date, dan untuk kalimat dapat digunakan string. Ada apa dengan Variant ? Variant merupakan tipe data khusus yang sangat digemari oleh programmer pemula, karena variabel dengan tipe data ini dapat menampung data dari semua tipe variabel yang ada tanpa menyebabkan kesalahan pada saat kompilasi maupun runtime. Tetapi penulis menyarankan untuk tidak terlena dengan tipe data ini, karena pada pengembangan selanjutnya (VB.net), tipe data ini tidak didukung lagi, karena tipe ini dapat menyebabkan bugs jika program telah berkembang menjadi besar.
Tabel 1-2. Operator pada Visual Basic dan urutan operasi dari atas ke bawah Catatan penulis : Salah satu bugs yang sering terjadi pada programmer pemula adalah kesalahan dalam pemakaian operator karena kurangnya memahami urutan operasi.
Operator Like
Salah satu operator yang menarik untuk dibahas adalah operator like, karena operator ini tidak tersedia pada bahasa BASIC. Operator digunakan untuk operasi pencocokan pola pada string yang akan sangat membantu programmer. Indoprog
15
Hendra, S.T.
Tabel 1-3. Character dalam pencocokan pola pada operator Like Contoh :
MyCheck = "aBBBa" Like "a*a" MyCheck = "F" Like "[A-Z]" MyCheck = "F" Like "[!A-Z]" MyCheck = "a2a" Like "a#a" MyCheck = "aM5b" Like "a[L-P]#[!c-e]" MyCheck = "BAT123khg" Like "B?T*" MyCheck = "CAT123khg" Like "B?T*"
' Returns True. ' Returns True. ' Returns False. ' Returns True. ' Returns True. ' Returns True.
Deklarasi Variabel
Visual Basic memungkinkan kita untuk menggunakan variabel tanpa deklarasi. Tetapi hal ini adalah kurang baik untuk praktek pemrograman yang terstruktur dan menghindari kesalahan pengolahan yang diakibatkan oleh kesalahan dalam pengetikkan nama variabel. Agar setiap variabel yang digunakan harus dideklarasikan, dapat digunakan perintah : Option Explicit Pada setiap awal module, atau pada menu Tools, pilih Option, pilih tab Editor, buat tanda check pada Require Variable Declaration. Deklarasi variabel pada Visual Basic dapat dilakukan dengan Keyword berikut :
Keyword Public Private Dim Static Digunakan pada Berlaku pada level modul Berlaku pada level modul Berlaku pada level modul dan level procedure Berlaku pada level procedure
Indoprog
16
Hendra, S.T.
Syntax : <keyword> NamaVariabel [As TypeVariabel] Contoh : Dim Nama As String Catatan penulis : Penjelasan tentang Public, Private, dan Static akan menjadi lebih mudah setelah anda mempelajari topik Module, Sub dan Function.
Harus dimulai dengan suatu Huruf Tidak dapat mengandung titik atau spesial karakter Tidak dapat lebih dari 255 huruf, nama dari kontrol, form, class, dan module tidak dapat melebihi 40 karakter. Tidak dapat sama dengan keywords yang tercadang.
Keyword yang tercadang adalah kata yang Visual Basic gunakan sebagai bagian dari bahasanya. Ini terdiri dari predefined statements (seperti If dan Loop), function (seperti Len dan Abs), dan operator (seperti Or dan Mod).
Deklarasi Variabel
Deklarasi variabel pada bagian deklarasi (general declaration) di suatu form, standard, atau class module, dari pada dalam suatu procedure, membuat variabel itu berlaku untuk semua procedure dan function dalam module tersebut Deklarasi variabel dengan menggunakan keyword Public membuatnya berlaku pada keseluruhan aplikasi anda. Deklarasi suatu variabel lokal dengan menggunakanan keyword Static akan menyimpan nilainya ketika suatu procedure berakhir.
Deklarasi Implicit
Anda tidak perlu mendeklarasikan suatu variabel sebelum menggunakan, tetapi fasilitas ini tidak disarankan oleh penulis, karena dapat mengakibatkan bug-bug tersembunyi
Indoprog
17
Hendra, S.T.
karena pemakaian variabel yang tidak konsisten dan kemungkinan kesalahan pengetikan nama variabel. Defaultnya Visual Basic menggunakan Deklarasi Implicit.
Deklarasi Explicit
Untuk mencegah kesalahan mengetik variabel, dan Visual Basic akan selalu memberikan peringatan jika menemukan nama yang tidak dideklarasikan terlebih dahulu sebagai suatu variabel. Catatan : Pernyataan Option Explicit hanya bekerja per-module, sehingga harus diletakkan pada bagian deklarasi pada setiap form, dan class module yang mana anda ingin Visual Basic memaksakan suatu explicit variabel deklarasi
Struktur Keputusan
Struktur keputusan yang didukung oleh Visual Basic adalah sebagai berikut :
If...Then
Gunakan suatu struktur If...Then untuk menjalankan suatu pernyataan secara kondisional. Anda dapat menggunakan syntax satu baris ataupun syntax banyak baris : If kondisi Then pernyataan atau If kondisi Then pernyataan-pernyataan End If Kondisi biasanya berupa suatu perbandingan, maupun ekspresi yang menghasilkan nilai numerik. Visual Basic menginterpretasikan False sebagai nol (0), dan True sebagai bukan nol.
Indoprog
18
Hendra, S.T.
If...Then...Else
Gunakan IfThenElse untuk mendefinisikan beberapa blok pernyataan yang akan dijalankan salah satu berdasarkan kondisi yang memenuhi syarat If kondisi1 Then [blok pernyataan-1] [ElseIf kondisi2 Then [blok pernyataan-2]] ... [Else [blok pernyataan-n]] End If Visual Basic awalnya akan mencoba kondisi1. Jika False, maka Visual Basic akan memeriksa kondisi2, dan seterusnya sampai menemukan suatu kondisi True untuk dijalankan blok pernyataannya. Contoh :
If JlhRec > 0 Then Posisi = 1 Else Posisi = 0 End If
Select Case
Visual Basic menyediakan struktur Select Case sebagai suatu alternatif terhadap If...Then...Else. Suatu Select Case statement memiliki kemampuan yang sama dengan IfThenElse, tetapi membuat code lebih mudah dibaca. Struktur Select Case bekerja dengan suatu percobaan tunggal yang hanya dievaluasi satu kali pada bagian atas struktur. Visual Basic then membandingkan hasil ekspresi dengan nilai pada setiap Case didalam struktur tersebut, jika ada yang sesuai, akan dijalankan blok statement yang sesuai Select Case ekspresiyangdicoba [Case ekspresi1 [blokpernyataan-1]] [Case ekspresi2 [blokpernyataan-2]] [Case Else [blokpernyataan-n]] End Select Indoprog
19
Hendra, S.T.
Contoh :
Select Case x Case 0: angka = "Nol" Case 1: If posisi = 1 Then angka = "Satu " Else angka = "Se" End If Case 2: angka = "Dua " Case 3: angka = "Tiga " Case 4: angka = "Empat " Case 5: angka = "Lima " Case 6: angka = "Enam " Case 7: angka = "Tujuh " Case 8: angka = "Delapan " Case 9: angka = "Sembilan " Case 10: angka = "Sepuluh " Case 11: angka = "Sebelas " Case 12: angka = "Duabelas " Case 13: angka = "Tigabelas " Case 14: angka = "Empatbelas " Case 15: angka = "Limabelas " Case 16: angka = "Enambelas " Case 17: angka = "Tujuhbelas " Case 18: angka = "Delapanbelas " Case 19: angka = "Sembilanbelas " End Select
Deklarasi Konstanta
Anda sering menjumpai suatu kode yang mengandung nilai yang berulang-ulang ataupu nilai yang memiliki arti khusus, atau anda menemukan bahwa angka tersebut susah diingat. Dalam hal ini anda dapat membuat code anda menjadi lebih mudah dibaca-lebih mudah ditangani-dengan menggunakan suatu konstanta. Suatu konstanta adalah nama yang menyimpan dari suatu nilai yang tidak dapat berubah. Ada dua sumber dari suatu konstanta :
Intrinsic atau System-defined konstanta yang disediakan oleh suatu aplikasi atau control. Konstanta Visual Basic terdaftar pada Visual Basic (VB), Visual Basic for Application (VBA), dan Data Access (DAO). Symbolic atau User-defined konstanta adalah dideklarasikan dengan menggunakan statement Const.
Indoprog
20
Hendra, S.T.
Membuat suatu konstanta yang mana hanya ada dalam suatu procedure, deklarasikan di dalam procedure tersebut Membuat suatu konstanta berlaku pada semua procedure dalam suatu module, deklarasikan dia pada bagian deklarasi di module tersebut Membuat suatu konstanta berlaku pada semua aplikasi, deklarasikan dia dengan keyword Public sebelum kata Const.
Struktur Perulangan
Struktur loop memperbolehkan anda untuk melaksanakan sekelompok baris lebih dari satu kali :
Do...Loop
Gunakan Do loop untuk mengeksekusi suatu blok statement dengan jumlah perulangan yang tak terhingga, ada beberapa Do...Loop statement, tetapi masing-masing mengevaluasi suatu kondisi untuk menentukan apakah melanjutkan eksekusi Berikut ini adalah statement DoLoop, yang dijalankan selama kondisi benar :
Do While condition statements Loop
Ketika Visual menjalankan Do loop ini, pertama kali akan di coba kondisinya, jika kondisi False (zero), akan diloncati semua statements yang mengikuti kondisi tersebut. Visual Basic akan menjalankan statements jika kondisi benar dan kembali ke DoLoop berikutnya.
Function Faktorial (x) Dim Hasil As Double Dim Count As Long Hasil = 1 count = 2 Do While Count <= x Hasil = Hasil * count count = count + 1 Loop
Indoprog
21
Hendra, S.T.
Variasi lain dari statement DoLoop, yang menjamin minimal satu kali statement dijalankan :
Do statements Loop While condition
Dua variasi yang analog dengan dua contoh sebelumnya adalah perulangan minimal satu kali. Dan berikut ini adalah berulang atau tidak sama sekali :
Do Until condition statements Loop Do statements Loop Until condition
For...Next
Do loops bekerja dengan baik, ketika anda tidak tahu berapa bayak kali untuk butuhkan untuk menjalankan statement. Ketika anda mengetahui harus menjalankan statement sejumlah kali, bagaimanapun ForNext adalah pilihan yang lebih baik. Tidak seperti Do Loop, Forloop menggunakan suatu variabel yang disebut counter yang mana akan bertambah atau berkurang pada setiap perulangan. Syntaxnya adalah :
For counter = start To end [Step increment] statements Next [counter]
Argumen counter, start, end, dan increment semuanya adalah numerik 1. Dalam melakukan For loop, Visual Basic : 2. Menset nilai counter sama dengan start 3. Mencoba apakah counter lebih besar dari end. Jika ya, Visual Basic meninggalkan looping tersebut. 4. Menjalankan statements tersebut. 5. Menaikkan counter dengan 1 atau dengan nilai step yang ditentukan 6. Mengulangi langkah 2 sampai 4 Code berikut akan mencetak semua item yang terdapat pada suatu daftar list.
Private Sub Form_Click () Dim I As Integer For i = 0 To List1.ListCount-1 Print List1.List(I) Next End Sub
Indoprog
22
Hendra, S.T.
Statement Exit Do bekerja pada semua versi syntax Do loop. Exit For dan Exit Do adalah kadang-kadang perlu untuk keluar dari suatu loop dengan segera, tanpa melakukan iterasi yang berikutnya.
Sesaat setelah anda menambahkan module, maka pada Jendela Project Explorer akan nampak Module1
Indoprog
23
Hendra, S.T.
Untuk melakukan koding, anda dapat melakukan double klik pada Module tersebut.
Indoprog
24
Hendra, S.T.
Contoh :
Sub Tengah(x) x.Move (Screen.Width - x.Width) \ 2, _ (Screen.Height - x.Height) \ 2 End Sub
Mengenal Procedure
Procedure digunakan untuk memadatkan tugas-tugas berulang ataupun proses yang digunakan bersama, seperti perhitungan yang sering dilakukan, text dan manipulasi kontrol, serta operasi database. Secara umum ada dua keuntungan dengan pemakaian procedure dalam program : Procedure memungkinkan anda untuk memecahkan program anda pada unit logika yang lebih kecil, sehingga anda dapat dengan mudah melakukan proses debug dari pada jika keseluruhan program tanpa menggunakan procedure. 2. Procedure yang digunakan dalam suatu program dapat bertindak sebagai suatu blok yang dibangun untuk program lain dengan sedikit perubahan atau tanpa perubahan sama sekali.
1.
Sub procedure yang tidak menggembalikan nilai Function procedure yang mengembalikan nilai Property procedure yang dapat mengembalikan nilai dan diisi nilai yang mengacu pada suatu objek.
Sub Procedure
Syntax penulisan Sub procedure: [Private|Public][Static]Sub namaprosedur (argumen-argumen) pernyataan-pernyataan End Sub Setiap kali procedure dipanggil, maka pernyataan-pernyataan yang berada di antara Sub dan End Sub akan dijalankan. Argumen pada procedure adalah nilai yang akan dilewatkan saat pemanggilan procedure.
Indoprog
25
Hendra, S.T.
Event Procedure , Procedure yang diaktifkan oleh system sebagai respon terhadap event.
Contoh, sub Tengah yang dapat digunakan untuk menampilkan form ketengah Layar, dimana x adalah parameter yang merupakan form yang akan dibuat ketengah layar.
Sub Tengah(x As Form) x.Top = (Screen.Height - x.Height) \ 2 x.Left = (Screen.Width - x.Width) \ 2 End Sub Private Sub Form_Load() Call Tengah(Me) End Sub
Function Procedure
Pada Visual Basic telah tersedia berbagai fungsi bawaan seperti Sqr, Cos, dan Chr, tetapi fungsi-fungsi yang tersedia tersebut bersifat umum dan kandang-kadang tidak memenuhi kebutuhan programer, untuk keperluan tersebut anda dapat menciptakan fungsi-fungsi sendiri yang dikenal dengan Function procedure. Adapun syntax penulisan function procedure : [Private|Public][Static]Function namaprocedure (argumen-argumen) [As type] statements End Function Ada tiga perbedaan antara function dan procedure :
Umumnya anda dapat memanggil suatu function dengan mengikutkan nama function sisi kanan dari statement atau ekspresi. (returnvalue = function()). Function memiliki type data seperti suatu variabel. Ini menentukan type yang dari nilai yang dikembalikan. Nilai kembali dimasukkan ke namafunction itu sendirinya, dan suatu function dapat menjadi bagian dari suatu ekspresi yang panjang.
Contoh Fungsi ciptaan untuk mengembalikan nama bulan dari suatu tanggal dalam bahasa Indonesia.
Indoprog
26
Hendra, S.T.
Indoprog
27
Hendra, S.T.
Latihan 2
Judul : Project anda yang pertama
Petunjuk, sebaiknya lembar latihan ini anda cetak ke printer. 1. Aktifkan IDE Visual Basic dan pilih Standard EXE. 2. Pada form1 tanamkan kontrol label (Label1, Label2, Label3) dan kontrol text (Text1, Text2, Text3), serta CommandButton (Command1 dan Command2)
Caranya : Pada jendela toolbox, klik pada kontrol label, kemudian gambarkan pada Form1, lakukan hal sama untuk Label2 dan Label3, demikian juga untuk Textbox dan CommandButton. Anda dapat juga melakukan dengan cara double klik pada kontrol label pada toolbox dan kemudian dengan drag & drop memindahkan posisinya pada form1
Catatan : Kontrol, kontrol tersebut ditanamkan satu per satu, dan jangan menggunakan cara Copy dan Paste karena akan menyebabkan kontrol-kontrol tersebut menjadi kontrol array. 3. Aturlah properti-properti dari masing-masing kontrol sehingga menjadi sebagai berikut:
Indoprog
28
Hendra, S.T.
Caranya : Klik pada form1, kemudian pada jendela properti cari baris name, kemudian ketik nilainya MyForm, kemudian cari baris caption, kemudian ketik nilainya menjadi Program Menghitung Luas Persegi. Klik pada Label1, kemudian pada jendela properti cari baris caption, kemudian ketik nilainya &Panjang. Lakukan juga untuk kontrol lainnya berdasarkan tabel berikut. Catatan : Untuk menampilkan jendela properties, anda dapat menggunakan F4
Properti Name Caption Caption Caption Caption Name Text Name Text Name Text Name Caption
Nilai Myform Program Menghitung Luas Persegi &Panjang &Lebar Lu&as txtPanjang "" txtLebar "" txtLuas "" cmdHitung &Hitung
Command2
Name Caption
cmdSelesai &Selesai
Catatan : tanda ampersand & pada Visual Basic digunakan sebagai penanda kunci akses penekanan Alt oleh pemakai. 4. Lakukan koding untuk menghitung Luas, ketika pemakai melakukan klik atau Alt H, pada cmdHitung
Caranya :
Indoprog
29
Hendra, S.T.
Lakukan double klik pada kontrol cmdHitung, sehingga akan muncul jendela koding dan procedure event cmdHitung_Click : Private Sub cmdHitung_Click() End Sub procedure event, adalah subrutin yang akan dibangkitkan oleh aplikasi, ketika pemakai melakukan klik pada kontrol cmdHitung. Perintah-perintah yang anda ketik diantara Sub dan End Sub akan dijalankan. Cara lain : Tekan F7 untuk menampilkan jendela koding, kemudian pilih nama kontrol dari daftar kontrol seperti gambar berikut :
kemudian pilih daftar kejadian (event) seperti yang ditunjukkan pada gambar berikut :
Catatan : sebaiknya anda senantiasa menggunakan salah satu cara diatas untuk melakukan koding untuk menjamin kebenaran penulisan pada masing-masing event procedure.
Lakukan juga koding untuk cmdSelesai : Private Sub cmdSelesai_Click() Unload Me End Sub 5. Tampilkan kembali MyForm dengan klik View Object pada jendela Project Explorer
Indoprog
30
Hendra, S.T.
6. Menyimpan project : Buatlah bernama C:\VB2 Klik pada icon save atau gunakan menu File, dan pilih
Pilih Save in pada folder Vb2, dan nama form MyForm.frm, dan klik Save
Pada proses penyimpanan diatas akan menghasilkan file berikut : MyForm.frm, MyProject1.vbp, dan MyProject1.vbw. Coba periksa ini folder C:\VB2
7. Jalankan program anda dengan klik pada atau tekan pada tombol F5. 9. Tutup aplikasi Visual Basic anda.
, atau
10. Atur tab index masing-masing kontrol, dimana Label1 (0), txtPanjang (1), Label2 (2), txtLebar (3), Label3 (4), txtLuas(5), cmdHitung (6), cmdSelesai (7).
Indoprog
31
Hendra, S.T.
Klik pada cmdSelesai, atau properti tabindexnya menjadi 0, kemudian klik pada cmdHitung, atur properti indexnya menjadi 0, kemudian txtLuas, Label3, txtLebar, Label2, txtPanjang, Label1, masing-masing menjadi 0, sekarang semua kontrol telah berurut sesuai dengan yang kita inginkan. (Ini adalah salah satu trik untuk menomori tabindex dengan mudah)
11. Jalankan kembali program anda, sekarang coba tekan Alt+P, Alt+L, sekarang anda dapat mengaktifkan textbox Panjang dengan Alt+H (akses key dari Label1), dst. 12. Atur properti project anda, dengan menu Project, kemudian Project Properties, akan muncul dialog sebagai berikut
13. Simpan project anda, dan keluar dari Visual Basic 14. Aktifkan kembali Visual Basic anda, dan klik pada tab Recent, dan pilih kembali MyProject1.
Indoprog
32
Hendra, S.T.
Indoprog
33
Hendra, S.T.
Selanjutnya akan muncul jendela koding untuk Module1, dan ketikan program berikut
Tekan F5 untuk menjalankannya. Simpanlah program diatas dengan nama MyProject2, dan analisa file apa saja yang terbentuk berkaitan dengan project diatas. Catatan penulis: Saya yakin anda lebih familiar dengan alur program kedua dimana program berjalan mulai dari masukkan panjang, kemudian lebar, menghitung luas, serta mencetaknya. Hal tersebut sesuai dengan program konvensional, sedangkan pada program yang menggunakan form, eksekusi perhitungan baru dilakukan setelah pemakai melakukan klik pada tombol Hitung. Disinilah letak tantangan bagi anda yang berasal dari latar belakang pemrograman seperti Basic, Pascal, C/C++ maupun Clipper yang mulai belajar Visual Basic, dimana eksekusi program ditentukan oleh Event yang terjadi sehingga menuntut ketelitian untuk mengantisipasi segala aksi yang mungkin dilakukan pemakai, yang kalau tidak dapat menyebabkan bug pada program. Kesulitan yang sama juga terjadi pada sisi pengajar, dimana dalam menerangkan alur program menjadi agak susah.
Indoprog
34
Hendra, S.T.
Latihan 3
Judul : Memahami operator pada VBA
Petunjuk, sebaiknya lembar latihan ini anda cetak ke printer. 1. Aktifkan jendela Immedietly dengan menggunakan menu View, Immedietly Window atau menekan Ctrl + G
?1+2 ? "1" + "2" ? 1 + "2" ? "1" + 2 ?1&2 ? "1" & "2" ? "1" & 2
Catatan : Operator + dapat digunakan untuk penjumlahan maupun pengabungan string, tetapi untuk pengabungan string lebih disarankan untuk menggunakan Operator &.
? #18 May 2001# + 31 ? #19 June 2001# - 1 ? #19 June 2001# - #17 June 2001# ? #05/18/2001# + 31 ? #06/19/2001# - 1 ? #06/19/2001# - #06/17/2001# ? #01:01:01# + 0.25 'Mengapa ? ? #06:01:01# - 0.25 ? #06:01:01# - #05:30:30#
Catatan : Pada Visual Basic data date/time ditulis dengan #tanggal#, Operator + digunakan untuk menambah sejumlah hari, Operator - digunakan untuk mengurangi sejumlah hari atau selisih hari.
? True + 0
Indoprog
35
Hendra, S.T.
Catatan : Pada Visual Basic nilai True adalah sama dengan -1, dan nilai False adalah 0
? "indoprog" like "i*" ? "Indoprog" like "i*" ? "Indoprog" like "[iI]*" ? "a" like "[a-z]" ? "A" like "[!a-z]" ? "A1" like "A?" ? "A1" like "A#" ? "Aa" like "A#"
Lengkapilah daftar berikut : a True True False False c True False True False a and b a or b a xor b a eqv b a imp b
Catatan : Operator and, or, xor, eqv, imp, dan not dapat digunakan untuk operasi bitwise 2. Tanamkan sebuah kontrol CommandButton pada Form1, dan atau properti name : cmdCoba, dan caption : &Coba, seperti berikut ini :
Indoprog
36
Hendra, S.T.
Lakukan koding pada event cmdCoba_Click, sebagai berikut : Private Sub MyCoba_Click() Dim a As Integer Dim b As Integer Dim c As String Dim d As String a = 1.2 + 2.2 'Berapa nilai a b = 1.3 + 2.3 'Berapa nilai b c = "100" 'Berapa nilai c d = c + 200 'Berapa nilai d Print a Print b Print c Print d End Sub Jalankan program, dan klik pada tombol Coba, dan perhatikan hasilnya, apakah sesuai dengan perkiraan anda?
Indoprog
37
Hendra, S.T.
Kontrol-kontrol yang barada pada jendela Toolbox pada Visual Basic merupakan class-class. Objek tersebut dikenal sebagai kontrol tidak akan ada sampai anda menanamkannya pada suatu form. Ketika anda menanamkan suatu kontrol, anda telah membuat suatu duplikasi atau instance dari class kontrol tersebut. Form dimana anda bekerja pada saat desain adalah suatu class. Pada saat run time, Visual Basic menciptakan suatu instance dari class form.
Gambar 2-1, kontrol Text1 yang ditanam diatas form berasal dari class Textbox Misalnya anda menamkan sebuah textbox diatas form1, coba perhatikan jendela properti kontrol tersebut akan menampilkan Text1 (nama dari kontrol textbox tersebut) dan Textbox (nama dari class kontrol tersebut). Indoprog
38
Hendra, S.T.
Gambar 2-2, jendela property menunjukkan nama kontrol dan jenis Class-nya Semua objek merupakan duplikasi dari class mereka. Sesaat setelah menjadi objek berdiri sendiri, masing-masing dapat memiliki properti yang berbeda-beda. Misalnya anda menanam tiga buah command button pada suatu form, masing-masing command button merupakan instance dari class CommandButton sehingga memiliki sejumlah karakteristik dan kemampuan (properti-properti, metode-metode, dan eventevent) yang sama, dimana yang terdefinisi pada class-nya. Tetapi, masing-masing dapat memiliki Name, Caption, BackColor, Style yang berbeda sesuai dengan pengaturan pada masing-masing properti.
Gambar 2-3, masing-masing kontrol dapat memiliki properti masing-masing Catatan penulis : Jadi tombol Tambah, Perbaiki dan Simpan berasal dari Class yang sama yaitu Command Button, tetapi setelah mereka ditanam diatas form, masing-masing tombol merupakan objek yang berdiri sendiri dan memiliki properti yang berbeda. Dalam istilah OOP tombol Tambah, Perbaiki dan Simpan adalah objek yang merupakan instance dari Class Command Button.
Indoprog
39
Hendra, S.T.
Objek-objek Visual Basic memiliki properti-properti, metode-metode, dan event-event. Pada Visual Basic, suatu data dari objek (setting dan atribut) disebut sebagai properti, sedangkan berbagai subrutin yang dapat beroperasi pada objek tersebut disebut sebagai metodenya. Dan suatu event adalah aksi yang dikenali oleh suatu objek, seperti klik pada mouse atau penekanan tombol, sehingga anda dapat menulis kode untuk menangani event tersebut.
Gambar 2-4, pengaturan properti dapat dilakukan melalui jendela properti pada waktu desain atau
Private Sub Form_Load() MyForm.Caption = "Pemakai Telepon" End Sub
Indoprog
40
Hendra, S.T.
Catatan penulis : Salah satu kesulitan programmer yang menggunakan bahasa konvensional seperti Basic, Pascal, maupun Clipper yang mempelajari Visual Basic adalah dalam memahami topik tentang objek dan event programming, karena merupakan hal yang tidak ada pada bahasa tersebut. Jika anda memikirkan kembali istilah properti, metode dan event, maka properti merupakan ciri-ciri yang membedakan, misalnya si Budi dan si Amat yang sama-sama merupakan instance dari Class manusia, tetapi properti mereka dapat berbeda Properti Tinggi Berat Rambut Warna kulit si Budi 160 cm 60 kg Lurus Kuning langsat Si Amat 170 cm 70 kg Kriting Sawo mata
Sedangkan metode merupakan aksi yang dapat dilakukan oleh si Budi dan si Amat seperti berjalan, berlari, berbicara, ketawa, dll Sedangkan event merupakan reaksi terhadap suatu kejadian, contoh kalau dipukul maka apa yang harus dilakukan ? Program pada Visual Basic akan berjalan berdasarkan event-event yang terjadi, baik yang event dibangkitkan oleh sistem operasi maupun event yang dibangkitkan karena aksi oleh pemakai.
Indoprog
41
Hendra, S.T.
Berikut ini akan dibahas beberapa properti yang umum yang hampir terdapat pada semua intrinsic kontrol pada Visual Basic.
Gambar 2-5, Form1 merupakan kontainer bagi Text1 Nb. Pada defaultnya nilai properti ini dinyatakan dalam twips ( 1 inch = 1440 twips; 1 cm = 576 twips) Perhatian : Properti Width dan Height pada control Combobox sifatnya readonly. Catatan penulis : Tidak semua objek pada Visual Basic dapat menjadi kontainer bagi objek lainnya, kontrol standar yang dapat berlaku sebagai kontainer adalah form, frame, picturebox.
Indoprog
42
Hendra, S.T.
Gambar 2-6, form dengan pemakaian backcolor dan forecolor Nb. Setting properti Backcolor menjadi tidak berfungsi jika anda menset properti BackStyle menjadi 0 - transparent.
Gambar 2-7, pengaturan Backcolor dan ForeColor melalui jendela properti Ketika anda menentukan nilai untuk properti ini, anda dapat menggunakan suatu warna standard, atau warna custom (saya menyarankan anda untuk menggunakan warna standard untuk menjaga nilai rasa pemakai integrasi dengan sistem operasi)
Indoprog
43
Hendra, S.T.
Properti Font
Pada waktu desain, anda dapat menentukan properti Font dengan dialog box, tetapi pada saat runtime, hal tersebut harus dilakukan dengan properti Name, Size, Bold, Italic, Underline, and Strikethrough, karena sebenarnya Font adalah suatu objek campuran. Contoh :
Text1.Font.Name = "Tahoma" Text1.Font.Size = 12 Text1.Font.Bold = True Text1.Font.Underline = True
Gambar 2-8, pengaturan Font melalui dialog box Font dari jendela properti Nb. Pada properti Caption, kita dapat menggunakan tanda & (ampersand) untuk menyatakan hotkey bagi control tersebut. Properti Text dapat diabaikan, karena merupakan properti default bagi suatu control. Contoh :
Indoprog
44
Hendra, S.T.
Jika properti Screen.MousePointer di set ke nilai yang bukan 0-vbDefault, kursor mouse akan mengikuti nilai ini, tetapi ketika mouse berada diatas aplikasi lain (atau pada desktop), tampilan kursor akan bergantung kepada kondisi aplikasi bersangkutan, bukan pada aplikasi anda. Jika Screen.MousePointer adalah 0 dan kursor mouse berada diatas suatu kontrol, Visual Basic akan memeriksa nilai properti MousePointer kontrol tersebut; jika nilainya bukan 0-vbDefault, kursor mouse akan di set ke nilai tersebut. Jika Screen.MousePointer adalah 0 dan mouse berada diatas permukaan suatu form atau berada diatas kontrol yang properti MousePointer adalah 0, Visual Basic akan menggunakan nilai yang tersimpan pada properti Mousepointer pada form.
Properti MouseIcon dapat digunakan untuk menampilkan bentuk pointer mouse sesuai dengan keinginan pemakai, tetapi sebelumnya properti MouseIcon harus di set ke 99vbCustom, dan kemudian set suatu icon pada properti MouseIcon.
Indoprog
45
Hendra, S.T.
Gambar 2-9, pengaturan Mouse Pointer dan Mouse Pointer melalui jendela properti
Properti Tag
Semua kontrol mendukung properti Tag, tanpa kecuali, karena properti ini disediakan oleh Visual Basic, bukan oleh kontrol. Properti Tag digunakan sebagai kontainer untuk bagi data dari kontrol yang anda ingin simpan (misalnya anda dapat mengunakannya untuk menyimpan nilai awal dari textbox, sehingga pemakai dapat melakukan Undo dengan mengembalikan nilai awal tersebut dari properti Tag).
Metode Move
Jika suatu kontrol mendukung properti Left, Top, Width, dan Height, juga mendukung metode Move, dengannya dimana anda dapat mengubah beberapa atau semua properti dalam satu operasi tunggal. Contoh berikut mengubah tiga properti: Left, Top, dan Width. Contoh :
'Mendoublekan lebar form, dan memindahkan ke sudut kiri atas layar 'Syntaxnya adalah: Move Left, Top, Width, Height. Form1.Move 0, 0, Form1.Width * 2
Indoprog
46
Hendra, S.T.
Metode Refresh
Metode refresh menyebabkan suatu form akan digambar ulang. Pada dasarnya Visual Basic otomatis memanggil metode ini setiap ada kesempatan, tetapi anda dapat menggunakannya untuk mengupdate tampilan seketika. Contoh :
For n = 1000 To 1 Step -1 Label1.Caption = CStr(i) Label1.Refresh ' Mengupdate label seketika. Next
Metode SetFocus
Metode ini memindahkan fokus input ke kontrol tertentu. Sesuatu masalah yang sering terjadi adalah metode ini akan menyebabkan error ketika diterapkan pada kontrol yang sedang di Disable atau dalam keadaan Invisible. Untuk menhindari hal ini, metode SetFocus jangan digunakan pada bagian Form Load. Contoh :
Private Sub cmdAdd_Click() Aksi = flAdd Call Buka Call Kosong txtCCode.SetFocus End Sub
Metode ZOrder
Metode ZOrder memberikan efek tampilan kontrol yang saling menimpa. Anda menggunakan metode ini untuk memindahkan kontrol keatas kontrol yang lain. Gunakan argumen satu untuk sebaliknya. Contoh :
Label1.ZOrder Label1.ZOrder 1 'Memindahkan ke atas 'Memindahkan ke bawah
Pada saat design, anda dapat menggunakan Ctrl+J untuk memindahkan kontrol ke depan, dan Ctrl+K untuk memindahkan form ke belakang.
Indoprog
47
Hendra, S.T.
Pada kontrol-kontrol seperti Checkbox dan OptionButton, event Click juga dibangkitkan kalau terjadi perubahan nilai properti Value secara koding. ListBox dan Combobox juga melakukan hal yang sama kalau properti ListIndex-nya berubah. Adalah penting untuk menghindari pemakaian Event Click dan DblClick pada satu kontrol yang sama, karena tidak menjamin Event DblClick dibangkitkan setelah Event Click terjadi.
Indoprog
48
Hendra, S.T.
Event Change
Event Change dibangkitkan ketika isi dari suatu kontrol berubah. Tetapi pada CheckBox, dan OptionButton Event Click yang dibangkitkan. Pada kontrol TextBox dan ComboBox dibangkitkan ketika pemakai mengetik sesuatu. (Tetapi pada kontrol ComboBox, kontrol membangkitkan event Click kalau pemakai memilih item dari list dari pada mengetiknya). Pada kontrol Scroll bar event Change terjadi ketika pemakai melakukan klik baik pada panah maupun scroll box. Event Change juga terdapat pada PictureBox, DriveListBox, dan kontrol DirListBox. Event Change juga dibangkitan oleh isi kontrol yang diubah melalui koding.
Objek Browser
Anda dapat melihat properti-properti, metode-metode, dan event-event pada suatu objek dengan menggunakan fasilitas Objek Browser yang dapat diaktifkan dengan menggunakan menu View, Object Browser.
Indoprog
49
Hendra, S.T.
Gambar 2-11, jendela objek browser untuk melihat isi suatu objek
Indoprog
50
Hendra, S.T.
Gambar 2-12, user interface form dengan berbagai kontrol diatasnya Catatan penulis : Secara default Visual Basic akan memberikan nomor Tab Index pada setiap kontrol berdasarkan urutan penempatannya pada saat design. Urutan tab index ini akan menentukan urutan fokus pada saat keaktifan Form pertama kali, dan fokus berikutnya pada setiap penekanan tombol Tab. Anda dapat mengubah urutan Tab Index pada masing-masing kontrol dengan mengatur properti TabIndex. Untuk memudah anda dalam menempatkan kontrol-kontrol pada form, periksalah option seperti Show Grid dan ukurannya, serta Align Control to Grid, pengaturan ini dapat dilakukan dengan menu Tools, Option, kemudian memilih tab General.
Indoprog
51
Hendra, S.T.
Gambar 2-13, jendela option untuk pengaturan form Untuk memudahkan anda mengatur ukuran, jarak antar kontrol maupun pemerataan kontrol-kontrol yang anda tempatkan diatas form, anda dapat menggunakan kelompok menu format
Bagian General Declaration, bagian ini digunakan untuk deklarasi Option Explicit, Option Base, Type, dan variabel yang dapat digunakan pada form level (dikenal oleh semua subrutin pada form tersebut) baik pada tingkat Public
Indoprog
52
Hendra, S.T.
maupun Private. Bagian ini biasanya terletak pada bagian teratas pada jendela koding.
Bagian General Procedure, bagian ini merupakan subrutin maupun fungsi yang dibuat oleh pemakai. Bagian ini ditandai dengan (General), dan nama subrutin.
Bagian Event Procedure, bagian ini merupakan subrutin yang digunakan untuk menangani kejadian yang diakibatkan oleh aksi pemakai terhadap kontrol tertentu. Ditandai dengan nama kontrol dan jenis eventnya.
Indoprog
53
Hendra, S.T.
Event Initialize
Event ini terjadi pertama kali ketika Form dibuat dari Class-nya dan hanya sekali selama keberadaan form tersebut, Event ini digunakan untuk menginisialisasi nilai awal variabel.
Event Terminate
Event ini terjadi ketika objek Form akan dimusnahkan dari memori.
Event Load
Event ini terjadi ketika suatu form di Load. Pada Event procedure ini anda letakkan statement yang digunakan untuk mengatur setting awal form anda, misalnya membuka file, menginisialisasi nilai awal variabel, dan mengatur properti kontrol-kontrol pada form. Contoh :
Private Sub Form_Load() Open "C:\Pemakai.Dat" For Random As #1 Len=Len(DatPemakai) JlhRec = LOF(1) / Len(DatPemakai) If JlhRec > 0 Then Posisi = 1 Else
Indoprog
54
Hendra, S.T.
Event QueryUnload
Event ini terjadi ketika suatu form akan tutup, dan dapat mempelajari bagaimana pemakai menutup form tersebut dengan mempelajari parameter UnloadMode. Contoh :
Private Sub Form_QueryUnload(Cancel As Integer, _ UnloadMode As Integer) Select Case UnloadMode Case vbFormControlMenu ' = 0 ' From diclose oleh pemakai. Case vbFormCode ' = 1 ' Form diclose dengan kode. Case vbAppWindows ' = 2 ' Session windows berakhir. Case vbAppTaskManager ' = 3 ' Task manager mengakhiri program ini. Case vbFormMDIForm ' = 4 ' From ditutup oleh MDI. Case vbFormOwner ' = 5 ' From ditutup oleh Owner. End Select End Sub
Parameter Cancel dapat digunakan untuk menentukan apakah proses dilanjutkan ke Event UnLoad atau tidak. (0 berarti proses dihentikan, 1 berarti proses dilanjutkan ke Event Unload)
Event UnLoad
Event ini terjadi ketika suatu form di unload dengan menggunakan command Close pada Control menu atau dengan statement UnLoad. Event ini terjadi setelah Event QueryUnload. Anda dapat mengetikkan kode-kode untuk menutup file-file yang terbuka pada Event ini. Contoh :
Private Sub Form_Unload(Cancel As Integer) Close #1 End Sub
Parameter Cancel dapat digunakan untuk menentukan apakah proses UnLoad dilakukan atau tidak. (0 berarti proses UnLoad dilakukan, 1 berarti proses Unload dibatalkan)
Indoprog
55
Hendra, S.T.
Contoh :
Private Sub Form_Unload(Cancel As Integer) Dim nPil As Integer nPil = MsgBox("Apakah Anda Yakin", vbYesNo) If nPil = vbYes Then Close #1 Cancel = 0 Else Cancel = 1 End If End Sub
Event Resize
Event ini terjadi ketika form pertama kali ditampilkan atau ukuran dari suatu object berubah. Contoh :
Private Sub Form_Resize () 'Mengubah ukuran PictureBox menjadi sama dengan ukuran form yang diresize. Picture1.Move 0,0, ScaleWidth, ScaleHeight End Sub
Catatan : ScaleWidth, properti yang mengembalikan nilai ukuran lebar interior dari suatu kontrol ScaleHeight, properti yang mengembalikan nilai ukuran lebar interior dari suatu kontrol
Event Activate
Event Activate terjadi ketika suatu form menjadi jendela aktif, ketika user melakukan klik pada form, atau menggunakan metode SHOW atau SETFOCUS.
Event DeActivate
Event DeActivate terjadi ketika suatu form menjadi jendela yang tidak aktif, dimana ketika focus bergeser ke form lain. Event ini tidak terjadi pada saat UNLOAD.
Perintah Load
Melakukan Load Form, tetapi tidak membuatnya menjadi Visibel Syntax :
Indoprog
56
Hendra, S.T.
Metoda Show
Melakukan Load suatu Form, dan membuatnya menjadi Visible. Syntax : object.Show Contoh :
Private Sub cmdShow_Click() Form2.Show End Sub
Metoda Hide
Menyembunyikan form, tetapi tidak melakukan unload Syntax : object.Hide Contoh :
Private Sub cmdHide_Click() Form2.Hide End Sub
Perintah UnLoad
Melakukan UnLoad Form Syntax : UnLoad form Contoh :
Private Sub cmdUnload_Click() Unload Form2
Indoprog
57
Hendra, S.T.
Indoprog
58
Hendra, S.T.
Latihan 4
Judul : Memahami urutan event, metoda, dan perintah pada Form
1. Tambahkan Form2 ke dalam project anda (caranya : Pada menu Project, pilih Add Form), Kemudian tanamkan Command1 pada Form2, sehingga menjadi sebagai berikut :
2. Aktifkan jendela koding Form2 dengan menekan F7, atau pada Menu View, pilih Code, atau klik icon View Code pada jendela Project Explorer. Pada DropDownList object, pilih Form, dan pada DropDownList procedure pilih Initialize.
Dan lakukan koding untuk Event Initialize untuk form2, sebagai berikut : Private Sub Form_Initialize() MsgBox "Ini adalah initialize form2" End Sub Indoprog
59
Hendra, S.T.
Dan dengan cara yang sama lakukan juga koding untuk Event-Event berikut : Private Sub Form_Load() MsgBox "Ini adalah Load Form2" End Sub Private Sub Form_Activate() MsgBox "Ini adalah Activate Form2" End Sub Private Sub Form_Deactivate() MsgBox "Ini adalah Deactivate Form2" End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) MsgBox "Ini adalah QueryUnload Form2" End Sub Private Sub Form_Unload(Cancel As Integer) MsgBox "Ini adalah Unload Form2" End Sub Private Sub Form_Terminate() MsgBox "Ini adalah terminate form2" End Sub Dan akhirnya lakukan juga koding untuk Command1 pada Form2 Private Sub Command1_Click() Unload Me End Sub 3. Tampilkan kembali Form1. (caranya : Double Klik pada Form1 di jendela Project Explorer), dan kemudian tanamkan Command1 s/d 4 diatasnya, dan lakukan koding berikut :
Indoprog
60
Hendra, S.T.
Lakukan koding untuk masing-masing Command Private Sub cmdShow_Click() Form2.Show End Sub
Indoprog
61
Hendra, S.T.
Private Sub Form_Resize() MsgBox "Ini adalah Resize Form2" End Sub Private Sub cmdHide_Click() Form2.Hide End Sub Private Sub cmdLoad_Click() Load Form2 End Sub Private Sub cmdUnload_Click() Unload Form2 End Sub 4. Simpan Project anda FormEvent.vbp, Form1.frm, Form2.frm 5. Jalankan project anda
Lakukan klik pada Show, dan perhatikan tulisan pada message box, yang menunjukkan urutan Event pada Form2, klik Ok untuk menutup masing-masing MsgBox. Alih keaktifan ke Form1 tanpa menutup Form2, perhatikan tulisan pada message box, yang menunjukkan Event yang terjadi. Aktifkan kembali ke Form2 dengan klik pada Form2 (bukan klik pada Command1 di Form1), perhatikan Event yang terjadi. Tutup Form2, dengan klik pada Command1, dan perhatikan urutan Event yang terjadi. Buka kembali Form2, dengan klik pada Command1 diatas Form1, dan perhatikan urutan Event yang terjadi (apakah Event Initialize dijalankan ?) Tutup Form2 Tutup Form1, dan perhatikan Event yang terjadi (mengapa Event Terminate Form2 terjadi ?)
Lakukan klik pada Load, dan perhatikan tulisan pada message box, yang menunjukkan urutan Event pada Form2, klik Ok untuk menutup masing-masing MsgBox. Lakukan klik pada Show, dan perhatikan Event yang terjadi.
Indoprog
62
Hendra, S.T.
Latihan 5
Judul : Pengaturan Form, Properti, dan Event yang diterapkan pada pengolahan Random File
1. Buatlah suatu project baru, dan periksalah setting grid pada form anda, dengan menu Tools, Option, General. Adapun hal yang perlu diperhatikan adalah keaktifan Show Grid, dan Align Control to Grid
Kemudian tanamkan kontrol-kontrol berikut pada form1 sehingga membentuk tampilan sebagai berikut, anda harus menanamkan kontrol Frame terlebih dahulu baru diikuti dengan Option1 s/d 3 diatasnya, dalam hal ini Kontrol Frame1 bertindak sebagai kontainer bagi Option1 s/d 3.
cc
Indoprog
63
Hendra, S.T.
Pilihlah kontrol Label1, Label2, dan Label3 (caranya : klik pada Label1, kemudian tekan tombol Ctrl dan jangan di lepas, klik pada Label2, dan klik pada Label3, akhirnya tombol Ctrl di lepas), kemudian pada menu Format Pilih Align pilih Left.
Pilih Text1, Text2, dan Text3, dan, kemudian pada menu Format, pilih Make Same Size, pilih Both, dan juga dibuat rata Kiri. Lakukan juga proses diatas untuk Option1 s/d 3, Command1 s/d 7 2. Aturlah properti dari masing-masing kontrol sehingga menjadi sebagai berikut, dan jangan lupa untuk mengatur tabindex dengan urutan txtCCode, txtNama,txtEkstension, fraAkses, optLokal, optSLJJ, optSLI, baru kemudian urutan untuk commandbutton :
Kontrol Form1
Indoprog
64
Hendra, S.T.
3. Aktifkan ke jendela Koding, dengan menekan tombol F7, atau pada jendela Project Explorer, klik pada frmPemakai, dan klik pada icon View Code, dan pilih General, Declaration
Indoprog
65
Hendra, S.T.
dan ketikkan kode berikut : Option Explicit 'Deklarasi enumerated type Private Enum Flag flNone = 0 flAdd = 1 flEdit = 2 End Enum
'Struktur data untuk random file Private Type Pemakai CCode As String * 4 'Password PABX Nama As String * 30 'Nama Pemakai Ekstension As String * 3 'Ekstension Local As Boolean 'Akses Lokal SLJJ As Boolean 'Akses SLJJ SLI As Boolean 'Akses SLI End Type 'Deklarasi variabel Form Level Dim DatPemakai As Pemakai Dim Posisi As Integer ditampilkan Dim JlhRec As Integer Dim Aksi As Integer
'Variabel untuk menampung data Pemakai 'Untuk mencatat nomor record yang sedang 'Untuk mencatat jumlah record dalam random file 'Untuk flag Tambah Data, Perbaiki Data, atau None
Sub Kunci() 'Mengunci kontrol Text, dan OptionButton txtCCode.Locked = True Indoprog
66
Hendra, S.T.
txtNama.Locked = True txtEkstension.Locked = True FraAkses.Enabled = False diakses End Sub Sub Buka() txtCCode.Locked = False txtNama.Locked = False txtEkstension.Locked = False FraAkses.Enabled = True End Sub
Sub Tampil() 'Sub rutin ini digunakan untuk menampilkan isi record ke 'Masing-masing kontrol yang bersesuaian If Posisi > 0 Then 'Jika posisi record lebih besar dari 0 Get #1, Posisi, DatPemakai 'Baca record berdasarkan posisi txtCCode.Text = DatPemakai.CCode txtNama.Text = DatPemakai.Nama txtEkstension.Text = DatPemakai.Ekstension optLocal.Value = DatPemakai.Local optSLJJ.Value = DatPemakai.SLJJ optSLI.Value = DatPemakai.SLI Else Call Kosong End If Aksi = flNone 'Tandai Flag Aksi adalah None Call Kunci 'Buat semua kontrol tidak dapat diperbaki End Sub Sub Kosong() 'Subrutin ini akan mengosongkan semua nilai pada masing-masing kontrol txtCCode.Text = "" txtNama.Text = "" txtEkstension.Text = "" optLocal.Value = False optSLJJ.Value = False optSLI.Value = False End Sub 4. Kembali ke tampilan Form1 (gunakan Shift-F7 atau icon view Object pada Project Explorer), dan double klik pada frmPemakai, sehingga muncul Event Procedure Form_Load, dan ketiklah kode berikut :
Indoprog
67
Hendra, S.T.
Private Sub Form_Load() 'Subrutin ini akan dijalankan ketika form di load 'ke memory Open "C:\Pemakai.Dat" For Random As #1 Len=Len(DatPemakai) 'Membuka random file sebagai file nomor 1 JlhRec = LOF(1) / Len(DatPemakai) 'Menghitung jumlah record If JlhRec > 0 Then 'Jika jumlah record > 0 Posisi = 1 'Posisi menunjuk ke record 1 Else Posisi = 0 End If Call Tampil End Sub Beralih ke Event Procedure Unload, perhatikan gambar berikut
dan ketiklah kode berikut : Private Sub Form_Unload(Cancel As Integer) Dim nPil As Integer nPil = MsgBox("Apakah Anda Yakin", vbYesNo) 'Konfirmasi penutupan If nPil = vbYes Then 'Jika di jawab Yes Close #1 'Tutup file 1 Cancel = 0 'Proses tutup form dilakukan Else Cancel = 1 'Proses tutup form dibatalkan End If End Sub dan lakukan juga koding untuk kontrol masing-masing : Private Sub cmdFirst_Click() If JlhRec > 0 Then Posisi = 1 Call Tampil Indoprog
68
Hendra, S.T.
End If End Sub Private Sub cmdPrev_Click() If Posisi > 1 Then Posisi = Posisi - 1 Call Tampil End If End Sub Private Sub cmdNext_Click() If Posisi < JlhRec Then Posisi = Posisi + 1 Call Tampil End If End Sub Private Sub cmdLast_Click() Posisi = JlhRec Call Tampil End Sub Private Sub cmdAdd_Click() Aksi = flAdd Call Buka Call Kosong txtCCode.SetFocus End Sub Private Sub cmdEdit_Click() Aksi = flEdit Call Buka txtCCode.SetFocus End Sub Private Sub cmdUpdate_Click() If Aksi = flAdd Or Aksi = flEdit Then If Aksi = flAdd Then JlhRec = JlhRec + 1 Posisi = JlhRec End If DatPemakai.CCode = txtCCode.Text DatPemakai.Nama = txtNama.Text DatPemakai.Ekstension = txtEkstension.Text DatPemakai.Local = optLocal.Value DatPemakai.SLJJ = optSLJJ.Value
Indoprog
69
Hendra, S.T.
DatPemakai.SLI = optSLI.Value Put #1, Posisi, DatPemakai Call Kunci End If End Sub 5. Gunakan menu Format, Lock Controls, untuk mengunci semua kontrol yang berada pada form agar ditidak dapat digeser dan diubah ukurannya, hal ini cocok dilakukan pada form yang telah selesai. 6. Simpan project diatas sebagai Pemakai.vbp, dan Pemakai.frm 7. Aktifkan Objek browser, dan amati objek-objek yang ada pada Project1, dengan menu View, Object Browser, kemudian pilih Project1.
Indoprog
70
Hendra, S.T.
Latihan 6
Judul : Tantangan pemrograman
Lengkapi program diatas dengan fasilitas Find, dimana jika tombol Find ditekan akan muncul suatu InputBox yang menanyakan nama yang dicari, jika ketemu, akan ditampilkan, dan jika tidak ketemu akan muncuk message box data tidak ada.
Private Sub cmdFind_Click() Dim nama As String nama = InputBox("Masukkan nama :", "Pencarian") If nama <> "" Then 'lengkapi bagian ini End If End Sub
Indoprog
71
Hendra, S.T.
Label
Digunakan untuk menampilkan text tanpa bisa diubah oleh pemakai pada saat runtime. Beberapa properti pada label :
Properti Fungsi Digunakan untuk menentukan pemerataan tulisan pada kontrol label (0 - Left Justify, 1 Right Justify, 2 - Center)
Alignment
Digunakan untuk menentukan tampilan dari kontrol label di cat atau tidak (0 - Flat, 1 - 3D) Digunakan untuk menentukan apakah ukuran kontrol otomatis disesuaikan dengan ukuran tulisan (False, True) Digunakan untuk menentukan warna latar belakang (properti ini saling berkaitan dengan properti Appearance) Digunakan untuk menentukan prilaku latar belakang kontrol label (0 - Transparent, 1 Opaque), kalau transparan, maka BackColor menjadi tidak berarti, demikian juga Appearance.
BackStyle
Indoprog
72
Hendra, S.T.
Digunakan untuk menentukan bentuk border, apakah (0- None, 1 - Fixed Single)
BorderStyle
Caption DragIcon DragMode Enabled Font ForeColor Height Index Left MouseIcon
Digunakan untuk menentukan tulisan pada kontrol label, mungkin ini adalah properti yang paling sering anda gunakan. Digunakan untuk menentukan icon yang digunakan pada operasi drag-n-drop pada kontrol label Menentukan modus drag-n-drop (0 - manual, 1 - automatic) Menentukan apakah kontrol label dapat menerima event yang dibuat oleh pemakai, misalnya event Click, MouseDown, MouseUp, dll. Digunakan untuk menentukan jenis font, ukuran, style, dll Digunakan untuk menentukan warna tulisan Digunakan untuk menentukan tinggi dari kontrol Digunakan untuk menentukan nomor index, jika kontrol tersebut merupakan kontrol array. Digunakan untuk menentukan jarak kiri kontrol dari kontainernya. Digunakan untuk menentukan icon mouse yang digunakan ketika pointer mouse berada diatas kontrol label tersebut, properti ini berarti bila properti MousePointer diset menjadi (99 - Custom) Digunakan untuk menentukan bentuk pointer yang digunakan ketika mouse pointer berada diatas kontrol label tersebut. Properti ini dapat digunakan sebagai tempat menyimpan data sementara yang berkaitan dengan kontrol label tersebut Digunakan untuk menentukan tip tulisan ketika mouse pointer berada diatas kontrol Digunakan untuk menentukan jarak atas kontrol dari kontainernya. Digunakan untuk menentukan perlakuan terhadap tanda & ampersand sebagai access key, atau sebagai simbol & (False, True) Digunakan untuk menentukan apakah kontrol label tersebut Visible atau tidak (False, True) Digunakan untuk menentukan lebar kontrol label Digunakan untuk menentukan apakah tulisan dalam kontrol label dapat dilipat menjadi beberapa baris.
Indoprog
73
Hendra, S.T.
Gambar 3-1, Contoh properti pada kontrol Label Adapun event-event yang efektif pada kontrol label adalah :
Event Change Click DblClick Keterangan Event ini terjadi ketika nilai properti Caption dari kontrol Event ini terjadi ketika pemakai melakukan klik pada kontrol, event ini terjadi dengan urutan (MouseDown, MouseUp, Click) Event ini terjadi ketika pemakai melakukan double klik pada kontrol, event ini terjadi dengan urutan (MouseDown, MouseUp, Click, MouseDown, DblClick, MouseUp) Event ini terjadi ketika pemakai melakukan penekanan tombol mouse pada kontrol, parameter yang dapat digunakan adalah Button (1 - Tombol kiri, 2 - Tombol kanan), Shift (1 - Shift, 2 - Ctrl, 3 - Alt), X (posisi kolom pointer), Y (posisi baris pointer) Event ini terjadi ketika pamakai mengerakan mouse pada kontrol, parameter yang dapat digunakan adalah Button (1 - Tombol kiri, 2 - Tombol kanan), Shift (1 - Shift, 2 - Ctrl, 3 Alt), X (posisi kolom pointer), Y (posisi baris pointer) Event ini terjadi ketika pemakai melepaskan penekanan tombol mouse pada kontrol, parameter yang dapat digunakan adalah Button (1 - Tombol kiri, 2 - Tombol kanan), Shift (1 - Shift, 2 - Ctrl, 3 - Alt), X (posisi kolom pointer), Y (posisi baris pointer)
MouseDown
MouseMove
MouseUp
Textbox
Indoprog
74
Hendra, S.T.
Digunakan untuk menampilkan text yang dapat diubah oleh pemakai pada saat runtime
Properti Alignment Appearance BackColor BorderStyle CauseValidation DragIcon DragMode Enabled Font ForeColor Height HideSelection Index Left Locked MaxLength Fungsi sda sda sda sda Digunakan untuk menentukan apakan event Validate di aktifkan ketika kontrol akan kehilangan fokus (False, True) sda sda sda sda sda sda Digunakan untuk menentukan apakah selection disembunyikan ketika kontrol kehilangan fokus sda Digunakan untuk menentukan jarak kiri kontrol dari kontainernya. Digunakan untuk menentukan apakah text dalam kontrol textbox dapat di perbaharui oleh pemakai atau tidak (False, True) Digunakan untuk menentukan jumlah huruf maksimal yang dapat diketikkan dalam textbox (0 s/d 65535), 0 tidak dibatasi. Digunakan untuk menentukan icon mouse yang digunakan ketika pointer mouse berada diatas kontrol label tersebut, properti ini berarti bila properti MousePointer diset menjadi (99 - Custom) Digunakan untuk menentukan bentuk pointer yang digunakan ketika mouse pointer berada diatas kontrol label tersebut. Digunakan untuk menentukan apakah tulisan dalam textbox dapat ditampilkan dalam bentuk beberapa baris, dan mengenali Enter untuk memasuki baris baru. (False, True)
MouseIcon
MousePointer
MultiLine
PasswordChar
Digunakan untuk menentukan karakter yang digunakan untuk menyandikan tampilan huruf yang diketik oleh pemakai. Biasanya digunakan untuk pengisian password, dimana huruf yang ditekan ditampilkan dalam bentuk *
ScrollBars
Digunakan untuk menentukan penampilan ScrollBar pada textbox, properti ini efektif jika setting properti MultiLine adalah True (0 - None, 1 - Horizontal, 2 - Vertical, 3 - Both)
Indoprog
75
Hendra, S.T.
Digunakan untuk menentukan urutan tabindex, 0 adalah kontrol yang pertama mendapat fokus jika form dijalankan. Properti ini efektif jika setting properti TabStop adalah True Digunakan untuk menentukan apakah textbox dapat menerima fokus karena penekanan tombol TAB oleh pemakai (False, True) sda Properti ini berisi tulisan yang berada dalam textbox sda sda sda
Gambar 3-2, Contoh properti pada kontrol Text Adapun event-event yang efektif pada kontrol Textbox adalah :
Event Change Click DblClick GotFocus KeyDown Keterangan Event ini terjadi ketika nilai properti Text dari kontrol mengalami perubahan sda sda Event ini terjadi ketika kontrol mendapatkan fokus Event ini terjadi ketika pemakai mengetik karakter pada kontrol Event ini terjadi setelah event KeyDown ketika pemakai mengetik karakter pada kontrol, parameter yang dapat digunakan adalah KeyAscii. Anda dapat memanipulasi tombol yang diketik dengan melakukan perubahan pada nilai KeyAscii. KeyPress Contoh : Private Sub txtNama_KeyPress(KeyAscii As Integer)
Indoprog
76
Hendra, S.T.
Event ini terjadi setelah event KeyPress ketika pemakai mengetik karakter pada kontrol dengan urutan (KeyDown, KeyPress, KeyUp, Change) Event ini terjadi ketika kontrol kehilangan fokus sda sda sda Event ini terjadi ketika kontrol akan kehilangan fokus.
Option
Digunakan untuk menampilkan beberapa pilihan yang hanya dapat dipilih salah satu dalam suatu form, untuk
Properti Alignment Appearance BackColor Caption Fungsi sda sda sda sda
CauseValidation sda DisablePicture DownPicture DragIcon DragMode Enabled Font ForeColor Height Index Left MaskColor Digunakan untuk menentukan gambar yang ditampilkan ketika kontrol Option disable (properti Enabled = False), properti ini efektif jika setting properti Style adalah (1- Graphical) Digunakan untuk menentukan gambar yang ditampilkan ketika kontrol Option dipilih (properti Value = True), properti ini efektif jika setting properti Style adalah (1- Graphical) sda sda sda sda sda sda sda Digunakan untuk menentukan jarak kiri kontrol dari kontainernya. Digunakan untuk warna pada bitmap yang akan dijadikan transparan, properti ini efektif jika picture yang masukkan adalah (*.bmp), dan setting properti UseMaskColor adalah True
Indoprog
77
Hendra, S.T.
Digunakan untuk menentukan gambar yang digunakan, properti ini efektif jika setting properti Style adalah (1 - Graphical) Digunakan untuk menentukan jenis style pada kontrol option (0 - Standard, 1 - Graphical) sda sda sda sda sda Digunakan akan warna yang ditentukan pada MaskColor efektif atau tidak (False, True) Adalah nilai kontrol option button (True - terpilih, False - tidak terpilih) Digunakan untuk menentukan apakah kontrol Visibel atau tidak. sda
Gambar 3-3, Contoh properti pada kontrol Option Adapun event-event yang efektif pada kontrol option adalah :
Event Click DblClick GotFocus KeyDown KeyPress KeyUp LostFocus MouseDown MouseMove Keterangan sda, pada option event ini juga dibangkitkan ketika kontrol menerima fokus, maupun ketika pemakai menekan space pada kontrol bersangkutan. sda sda sda sda sda sda sda sda
Indoprog
78
Hendra, S.T.
sda
Check
Digunakan untuk menampilkan beberapa pilihan yang dapat dipilih lebih dari satu
Gambar 3-4, Contoh properti pada kontrol Check Properti kontrol Check, maupun event dapat dilihat pada properti Option
Frame
Digunakan untuk mengelompokan sekelompok kontrol. Pemakaian kontrol frame yang paling nyata adalah untuk mengelompokan sejumlah option, sebagaimana kita ketahui,
Indoprog
79
Hendra, S.T.
pada suatu form, hanya 1 option yang dapat dipilih setiap saat, hal ini dapat diatasi dengan pemakaian frame, sehingga option dapat dipilih sesuai dengan konteks yang diwakili.
Properti Appearance BackColor BorderStyle Caption CauseValidation DragIcon DragMode Enabled Font ForeColor Height Index Left MouseIcon MousePointer TabIndex Tag ToolTipText Top Visible Width Fungsi sda sda sda sda sda sda sda sda sda sda sda sda Digunakan untuk menentukan jarak kiri kontrol dari kontainernya. sda sda sda sda sda sda Digunakan untuk menentukan apakah kontrol Visibel atau tidak, jika Visible false, maka semua kontrol yang berada diatasnya menjadi tidak kelihatan. sda
Gambar 3-5, Contoh properti pada kontrol Frame Adapun event-event yang efektif pada kontrol frame adalah :
Indoprog
80
Hendra, S.T.
CommandButton
Indoprog
81
Hendra, S.T.
Gambar 3-6, Contoh properti pada kontrol Command Adapun event-event yang efektif pada kontrol commandbutton adalah :
Event Click GotFocus KeyDown KeyPress KeyUp LostFocus MouseDown MouseMove MouseUp Keterangan sda, pada commandbutton, event ini juga dibangkitkan ketika pemakai menekan space pada kontrol tersebut. sda sda sda sda sda sda sda sda
Indoprog
82
Hendra, S.T.
Latihan 7
Judul : Mengenal Properti Label, Text, Option, Check, Frame dan Command
1. Buatlah project baru yang berisi form, form berikut : Form 1
Form 2
Form 3
Indoprog
83
Hendra, S.T.
Form 4
Form 5
Indoprog
84
Hendra, S.T.
Form 6
Dengan fungsi masing-masing tombol untuk mengaktifkan masing-masing form yang bersesuaian.
Indoprog
85
Hendra, S.T.
Latihan 8
Judul : Memahami beberapa event yang umum pada kontrol.
1. Buatlah project baru, dengan Form1
Properti Name CauseValidation Name Name Name Caption Default Name Caption Cancel
Value txtUmur True txtCoba1 txtCoba2 cmdDefault &Default True True cmdCancel &Cancel True True
Command2
Indoprog
86
Hendra, S.T.
Debug.Print "txtCoba2 Event KeyPressed dengan KeyAscii : " & KeyAscii End Sub Private Sub txtCoba2_KeyUp(KeyCode As Integer, Shift As Integer) Debug.Print "txtCoba2 Event Keyup dengan KeyCode : " & KeyCode & " Shift : " & Shift End Sub Private Sub txtCoba3_Click() Debug.Print "txtCoba3 Event Click" End Sub Private Sub txtCoba3_DblClick() Debug.Print "txtCoba3 Event DblClick" End Sub Private Sub txtCoba3_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Debug.Print "txtCoba3 Event MouseDown dengan Button : " & Button & " Shift : " & Shift & " X : " & X & " Y : " & Y End Sub Private Sub txtCoba3_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Debug.Print "txtCoba3 Event MouseMove dengan Button : " & Button & " Shift : " & Shift & " X : " & X & " Y : " & Y End Sub Private Sub txtCoba3_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Debug.Print "txtCoba3 Event MouseUp dengan Button : " & Button & " Shift : " & Shift & " X : " & X & " Y : " & Y End Sub
Private Sub txtCoba1_GotFocus() MsgBox "txtCoba1 menerima fokus" End Sub Private Sub txtCoba1_LostFocus() MsgBox "txtCoba1 kehilangan fokus" End Sub Private Sub txtCoba2_Change() Debug.Print "txtCoba2 Change" End Sub Private Sub txtUmur_Validate(Cancel As Boolean) If (Val(txtUmur) < 5) Or (Val(txtUmur) > 125) Then MsgBox "Masukkan umur 5 s/d 125" & vbCrLf & _ "Event Validate" Cancel = True End If End Sub
Indoprog
87
Hendra, S.T.
Latihan 9
Judul : Tantangan melengkapi program data pemakai Telepon Latihan Bab2
1. Aktifkan program Latihan 2-2, modul sebelumnya.
Lengkapi program tersebut dengan beberapa hal sebagai berikut : 1. txtCCode, maksimal pengetikkan 4 huruf, dan tidak boleh kurang dari 4 huruf, dan yang dapat diketik hanya digit (0 s/d 9) 2. txtNama, maksimal pengetikkan 30 huruf, dan huruf pertama setiap suku kata otomatis besar, misalnya Hendra Wijaya, Susan Dewichan 3. txtEkstension, maksimal pengetikkan 3 huruf, dan yang dapat diketik hanya digit (0 s/d 9), dan nomor ekstension terkecil 100, terbesar 600. 4. Penekanan Enter dapat digunakan untuk berpindah antar textbox 5. Option SLI, hanya bisa dipilih untuk ekstension 100 s/d 199, SLJJ, hanya dipilih untuk ekstension 200 s/d 299 6. txtCCode, txtNama, txtEkstension, dan Akses tidak boleh kosong.
Indoprog
88
Hendra, S.T.
Column
Digunakan untuk menentukan icon yang digunakan pada operasi drag-n-drop pada kontrol label Menentukan modus drag-n-drop (0 - manual, 1 - automatic) Menentukan apakah kontrol label dapat menerima event yang dibuat oleh pemakai, misalnya event Click, MouseDown, MouseUp, dll. Digunakan untuk menentukan jenis font, ukuran, style, dll Digunakan untuk menentukan warna tulisan Digunakan untuk menentukan tinggi dari kontrol Digunakan untuk menentukan nomor index, jika kontrol tersebut merupakan kontrol array. Digunakan untuk menentukan tinggi dari kontrol (Height) sedemikian rupa sehingga tidak ada item yang ditampilkan sebagian ( False, True)
IntegralHeight
Adalah daftar yang dapat digunakan untuk menyimpan nilai numerik yang berkaitan dengan item-item yang terdapat dalam listbox. Berkoresponden satu-satu. Digunakan untuk menentukan jarak kiri kontrol dari kontainernya. Merupakan properti yang berisi pilihan dalam Listbox, untuk mengetik itemnya anda harus menggunakan Ctrl-Enter untuk memasukki item yang berikutnya. Digunakan untuk menentukan icon mouse yang digunakan ketika pointer mouse berada
Indoprog
89
Hendra, S.T.
diatas kontrol label tersebut, properti ini berarti bila properti MousePointer diset menjadi (99 - Custom) MousePointer Digunakan untuk menentukan bentuk pointer yang digunakan ketika mouse pointer berada diatas kontrol label tersebut. Digunakan untuk menentukan apakah item dalam listbox dapat dipilih lebih dari satu atau tidak (0 - None, 1 - Simple, 2 - Extended) Perbedaan antara 1 - Simple dengan 2 Extended, adalah pada Simple pemilihan beberapa item sekaligus tidak dapat menggunakan bantuan Shift.
MultiSelect
Sorted
Digunakan untuk menentukan apakah item dalam listbox otomatis diurut berdasarkan aphabetik atau tidak (False, True) Digunakan untuk menentukan bentuk tampilan item yang digunakan (0 - Standard, 1 Checkbox)
Style
Digunakan untuk menentukan urutan tabindex, 0 adalah kontrol yang pertama mendapat fokus jika form dijalankan. Properti ini efektif jika setting properti TabStop adalah True Digunakan untuk menentukan apakah textbox dapat menerima fokus karena penekanan tombol TAB oleh pemakai (False, True) Properti ini dapat digunakan sebagai tempat menyimpan data sementara yang berkaitan dengan kontrol label tersebut Digunakan untuk menentukan tip tulisan ketika mouse pointer berada diatas kontrol Digunakan untuk menentukan jarak atas kontrol dari kontainernya. Digunakan untuk menentukan apakah kontrol label tersebut Visible atau tidak (False, True) Digunakan untuk menentukan lebar kontrol label
klik pada properti List, ketikkan Satu, tekan Ctrl-Enter ketikkan Dua, tekan Ctrl-Enter dst
Indoprog
90
Hendra, S.T.
Cara lain adalah dengan menggunakan metoda AddItem(string, index) pada Event Load pada Form, dimana string adalah item yang ingin ditambahkan ke ListBox, sedangkan index adalah posisi dimana item akan disisip, defaultnya adalah posisi terakhir. Contoh :
Private Sub Form_Load() LstAngka.AddItem("Satu") LstAngka.AddItem("Dua") LstAngka.AddItem("Tiga") LstAngka.AddItem("Empat") LstAngka.AddItem("Lima") End Sub
Jika pada Listbox dengan Multiselect = True, maka pekerjaan menjadi sedikit lebih rumit, dimana kita perlu memeriksa item pada listbox satu persatu untuk memeriksa apakah item tersebut dalam keadaan terpilih (diperiksa dengan properti selected(index) atau tidak. Contoh berikut akan menampilkan kotak pesan yang berisi item-item yang terpilih.
Private Sub cmdPeriksa_Click() For i = 0 To LstAngka.ListCount - 1 If LstAngka.Selected(i) Then 'Jika True artinya terpilih MsgBox LstAngka.List(i) 'Tampilkan item tersebut dari List End If Next i End Sub
Sesuatu hal yang perlu diingat bahwa nomor index item pada Listbox dimulai dari 0 s/d ListCount - 1
Indoprog
91
Hendra, S.T.
Pada Listbox yang MultiSelect = False, properti ListIndex menunjukkan nomor index (mulai dari 0) item yang sedang terpilih, dan jika tidak ada yang terpilih nilainya -1.
Indoprog
92
Hendra, S.T.
parameter yang dapat digunakan adalah KeyAscii. Anda dapat memanipulasi tombol yang diketik dengan melakukan perubahan pada nilai KeyAscii. KeyUp LostFocus MouseDown Event ini terjadi setelah event KeyPress ketika pemakai mengetik karakter pada kontrol dengan urutan (KeyDown, KeyPress, KeyUp, Change) Event ini terjadi ketika kontrol kehilangan fokus Event ini terjadi ketika pemakai melakukan penekanan tombol mouse pada kontrol, parameter yang dapat digunakan adalah Button (1 - Tombol kiri, 2 - Tombol kanan), Shift (1 - Shift, 2 - Ctrl, 3 - Alt), X (posisi kolom pointer), Y (posisi baris pointer) Event ini terjadi ketika pamakai mengerakan mouse pada kontrol, parameter yang dapat digunakan adalah Button (1 - Tombol kiri, 2 - Tombol kanan), Shift (1 - Shift, 2 - Ctrl, 3 Alt), X (posisi kolom pointer), Y (posisi baris pointer) Event ini terjadi ketika pemakai melepaskan penekanan tombol mouse pada kontrol, parameter yang dapat digunakan adalah Button (1 - Tombol kiri, 2 - Tombol kanan), Shift (1 - Shift, 2 - Ctrl, 3 - Alt), X (posisi kolom pointer), Y (posisi baris pointer) Event ini terjadi ketika Listbox mengalami scroll. Event ini terjadi ketika kontrol akan kehilangan fokus.
MouseMove
Combo Box
Jika dibandingkan dengan Listbox, maka ComboBox lebih menghemat pemakaian tempat pada form, dimana hasil pilihan pemakai ditempilkan dalam suatu textbox, dimana pilihan-pilihan dapat di drop-down dalam bentuk listbox. Pada Combobox pemakai juga dapat mengetik langsung pilihannya, tetapi hal ini sangat bergantung pada Style yang digunakan. Jika pada Listbox dimungkinkan pemakai melakukan MultiSelect, tetapi pada Combobox hal tersebut tidak dapat dilakukan.
Properti BackColor CauseValidation DragIcon DragMode Enabled Font ForeColor Height Index IntegralHeight ItemData Left Locked MouseIcon MousePointer Sorted Fungsi sda sda sda sda sda sda sda sda sda sda sda sda sda sda sda sda Digunakan untuk menentukan bentuk tampilan combo yang digunakan (0 - Dropdown Combo, 1 - Simple Combo, 2 - Dropdown List), pada Dropdown Combo, pemakai diperbolehkan mengetik tulisan yang tidak ada di list, pada Simple Combo, pemakai boleh mengetik atau memilih dengan tombol keatas atau kebawah dan daftar tidak bisa terbuka, pada Dropdown List, tulisan hanya dapat dipilih dari daftar.
Style
Indoprog
93
Hendra, S.T.
Untuk pengolahan ComboBox tidak jauh berbeda dengan Listbox, untuk itu perhatikan kembali contoh-contoh pengolahan Listbox diatas dengan sedikit perbedaan karakteristik antara Listbox dan ComboBox. Adapun event-event yang efektif pada ComboBox adalah sebagai berikut
Event Click DblClick GotFocus KeyDown KeyPress KeyUp LostFocus MouseDown MouseMove MouseUp Validate Keterangan sda sda sda sda sda sda sda sda sda sda sda
Indoprog
94
Hendra, S.T.
Latihan 10
Judul : Memahami kontrol Listbox yang diaplikasikan untuk pengolahan nama negara dan propinsi
1. Buatlah program yang menyimpan nama-nama negara didalam sebuah text file Negara.txt, dimana setiap kali form diaktifkan, maka isi file Negara.txt akan dibaca dan ditampilkan dalam suatu listbox, kemudian pemakai dapat melakukan tambah, perbaiki maupun hapus item dalam listbox, dan isi daftar akan disimpan kembali ke file Negara.txt setiap pemakai melakukan klik pada Simpan ke file.
Kontrol Listbox1 Text1 Command1 Command2 Command3 Command4 Command5 Properti Name MultiSelect Sorted Name Name Caption Name Caption Name Caption Name Caption Name Caption Nilai lstNegara 0 - None True lstItem cmdTambah &Tambah cmdPerbaiki &Perbaiki cmdHapus &Hapus cmdSimpankeFile &Simpan ke file cmdSimpan &Simpan
Koding yang akan dilakukan : Membuat deklarasi type dan variabel pada bagian General Declaration
Option Explicit 'Deklarasi enumerated type Private Enum Flag flNone = 0 flAdd = 1 flEdit = 2 End Enum 'Setiap variabel harus dideklarasikan
'Deklarasi variabel form level Dim Aksi As Integer 'Digunakan untuk menandai aksi yang dibuat pemakai
Membaca dari file Negara.txt dan mengisikannya kedalam lstNegara, serta membuat setting awal variabel pada Event Form Load
Indoprog
95
Hendra, S.T.
'Buka text file untuk input 'Looping s/d Eof 'baca 1 item 'tambahkan ke Listbox
Melakukan koding untuk menangani event klik pada kontrol cmdTambah, adapun hal yang perlu dilakukan adalah menandai Aksi sebagai flAdd dan mimindahkan fokus ke txtItem.
Private Sub cmdTambah_Click() Aksi = flAdd txtItem.SetFocus End Sub 'Aksi adalah flAdd 'pindah fokus ke txtItem
Melakukan koding untuk menangani event klik pada kontrol cmdPerbaiki, adapun hal yang perlu dilakukan adalah memeriksa apakah pemakai ada memilih item yang diperbaiki, kemudian memasukkan item yang diperbaiki ke txtItem, kemudian menandai Aksi sebagai flEdit, kemudian memindahkan fokus ke txtItem.
Private Sub cmdPerbaiki_Click() If LstNegara.Text = "" Then MsgBox "Anda harus memilih Item" & vbCrLf & _ "yang akan diperbaiki", vbOKOnly + vbInformation Else txtItem = LstNegara.Text txtItem.SetFocus Aksi = flEdit End If End Sub
Indoprog
96
Hendra, S.T.
Melakukan koding untuk menangani event klik pada kontrol cmdHapus, adapauh hal yang perlu dilakukan adalah memeriksa Aksi, apakah flAdd atau flEdit, jika flAdd, maka tulisan dalam txtItem ditambahkan ke listbox, kalau flEdit maka item pada listbox dihapus, dan tulisan pada txtItem ditambahkan, kemudian Aksi di set ke flNone dan isi txtItem dikosongkan
Private Sub cmdSimpan_Click() Dim Posisi As Integer If Aksi = flAdd Then LstNegara.AddItem (txtItem.Text) ElseIf Aksi = flEdit Then Posisi = LstNegara.ListIndex LstNegara.RemoveItem (Posisi) LstNegara.AddItem (txtItem.Text) End If Aksi = flNone txtItem.Text = "" End Sub 'Aksi diset ke flNone 'kosongkan txtItem 'Jika Aksi adalah flAdd 'Tambahkan txtItem ke Listbox 'Jika Aksi adalah flEdit 'Ambil posisi aktif 'Hapus item posisi tersebut 'Tambahkan txtItem ke Listbox
Melakukan koding untuk menangani event klik pada cmdHapus, dengan memeriksa apakah ada item yang dipilih, kalau ada remove item tersebut,dan reset flag Aksi
Private Sub cmdHapus_Click() If LstNegara.ListIndex < 0 Then 'Jika tidak ada yang dipilih
MsgBox "Anda harus memilih Item" & vbCrLf & _ "yang akan dihapus", vbOKOnly + vbInformation Else 'Hapus item tersebut
Melakukan koding untuk menangani event klik pada cmdSimpankeFile, dengan looping dari item 0 s/d Listcount -1.
Private Sub cmdSimpanKeFile_Click() Dim i As Integer Open "Negara.txt" For Output As #1 'Buka file untuk ditulis
Indoprog
97
Hendra, S.T.
2. Buatlah program yang menyimpan nama-nama propinsi didalam sebuah text file Indonesia.txt, dimana setiap kali form diaktifkan, maka isi file Indonesia.txt akan dibaca dan ditampilkan dalam suatu listbox, kemudian pemakai dapat melakukan tambah, perbaiki maupun hapus item dalam listbox, dan isi daftar akan disimpan kembali ke file Indonesia.txt setiap pemakai melakukan klik pada Simpan ke file.
Indoprog
98
Hendra, S.T.
Latihan 11
Judul : Memahami kontrol ComboBox yang diaplikasikan untuk pengolahan data Peserta Indoprogvb
1. Buatlah program untuk menyimpan data perserta indoprog-vb kesebuah random file Peserta.Dat yang memiliki struktur sebagai berikut :
'Struktur data untuk random file Private Type Peserta Email As String * 30 nama As String * 30 Alamat As String * 40 Kota As String * 20 Propinsi As String * 20 Negara As String * 20 Tempat As String * 20 TglLahir As Date Pria As Integer End Type
Pada masing-masing textbox dibatasi panjang pengetikkan terbatas sesuai dengan ukuran masing-masing field, seperti tampilan berikut : Isi ComboBox cboNegara diisi dari file Negara.txt, dan Propinsi dari file Propinsi.txt, sehingga menghasilkan tampilan sebagai berikut :
Indoprog
99
Hendra, S.T.
Petunjuk, lakukan hal tersebut pada Event Form_Load, adapun potongan programnya adalah sebagai berikut :
Private Sub Form_Load() Dim Item As String file 'Variabel untuk membaca isi text
'Isi cboNegara dengan file Negara.txt Open "Negara.txt" For Input As #1 'Buka text file Negara.txt Do While Not EOF(1) Input #1, Item 'Baca ke item cboNegara.AddItem (Item) 'Tambahkan item ke cboNegara Loop Close #1 'Tutup text file 'Isi cboPropinsi dengan file Propinsi.txt Open "Propinsi.txt" For Input As #1 Do While Not EOF(1) Input #1, Item cboPropinsi.AddItem (Item) Loop Close #1 'Buka Random file Peserta.Dat Open "Peserta.Dat" For Random As #1 Len=Len(DatPeserta) JlhRec = LOF(1) / Len(DatPeserta) If JlhRec > 0 Then Posisi = 1 Else Posisi = 0 End If
Indoprog
100
Hendra, S.T.
Untuk koding pada event-event tombol harus anda buat sendiri dengan mempelajari dan mencontoh Latihan pada Modul-modul sebelumnya untuk kemajuan anda sendiri. Catatan : Fasilitas Find adalah mencari berdasarkan Nama
Indoprog
101
Hendra, S.T.
Latihan 12
Judul : Tantangan penyempurnaan Program Peserta Indoprog-vb
1. Buka kembali program Latihan1 diatas, jalankan program diatas, dan carilah kelemahan-kelemahan yang ada, serta lengkapi program diatas untuk menutupi lubang kelemahan tersebut. 2. Lengkapi program Latihan2 dengan kemampuan memeriksa apakah data yang dimasukkan telah ada pada random file atau tidak, adapun kunci yang digunakan adalah alamat Email pada saat penyimpanan. 3. Lengkapi program Latihan2 dengan kemampuan Find Next, dimana mencari data memenuhi syarat yang berikutnya.
4. Buatlah semua form-form diatas ditampilkan ditengah layar pada saat di jalankan.
Indoprog
102
Hendra, S.T.
BorderStyle
Digunakan untuk menentukan icon yang digunakan pada operasi drag-n-drop pada kontrol label Menentukan modus drag-n-drop (0 - manual, 1 - automatic) Menentukan apakah kontrol dapat menerima event yang dibuat oleh pemakai, misalnya event Click, MouseDown, MouseUp, dll. Digunakan untuk menentukan tinggi dari kontrol Digunakan untuk menentukan nomor index, jika kontrol tersebut merupakan kontrol array. Digunakan untuk menentukan jarak kiri kontrol dari kontainernya. Digunakan untuk menentukan icon mouse yang digunakan ketika pointer mouse berada diatas kontrol label tersebut, properti ini berarti bila properti MousePointer diset menjadi (99 - Custom) Digunakan untuk menentukan bentuk pointer yang digunakan ketika mouse pointer berada diatas kontrol label tersebut. Digunakan untuk menentukan apakah gambar disesuaikan dengan ukuran kontrol (gambar dapat menggalami pengecilan maupun pembesaran)
MousePointer Stretch
Indoprog
103
Hendra, S.T.
Digunakan untuk menentukan gambar dalam image, atau mengambil gambar dalam image. Properti ini dapat digunakan sebagai tempat menyimpan data sementara yang berkaitan dengan kontrol picture tersebut Digunakan untuk menentukan tip tulisan ketika mouse pointer berada diatas kontrol Digunakan untuk menentukan jarak atas kontrol dari kontainernya. Digunakan untuk menentukan apakah kontrol label tersebut Visible atau tidak (False, True) Digunakan untuk menentukan lebar kontrol label