FUNGSI

January 13, 2009 at 2:20 am (Konsep pemrograman, materi perkuliahan)

FUNGSI

Sebuah fungsi berisi sejumlah pernyataan yang dikemas dalam sebuah nama. Nama ini selanjutnya dapat dipanggil dipanggil beberapa kali dibeberapa tempat dalam program. Tujuan pembuatan fungsi adalah :

q Memudahkan dalam mengembangkan program. Hal ini merupakan kunci dalam pembuatan program yang terstruktur.

q Menghemat ukuran program. Manfaat ini terasakan kalau ada beberapa deretan instruksi yang sama digunakan pada beberapa tempatdi dalam program.

Umumnya fungsi menerima masukan (disebut argumen atau parameter). Masukan ini selanjutnya diproses oleh fungsi. Hasil akhir berupa sebuah nilai yang disebut nilai balik (return value). Sebagai contoh, kalau terdapat pernyataan:

kap = toupper (huruf) ;

Maka :

Ø huruf adalah argumen bagi fungsi toupper ().

Ø toupper () memberikan nilai balik (berupa huruf kapital dari huruf ) ke variable kap.

6.1. Prototipe Fungsi

Sebuah fungsi tidak dapat dipanggil kecuali sudah dideklarasikan. Untuk melihat hal ini perhatikan contoh berikut :

void main ( )

{

printf (“Hai \n”);

}

Jika program ini dijalankan, C++ akan memberikan kesalahan yang menyatakan bahwa printf( ) tidak memiliki prototype. Hal seperti ini masih bisa lolos pada bahasa C. Tetapi tidak demikian halnya pada C++. Kesalahan seperti diatas tidak akan terjadi seandainya program ditulis menjadi seperti berikut :

#include <stdio.h>

void main()

{

printf (“ Hai \n “);

}

Mengapa? Karena prototipe fungsi printf( ) ada pada file “stdio.h”. Itulah sebabnya diperlukan untuk menyertakan baris berbentuk :

#include < nama_file_header >

Deklarasi fungsi dikenal dengan sebutan prototipe fungsi. Prototipe fungsi ini berupa :

v Nama fungsi.

v Tipe nilai balik fungsi.

v Jumlah dan tipe argumen.

Dan diakhiri dengan titik koma (;), sebagaimana pada pendeklarasian variable. Sebagai contoh :

1). long kuadrat (long l);

2). int maks3 (int a, int b, int c );

3). double maks (double x, double y );

4). void garis ( );

Pada contoh pertama, fungsi kuadrat() mempunyai argumen bertipe long dan nilai balik juga bertipe long. Pada contoh kedua, fungsi maks3() memiliki tiga buah argumen, masing-masing bertipe int dan nilai balik juga bertipe int. Adapun contoh ketiga, fungsi maks() mempunyai dua buah argumen, masing-masing argumen bertipe double. Pada contoh keempat, fungsi garis() tidak memiliki argumen dan nilai balik tidak ada (void).

Manfaat dari prototipe fungsi adalah untuk menjamin tipe argumen yang dilewatkan pada pemanggilan fungsi benar-benar sesuai. Tanpa adanya prototipe fungsi, amatlah mudah bagi pemrogram untuk melakukan kesalahan tanpa sengaja dalam melewatkan argumen. Misalnya, melewatkan argumen bertipe float pada fungsi yang semestinya meminta tipedata int. Dengan adanya prototipe fungsi, kesalahan semacam itu akan terdeteksi oleh kompiler.

6.2. Definisi Fungsi

Setiap fungsi yang dipanggil didalam program harus didefinisikan. Letaknya dapat dimana saja. Khusus untuk fungsi yang disediakan sistem, definisinya sebenarnya ada dalam pustaka, yang akan digabungkan dengan program sewaktu proses linking. Contoh definisi fungsi kuadrat( ):

long kuadrat (long l)

{

return (l * l);

}

Pada pendefisian fungsi, setelah :

long kuadrat (long l)

Tidak terdapat tanda titik koma. Ini berbeda dengan prototipe fungsi.

Pernyataan return didalam fungsi digunakan untuk memberikan nilai balik fungsi. Pada contoh diatas, fungsi kuadrat() memberikan nilai balik berupa nilai kuadrat dari argumen.

/*…….contoh fungsi untuk memperoleh nilai terbesar……*/

/*……………..di antara dua bilangan ………………*/

#include<iostream.h>

#include<conio.h>

double maks(double x,double y); //prototie

void main()

{

clrscr(); //hapus layar

cout<<maks(65789,123)<<endl;

cout<<maks(123,65789)<<endl;

}

//definisi fungsi

double maks(double x,double y)

{

if (x > y)

return (x);

else

return (y);

}

6.3. Fungsi Tanpa Nilai Balik

Adakalanya suatu fungsi tidak perlu memiliki nilai balik. Misalnya fungsi yang hanya dimaksudkan untuk menampilkan suatu keterangan saja. Pada fungsi ini, tipe nilai fungsi yang diperlukan adalah void.

/*..Contoh pembuatan dan pemanggilan fungsi tanpa nilai balik..*/

#include<iostream.h>

#include<iomanip.h>

#include<conio.h>

void garis(); //prototipe fungsi garis()

void main()

{

clrscr(); //hapus layar

garis(); //panggil fungsi garis()

cout<<setiosflags(ios::left);

cout<<setw(26)<<“J u d u l B u k u”<<“PENGARANG”<<endl;

garis(); //panggil kembali funsi garis()

cout<<setw(26)<<“Mastering Borland C++”

<<“Tom Swan”<<endl;

cout<<setw(26)<<“Turbo C++ By Example”

<<“Greg Perry & M.Johnson”<<endl;

cout<<setw(26)<<“Converting C To Turbo C++”

<<“Len Dorfman”<<endl;

garis(); //panggil kembali fungsi garis()

}

void garis()

{

int i;

for (i = 0;i<49;i++)

cout<<‘-‘;

cout<<endl;

}

6.4. Lingkup Variabel

Pemahaman terhadap lingkup variable didalam penulisan fungsi sangatlah penting, agar tidak salah dalam menggunakan suatu variable. Lingkup variable menentukan keberadaan suatu variable tertentu didalam fungsi. Ada variable yang hanya dikenal disuatu fungsi dan tidak dikenal pada fungsi lain. Namun ada juga variable yang dapat di akses oleh semua fungsi.

Jenis variable berdasarkan kelas penyimpanannya, yaitu :

v Variabel otomatis.

v Variable eksternal.

v Variable statis.

Varabel Otomatis.

Variabel yang didefinisikan didalam suatu fungsi berlaku sebagai variabel lokal bagi fungsi. Artinya, variable tesebut hanya dikenal didalam fungsi tempat variable didefinisikan.

/*…….Contoh untuk memperlihatkan efek variabel……….*/

/*…….otomatis (lokal)…………………………….*/

#include<iostream.h>

#include<conio.h>

void alpha(); //prototipe fungsi

void main()

{

int x = 22; //variable lokal pada main()

double y = 2.22; //begitu juga pada variable ini

clrscr();

cout<<“Pada main(): x =”<<x

<<“y =”<< y <<endl;

alpha(); //panggil variable alpha

cout<<“Pada main(): x =”<<x

<<“y =”<< y <<endl;

}

//definisi fungsi alpha()

void alpha()

{

int x = 20; //variable lokal pada main()

double y=3.14; //begitu juga pada variable ini

cout<<“Pada main(): x =”<<x

<<“y =”<< y <<endl;

}

Variable Eksternal.

Varibel eksternal merupakan kebalikan dari variable otomatis. Variable eksternal adalah varibel yang didefinisikan diluar fungsi manapun. Variable ini dikenal juga sebagai variable global, sebab variable ini dikenal di semua fungsi.

Guna memperjelas bahwa suatu variable didalam suatu fungsi merupakan variable eksternal, didalam fungsi yang menggunakannya, kita dapat mendeklarasikan (bukan mendefinisikan, karena tidak ada pengalokasian memori) dengan menambahkan kata kunci extern didepan tipe data. Kata kunci menyatakan bahwa variable tersebut didefinisikan di tempat lain.

/*……….Contoh variable eksternal………………*/

#include<iostream.h>

#include<conio.h>

int oblada = 550; //variable eksternal

void tambah(); //prototipe fungsi

void main()

{

clrscr(); //hapus layar

cout<<oblada<<endl;

tambah();

cout<<oblada<<endl;

tambah();

cout<<oblada<<endl;

}

//definisi fungsi

void tambah()

{

oblada++; //variable eksternal dinaikkan

}

Contoh lain:

/*….Contoh untuk menunjukkan kalau variable global……*/

/*……..dan variable lokal bernama sama……………*/

#include<iostream.h>

#include<conio.h>

int fernando = 55; //variable eksternal

void bravo(); //prototipe fungsi

void main()

{

clrscr(); //hapus layar

cout<<“main() : fernando =”<<fernando<<endl;

bravo();

cout<<“main() : fernando =”<<fernando<<endl;

}

void bravo()

{

int fernando; //variable lokal

fernando = 77;

cout<<“bravo() : fernando =”<<fernando<<endl;

}

Variabel Statis.

Baik variable eksternal maupun otomatis dapat berkedudukan sebagai variable statis. Suatu variable statis mempunyai sifat :

o Jika variable lokal berdiri sebagai variable statis, maka :

ü Variabel tetap hanya dapat diakses pada fungsi yang mendefinisikannya .

ü Variabel tidak hilang saat eksekusi fungsi berakhir. Nilai akan tetap dipertahankan, sehingga akan dikenali pada pemanggilan fungsi untuk tahap berikutnya.

ü Inisialisasi oleh pemrogram akan dilakukan sekali saja selama program dijankan. Jika tidak ada inisialisasi secara eksplisit, variable diisi dengan nol.

o Jika variable eksternal dijadikan sebagai variable statis, variable ini dapat di akses oleh semua file yang didefinisikan pada file yang sama dengan variable eksternal tesebut (hal ini bermanfaat pada pemrogram file berganda atau kode program dituh pada beberapa file).

o Variable statis diperoleh dengan menamahkan kata kunci static didepan tipe variable pada pernyataan pendefinisian.

/*………Contoh untuk menunjukkan efek…………….*/

/*…………….varible statis……………………*/

#include<iostream.h>

#include<conio.h>

void saya_ingat(); //prototipe fungsi

void main()

{

int mamamia = 50;

clrscr(); //hapus layar

saya_ingat();

saya_ingat();

saya_ingat();

cout<<“main() : mamamia =”<<mamamia<<endl;

}

//pada fungsi berikut

//mamamia didefinisikan sebagai variabel statis

void saya_ingat()

{

static int mamamia = 77; //variable statis

mamamia++; //naikkan sebesar 1

cout<<“saya_ingat(): mamamia =”<<mamamia<<endl;

}

6.5. Operator Resolusi Lingkup

Pada C++ terdapat operator berupa dua buah tanda titik dua (::). Operator ini disebut operator resolusi lingkup. Kegunaannya untuk mengakses variable yang didefinisikan diluar suatu fungsi. Hal ini sangat bermanfaat kalau didalam suatu fungsi yang hendak mengakses variabel tersebut terdapat varibel lokal (variable yang didefinisikan didalam fungsi dengan nama yang sama dengan variable diluar fungsi yang bersangkutan ).

/*….Operator resolusi ligkup dipakai untuk mengakses…..*/

/* variabel yang didefinisikan di luar blok */

#include<iostream.h>

#include<conio.h>

int x=50;

void main()

{

double x; //definisi variable lokal

clrscr(); //hapus layar

x = 5.678901234;

cout<< x <<” “<< ::x<<endl;

{ //awal blok baru

char x = ‘A'; //lokal terhadap blok ini

cout<< x <<” “<<::x<<endl;

}

}

6.6. Nilai Bawaan Untuk Argumen Fungsi

Salah satu keistimewaan C++ yang sangat bermanfaat dalam pemrograman adalah adanya kemampuan untuk menyetel nilai bawaan (default) argumen fungsi. Argumen-argumen yang mempunyai nilai bawaan nantinya dapat tidak disertakan didalam pemanggilan fungsi dan dengan sendirinya C++ akan menggunakan nilai bawaan dari argumen yang tidak disertakan.

/*…..Contoh mengatur nilai bawaan terhadap argumen……..*/

/* pada fungsi yang memiliki dua buah program */

#include<iostream.h>

#include<conio.h>

//prototipe fungsi dan penyetelan nilai bawaan

//pada argumen ke dua

void ulang(char karakter =’-‘,int jum =10);

void main()

{

ulang(‘*’,5); //tampilkan * sebanyak 5 kali

ulang(‘+’); //tampilkan + sebanyak 10 kali

ulang(); //tampilkan – sebanyak 10 kali

}

//definisi fungsi

void ulang(char karakter,int jum)

{

for (int i = 0;i<jum; i++)

cout<<karakter;

cout<<endl;

}

6.7. Referensi

int &ref = nama_varible ;

Pada C++ referensi digunakan untuk memberikan nama alias dari variable. Bentuk pendeklarasiannya :

Tanda & mengawali nama referensi.

Setelah pendeklarasian seperti diatas, ref menjadi nama alias dari nama_variable. Pengubahan nilai terhadap nama_variable dapat dilakukan melalui nama_variable itu sendiri ataupun melalui referensi ref.

Referensi sangat berguna untuk melewatkan struktur atau obyek yang besar kedalam fungsi. Dengan memakai referensi untuk parameter, hanya alamat yang akan dilewatkan dan bukan struktur atau obyek itu sendiri. Keuntungannya :

· Mempercepat eksekusi.

· Menghemat stack (untuk meletakkan argumen ke stack pada saat pemanggilan fungsi).

Selain itu akan membuat argumen struktur atau obyek gampang dipakai didalam fungsi itu sendiri.

/*….contoh untuk memperlihatkan alamat variabel……..*/

/* alamat referensi */

#include<iostream.h>

#include<conio.h>

void main()

{

int i = 55;

int &r = i; //referensi

clrscr(); //hapus layar

cout<<“Alamat : i = “<<&i<<” r =”<<&r<<endl;

}

6.8. Inline Function

Fungsi digunakan di dalam program diantaranya adalah untuk membentuk program yang terstruktur. Namun pemakaian fungsi kadang-kadang harus dibayar mahal. Sebab argumen-argumen fungsi harus diletakkan didalam stack pada saat pemanggilan fungsi. Kemudian pada saat fungsi berakhir, argumen-argumen yang ada pada stack perlu dikosongkan lagi. Sebagai akibat akan memperlambat eksekusi, terutama kalau fungsi sering dipanggil (misalnya pada pengulangan proses dengan while ).

Masalah seperti itu diatasi oleh C++ dengan menggunakan inline function. Sebuah inline function dibentuk dengan cukup menyisipkan kata kunci inline didepan tipe nilai balik fungsi dalam pendefisian fungsi.

Inline function disarankan dipakai pada fungsi yang sering dipanggil dan ukurannya kecil (terdiri satu atau dua pernyataan). Terutama jika dilibatkan pada pernyataan pengulangan proses (while, for dan do-while).

/*……Contoh pembuatan fungsi inline…………..*/

#include<iostream.h>

#include<conio.h>

//definisi fungsi sebagai inline

inline int jumlah(int x,int y)

{

return(x + y);

}

void main ()

{

clrscr();

for (int i = 1; i <100; i++)

cout << i <<“.” << jumlah(i, 2*i) << endl;

}

6.9. Function Overloading

Function Overloading terjadi sewaktu anda mendefisinikan kembali fungsi dengan sedemikian rupa sehingga fungsi itu bisa dipakai dalam beberapa versi di dalam satu program. Dalam bahasa C dua fungsi tidak bisa nemiliki scope yang sama. Dengan konsep function overloading itu C++ bisa mengatasi problem yang ada di bahasa C.

Function overloading atau overloading terhadap fungsi merupakan kemampuan C++ yang memungkinkan sebuah fungsi dapat menerima bermacam-macam tipe dan mamberikan nilai balik yang bervariasi pula. Ada beberapa alasan mengapa dilakukan funtion overloading:

· karena fungsi tertentu memiliki tugas generik (bisa dipakai dimana mana) tapi pemakaian lainnya memerlukan sedikit perubahan.

· karena kita menginginkan hasil yang sama dari nilai data yang bisa disajikan dalam berbagai format.

/*………contoh overloading terhadap fungsi…….*/

#include<iostream.h>

#include<conio.h>

//prototipe fungsi

int kuadrat (int i);

long kuadrat (long l);

double kuadrat (double d);

void main()

{

cout<<kuadrat(2)<<endl;

cout<<kuadrat(66666)<<endl;

cout<<kuadrat(1.2)<<endl;

}

//definisi fungsi

int kuadrat(int i)

{

return (i*i);

}

long kuadrat (long l)

{

return (l*l);

}

double kuadrat(double d)

{

return(d*d);

}

Contoh lain:

/*……Contoh overloading terhadap fungsi dengan…..*/

/*………jumlah argumen berlainan……………….*/

#include<iostream.h>

#include<conio.h>

void tampil(int i);

void tampil(int i,char *str);

void main()

{

clrscr();

tampil(5);

tampil(7,”Bintang”);

}

void tampil(int i)

{

cout<<i<<endl;

}

void tampil(int i,char * str)

{

cout<<i<<‘ ‘<<str<<endl;

}

6.10. Model Pendefinisian Fungsi pada C.

Berikut ini diberikan tiga buah fungsi yang dimaksudkan untuk memperoleh kuadrat dari tipe int, long, dan double.

int kuadrat_i (int i)

{

return (i*i);

}

long kuadrat_i (long i)

{

return (i*i);

}

double kuadrat_i (double d)

{

return (d*d);

}

Untuk membentuk fungsi yang sama dengan tipe yang berbeda-beda perlu dibuat nama fungsi yang berbeda–beda pula.

6.11. Fungsi Overload dan Tipe Safe – Lingkage

Tipe Safe Linkage adalah proses yang digunakan penyusun C++ (internal) untuk menjamin pemanggilan fungsi overloading adalah membandingkan versi yang sebenarnya pada fungsi tesebut.

Compiler C++ yang baru mengasumsikan bahwa pada pogram C++ itu ada fungsi overload sehingga proses pembentukannnya di sebut mangling pada setiap nama fungsi tanpa perkecualian.

Mangling adalah proses penambahan pada nama fungsi yang cukup informasi. Sehingga ini tidak ada kemungkinan bingung pada saat C tersebut terdapat header. Mangling nama fungsi dapat mencegah hubungan dari lokasi keberhasilan sebuah fungsi C pada librari.Untuk beberapa compiler dapat menurunkan mangling

6.12. Yang Dapat Di-Overload

Ada sebagian dari standar C operator set dapat di overload. Kita tidak dapat menemukan operator kita sendiri, hanya bisa memakai satu eksistensi. Semua ini bukan batasan yang buruk, di mana ketika kita berpikir tentang kekuatan yang inheren pada set operator C. Daftar berikut menunjukkan operator C dapat di overload:

[ ] ( )

- > ++

&

* +

- -

! sizeof

/ %

<< >>

<= >=

^ !=

&& ||

= *=/=

%= -%

+=

<<= >>=

& = ^ =

| = ,

Solusi pada C++

Pada C++, ketiga fungsi seperti di atas (dalam model pendefisian fungsi pada C) dapat menggunakan nama yang sama, misalnya kuadrat. Definisinya menjadi seperti berikut:

int kuadrat (int i)

{

return (i *i);

}

long kuadrat (long i)

{

return (i *i);

}

double kuadrat (double d)

{

return (d *d);

}

Kemampuan seperti inilah yang dinamakan function overloading. Yang menarik, C++ dapat memilih fungsi yang tepat dengan memeriksa tipe argumen. Jadi, seandainya terdapat pemanggilan fungsi kuadrat() sebagai berikut :

x = kuadrat (7.1);

Maka C++ dengan bijaksana akan memilih fungsi :

double kuadrat (double d)

{

return (d *d);

}

Dengan cara seperti ini, pemrograman tidak perlu mengingat-ingat nama-nama fungsi yang berbeda untuk menyiratkan operasi yang sama.

About these ads

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: