Pencarian (Searching) 1
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Pencarian Sequential digunakan apabila data dalam keadaan acak atau tidak terurut.
Pencarian Sequential atau sering disebut Pencarian Linear menggunakan prinsip sebagai berikut
data yang ada dibandingkan satu persatu secara berurutan dengan data yang dicari.
Pencarian Sequential (Sequential Search) :
1. Sequential Search pada Array yang elemen datanya Belum Terurut
a. Metode tanpa Sentinel
b. Metode dengan sentinel
2. Sequential Search pada Array yang elemen datanya Sudah Terurut
c. Metode Sequential Tanpa Sentinel
d. Metode Sequential Search Dengan Sentinel
#include <iostream.h>
typedef enum boolean {false=0,true=1};
main()
{
int X[10]={20,50,10,30,90,60,70,80,40,100};
boolean found;
int i,y;
cout << "nilai yang dicari = ";
cin >> y;
found=false;
i=0;
while ((i<10) & (!found))
{
if (X[i]==y)
found = true;
else
i = i + 1;
}
if(found)
cout << y <<" ditemukan pada index array ke-" <<i;
else
cout << y <<" tidak ada dalam Array tersebut";
}
3
Cara lain untuk Sequential Search pada data Array X[n], adalah dengan menyediakan satu
tempat setelah elemen terakhir, yaitu pada X[n+1] dan menyimpan harga yang dicari (misal y)
pada posisi tersebut. Nilai yang dicari pada posisi elemen terakhir tersebut dinamakan sentinel.
B. Proses pencarian sequential data belum terurut dengan sentinel :
pada dasarnya pencarian ini sama dengan proses pencarian sequential data belum
terurut tanpa sentinel yaitu melakukan pengulangan dari elemen ke-1 sampai dengan
jumlah data.
pada setiap pengulangan, dibandingkan data ke-i dengan yang dicari,
apabila sama berarti data telah ditemukan,
perbedaannya dengan yang tanpa sentinel adalah ketika data ditemukan tapi data
tersebut adalah sentinel berarti data tidak ada.
Contoh/* SeqSearch_BelumUrut_Sentinel{cara1}
diasumsikan Array X[0..10] sudah ada dan indeks ke 0..9 telah
berisi data yang belum urut, nilai yang dicari adalah y dan
hanya ada satu, y diletakkan di index ke-10 */
#include <iostream.h>
main()
{
int X[11]={20,50,10,30,90,60,70,80,40,100};
int i,y;
cout << "nilai yang dicari = ";
cin >> y;
X[10]=y;
i=0;
while (X[i]!=y)
i=i+1;
if (i>9)
cout << "tidak ada " << y << " dalam Array";
else
4
cout << y << " ditemukan dalam Array pada index ke-" << i;
}
Program SeqSearch_BelumUrut_Sentinel {cara1}
#include <iostream.h>
typedef enum boolean {false=0,true=1};
main()
{
int X[11]={20,50,10,30,90,60,70,80,40,100};
int i,y;
boolean found;
cout << "nilai yang dicari = ";
cin >> y;
X[10]=y;
found=false;
i=0;
while (!found)
{ if (X[i]==y) found=true;
else i=i+1;
}
if (i==10)
cout << "tidak ada " << y << " dalam Array";
else
cout << y << " ditemukan dalam Array pada index ke-" << i;
}
5
#include <iostream.h>
typedef enum boolean {false=0,true=1};
main()
{
int X[10]={10,20,30,40,50,60,70,80,90,100};
int i,y;
boolean found;
cout << "nilai yang dicari = ";
cin >> y;
found=false;
i=0;
while ((i<9) & (!found) & (y>=X[i]))
{ if (X[i]==y)
found=true;
else
i=i+1;
}
if (found)
cout << y << " ditemukan dalam Array pada index ke-" << i;
else
6
cout << "tidak ada " << y << " dalam Array";
}
#include <iostream.h>
typedef enum boolean {false=0,true=1};
main()
{
int X[11]={10,20,30,40,50,60,70,80,90,100};
int i,y;
boolean found;
cout << "nilai yang dicari = "; cin >> y;
X[10]=y;
found=false;
i=0;
while ((!found) & (X[i]<y))
i=i+1; //tidak ada pengecekkan ketemu atau tidak
if (i>9)
cout << "tidak ada " << y << " dalam Array";
else
if (X[i]==y)
cout << y <<" ditemukan dalam Array pada index ke-"<< i;
7
else
cout << "tidak ada " << y << " dalam Array";
}
#include <iostream.h>
typedef enum boolean {false=0,true=1};
main()
{
int X[11]={10,20,30,40,50,60,70,80,90,100};
int i,y;
boolean found;
cout << "nilai yang dicari = "; cin >> y;
X[10]=y;
found=false;
i=0;
while ((!found) & (X[i]<=y))
{ if (X[i]==y)
found=true;
else
i=i+1;
}
if (i==10)
cout << "tidak ada " << y << " dalam Array";
else
if (found)
cout << y << " ditemukan dalam Array pada index ke-" << i;
8
else
cout << "tidak ada " << y << " dalam Array";
}
PENUTUP
Sequensial Search mempunyai empat macam metode, dan metode pencarian ini dapat
dipakai untuk kelompok data yang urut maupun yang tidak urut.
SOAL-SOAL
Tulislah program untuk mencari data bertipe rekaman menggunakan salah satu metode
pencarian. Banyaknya data 10. Tipe rekaman mempunyai empat field, yaitu:
Pencarian (Searching) 2
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Salah satu syarat pencarian biner (Binary Search) dapat dilakukan adalah data sudah dalam
keadaan terurut. Dengan kata lain, apabila data belum dalam keadaan urut, pencarian biner tidak
dapat dilakukan.
Dalam kehidupan sehari-hari, sebenarnya kita sering menggunakan pencarian biner, misalnya
pada saat ingin mencari suatu kata dalam kamus.
Langkah dari pencarian biner adalah sebagai berikut:
1. mula-mula diambil posisi awal=1 dan posisi akhir=n
2. kemudian kita cari posisi data tengah dengan rumus posisi tengah = (posisi awal + posisi
akhir) div 2
3. kemudian data yang dicari dibandingkan dengan data tengah
a. jika sama, data ditemukan, proses selesai.
b. jika lebih kecil, proses dilakukan kembali tetapi posisi akhir dianggap sama
dengan posisi tengah - 1.
c. jika lebih besar, proses dilakukan kembali tetapi posisi awal dianggap sama
dengan posisi tengah + 1.
4. ulangi langkah 2 sampai data ditemukan, atau tidak ditemukan.
10
5. Pencarian biner ini akan berakhir jika data ditemukan atau posisi awal lebih besar dari
pada posisi akhir. Jika posisi awal sudah lebih besar daripada posisi akhir berarti data
tidak ditemukan.
Contoh :
Misalkan kita ingin mencari angka 14 pada sekumpulan data urut berikut :
1 2 3 4 5 6 7 8 9
3 7 10 12 13 14 20 24 29
awal tengah akhir
Jawab:
1. mula-mula dicari data tengah, dengan rumus tengah = (awal+akhir) div 2 = (1+9) div 2 =
5, berarti data tengah adalah data ke-5, dengan nilai 13
2. data yang kita cari adalah 14, bandingkan nilai 14 dengan data tengah.
3. karena 14 > 13, berarti proses dilanjutkan tetapi posisi awal dianggap sama dengan posisi
tengah+1 atau 6
1 2 3 4 5 6 7 8 9
3 7 10 12 13 14 20 24 29
awal tengah akhir
4. data tengah yang baru didapat dari rumus (6+9) div 2 = 7, berarti data tengah yang baru
adalah data ke-7, yaitu 20.
5. data yang kita cari adalah 14, bandingkan nilai 14 dengan nilai tengah.
6. karena 14 < 20, berarti proses dilanjutkan, tetapi posisi akhir dianggap sama dengan
posisi tengah-1 atau 6.
1 2 3 4 5 6 7 8 9
3 7 10 12 13 14 20 24 29
awal
akhir
tengah
7. data tengah yang baru didapat dari rumus (6+6) div 2 = 6, berarti data tengah yang baru
adalah data ke-6, yaitu 14
11
8. data yang kita cari adalah 14, bandingkan dengan data tengah, ternyata sama.
9. jadi data yang ditemukan pada indeks ke-6
Bagaimana jika data yang dicari tidak ditemukan, misalnya data yang dicari 16? Pencarian biner
ini akan berakhir jika data ditemukan atau posisi awal lebih besar dari pada posisi akhir. Jika
posisi awal sudah lebih besar daripada posisi akhir berarti data tidak ditemukan.
#include <iostream.h>
typedef enum boolean {false=0,true=1};
main()
{
int X[10]={10,20,30,40,50,60,70,80,90,100};
int i,y,j,k;
boolean found;
12
main()
{
int array[100], I;
clrscr();
for (i=0; i<100; i++)
array[i]= i;
printf(“Result of search %d\n”,binary_search(array, 33, 100));
printf(“Result of search %d\n”,binary_search(array, 75, 100));
printf(“Result of search %d\n”,binary_search(array, 1001, 100));
getche();
}
Program ini dimaksudkan untuk mengamati jumlah operasi searching yang harus dilakukan
untuk menemukan masing-masing nilai.
PENUTUP
14
Metode Binary Search dapat dipakai hanya untuk data yang urut atau telah diurutkan.
SOAL-SOAL
1. Ilustrasikan pencarian nilai 25 pada kumpulan data dibawah. Gunakanlah metode Binary
Search.
1 1 4 2 4 1 1 9 3 33
2 5 5 5 0 9 2
2. Ilustrasikan pencarian nilai 20 pada kumpulan data dibawah. Gunakanlah metode Binary
Search.
1 1 4 2 4 1 1 9 3 33
2 5 5 5 0 9 2
3. Tulislah program untuk mengurutkan data bertipe rekaman menggunakan salah satu metode
pengurutan. Tipe rekaman yang harus diurutkan mempunyai empat data, yaitu:
nomorinduk, bertipe bilangan bulat
nama, bertipe string
alamat, bertipe string
golongan, bertipe char (dapat bernilai ‘A’, …’Z’);
procedure pengurutan menerima satu parameter, yaitu bilangan bulat yang dapat bernilai 1, 2,
atau 3. Apabila bernilai 1, maka data diurutkan menurut nomorinduk, apabila bernilai 2, maka
data diurutkan menurut nama, dan apabila bernilai 3, maka data diurutkan menurut golongan.
15
Pengurutan (Sorting) 1
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Untuk melakukan proses pengurutan dapat menggunakan beberapa metode antara lain :
1 5 4 5 7 9 8 6
4 3 8 4 5 7 8 9 6
5 4 6 4 5 7 8 6 9
3 6 4 5 7 6 8 9
2 6 4 5 6 7 8 9
11 11 11 11
44 44 33 22
55 55 55 55
33 33 44 44
22 22 22 33
11 11 11
22 22 22
44 33 33
55 55 44
33 44 55
Langkah-langkah :
1 : Baca array elemen yang diurutkan (N)
2 : Kerjakan langkah 3 untuk I=1 s/d N-1
3 : Kerjakan langkah 4 untuk J=1 s/d N-1
4 : Cek apakah A[J]>A[J+1}
5 : Selesai
4 11 4 11 4 11 4 11
0 33 0 33 0 33
1 44 1 44 1 22
2 22 2 22 2 44
3 11 3 11 3 11
4 55 4 55 4 55
0 33 0 22 0 22 0 22
1 22 1 33 1 11 1 11
2 11 2 11 2 33 2 33
3 44 3 44 3 44 3 44
4 55 4 55 4 55 4 55
Program berikut memakai bubble sort untuk mengurutkan data array berisi 30 nilai acak :
/* Bubble Sort */
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
PENUTUP
20
Ketiga metode pengurutan langsung yang dibahas pada pertemuan ini hanya beberapa
dari metode pengurutan langsung lainnya. Banyak metode lain untuk mengurutkan data. Metode-
metode tersebut bertujuan sama yaitu mengurutkan data, yang berbeda hanya cara yang
mempengaruhi kecepatan untuk jumlah data tertentu.
SOAL-SOAL
1. Pergunakan ketiga metode pengurutan langsung di atas untuk menampilan data dalam
pengolahan data nilai suatu mata kuliah.
Buatlah menu untuk memilih metode yang dipakai, dan pilihan field yang akan dipakai sebagai
key juga harus bisa dipilih (misal berdasarkan NIM atau Nilai Akhir).
BykMhs, i, j : integer
Mahasiswa : Array[1..100] of DataMhs
Temp : DataMhs
tampilkan data.
2. Carilah metode pengurutan langsung lainnya selain ketiga metode yang dibahas pada
pertemuan ini.
22
Pengurutan (Sorting) 2
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Untuk melakukan proses pengurutan tidak langsung dapat menggunakan beberapa metode :
4. Shell Sort
5. Quick Sort
6. Merge Sort
1. Shell Sort
Disebut juga dengan istilah metode “pertambahan menurun (dimishing increment)” dari
Donald L.Shell. Metoda ini memanfaatkan penukaran sepasang elemen untuk mencapai keadaan
urut. Dua buah elemen ditukarkan dengan jarak tertentu.
Rumus : ■ Jarak pertama = N div 2
■ Jarak berikutnya = jarak sebelumnya div 2
Contoh :
24 46 11 26 57 38 27 20 17
A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
Sehingga : ■ Jarak pertama = 9 div 2 = 4
23
Ilustrasi
Jarak A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
Awal 24 46 11 26 57 38 27 20 17
Jarak = 4 24 46 11 26 57 38 27 20 17
24 38 11 26 57 46 27 20 17
24 38 11 26 57 46 27 20 17
24 38 11 20 57 46 27 26 17
Jarak = 2 24 38 11 20 17 46 27 26 57
11 38 24 20 17 46 27 26 57
11 20 24 38 17 46 27 26 57
/* Shell Sort */
11 20 17 38 24 46 27 26 57
#include <iostream.h>
11
#include <stdlib.h> 20 17 38 24 46 27 26 57
11
#include <conio.h> 20 17 38 24 46 27 26 57
void shell_sort(int
11 array[],
20 17 int size)
38 24 26 27 46 57
{ int temp, gap, i, exchange_occurred;
Jarak = 1 11 20 17 38 24 26 27 46 57
11
gap= size/2; 20 17 38 24 26 27 46 57
do { 11 17 20 38 24 26 27 46 57
do { 11 17 20 38 24 26 27 46 57
exchange_occurred= 0;
11 for17(i=0;20i<size-gap;
24 38i++) 26 27 46 57
11 17 if(array[i]
20 24 > array[i+gap])
26 38 27 46 57
11 17 20 { 24 26 27 38 46 57
11 17 20 temp=
24 array[i];
26 27 38 46 57
array[i]= array[i+gap];
11 17 20 array[i+gap]=
24 26 27
temp; 38 46 57
exchange_occurred= 1;
}
} while (exchange_occurred);
} while (gap= gap/2);
}
main()
{
int values[50], i;
clrscr();
//data yang belum diurutkan diambil dari hasil random
cout << "data yang belum urut : "<< endl;
for (i=0; i<50; i++)
{
Program values[i]= rand()%100;
berikut, memakai shell sort untuk mengurutkan array yang berisi 50 nilai acak:
cout << values[i] << " ";
}
Contoh Program Shell Sort :
cout << endl;
shell_sort(values, 50);
2. Quick Sort
Sering disebut dengan “partion exchange” sort.
Langkah-langkah :
a. Misal vektor A yang memiliki N elemen.
b. Dipilih sembarang elemen, biasanya elemen pertama, misal sebut saja X.
c. Kemudian, semua elemen tersebut dengan menempatkan X pada posisi J sedemikian
rupa sehingga :
25
#include <iostream.h>
Ilustrasi
#include <stdlib.h>
1#include <conio.h> N
24 void quick_sort(int
46 11 26
array[],57int first,
38 int27last) 20 17
{
int temp, low, high, list_separator;
Subvektor Kiri X Subvektor Kanan
low= first;
11 high=
20 last;
17 24 46 26 57 38 27
list_separator= array[(first+last)/2];
do {
1 J-1 while (array[low]<list_separator)
J+1 low++; N
while (array[high]>list_separator) high--;
11 20 17if (low<=high)24 46 26 57 38 27
{
temp= array[low];
array[low++]= array[high];
array[high--]= temp;
}
11 } while
20 (low<=high);
17 24 26 38 27 46 57
quick_sort(values, 0, 99 );
3. Merge Sort
Ide metode Merge Sort :
1. Pembagian array data menjadi dua bagian (bagian kiri dan bagian kanan)
Ulangi langkah 1 secara rekursi terhadap kedu abagian tersebut, sampai tiap subarray
hanya terdiri dari satu elemen.
27
tengah =
(1+7) div 2
2
25 6 12 7 28 15 20
tengah tengah
25 6 12 7 28 15 20 3
25 6 12 7 28 15 20
4
II
2 1 2 1 2
6 7
5 2 8 5 0
2 1 1 2 2
6 7
5 2 5 8 0
28
1 2 1 2 2
6 7
2 5 5 0 8
1 1 2 2 2
6 7
2 5 0 5 8
Algoritma MergeSortRekursi
Deklarasi
Type TipeData : Array[1..100] of integer
Data : TipeData
n,i : integer
Procedure MergeSort(input/output Data : TipaData;
input awal,akhir : integer)
Deskripsi
output(‘Banyaknya elemen array :’)
input(n)
i traversal[1..n]
Datai random(n)
MergeSort(Data,1,n)
endif
if (Datakiri>Datakanan) or (kiri>akhirkiri) then
tempi Datakanan
kanan kanan+1
endif
ii+1
endwhile
i traversal[awalkiri..akhirkanan]
Datai tempi
PENUTUP
Proses pengurutan tidak langsung dapat menggunakan beberapa metode : Shell Sort,
Quick Sort dan Merge Sort. Metode pengurutan tak langsung, implementasinya dapat
menggunakan fungsi rekursi.
SOAL-SOAL
1. Tambahkan ketiga metode pengurutan tak langsung di atas untuk menampilan data dalam
pengolahan data nilai suatu mata kuliah pada soal latihan kuliah pertemuan ke-8.
2. Buat program menghitung nilai tengah (median) dari data-data integer yang diinput lewat
keyboard, dan cari nilai Z dengan Z = (median)2.
(Keterangan : cari dengan bantuan procedure pengurutan atau sorting. Perhatikan untuk data
yang jumlahnya ganjil atau genap)
Misal :
Input : Data ke-1 = 3
Data ke-2 = 2
Data ke-3 = 6
Data ke-4 = 5
31
Output : Median = 4
Z = 16
32
Class (1)
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
#include <constrea.h>
#include
<string.h>
constream ctk;
struct mahasiswa Ba
{
char nim[11]; ga
char nama[21];
};
im
an
void main(){
ctk.clrscr(); a
struct mahasiswa a; ca
do{
ctk << “Masukkan NIM [10 digit]: “; cin >> a.nim; ra
}while(strlen(a.nim)!=10);
pa
do{ ssi
ctk << “Masukkan Nama [max 20 digit]: “; cin >> a.nama;
}while(strlen(a.nama)==0||strlen(a.nama)>20); ng
se
ctk << endl << endl;
ctk << “NIM : “ << a.nim << “ Nama : “ << a.nama;
getch();
}
33
Fungsi di atas menggunakan passing parameter by value. Hal ini tidak bagus performancenya
karena data sebesar satu struct harus dicopykan ke variable lainnya.
Hal ini dalam C++ ditangani dengan variable reference. Variable reference juga dikenal sebagai
alias.
Variabel Reference
Pada program di bawah ini kita mendeklarasikan variabel bernama a, kemudian kita membuat
variabel reference b sebagai alias / nama lain dari a. Sekarang kita dapat
mengakses/mengubah nilainya melalui a ataupun b.
#include <constrea.h>
void main(){
int a;
int &b = a; //variable reference, harus langsung
diinisialisasi
cout << b;
}
Pada program di atas kita mendeklarasikan variabel bernama a, kemudian kita membuat
variabel reference b sebagai alias / nama lain dari a. Sekarang kita dapat
mengakses/mengubah nilainya melalui a ataupun b.
Untuk passing struct ke dalam fungsi dengan menggunakan variabel reference akan lebih cepat
karena tidak perlu mengcopy isi variable ke variable lainnya.
#include <constrea.h>
34
#include<string.h>
constream ctk;
struct mahasiswa {
char nim[11];
char nama[21];
};
void main(){
ctk.clrscr();
struct mahasiswa a;
do{
ctk << “Masukkan NIM [10 digit]: “; cin >> a.nim;
}while(strlen(a.nim)!=10);
do{
ctk << “Masukkan Nama [max 20 digit]: “; cin >> a.nama;
}while(strlen(a.nama)==0||strlen(a.nama)>20);
cetak(a);
getch();
}
Konsep Encapsulation
Yang membedakan antara C dan C++ adalah, C++ sudah dapat memenuhi criteria
35
1. Encapsulation
- penggabungan data dan method ke dalam suatu class.
2. Inheritance
- pewarisan sifat dari class induk kepada class anaknya.
3. Polymorphism
- objek dari sebuah class dapat memiliki implementasi yang berbeda-beda.
Kita akan mempelajarinya satu per satu bagian. Marilah kita membuat sebuah class sederhana.
#include <constrea.h>
#include <string.h>
class Person {
private:
char nama[21];
int umur;
public :
void setNama(char *s){
strcpy(nama,s);
}
void setUmur(int n){
umur = n;
}
};
Class adalah design, template, atau blue-print. Dari suatu class dapat dibuat banyak
objek/instance. Analoginya adalah seperti ini, bayangkan jika anda seorang arsitek, sebelum
membangun rumah tentunya akan merancang dulu di kertas, jumlah dan letak pintu, jendela,
dan semuanya, itulah class. Kemudian dari gambar rumah tersebut kita dapat membangun
banyak rumah sesuai rancangan yang sudah dibuat. Masing-masing rumah jadi tersebut
adalah yang disebut dengan objek/instance.
Instance 1
Class
Design Instance 2
template
Blue Print
Instance 3
Sekarang kita akan melanjutkannya, class Person yang sudah dibuat akan kita buat objeknya.
constream ctk;
void main(){
ctk.clrscr();
a.setNama(“Ali”);
a.setUmur(21);
37
b.setNama(“Adi”);
b.setUmur(20);
Dari yang baru saja kita bahas, dapat kita simpulkan bahwa :
Mengapa data dibuat privat ? tentunya tidak dapat diakses dari luar class.
class Person {
private:
int umur;
public :
void setUmur(int n){
if ( n < 0 ) umur=-n; else umur=n;
}
}
void main(){
38
Person a;
a.umur = 9; //ERROR: umur sifatnya privat
//a.setUmur(9); adalah alternatifnya
}
Gunanya kita membuat private adalah information hiding, pengguna dari class tidak bisa
langsung mengakses data dalam suatu objek, untuk menjaga agar data selalu valid, bayangkan
jika variable umur kita buat public, bisa saja nilai umur di-set dengan nilai negatif ( umur tidak
ada yang negatif ), dengan melalui fungsi setUmur kita bisa memberikan alternative
penanganan jika hal itu terjadi seperti contoh di atas.
Selain itu beberapa fungsi pun dapat dibuat privat, di mana kita ingin fungsi-fungsi tersebut
tidak bisa diakses oleh pengguna class, sehingga class dapat dipandang lebih sederhana, karena
hanya fungsi-fungsi public saja yang ditampilkan, dan tentunya class menjadi lebih mudah
digunakan.
Private Function
Private Function
Latihan
1. Buatlah sebuah class bernama Titik, memiliki dua buah data yaitu variable x sebagai
integer dan y sebagai integer juga. Semua data bersifat private. Untuk mengubah data x
dan y, menggunakan fungsi public setX dan setY, untuk mendapatkan nilai x dan y,
melalui fungsi getX dan getY. Kemudian class Titik ini mempunyai fungsi translate
( translasi ) di mana memiliki bentuk fungsi sebagai berikut.
39
Fungsi ini akan menggeser nilai x sebesar vx dan nilai y sebesar vy.
2. Apakah variable reference sudah ada di pemrograman C ?
3. Apa yang dimaksud dengan member data dan member function ?
Dalam pembuatan class kita dapat membuat implementasi secara terpisah seperti di bawah ini.
class Person {
private:
int umur;
public :
void setUmur(int);
int getUmur();
};
int Person::getUmur(){
return umur;
}
this->umur digunakan untuk menunjuk ke objek yang aktif, menunjuk umur pada class
40
( member data ).
41
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Constructor
Constructor otomatis dipanggil pada saat objek/instance dibuat dari suatu class.
Destructor
class Person {
private:
char c;
public :
Person(); //constructor
~Person(); //destructor
}
Person::Person(){
cout << “constructor dijalankan” << endl;
42
Person::~Person(){
cout << “destructor dijalankan” << endl;
}
void main(){
Person a;
Person b;
}
Member Initializer
class Titik {
private:
int x,y;
public :
Titik(int a,int b); //constructor
}
void main(){
Titik p(8,7);
}
43
44
Class (2)
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Overloading Function
Dalam pemrograman C++, developer dapat membuat fungsi yang namanya sama tetapi
berbeda parameternya. Hal ini dikenal dengan Overloading Function / Method.
class Person {
private:
char c;
public :
void cetak();
void cetak(int n);
}
void Person::cetak(){
cout << “Hello” << endl;
}
void Person::cetak(int n){
45
for(int i=0;i<n;i++){
cout << “Hello” << endl;
}
}
void main(){
Person a;
a.cetak();
a.cetak(5);
}
Pada program di atas, fungsi cetak yang pertama akan memanggil fungsi cetak yang tanpa
parameter, sedangkan cetak(5) digunakan untuk memanggil fungsi cetak dengan parameter
sebuah integer. Fungsi yang dipanggil adalah Person::cetak(int n)
Constructor Overloading
Constructor dalam suatu class juga dapat dioverloading. Sebagaimana diketahui secara default
sebuah class memiliki 2 buah constructor yaitu Constructor default dan Constructor Copy dan
1 buah destructor. Selain itu kita bisa menambahkan Constructor lagi dengan membedakan
parameternya.
class Person {
private:
char c;
public :
Person();
Person(char c);
}
46
Person::Person(){
c = ‘ ‘;
}
Person::Person(char c){
this->c = c;
}
Bentuk pemanggilan constructor adalah dilakukan otomatis pada saat pembuatan objek.
Destructor dipanggil pada saat objek dihancurkan (di-unload dari memory).
Pembuatan objek dapat dilakukan dengan dua cara, dengan pointer dan tanpa pointer.
void main(){
Person a; //constructor dijalankan
Person *b;
Urutan pemanggilan constructor menggunakan konsep Stack. Jadi misalkan urutan pembuatan
objeknya adalah a,b,c maka destructor yang dijalankan adalah c,b,a.
47
void main(){
Person a,b,c;
}
Pada program di atas dibuat tiga buah objek a,b,dan c. Maka constructor yang dipanggil adalah
constructor untuk a, b, kemudian c. Pada saat akhir dari program, objek akan dibuang dari
memory, destructor yang dijalankan adalah destructornya c, b, baru kemudian a.
Jika objek dibuat dalam fungsi, constructornya pun akan tetap dipanggil. Perhatikan kembali
program berikut ini dan perhatikan pemanggilan constructor dan destructornya
#include <constrea.h>
#include <string.h>
class Person {
private:
char s[31];
public:
Person(char *);
~Person();
};
Person::Person(char *val){
strcpy(s,val);
cout << s << “ constructor…” << endl;
}
48
Person::~Person(){
cout << s << “destructor…” << endl;
}
//Objek global
Person global(“global”);
void fungsi(){
Person lokal(“lokal”);
static Person statiklokal(“statiklokal”);
}
void main(){
fungsi();
}
Constructor Copy
Constructor copy secara default sudah dimiliki oleh suatu class. Namun developer dapat
mendefinisikan sendiri constructor copy. Constructor copy dijalankan pada beberapa kondisi
yaitu:
1. Initialization
2. Passing parameter by value
3. Function Return
Cara mendefinisikan copy constructor adalah sebagai berikut:
#include <constrea.h>
#include <string.h>
49
class Person {
private:
char s[31];
public:
Person(char *);
Person(const Person &); //copy constructor
};
Kapan copy constructor harus didefinisikan ? Sebuah class harus kita buat copy
constructornya pada saat di dalam class terdapat variabel pointer dan mempunyai alokasi
yang dinamis.
Berikut ini adalah class yang tidak membutuhkan pendefinisian copy constructor oleh
developer bisa menggunakan default yang sudah ada saja.
Tetapi misalkan kita mempunyai class Person di mana namanya panjangnya bisa dinamis.
Maka kita definisikan data membernya sebagai pointer.
private:
char *name;
public:
Person();
~Person();
//Copy constructor
Person(const Person &b);
};
Pendefinisian class-nya adalah sebagai berikut
Person::Person(){
name = new char[21];
} Person::~Person(){
delete [] name;
}
//Copy constructor
Person::Person(const Person &temp){
name = new char [ strlen(temp.name)+1 ];
strcpy(name,temp.name);
};
Initialization
void main()
{
Person a;
...
51
void main()
{
Person a;
Function Return
52
void main()
{
Person a;
Person b;
b = get(a); //copy constructor is called
}
Default value
Pada saat membuat constructor dengan parameter (constructor overloading), nilai-nilai dari
parameter tersebut dapat diberi nilai default.
class Titik
{
private:
int x; int y;
public:
Titik(int x=0,int y=0);
};
Titik::Titik(int x,int y)
{
this->x = x;
this->y = y;
53
void main()
{
Titik a; //x=0, y=0
Titik b(5); //x=5, y=0
Titik c(8,9); //x=8, y=9
}
Static class members adalah di mana data/function tersebut merupakan milik class bukan
objeknya. Jadi nilainya hanya satu yang bisa digunakan untuk semua objek dari class tersebut.
class SomeClass
{
public:
static int n;
int m;
};
void main()
{
SomeClass a,b;
a.n = 10; a.m = 20;
b.n = 100; b.m = 40;
cout << “a.n = “ << a.n << endl;
54
Dari contoh program di atas dapat disimpulkan nilai dari a.n dan b.n adalah sama, karena
sebenarnya hanya ada stau variabel. Pengubahan nilai a.n sama saja merubah nilai b.n
55
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Friend Function
Friend Function adalah fungsi bukan anggota kelas yang dapat mengakses anggota
kelas. Sebagai contoh perhatikan coding berikut ini.
class Titik
{
private:
int data;
public:
friend void cetak(const Titik &);
};
void main()
{
Titik a(8,9); //x=8, y=9
cetak(a);
}
Fungsi cetak bukan merupakan anggota kelas, tetapi fungsi biasa tetapi fungsi ini bisa
mengakses data dari class Titik.
Friend Class
Dengan menggunakan friend class, kita dapat membuat suatu class menjadi friend dengan class
lain sehingga class tersebut dapat mengakses semua data dalam class tersebut.
class add
{
private:
int x,y;
public:
add( )
{
x=y=4;
}
friend class support; //support is now a friend of add
};
57
Dengan menambahkan friend class support; berarti class support adalah teman dari class add
dan class support dapat mengakses data dari class add.
class support
{
public:
void sum(add ob) //it can access private members of class 'add’
{
cout<<"The sum of the 2 members is : "<<(ob.x+ob.y);
}
};
int main( )
{
add ad;
support sup;
sup.sum(ad);
return 0;
}
Operator overloading adalah fitur di mana programmer dapat mendefinisikan sendiri arti
dari suatu operator terhadap class yang dibuatnya.
class keranjang
{
private:
int apel, jeruk;
58
public:
keranjang (int=0,int=0);
void setapel(int);
void setjeruk(int);
int getapel();
int getjeruk();
};
int keranjang::getapel(){
return apel;
}
int keranjang::getjeruk(){
return jeruk;
59
void main(){
keranjang a (5,6);
keranjang b (2,3);
keranjang c;
Pada program di atas kita dapat mendefinisikan arti dari operator +=, --, + dan sebagainya.
Banyak sekali operator yang dapat dioverloading. Keuntungannya dapat mempermudah
penulisan coding dan lebih cepat. Misalkan untuk menambahkan apel dan jeruk sebanyak 2
buah bisa dilakukan dengan coding singkat sebagai berikut:
a += 2;
a.setapel ( a.getapel() + 2 );
60
a.setjeruk ( a.getjeruk() + 2 );
Cara membuat operator overloading adalah sebagai berikut. Pada bagian deklarasi class
tambahkan beberapa coding sebagai berikut:
class keranjang
{
private:
int apel, jeruk;
public:
keranjang (int=0,int=0);
void setapel(int);
void setjeruk(int);
int getapel();
int getjeruk();
Setelah itu setiap prototype fungsi tersebut kita definisikan lebih lanjut.
void keranjang :: operator += (int n)
61
{
this->apel += n;
this->jeruk += n;
}
void keranjang::operator –- ()
{
this->apel--;
this->jeruk--;
}
Operator overloading secara luas dipakai untuk meningkatkan efisiensi dalam penggunaan
class tersebut dalam coding. Di mana user coding akan dapat ditulis dengan lebih sederhana
dan ringkas. Salah satu fitur lain operator overloading dapat dilakukan terhadap tanda << dan
>> yang digunakan oleh ostream dan istream untuk input output. Misalkan untuk menampilkan
jumlah apel dan jeruk dapat ditulis dengan sebagai berikut
62
class keranjang
{
private:
int apel, jeruk;
public:
keranjang (int=0,int=0);
void setapel(int);
void setjeruk(int);
int getapel();
int getjeruk();
void operator += (int);
void operator –- ();
keranjang operator + (const keranjang &);
return out;
}
• ?: (conditional)
• . (member selection)
• .* (member selection with pointer-to-member)
• :: (scope resolution)
• sizeof (object size information)
• typeid (object type information)
Inheritance
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Konsep Inheritance
Inheritance atau pewarisan sifat merupakan bagian yang sangat penting dalam Object Oriented
Programming, dikarenakan kemampuan extensibility dan mempermudah peng-coding-an.
Sebagai contoh misalkan kita mempunyai class Titik, di mana dideklarasikan sebagai berikut.
class Titik
{
private:
int x,y;
public:
Titik(int=0,int=0);
void setx(int);
void sety(int);
int getx();
int gety();
};
65
int Titik::getx(){
return x;
}
int Titik::gety(){
return y;
}
Kemudian kita membuat class baru bernama Lingkaran di mana merupakan turunan dari class
Titik, maka semua member dari class Titik akan diturunkan ke Lingkaran dan class Lingkaran
dapat menambahkan data member baru yaitu radius. Semua data dan fungsi yang didefinisikan
akan dimiliki oleh class Lingkaran pula tanpa harus mengcoding ulang lagi. Keuntungannya
class dapat dibuat dengan mengembangkan class yang sudah ada.
Sebagai contoh kita buat class Lingkaran sebagai turunan dari class Titik. Di mana class
Lingkaran akan memiliki semua sifat dari class Titik dan kita tambahkan variabel radius
66
double Lingkaran::getradius(){
return radius;
}
double Lingkaran::getluas(){
return 22.0 / 7 * radius * radius;
}
67
double Lingkaran::getkeliling(){
return 22.0 / 7 * radius * 2;
}
Seperti contoh di atas pada bagian constructor, memanggil constructor class Titik, di mana
constructor Titik akan memberikan nilai untuk x dan y, sedangkan constructor Lingkaran
memberikan nilai untuk radiusnya.
Hal ini dikarenakan class Lingkaran tidak mempunyai akses ke x dan y secara langsung karena
dideklarasikan secara private. class Lingkaran hanya bisa mengakses lewat fungsi setx dan
sety.
Tipe-tipe inheritance
Inheritance Type
Member Type
private protected Public
private private Private Private
protected private protected protected
public private protected public
68
Pada saat membuat coding inheritance, dapat dispesifikasi tipe inheritancenya yang akan
mengakibatkan perubahan level akses ke anggota kelas. Sebagai contoh sebuah class B
diturunkan dari class A secara private, maka akan berdampak semua yang diturunkan ke class B
bersifat private.
class A {
public:
int data;
};
class B : private A {
//data is inherited and become private
};
class C : public B {
//data is inherited, but class C cannot access through it
//because it is private
};
Overriding Method
Overriding method adalah pembuatan sebuah fungsi dengan nama yang sama seperti yang sudah
diturunkan dari class induknya. Sebagai contoh kita lanjutkan membuat class Tabung turunan dari
Lingkaran.
private:
double tinggi;
public :
Tabung(int=0,int=0,double=0.0,double=0.0);
void settinggi(double);
double gettinggi();
double getluas(); //overriding
double getvolume();
};
Class Tabung merupakan turunan dari class Lingkaran, di mana sudah diturunkan fungsi
getLuas(), namun pada class Tabung melakukan overriding dengan membuat fungsi dengan
nama getLuas() juga, maka fungsi yang baru akan menggantikan (override) fungsi dari
induknya.
Multiple Inheritance
Sebuah class di C++ dapat diturunkan dari beberapa class (lebih dari satu class), dinamakan
Multiple Inheritance. Sebagai contoh class A diturunkan dari class B dan C.
Untuk lebih detail tentang Multiple Inheritance lihat di web berikut ini.
http://en.wikibooks.org/wiki/C++_Programming/Classes/Inheritance#Multiple_inheritance
http://en.wikipedia.org/wiki/Diamond_problem
71
Array of Object
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Array in C++
Array di C++ sangat erat kaitannya dengan pointer. Array adalah pointer.
Cara membuat array adalah sebagai berikut.
Array of Object
Cara membuat array of object sama dengan cara sebelumnya hanya yang digunakan adalah
class yang sudah dibuat. Sebagai contoh kita buat array of Titik.
72
delete [] p;
Titik *p[5];
...
for(i=0;i<5;i++)
{
delete p[i]; //release each object
}
73
74
Polymorphism
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Virtual Function
class Person {
public:
void speak();
};
void Person::speak(){
cout << “Person speak” << endl;
75
void Man::speak(){
cout << “Man speak” << endl;
}
void main(){
Person p;
Man m;
Penggunaan Polymorphism adalah menggunakan pointer dari superclass untuk menunjuk pada
objek dari subclass. Kemudian lewat pointer tersebut kita dapat memanggil method yang ada
dalam objek tersebut. Seperti contoh di atas ptr->speak() memanggil fungsi speak, namun yang
dijalankan justru adalah speak dari Person. Agar supaya fungsi speak() yang dijalankan adalah
fungsi speak() dari Man, kita harus menambahkan kata kunci virtual pada fungsi speak di class
Person.
class Person {
public:
virtual void speak();
};
76
Abstract class adalah class yang di dalam terdapat fungsi abstract. Fungsi abstract adalah
fungsi tanpa implementasi, di mana dikarenakan sifatnya terlalu general sehingga tidak bisa
diimplementasikan.
Pada gambar di atas class Animal bersifat abstrak karena memiliki fungsi abstrak yaitu
makeVoice(), di mana fungsi tersebut tidak bisa diberi implementasi. “Bagaimana binatang
bersuara ?”, ini pertanyaan yang tidak bisa dijawab dengan pasti karena sifatnya masih terlalu
umum. Kemudian class Cat dan Dog diturunkan dari class Animal, maka class Cat harus
meng- override fungsi makeVoice() tersebut.
class Animal {
public:
virtual void makeVoice()=0; //abstract method
};
77
void Cat::makeVoice(){
cout << “miaw...miaw...” << endl;
}
void Dog::makeVoice(){
cout << “guk...guk...” << endl;
}
Semua fungsi abstrak harus diberi keyword virtual di depannya. Selanjutnya class tersebut bisa
digunakan dalam program.
Penggunaan Polymorphism
Polymorphism digunakan dengan membuat pointer dari class induk untuk menunjuk pada objek
pada class anak. Di mana pada saat pemanggilan fungsi, implementasi yang dilakukan
berbeda- beda sesuai dengan objek yang ditunjuk
void main(){
Animap * ptr;
78
delete ptr;
}
79
Template Class
Mukidin, S. Kom
mukidin@stikompoltek.ac.id
http://elearning.stikompoltek.ac.id
Lisensi Dokumen:
Copyright © 2010 elearning.stikompoltek.ac.id
Seluruh dokumen di elearning.stikompoltek.ac.id dapat digunakan, dimodifikasi dan
disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak
menghapus atau merubah atribut dosen bersangkutan dan pernyataan copyright yang
disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,
kecuali mendapatkan ijin terlebih dahulu dari dosen yang bersangkutan.
Function Template
Template dapat digunakan untuk membuat class yang generik, dan dapat diimplementasi untuk
berbagai macam tipe data.
Function Template
int main(){
const int aCount=5;
80
printArray(a,aCount);
printArray(b,bCount);
printArray(c,cCount);
}
Template Class
Pada saat main program kita dapat menggunakan berbagai macam tipe data untuk class Stack
82
ini.
void main(){
Stack <double> doubleStack(5); //membuat stack untuk double
Stack <int> intStack(5); //membuat stack untuk int
…..
…..
}
Stack double dapat digunakan sebagai stack di mana data-datanya berupa double, sedangkan
yang satunya lagi berupa integer. Kita dapat membuat suatu class di mana datanya
menggunakan template untuk dapat diimplementasi untuk tipe data yang berbeda-beda.
83
Referensi
• Buku Teks
Munir, Rinaldi (2005), Algoritma dan Pemrograman dalam Bahasa Pascal dan C,
Buku 2, Edisi Ketiga, Penerbit Informatika Bandung.
Charibaldi, N. (2004), Modul Kuliah Algoritma Pemrograman II, Edisi Kedua,
Yogyakarta
• Buku Acuan/Referensi
Brassard, Gilles (1999), Fundamentals of algorithma, PrinteceHall.
Jarne, Stroustrup B. (1997), C++ Programming language, AT &T.
Kristanto, Andri (2003), Algoritma pemrograman C++, Graha Ilmu.
Schildt,Herbert (2000), The Complete Reference C++, McGraw-Hill.
Sedgewick, R. (2000), Algoritma Third edition In C part 5, Addison Wesley.