Anda di halaman 1dari 83

1

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 (Sequential Search)

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

A. Proses pencarian sequential data belum terurut tanpa sentinel :


 pada dasarnya pencarian ini hanya 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,
 sebaliknya apabila sampai akhir pengulangan tidak ada yang sama, berarti data tidak
ada.
2

Contoh Program SeqSearch_BelumUrut_nonSentinel


/* SeqSearch_BelumUrut_nonSentinel
diasumsikan Array X sudah ada dan berisi data yang belum
terurut, nilai yang dicari adalah y dan hanya ada satu */

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

Contoh Program SeqSearch_BelumUrut_Sentinel {cara2}


/* SeqSearch_BelumUrut_Sentinel {cara2}
diasumsikan Array X[0..10] sudah ada dan indeks ke 0..9 telah berisi data yang belum
terurut,nilai yang dicari adalah y dan hanya ada satu, y diletakkan di index ke-10 */

#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

C. Proses pencarian sequential data sudah terurut tanpa sentinel :


Dimulai dari elemen pertama pada Array, dilakukan pembandingan dengan elemen yang
dicari. Jika elemen dalam Array masih lebih kecil dari elemen yang dicari maka pencarian
diteruskan. Jika sudah lebih besar, pencarian dihentikan, dan bisa dipastikan bahwa elemen yang
dicari memang tidak ada.
Contoh Program SeqSearch_Urut_NonSentinel
/* SeqSearch_SudahUrut_NonSentinel
diasumsikan Array X sudah ada dan berisi data yang sudah terurut,
nilai yang dicri adalah y dan hanya ada satu */

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

D. Proses pencarian sequential data sudah terurut dengan sentinel :


Jika digunakan cara pencarian dengan sentinel (elemen yang dicari disisipkan di index
setelah data terakhir), dan elemen yang dicari lebih besar dari data terakhir yang ada di Array
sehingga data yang dicari sama dengan data sentinel maka dapat disimpulkan bahwa data tidak
ditemukan.
Contoh Program SeqSearch_Urut_Sentinel {cara1}
/* SeqSearch_SudahUrut_Sentinel {cara 1}
diasumsikan Array X[1..nmax] sudah ada dan indeks 1..n telah berisi data yang sudah
terurut,nilai yang dicari adalah y dan hanya ada satu */

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

Contoh Program SeqSearch_Urut_Sentinel {cara2}


/* SeqSearch_SudahUrut_Sentinel {cara 2}
diasumsikan Array X [0..10] sudah ada dan indeks 1..9 telah berisi data yang sudah terurut,nilai
yang dicri adalah y dan hanya ada satu */

#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:

 nomorinduk, bertipe bilangan bulat


 nama, bertipe string
 alamat, bertipe string
 golongan, bertipe char (dapat bernilai ‘A’, …’Z’)
Data dicari melalui nomorinduknya. Ketika data yang dicari ditemukan, tampilkan tiga field
lainnya.
9

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.

Pencarian Biner (Binary Search)

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.

Secara umum algoritma pencarian biner, adalah sebagai berikut :


(Data diurutkan lebih dahulu, data disimpan di data array, x adalah nilai yang dicari)
1. awal  1
2. akhir  N
3. ketemu  false
4. selama (awal<=akhir) dan (not ketemu) kerjakan baris 5 sampai 8.
5. tengah  (awal+akhir) div 2
6. jika (data [tengah] = x) maka ketemu  true
7. jika (x < data [tengah] ) maka akhir  tengah-l
8. jika (x > data [tengah] maka awal  tengah+1.
9. if (ketemu) maka tengah adalah indeks dari data yang dicari, jika tidak data tidak
ditemukan.
Contoh 1 pemakaian pencarian binary :
/* BinSearch_SudahUrut
diasumsikan Array X sudah ada dan berisi data yang sudah terurut,
nilai yang dicari adalah y dan hanya ada satu */

#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

cout << "nilai yang dicari = ";


cin >> y;
found = false;
i=0;
j=10;
while ((!found) & (i <= j))
{
k=(i+j)/2;
if (y == X[k])
found=true;
else
if (y<X[k])
j=k-1; //i tetap
else
i=k+1; //j tetap
}
if (found)
cout<< y<<"ditemukan dalam Array pada index ke-" << k;
else
cout << "tidak ada " << y << " dalam Array";
}

Contoh 2 pemakaian pencarian binary :


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int binary_search (int array[], int value, int size)
{
int found= 0;
int high= size, low= 0, mid;
Mid= (high+low)/2;
13

printf(“\n\nLooking for %d\n”, value);


while ((! Found) && (high >= low))
{
printf(“Low %d Mid %d High %d\n”, low, mid, high);
if (value == array[mid])
Found= 1;
else if (value < array[mid])
High= mid – 1;
else
Low= mid + 1;
Mid= (high + low) / 2;
}
return (( found) ? mid: -1);
}

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 :

A. Metode pengurutan langsung :


1. Metode Penyisipan Langsung (Straight Insertion Sort)
2. Metode Seleksi (Straight Selection Sort)
3. Metode Penukaran (Exchange selection) / Gelembung (Bubble Sort)
B. Metode pengurutan tidak langsung :
1. Shell Sort
2. Quick Sort
3. Merge Sort

A. Metode pengurutan langsung :


1. Metode Penyisipan Langsung (Straight Insertion Sort)
Dapat dibagi menjadi 2 bagian
– Bagian sebelah kiri data sudah terurut (tujuan)

– Bagian sebelah kanan data belum terurut (sumber)


Langkah-langkah :
1 : Baca array elemen yang akan diurutkan (n)
16

2 : Kerjakan langkah 3 sampai langkah 6 untuk i : 1 s/d n-1


3 : Tentukan elemen yang akan disisipkan (Temp = A [i] ;
j = i-1;)
4 : Kerjakan langkah 5 selama temp <A [j] dan j >= 0;
5 : A [j+1]= A[j] ; j =j-1;
6 : Tempatkan elemen A [j+1] = Temp;
7 : Selesai
Algoritma Straight Insertion Sort
Deklarasi
I,J,K,N : Integer
Temp : real
A : array [1..20] of real
Deskripsi
Input(N) {maksimal N=20}
K traversal [1..N]
Input (Af) {masukkan data sebanyak N}
I traversal [2..N]
Temp  A1
J  I-1
While (temp <Aj) and (J>=1) do
Aj+1  Aj
J J-1
Endwhile
Aj+1  Temp

Ilustrasi Insertion Sort


Temp =A [0] A [1] A [2] A [3] A [4] A [5]
i j=i-1
A[ i ] 4 7 9 5 8 6
1 0 7 4 7 9 5 8 6
2 1 9 4 7 9 5 8 6
3 2 5 4 7 5 9 8 6
17

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

2. Metode Seleksi (Straight Selection Sort)


Selection sort dimulai dengan menyelesaikan elemen array (misalnya elemen pertama).
Kemudian sorting mencari keseluruhan array hingga menemukan nilai yang terkecil. Sorting
menempatkan nilai terkecil pada elemen tersebut, memilih elemen kedua dan mencari elemen
terkecil kedua.

Langkah-langkah Straight Selection Sort


1 : Baca array elemen yang diurutkan (n)
2 : Kerjakan langkah-langkah 3 sampai langkah 5
untuk i=1 s/d n-1
3 : Tentukan lokasi awal data terkecil Mindeks =1;
kerjakan langkah 4 untuk j=i+1 s/d n
4 : Cari data terkecil dan catat lokasinya. Test
apakah AMindeks > Aj?
Jika ya, catat Mindeks = j
5 : Tukar nilai Amindeks dengan Aj
6 : Selesai

Ilustrasi Straight Selection Sort


44 33 33 22
33 44 44 44
55 55 55 55
22 22 22 33
11 11 11 11
18

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

3. Metode Penukaran (Exchange selection) / Gelembung (Bubble Sort)


 metode pertama yang paling banyak dipelajari pemrogram.
 Sederhana à
a. bubble sort tidak efisien dan menyita banyak waktu prosessor lebih banyak daripada
teknik sorting yang lain.
b. tidak lebih dari 30 atau kurang dari 30 elemen, penggunaan bubble sort masih sangat
baik
 Metode gelembung / penukaran adalah metode yang mendasarkan penukaran 2 buah
elemen untuk mencapai keadaan urut yang diinginkan

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

Ilustrasi Bubble Sort


0 44 0 33 0 33 0 33
1 33 1 44 1 44 1 44
2 55 2 55 2 55 2 22
3 22 3 22 3 22 3 55
19

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>

void bubble_sort(int array[], int size)


{
int temp, i, j;
for (i=0; i<size-1; i++)
for (j=0; j<size-1-i; j++)
if (array[j] > array[j+1])
{
temp= array[j];
array[j]= array[j+1];
array[j+1]= temp;
}
}

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

Struktur Data yang dipakai sebagai berikut :


Deklarasi
TYPE
DataMhs = Record
< NIM : String
Nama : String
UTS,UAS,Prakt,NA : real {0 s/d 100}
>

BykMhs, i, j : integer
Mahasiswa : Array[1..100] of DataMhs
Temp : DataMhs

Nilai Akhir (NA) dihitung dengan rumus : NA = 25%*UTS+50%*UAS+25%*Prakt

Proses yang dilakukan dalam program ini :


 memasukkan data,
 sorting, dan
21

 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

B. Metode pengurutan tidak langsung :

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

■ Jarak kedua = 4 div 2 = 2


■ Jarak ketiga = 2 div 2 = 1

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

//data yang sudah diurutkan


cout << "data yang sudah diurutkan : "<< endl;
for (i=0; i<50; i++)
cout << values[i] << " ";
getche();
}
24

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

i. elemen 1 s/d J-1 memiliki nilai lebih kecil dari X dan


ii. elemen ke J+1 s/d N memiliki nilai lebih besar dari X.
d. Dengan demikian, terdapat dua buah subvektor.
Contoh :
1 N
24 /* Quick
46 Sort*/
11 26 57 38 27 20 17

#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

if (first<high) quick_sort(array, first, high);


if (low<last) quick_sort(array, low, last);
}
11 17 20 24 26 38 27 46 57
main()
{
int values[100], i;
clrscr();
11 //data
17 yang
20 belum diurutkan
24 diambil dari
26 hasil
27 random
38 46 57
cout << "data yang belum urut : "<< endl;
for (i=0; i<100; i++)
{ Program
Contoh values[i]= rand()%100;
Quick Sort :
cout << values[i] << " ";
}
cout << endl;

quick_sort(values, 0, 99 );

//data yang sudah diurutkan


cout << "data yang sudah diurutkan : "<< endl;
for (i=0; i<100; i++)
cout << values[i] << " ";
getche();
}
26

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

2. Gabungkan masing-masing bagian itu sekaligus mengurutkannya, sesuai pohon yang


terbentuk saat membagi array, sampai membentuk array pertama saat sebelum dibagi.
Ulangi langkah 2 secara rekursi pula.
Ilustrasi Merge Sort
1
I 1 2 3 4 5 6 7
25 6 12 7 28 15 20

tengah =
(1+7) div 2

2
25 6 12 7 28 15 20

tengah tengah

25 6 12 7 28 15 20 3

tengah tengah tengah

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)

output(‘Data yang belum terurut : ‘)


i traversal[1..n]
output(Datai)

MergeSort(Data,1,n)

output(‘Data yang sudah terurut :’)


i traversal[1..n]
output(Datai)
29

Procedure MergeSort(input/output Data : TipaData;


input awal,akhir : integer)
Deklarasi Lokal
tengah : integer
Procedure Merge(input/output Data : TipaData;
input awalkiri,akhirkiri,
awalkiri,akhirkiri : integer)
Deskripsi
if (awal<akhir) then
tengah  (awal+akhir) div 2
MergeSort(Data,awal,tengah)
MergeSort(Data,tengah+1,akhir)
Merge(Data,awal,tengah,tengah+1,akhir)
endif

Procedure Merge(input/output Data : TipaData;


input awalkiri,akhirkiri,
awalkiri,akhirkiri : integer)
Deklarasi Lokal
temp : TipeData
i,kiri,kanan : integer
Deskripsi
kiri  awalkiri
kanan  awalkanan
i  awalkiri
while (kiri<=akhirkiri) or (kanan<=akhirkanan) do
if (Datakiri<=Datakanan) or (kanan>akhirkanan) then
tempi  Datakiri
kiri  kiri+1
30

endif
if (Datakiri>Datakanan) or (kiri>akhirkiri) then
tempi  Datakanan
kanan  kanan+1
endif
ii+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.

Review Abstract Data Type


Yang dimaksud dengan abstract data type adalah membuat tipe data baru dengan
menggunakan struct.

#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

buah struct ke suatu fungsi.

void cetak(struct mahasiswa val ){


ctk << “NIM : “ << val.nim << “ Nama : “ <<
val.nama;
}

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 cetak(struct mahasiswa & val ){


ctk << “NIM : “ << val.nim << “ Nama : “ << val.nama;
}

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

pemrograman berorientasi objek. Ciri-ciri dari pemrograman beorientasi objek adalah :

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.

Deklarasi class dan Implementasi class

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

char * getNama(){ return nama; }


int getUmur(){ return umur; }
36

};

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

//membuat objek dari class Person


Person a;
Person b;

a.setNama(“Ali”);
a.setUmur(21);
37

b.setNama(“Adi”);
b.setUmur(20);

//cetak nama dan umur masing-masing


ctk << a.getNama() << “ “ << a.getUmur() << endl;
ctk << b.getNama() << “ “ << b.getUmur() << endl;
getch();
}

Dari yang baru saja kita bahas, dapat kita simpulkan bahwa :

1. Sebuah class terdiri dari data dan method.


2. Sebuah class memiliki tipe akses, private yang hanya dapat diakses di class itu sendiri,
public yang dapat diakses di luar class, dan protected yang hanya dapat diakses oleh
class itu dan keturunannya.
3. Jika ingin mengubah data yang bersifat private, ubahlah melalui method yang public,
sebagai contoh jika kita ingin mengubah umur maka gunakan setUmur.
4. Dari satu Class dapat dibuat banyak objek.

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 Private Function use


r

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

void translate(int vx,int vy){


…..}

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

void Person::setUmur(int umur){


this->umur = umur;
}

int Person::getUmur(){
return umur;
}

this->umur digunakan untuk menunjuk ke objek yang aktif, menunjuk umur pada class
40

( member data ).
41

Constructor dan Destructor


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.

Constructor

Constructor otomatis dipanggil pada saat objek/instance dibuat dari suatu class.

Destructor

Destructor otomatis dipanggil pada saat objek dihancurkan/dibuang dari memory.

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

Untuk menginisialisasi data member dapat menggunakan member initializer.

class Titik {
private:
int x,y;
public :
Titik(int a,int b); //constructor
}

Titik::Titik(int a,int b) : x(a), y(b) {

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

Destructor tidak bisa dioverloading.

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;

b = new Person; //constructor dijalankan

b->setName(“John”); //atau (*b).setName(“John”);

delete b; //destructor b dijalankan


}
//destructor a dijalankan

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.

class A //Without copy constructor


{
private:
int x;
public:
A() {A = 10;}
~A() {}
};

Tetapi misalkan kita mempunyai class Person di mana namanya panjangnya bisa dinamis.
Maka kita definisikan data membernya sebagai pointer.

class Person //With copy constructor


{
50

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

Person b(a); //copy constructor is called

Person c = a; //copy constructor is called

Person d; //default constructor

d=a; //member wise copy, copy constructor is not called

Passing parameter by value

void cetak(Person temp)


{
cout << temp.getName();
}

void main()
{
Person a;

cetak(a); //copy constructor is called


}

Function Return
52

Person get(Person temp)


{
return temp;
}

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

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

cout << “a.m = “ << a.m << endl;


cout << “b.n = “ << b.n << endl;
cout << “b.m = “ << a.m << endl;
}

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

Friend Function/Class dan Operator


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

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 cetak(const Titik &p)


{
cout << p.data << endl;
56

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

Apa itu Operator Overloading

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

keranjang::keranjang(int apel=0, int jeruk=0)


{
this->apel = apel;
this->jeruk = jeruk;
}

void keranjang::setapel(int n){


apel = n;
}

void keranjang::setjeruk(int n){


jeruk = n;
}

int keranjang::getapel(){
return apel;
}

int keranjang::getjeruk(){
return jeruk;
59

Kita akan membuat supaya coding di bawah ini menjadi mungkin.

void main(){
keranjang a (5,6);
keranjang b (2,3);
keranjang c;

a += 2; // penggunaan operator overloading terhadap +=


b--; // penggunaan operator overloading terhadap --
c = a + b; // penggunaan operator overloading terhadap +

cout << a.getapel() << “ “ << a.getjeruk() << endl;


cout << b.getapel() << “ “ << b.getjeruk() << endl;
cout << c.getapel() << “ “ << c.getjeruk() << endl;
}

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;

akan sama saja dengan

a.setapel ( a.getapel() + 2 );
60

a.setjeruk ( a.getjeruk() + 2 );

Cara membuat operator overloading

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

void operator += (int);


void operator –- ();
keranjang operator + (const keranjang &);
};

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

keranjang operator + (const keranjang &p)


{
int apel = this->apel + p.apel;
int jeruk = this->jeruk + p.jeruk;
return keranjang(apel,jeruk);
}

Penggunaan operator overloading

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

cout << a.getapel() << “ “ << a.getjeruk() << endl;

bisa diringkas menjadi sebagai berikut


cout << a << endl;
Cara membuatnya tambahkan beberapa baris berikut dalam deklarasi class.

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

friend ostream & operator << (ostream & , keranjang &);


};

Setelah definisikan fungsi tersebut.

ostream & operator << (ostream & out, keranjang& p)


{
out << p.apel << “ “ << p.jeruk;
63

return out;
}

Daftar operator yang bisa/tidak bisa dioverload

Berikut ini adalah operator-operator yang tidak bisa dioverload.

• ?: (conditional)
• . (member selection)
• .* (member selection with pointer-to-member)
• :: (scope resolution)
• sizeof (object size information)
• typeid (object type information)

Lebih detail tentang operator overloading bias dilihat di sini.


http://en.wikibooks.org/wiki/C%2B%2B_Programming/Operators/Operator_Overloading
64

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

Titik::Titik(int x,int y){


this->x = x;
this->y = y;
}

void Titik::setx(int n){


this->x = n;
}

void Titik::sety(int n){


this->y = n;
}

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.

Calling Base Class Constructor

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

(jari- jari) dan fungsi getLuas() dan getKeliling()

class Lingkaran : public Titik


{
private:
double radius;
public:
Lingkaran(int=0,int=0,double=0.0);
void setradius(double);
double getradius();
double getluas();
double getkeliling();
};

Lingkaran::Lingkaran(int x,int y,double radius) : Titik(x,y) {


this->radius = radius;
}

void Lingkaran::setradius(double n){


this->radius = n;
}

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.

Lingkaran::Lingkaran(int x,int y,double radius) : Titik(x,y) {


this->radius = radius;
}

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

Untuk melakukan inheritance, terdapat beberapa tipe.

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.

class Tabung : public Lingkaran {


69

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.

Tabung::Tabung(int x,int y,double radius,double tinggi):Lingkaran(x,y,radius)


{
this->tinggi = tinggi;
}
void Tabung::settinggi(double tinggi)
{
this->tinggi = tinggi;
}
double Tabung::gettinggi(){
return tinggi;
}
double Tabung::getluas(){
return 2*Lingkaran::getluas() + Lingkaran::getkeiling() * tinggi;
}
double Tabung::getvolume(){
70

return Lingkaran::getluas() * tinggi;


}

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.

class A : public B,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.

int * arr = new int[5]; //array of int

for(int i=0; i < 5; i++){


arr[i] = 0;
}

delete [] arr; //delete the array – free memory


arr = new int[10]; //array of int with new size

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

Titik *p = new Titik[5];

for(int i=0; i < 5; i++){


p[i].setx(0);
p[i].sety(0);
}

Untuk release memory gunakan sintaks delete sebagai berikut.

delete [] p;

Selain itu bisa dilakukan dengan cara berikut ini.

Titik *p[5];

for(int i=0; i < 5; i++){


p[i] = new Titik;
p[i]->setx(0);
p[i]->sety(0);
}

...

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

Virtual Function digunakan dalam program untuk memaksimalkan fungsi Polymorphism.


Dengan polymorphism, programmer akan mem-program secara lebih umum ketimbang
spesifik. Untuk memahami contoh polymorphism perhatikan coding berikut ini.

class Person {
public:
void speak();
};

class Man : public Person {


public:
void speak(); //overriding
};

void Person::speak(){
cout << “Person speak” << endl;
75

void Man::speak(){
cout << “Man speak” << endl;
}

void main(){
Person p;
Man m;

p.speak(); //out “Person speak”


m.speak(); //out “Man speak”

Person *ptr = new Man; //using Polymorphism

ptr->speak(); //out “Person speak”


}

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 - Pure Virtual Function

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

class Cat : public Animal {


public:
void makeVoice();
};

class Dog : public Animal {


public:
void makeVoice();
};

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

ptr = new Cat;


ptr->makeVoice(); //out miaw...miaw...
delete ptr;
ptr = new Doq;
ptr->makeVoice(); //out guk...guk...

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

template < class T >


void printArray(const T *array, const int count )
{
for(int i = 0; i<count; i++){
cout << array[i] << “ “;
}
cout << endl;
}

int main(){
const int aCount=5;
80

const int bCount=7;


const int cCount=6;
int a[aCount]={1,2,3,4,5};
double b[bCount]={1.1,2.2,3.3,4.4,5.5,6.6,7.7};
char c[cCount]=”HELLO”;

printArray(a,aCount);
printArray(b,bCount);
printArray(c,cCount);
}

Template Class

template < class T >


class Stack {
private :
int size;
int top;
T *stackPtr;
public :
Stack(int = 10);
~Stack()
{
delete [] stackPtr;
}
void push(const T&);
void pop(T&);
int isFull(){ return top==size-1; }
81

int isEmpty() { return top==-1; }


};

template <class T>


Stack <T>::Stack(int s){
size = (s>0) ? s : 10;
top = -1;
stackPtr = new T[size];
}

template <class T>


void Stack<T>::push(const T &pushValue){
if(!isFull()){
top++;
stackPtr[top]=pushValue;
}
}

template <class T>


void Stack<T>::pop(T &popValue){
if(!isEmpty()){
popValue = stackPtr[top];
top--;
}
}

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.

Anda mungkin juga menyukai