Sunday, October 11, 2009

Mengenal Fungsi Swap

Pengantar

Fungsi swap adalah fungsi yang digunakan untuk menukarkan dua buah nilai. Fungsi ini sangat dibutuhkan ketika kita hendak membuat aplikasi pengurutan data (sorting). Pada pemrograman C++, fungsi ini sudah tersedia dengan fleksibilitas yang tinggi. Artinya bisa digunakan untuk menukar dua buah nilai dengan tipe data yang bermacam-macam. Walaupun sudah tersedia dan tinggal pakai, tidak ada salahnya kita belajar bersama-sama bagaimana membuat fungsi ini. Contoh penggunaan fungsi swap yang sudah tersedia juga akan tersedia pada source code yang diberikan.

Sekilas Tentang Pointer

Pointer sudah pernah dibahas pada tulisan, pengenalan bahasa C++ (bagian 3). Pada bagian ini akan dijelaskan secara singkat penggunaan sederhana dari pointer.

Konsep penting yang perlu diingat adalah, pointer biasanya digunakan untuk menunjuk ke variabel yang lain. Untuk itu pointer membutuhkan alamat dari variabel yang ditunjuk. Setelah mengetahui alamat, dengan menggunakan pointer kita bisa mengubah nilai dari variabel yang ditunjuk.

Kita sudah tahu bahwa untuk membuat sebuah variabel, kita perlu menentukan tipe dari variabel dan kita juga perlu memperhatikan aturan pemberian nama dari variabel tersebut. Misal kita akan membuat variabel dengan nama data dan bertipe int, maka kita dapat menulisnya sebagai berikut:

int data;

Jika kita hendak membuat pointer. Kita cukup mendambahkan tanda bintang setelah tipe data.

int* myPointer;

pada deklarasi ini, kita membuat sebuah pointer dengan nama myPointer. Pointer ini hanya bisa menunjuk ke variabel yang bertipe int.

Seperti yang sudah dijelaskan sebelumnya, untuk menunjuk sebuah variabel, pointer membutuhkan alamat dari variabel yang hendak ditunjuk. Dengan menggunakan tanda '&' kita bisa mendapatkan alamat dari sebuah variabel. Berikut ini ditunjukkan bagaimana caranya myPointer bisa menunjuk ke alamat dari data.

myPointer = &data;

Variabel sebenarnya hanya merupakan nama lain dari alamat dimemori. Kita tentu akan lebih mudah mengingat nama seperti data dari pada sebuah alamat dimemori, 0x22ff5c.

Sekarang diandaikan kita memberikan nilai 10 (sepuluh) pada variabel data

data = 10;

pernyataan tersebut sebenarnya, kita menyimpan nilai 10 ke alamat tertentu dimemori yang diwakili dengan nama data. Karena myPointer telah menunjuk ke alamat dari data, ini berarti myPointer juga menunjuk ke nilai 10.

Untuk mengakses (misal membaca) nilai yang ditunjuk oleh pointer, kita bisa menggunakan tanda '*' didepan nama dari pointer.

cout<< *myPointer ;

Keluaran dari pernyataan ini adalah angka 10 akan tercetak ke layar. Keluaran ini akan sama jika kita menampilkan nilai dari variabel data.

cout<< data;

Kita juga bisa mengubah nilai yang ditunjuk oleh pointer, seperti berikut:

*myPointer = 15;

Setelah pernyataan diatas maka keluaran dari kedua pernyataan berikut akan sama persis yaitu menampilkan angka 15.

cout << data;
cout << *myPointer;

Membuat Fungsi Swap

Untuk membuat sebuah fungsi, kita bisa memulai dengan membayangkan bagaimana caranya kita memanggil fungsi yang akan kita pakai. Sebagai contoh fungsi swap yang akan kita buat dipanggil dengan cara sebagai berikut:

int a = 5;
int b= 7;
mySwap(&a,&b);
cout << a; // harapannya tertampil 7
cout << b; // harapannya tertampil 5

berangkat dari skenario di atas, tampak bahwa fungsi swap memiliki dua buah parameter pointer dengan tipe int. Untuk itu bentuk fungsi kita kira-kira seperti berikut:

void mySwap (int* x, int* y)
{
//body dari swap
...
}

pada kasus ini kita tidak membutuhkan nilai kembalian sehingga tipe data dari return value dibuat void. Kenapa tidak butuh ? Silahkan melihat lagi skenario yang kita buat di atas.

Karena fungsi kita hendak menukarkan nilai x dan nilai y (ingat x dan y adalah pointer, sehingga kita butuh tanda * untuk mengubah nilai), maka kita membutuhkan sebuah penampung (variabel tambahan) untuk melakukan proses penukaran ini.

Buf = *x;// buf bernilai x
*x = *y; // x bernilai y
*y = buf;// y bernilai x

pada contoh diatas, penampung yang kita pakai adalah Buf. Karena Buf dipakai untuk menampung nilai bertipe int, maka Buf juga harus dideklarasikan bertipe int.

int Buf;

Dengan demikian bentuk fungsi kita selengkapnya, kira-kira seperti berikut:

void swap (int* x, int* y)
{
//body dari swap
int Buf;
Buf = *x;
*x = *y;
*y = Buf;
}

Pemanggilan fungsi dengan cara mengirimkan alamat dari variabel, dikenal dengan istilah passing parameter by reference.

Di dalam bahasa C++, diperkenalkan teknik baru untuk pengiriman parameter berupa reference dengan menggunakan tanda '&'. Dengan menggunakan teknik ini, cara pemanggilan fungsi swap bisa diskenariokan sebagai berikut:

int a = 5;
int b= 7;
swap(a,b); // perhatikan tanda & dihilangkan
cout << a;
cout << b;

Perubahan juga perlu dilakukan pada fungsi kita sebagai berikut:

void swap (int& x, int& y) //perhatikan tanda &
{
//body dari swap
int Buf;
Buf = x;// tanda * juga dihilangkan
x = y;
y = Buf;
}


2 comments: