c++

102
1 Pencarian (Searching) 1 Mukidin, S. Kom [email protected] http://elearning.stikompoltek.ac.id 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 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

Upload: mukidin

Post on 19-Jun-2015

1.001 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: c++

1

Pencarian (Searching) 1Mukidin, S. [email protected]://elearning.stikompoltek.ac.id

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.

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 2: c++

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

}

Page 3: c++

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

Page 4: c++

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;

}

Page 5: c++

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

Page 6: c++

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;

Page 7: c++

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;

Page 8: c++

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.

Page 9: c++

9

Pencarian (Searching) 2Mukidin, S. [email protected]://elearning.stikompoltek.ac.id

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.

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 10: c++

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

Page 11: c++

11

7. data tengah yang baru didapat dari rumus (6+6) div 2 = 6, berarti data tengah yang baru

adalah data ke-6, yaitu 14

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;

Page 12: c++

12

boolean found;

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;

Page 13: c++

13

Mid= (high+low)/2;

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.

Page 14: c++

14

PENUTUP

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.

12 15 4 25 45 10 19 9 32 33

2. Ilustrasikan pencarian nilai 20 pada kumpulan data dibawah. Gunakanlah metode Binary

Search.

12 15 4 25 45 10 19 9 32 33

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.

Page 15: c++

15

Pengurutan (Sorting) 1Mukidin, S. [email protected]://elearning.stikompoltek.ac.id

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)

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 16: c++

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

i j=i-1Temp =

A[ i ]

A [0] A [1] A [2] A [3] A [4] A [5]

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

Page 17: c++

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

Page 18: c++

18

22 22 22 33

11 11 11 11

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

Page 19: c++

19

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

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

Page 20: c++

20

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

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}

>

Page 21: c++

21

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

tampilkan data.

2. Carilah metode pengurutan langsung lainnya selain ketiga metode yang dibahas pada

pertemuan ini.

Page 22: c++

22

Pengurutan (Sorting) 2Mukidin, S. [email protected]://elearning.stikompoltek.ac.id

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

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 23: c++

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

11 20 17 38 24 46 27 26 57

11 20 17 38 24 46 27 26 57

11 20 17 38 24 46 27 26 57

11 20 17 38 24 26 27 46 57

Jarak = 1 11 20 17 38 24 26 27 46 57

11 20 17 38 24 26 27 46 57

11 17 20 38 24 26 27 46 57

11 17 20 38 24 26 27 46 57

11 17 20 24 38 26 27 46 57

11 17 20 24 26 38 27 46 57

11 17 20 24 26 27 38 46 57

11 17 20 24 26 27 38 46 57

11 17 20 24 26 27 38 46 57

Page 24: c++

24

Program berikut, memakai shell sort untuk mengurutkan array yang berisi 50 nilai acak:

Contoh Program Shell Sort :

/* Shell Sort */#include <iostream.h>#include <stdlib.h>#include <conio.h>void shell_sort(int array[], int size){ int temp, gap, i, exchange_occurred;

gap= size/2;do { do {

exchange_occurred= 0;for (i=0; i<size-gap; i++)

if(array[i] > array[i+gap]){ temp= array[i]; array[i]= array[i+gap]; array[i+gap]= temp; 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++) { values[i]= rand()%100;

cout << values[i] << " "; } 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();}

Page 25: c++

25

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 :

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 46 11 26 57 38 27 20 17

Ilustrasi

1 N

24 46 11 26 57 38 27 20 17

Subvektor Kiri X Subvektor Kanan

1 J-1 J+1 N

11 20 17 24 46 26 57 38 27

11 20 17 24 46 26 57 38 27

11 20 17

11 17 20

11 17 20

24

24

24

26 38 27 46 57

26 46 57

3827 26 46 57

38 27

Page 26: c++

26

Contoh Program Quick Sort :

/* Quick Sort*/

#include <iostream.h>#include <stdlib.h>#include <conio.h>

void quick_sort(int array[], int first, int last){ int temp, low, high, list_separator;

low= first; high= last; list_separator= array[(first+last)/2]; do {

while (array[low]<list_separator) low++;while (array[high]>list_separator) high--;if (low<=high)

{ temp= array[low]; array[low++]= array[high]; array[high--]= temp;}

} while (low<=high);

if (first<high) quick_sort(array, first, high); if (low<last) quick_sort(array, low, last);}

main(){ int values[100], i; clrscr(); //data yang belum diurutkan diambil dari hasil random cout << "data yang belum urut : "<< endl; for (i=0; i<100; i++) { values[i]= rand()%100;

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

Page 27: c++

27

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.

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

201528712625

7654321

201528712625

tengah = (1+7) div 2

tengah tengah

I

201528712625

tengah tengahtengah

201528712625

1

2

3

4

Page 28: c++

28

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 : ‘)

II20

15

28

712

625

28

20

15

25

12

76

20

28

15

12

725

6

28

25

20

15

12

76

Page 29: c++

29

i traversal[1..n]

output(Datai)

MergeSort(Data,1,n)

output(‘Data yang sudah terurut :’)

i traversal[1..n]

output(Datai)

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

Page 30: c++

30

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

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.

Page 31: c++

31

(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

Output : Median = 4

Z = 16

Page 32: c++

#include <constrea.h>#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);

ctk << endl << endl; ctk << “NIM : “ << a.nim << “ Nama : “ << a.nama;

getch();}

32

Class (1)Mukidin, S. [email protected]://elearning.stikompoltek.ac.id

Review Abstract Data Type

Yang dimaksud dengan abstract data type adalah membuat tipe data baru dengan

menggunakan struct.

Ba

ga

im

an

a

ca

ra

pa

ssi

ng

se

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 33: c++

void cetak(struct mahasiswa val ){ ctk << “NIM : “ << val.nim << “ Nama : “ << val.nama;}

33

buah struct ke suatu fungsi.

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.

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>

#include <constrea.h>

void main(){ int a; int &b = a; //variable reference, harus langsung diinisialisasi

cout << b;}

Page 34: c++

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

Page 35: c++

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

Page 36: c++

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.

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

Class Design template Blue Print

Instance 1

Instance 2

Instance 3

Page 37: c++

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

Page 38: c++

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.

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.

Private Function

Private Function

Private Function

Private Functionuser

Page 39: c++

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

Page 40: c++

40

( member data ).

Page 41: c++

41

Constructor dan DestructorMukidin, S. [email protected]://elearning.stikompoltek.ac.id

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;

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 42: c++

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

}

Page 43: c++

43

Page 44: c++

44

Class (2)Mukidin, S. [email protected]://elearning.stikompoltek.ac.id

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

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 45: c++

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

}

Page 46: 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.

Page 47: c++

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;

}

Page 48: c++

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>

Page 49: c++

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

{

Page 50: c++

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;

...

Page 51: c++

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

Page 52: c++

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;

Page 53: c++

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;

Page 54: c++

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

Page 55: c++

55

Friend Function/Class dan Operator

OverloadingMukidin, S. [email protected]://elearning.stikompoltek.ac.id

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)

{

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 56: c++

56

cout << p.data << endl;

}

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

};

Page 57: c++

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:

Page 58: c++

58

int apel, jeruk;

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

Page 59: c++

59

return jeruk;

}

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

Page 60: c++

60

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

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.

Page 61: c++

61

void keranjang :: operator += (int n)

{

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

Page 62: c++

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)

{

Page 63: c++

63

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

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.w i kib o oks . or g /wiki / C% 2 B % 2 B_ P ro g r a m min g / Opera t o r s /O p era t o r _ O verl o ading

Page 64: c++

64

InheritanceMukidin, S. [email protected]://elearning.stikompoltek.ac.id

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

};

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 65: c++

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

Page 66: c++

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;

}

Page 67: c++

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.

Member TypeInheritance Type

private protected Public

private private Private Private

protected private protected protected

public private protected public

Page 68: c++

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.

Page 69: c++

69

class Tabung : public 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.

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;

}

Page 70: c++

70

double Tabung::getvolume(){

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

Page 71: c++

71

Array of ObjectMukidin, S. [email protected]://elearning.stikompoltek.ac.id

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.

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 72: c++

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

}

Page 73: c++

73

Page 74: c++

74

PolymorphismMukidin, S. [email protected]://elearning.stikompoltek.ac.id

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;

}

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 75: c++

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

};

Page 76: c++

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

};

Page 77: c++

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;

Page 78: c++

78

ptr = new Cat;

ptr->makeVoice(); //out miaw...miaw...

delete ptr;

ptr = new Doq;

ptr->makeVoice(); //out guk...guk...

delete ptr;

}

Page 79: c++

79

Template ClassMukidin, S. [email protected]://elearning.stikompoltek.ac.id

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;

Lisensi Dokumen:Copyright © 2010 elearning.stikompoltek.ac.idSeluruh 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.

Page 80: c++

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

Page 81: c++

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

Page 82: c++

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.

Page 83: c++

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.