Berlangganan

About Me


FUNGSI (BAGIAN 2)

FUNGSI

(BAGIAN 2)

10

Tujuan Instruksi Umum (TIU):

Mampu memahami konsep pemrograman modular dan mengetahui fungsi-fungsi standar yang disediakan oleh bahasa C sehingga mampu mengimplementasikannya dalam pembuatan program dengan menggunakan bahasa C untuk permasalahan yang cukup kompleks.

Tujuan Instruksi Khusus (TIK):

• Dapat membedakan ruang lingkup variabel dalam sebuah program dan fungsi.

• Memahami tentang pengiriman parameter, baik pengiriman parameter secara nilai maupun pengiriman

parameter secara alamat.

• Memahami konsep rekursi dan dapat mengimplementasikannya dalam pemrograman, khususnya dalam

bahasa C

Pembahasan Materi:

• Pemanggilan fungsi

• Pengiriman parameter dalam fungsi

- Pengiriman parameter secara nilai - Pengiriman parameter secara acuan

• Ruang lingkup variabel dalam fungsi

- Variabel lokal - Variabel global - Variabel statis - Variabel lokal

10.1 Pemanggilan Fungsi

Sebuah fungsi yang didefinisikan oleh pembuat program selain dapat dipanggil oleh fungsi main() juga dapat dipanggil oleh fungsi lain. Seperti kita ketahui bahwa bentuk umum sebuah fungsi adalah sebagai berikut:

Tipe_nilai_balik nama_fungsi(daftar_argumen) { instruksi; }

Daftar argumen berisikan parameter yang dituliskan pada saat pendefinisian fungsi disebut parameter formal , sedangkan daftar argumen berisikan parameter yang dituliskan pada saat fungsi dipanggil oleh fungsi lain disebut parameter aktual . Untuk dapat membedakan antara parameter formal dengan parameter aktual dapat kita perhatikan listing program 10.1 di bawah ini:

83

-----------------------------------------------------Page 1-----------------------------------------------------

Listing Program 10.1 Pemanggilan Fungsi oleh main()

#include <stdio.h>

int addition(int a, int b)

{

int r; r=a+b;

return (r);

}

int main ()

Parameter Formal

{

int z;

Parameter Aktual

z = addition (5,3);

printf("Hasilnya %d", z); return 0;

}

Hasil Program:

Hasilnya 8

Pemanggilan terhadap sebuah fungsi adalah suatu ekspresi. Pada contoh di atas fungsi addition dipanggil oleh fungsi main() . Pada saat pemanggilan tersebut terjadi pengiriman nilai dari parameter aktual kepada parameter formal.

Variabel yang digunakan untuk menampung hasil pemanggilan suatu fungsi harus setipe dengan tipe_nilai_balik dari fungsi yang dipanggil. Berdasarkan program 10.1, kita lihat tipe data dari z harus sama dengan tipe data dari fungsi addition . Pada fungsi addition terdapat variabel r yang bertipe sama dengan tipe data

fungsi yaitu int . Nilai yang dikembalikan dengan menggunakan instruksi return oleh fungsi addition adalah nilai dari r , kemudian nilai r tersebut diberikan kepada z .

return (r);

Sebuah fungsi yang dideklarasikan oleh pembuat program dapat juga memanggil fungsi lain yang sebelumnya telah dideklarasikan atau dibuat sebelumnya. Penulian fungsi dalam program yang sama misalnya

84

-----------------------------------------------------Page 2-----------------------------------------------------

fungsi A dan fungsi B , dengan fungsi A akan memanggil fungsi B. Posisi fungsi B dapat dituliskan sebelum ataupun setelah fungsi A. Jika fungsi B dituliskan sesudah fungsi A maka function prototype dari fungsi B harus dituliskan, sebaliknya jika fungsi B dituliskan sebelum fungsi A maka function prototype dari fungsi B boleh tidak dituliskan. Untuk melihat perbedaan letak penulia fungsi yang dipanggil dapat melihat listing program 10.2 dan listing program 10.3.

Listing Program 10.2 Fungsi Memanggil Fungsi yang Didefinisikan Sebelum Fungsi Utama

#include <stdio.h>

float kali(float x, float y) { return(x * y);}

float segitiga(float als, float tg)

{ return(kali(als, tg)/2); } //fungsi kali dipanggil oleh fungsi segitiga

float persegi(float p, float l)

{ return(kali(p,l)); }
 //fungsi kali dipanggil oleh fungsi persegi

void cetakLuas(float nilai)

{ printf("Hasil = %.3f\n", nilai); }

void main(void) {

float a= 10.5, b=2.4;

cetakLuas(segitiga(a, b));
 /* fungsi cetakLuas dipanggil dua kali, parameter

cetakLuas(persegi(a, b));
 yang dikirim adalah nilai
 balik dari fungsi

segitiga dan persegi */

}

Listing Program 10.3 Fungsi Memanggil Fungsi yang Didefinisikan Sesudah Fungsi Utama

#include <stdio.h>

float segitiga(float als, float tg); float persegi(float p, float l);

float kali(float x, float y) { return (x*y); }

void cetakLuas(float nilai)

{ printf("Hasil = %.3f\n", nilai); }

void main(void)

{ float a= 10.5, b=2.4; cetakLuas(segitiga(a, b)); cetakLuas(persegi(a, b));

}

float segitiga(float als, float tg) { return(kali(als,tg)/2); }

float persegi(float p, float l) { return(kali(p,l)); }

85

-----------------------------------------------------Page 3-----------------------------------------------------

Kedua program menghasilkan keluaran yang sama.

Hasil Program:

Hasil = 12.600

Hasil = 25.200

10.2 Pengiriman Parameter

Sebuah fungsi dapat dipanggil atau digunakan oleh fungsi lain. Komunikasi yang terjadi antara satu fungsi yang memanggil ( calling function ) dengan fungsi yang dipanggil ( called function ) dilakukan dengan cara saling bertukar data. Jika sebuah fungsi yang memanggil fungsi yang lain untuk melakukan suatu tugas tertentu , kepada fungsi yang dipanggil diberikan semua data yang dibutuhkan untuk melaksanakan tugasnya. Setelah fungsi yang dipanggil menerima data yang diberikan dan melaksanakan tugas tersebut, fungsi yang dipanggil akan mengembalikan hasil proses kepada fungsi yang memanggil.

Pertukaran atau pengirimanan data tersebut melalui antar muka atau penghubung yang disebut parameter. Parameter dapat berupa identifier (variabel atau konstanta) dapat pula berupa nilai. Pengiriman parameter dalam pemrograman ada 2 jenis yaitu, pengiriman parameter secara nilai dan pengiriman parameter secara acuan/ alamat.

Pengiriman Parameter Secara Nilai ( call by value )

Pada pemanggilan parameter secara nilai, pengirimanan data dilakukan dengan cara mengirimkan nilai dari fungsi yang memanggil ke fungsi yang dipanggil. Dengan kata lain nilai dari parameter aktual diberikan kepada parameter formal. Fungsi yang menerima kiriman nilai akan menyimpannya di alamat terpisah dari nilai asli yang digunakan oleh program yang memanggil fungsi. Perubahan nilai di fungsi (parameter formal) tidak akan merubah nilai asli di bagian program yang memanggilnya.Pengiriman parameter secara nilai adalah pengiriman searah,

yaitu
 dari
 bagian program yang memanggil fungsi ke fungsi yang dipanggil. Pengiriman suatu nilai dapat

dilakukan untuk suatu ungkapan, tidak hanya untuk sebuah variabel, elemen array atau konstanta saja.

Berdasarkan contoh di atas, addition adalah nama fungsi untuk menjumlahkan dua bilangan yang memiliki dua parameter yaitu a dan b yang bertipe data integer. Nilai balik dari fungsi addition bertipe data integer. z adalah variabel yang berisi nilai hasil pemanggilan fungsi addition . Variabel a dan b adalah parameter formal, sedangkan 5 dan 3 adalah nilai yang dikirimkan oleh bagian yang memanggil fungsi (dalam hal ini adalah z ), nilai 5 diberikan kepada a dan nilai 3 diberikan kepada b .

86

-----------------------------------------------------Page 4-----------------------------------------------------

Untuk lebih memahami tentang pengiriman parameter secara nilai dapat dilihat listing program 10.4 di

bawah ini:

Listing Program 10.4 Contoh Call by Value

#include <stdio.h> #include <conio.h>

void tukar(int x, int y);

void main() { int a,b;

a = 20; b = 30;

printf(“Nilai sebelum pemanggilan fungsi\n”); printf(“a = %i b = %i\n\n”, a, b);

/* pendeklarasian fungsi */

// a dan b sebelum pemanggilan fungsi

tukar(a,b);
 /* pemanggilan fungsi tukar() */

printf(“Nilai setelah pemanggilan fungsi\n”);

}

printf(“a = %i b = %i\n\n”, a, b); getch();

// a dan b setelah pemanggilan fungsi

void tukar(int x, int y) { int temp;

/* variabel sementara */

/* Pendefinisian fungsi tukar() */

temp = x; x = y;

y = temp;

printf(“Nilai di dalam fungsi tukar()\n”); printf(“x = %i y = %i\n\n”, x, y);

}

Hasil Program:

Nilai sebelum pemanggilan fungsi a = 20 b = 30

Nilai di dalam fungsi tukar() x = 30 y = 20

Nilai setelah pemanggilan fungsi a = 20 b = 30

Pengiriman Parameter Secara Acuan/ Alamat ( Call by Refference )

Pada pemanggilan parameter secara Acuan, pengirimanan data dilakukan dengan cara mengirimkan alamat-alamat dimana nilai dari parameter pada fungsi yang memanggil disimpan ke fungsi yang dipanggil, jadi pada pengirminan parameter secara acuan yang dikirimkan adalah alamat dimana sebuah nilai di simpan dan bukan nilainya. Fungsi yang menerima kiriman alamat ini akan menggunakan alamat yang sama untuk mendapatkan nilai datanya. Perubahan nilai di fungsi akan merubah nilai asli di bagian program yang memanggil fungsi. Pengiriman parameter secara acuan adalah pengiriman dua arah, yaitu dari fungsi

87

-----------------------------------------------------Page 5-----------------------------------------------------

pemanggil ke fungsi yang dipanggil dan juga sebaliknya. Pengiriman secara acuan tidak dapat dilakukan untuk suatu ungkapan. Contoh pengiriman parameter secara acuan:

Pada contoh di atas yang menjadi parameter aktual adalah x , y dan z , sedangkan yang menjadi parameter formal adalah a , b dan c . Pada parameter formal variabel a , b dan c dideklarasikan sebagai variabel pointer (variabel yang menampung alamat) dengan menggunakan operator alamat & atau operator * . Saat fungsi duplicate dipanggil, alamat dari x , y dan z dikirimkan kepada a , b dan c . Untuk lebih memahami tentang pengiriman parameter secara acuan dapat dilihat listing program 10.5 dan 10.6 di bawah ini:

Listing Program 10.5 Contoh Call by Refference_1

#include <stdio.h>

void duplicate (int& a, int& b, int& c) { a*=2;

b*=2; c*=2;

}

int main ()

{ int x=1, y=3, z=7;

printf(“Sebelum pemanggilan fungsi duplicate\n”); printf("x= %d y= %d z= %d\n”);

printf(“\nSetelah pemanggilan fungsi duplicate\n”); duplicate (x, y, z);

printf("x= %d y= %d z= %d”); return 0;

}

Program di atas dapat ditulis seperti dibawah ini, kedua program akan menampilkan hasil keluaran yang sama.

Listing Program 10.6 Contoh Call by Refference_2

#include <stdio.h>

void duplicate (int* a, int* b, int* c) {

*a*=2; *b*=2; *c*=2;

}

int main ()

{ int x=1, y=3, z=7;

printf("Sebelum pemanggilan fungsi duplicate\n"); printf("x= %d y= %d z= %d\n");

printf("\nSetelah pemanggilan fungsi duplicate\n"); duplicate (&x, &y, &z);

printf("x= %d y= %d z= %d"); return 0;

}

88

-----------------------------------------------------Page 6-----------------------------------------------------

Hasil Program:

Sebelum pemanggilan fungsi duplicate x= 1 y= 3 z= 7

Setelah pemanggilan fungsi duplicate x= 2 y= 6 z= 14

10.3 Ruang Lingkup Identifier dan Variabel

Berdasarkan jangkauannya atau ruang lingkupnya identifier terbagi dua, yaitu global identifier dan local

identifier .

Global identifier adalah identifier yang dideklarasikan di luar fungsi dan ditempatkan di atas semua fungsi dalam suatu program. Jangkauan dari global identifier meliputi seluruh program. Identifier yang dideklarasikan secara global, dapat dideklarasikan kembali di dalam fungsi.

Local identifier adalah identifier yang dideklarasikan di dalam fungsi, termasuk daftar parameter. Jangkauan dari local identifier terbatas hanya pada fungsi atau sub program yang mendeklarasikan identifier itu sendiri.

Penggunaan identifier global memang terlihat lebih mudah karena satu identifier dapat dikenali oleh semua bagian dari program dan transfer data antar fungsi menjadi lebih mudah, tetapi ada beberapa kerugian jika menggunakan identifier global , yaitu:

Jika program semakin besar, maka semakin besar pula kecenderungan terjadinya error . Sulit melacak kesalahan.

Data tidak terjaga dengan baik, setiap fungsi dapat mengubah isi variabel tanpa sepengetahuan fungsi lainnya.

Nama variabel adalah identifier sehingga variabel dapat dideklarasikan sebagai variabel lokal atau variabel

global. Bahasa C mengelompokkan variabel berdasarkan jangkauannya menjadi: 1. Variabel lokal

2. Variabel eksternal 3. Variabel statis, dan 4. Variabel register

Variabel Lokal

Variabel lokal adalah variabel yang dideklarasikan di dalam fungsi. Sifat-sifat variabel lokal adalah:

-

-

-

-

Secara otomatis akan diciptakan ketika fungsi dipanggil dan akan lenyap ketika proses eksekusi terhadap fungsi berakhir.

Hanya dikenal oleh fungsi tempat variabel dideklarasikan

Tidak ada inisialisasi secara otomatis (saat variabel diciptakan nilainya random). Dideklarasikan dengan menambahkan kata “ auto ” (opsional).

Variabel lokal dapat dideklarasikan dengan memberikan kata kunci auto di depan tipe data. Variabel yang dideklarasikan di dalam fungsi bila tidak diberi kata kunci auto akan dianggap sebagai variabel lokal.

89

-----------------------------------------------------Page 7-----------------------------------------------------

Variabel global (eksternal)

Variabel global (eksternal) adalah variabel yang dideklarasikan di luar fungsi. Sifat-sifat variabel global :

- - -

Dikenal (dapat diakses) oleh semua fungsi.

Jika tidak diberi nilai awal secara otomatis berisi nilai nol. Dideklarasikan dengan menambahkan kata “extern” (opsional).

Variabel global dapat juga diletakkan di antara fungsi sehingga menjadi semi global. Jangkauan variabel seperti ini adalah mulai dari tempat deklarasi sampai ujung program. Apabila variabel global mempunyai nama yang sama dengan variabel lokal maka yang dikenal pada lokasi setempat adalah variabel lokal.

Listing Program 10.7 Variabel Global dan Variabel Lokal

#include <stdio.h>

void tampil(void);

int i = 25;

/* variabel global */

void main() { clrscr();

printf(“Nilai variabel i dalam fungsi main() adalah %i\n\n”, i); tampil();

i = i * 4;

/* nilai i yang dikali 4 adalah 25 (global) bukan 10 */

printf(“\nNilai variabel i dalam fungsi main() sekarang adalah %i\n\n”, i);

}

void tampil(void)

{ int i = 10;

/* variabel lokal */

printf(“Nilai variabel i dalam fungsi tampil() adalah %i\n\n”, i);

}

Hasil Program:

Nilai variabel i dalam fungsi main() adalah 25

Nilai variabel i dalam fungsi tampil() adalah 10

Nilai variabel i dalam fungsi main() sekarang 100

Variabel Statis

Variabel statis adalah variabel yang nilainya tetap dan bisa berupa variabel lokal (internal) dan variabel global (eksternal). Sifat-sifat variabel statis :

- -

- - - -

Jika bersifat internal (lokal), maka variabel hanya dikenal oleh fungsi tempat variabel dideklarasikan. Jika bersifat eksternal (global), maka variabel dapat dipergunakan oleh semua fungsi yang terletak pada program yang sama.

Nilai variabel statis tidak akan hilang walau eksekusi terhadap fungsi telah berakhir. Inisialisasi hanya perlu dilakukan sekali saja, yaitu pada saat fungsi dipanggil pertama kali. Jika tidak diberi nilai awal secara otomatis berisi nilai nol. Dideklarasikan dengan menambahkan kata “static”.

90

-----------------------------------------------------Page 8-----------------------------------------------------

Listing Program 10.8 Variabel Statis

#include <stdio.h>

void nambah();

void main()

{ int stat=100;

nambah(); nambah();

printf(“Nilai stat dalam fungsi main()= %d\n”, stat);

}

void nambah()

{ static int stat=5; /* variabel statis */

stat++;

printf(“Nilai stat dalam fungsi nambah()= %d\n”, stat);

}

Hasil Running:

Nilai stat dalam fungsi nambah()= 6 Nilai stat dalam fungsi nambah()= 7 Nilai stat dalam fungsi main() = 100

Variabel Register

Variabel Register adalah variabel yang nilainya disimpan dalam resister dan bukan dalam memori RAM.

Sifat-sifat variabel register :

- - -

-

Hanya dapat diterapkan pada variabel lokal yang bertipe int dan char. Digunakan untuk mengendalikan proses perulangan (looping).

Proses perulangan akan lebih cepat karena variabel register memiliki kecepatan yang lebih tinggi dibandingkan variabel biasa.

Dideklarasikan dengan menambahkan kata “register”.

Listing Program 10.9 Variabel Register

#include <stdio.h>

void main() {

register int x;
 /* variabel register */

int jumlah;

for(x=1; x<=100; x++)

jumlah = jumlah + x; printf(“1+2+3+…+100 = %d\n”, jumlah);

}

Hasil Running:

1+2+3+…+100 = 8260

91

-----------------------------------------------------Page 9-----------------------------------------------------

Latihan:

1. Apakah kegunaan variabel statis? Berikan contoh pemakaiannya.

2. Jika sebuah variabel tidak didefinisikan sebagai salah satu jenis variabel (lokal, global/eksternal, statis atau

register) maka variabel tersebut diberi default apa?

3. Apa kelebihan dan kekurangan menggunakan variabel global? 4. Apa yang dimaksud dengan local identifier dan global identifier ? 5. Apa yang dimaksud dengan call by value ? 6. Apa yang dimaksud dengan call by refference ? 7. Apa keuntungan menggunakan variabel register?

Tugas Mandiri:

1. Buatlah fungsi untuk menukar dua bilangan dengan menggunakan pengiriman parameter secara acuan. 2. Tulislah sebuah fungsi yang dapat menguji apakah bilangan bulat kedua merupakan kelipatan dari bilangan

bulat pertama

==============

Referensi:

Deitel & Deitel, C How to Program 3rd Edition , Prentice Hall, New Jersey, 2001

Jogiyanto, Konsep Dasar Pemrograman Bahasa C , Andi Offset, Yogyakarta, 1993

Thompson Susabda Ngoen, Pengantar Algoritma dengan Bahasa C , Salemba Teknika, Jakarta, 2004

☺☺☺

92

-----------------------------------------------------Page 10-----------------------------------------------------

1 Response to "FUNGSI (BAGIAN 2)"

  1. mw nanya mengenai variabel register...
    1+2+3+...+100=8620
    kok bisa????
    alasanx??

    ReplyDelete