Fungsi

71

VI
VI.1 Pendahuluan

FUNGSI

- Fungsi merupakan bagian (blok) dari kode program yang dirancang untuk melaksanakan tugas tertentu. Fungsi merupakan bagian penting dalam pemrograman C, dengan tujuan: o Program menjadi terstruktur, sehingga mudah dipahami dan mudah dikembangkan. o Dapat mengurangi pengulangan kode (duplikasi kode). - Tugas khusus yang dilakukan suatu fungsi dapat dilihat dari beberapa fungsi standard, seperti misalnya: o getch( ), dengan tugas untuk membaca kode tombol papan ketik yang ditekan. o printf( ), dengan tugas untuk menampiolkan informasi atau data ke layar. - Pada umumnya fungsi memerlukan masukan yang dinamakan sebagai argumen atau parameter. - Masukan ini selanjutnya diolah oleh fungsi dan hasil keluarannya dapat berupa sebuah nilai (disebut nilai keluaran fungsi atau nilai balik fungsi). - Bentuk umum sebuah fungsi adalah sebagai berikut: Penentu_tipe nama_fungsi (daftar parameter) Deklarasi parameter { tubuh fungsi } - Penentu tipe digunakan untuk menentuka tipe keluaran fungsi, yang dapat dilipih dari salah satu tipe data yang berlaku dalam C, seperti char atau int. Jika penentu tipe tidak disebutkan , maka akan dianggap sebagai int. - Sebuah fungsi dapat saja tidak mengandung parameter sama sekali, bahkan tanpa deklarasi parameter. Contoh: Nama funsi Tanpa argumen tidak ada tanda titik-koma awal fungsi tubuh fungsi akhir fungsi

Inisialisasi( ) { return(0); }

x). printf("y = %d\n".Program di atas sekaligus menjelaskan bahwa suatu fungsi cukup didefinisikan satu kali.c */ /* Contoh pembuatan fungsi */ /* ------------------------------------------.Contoh program berikut ini memperlihatkan penyusunan dan penggunaan suatu fungsi. } inisialisasi() { return(0). y. /* ------------------------------------------. } Contoh hasil eksekusi: C>Fungsi x=0 y=0 Program 6-1 . . x = inisialisasi(). .Fungsi 72 VI. dan di dalam tubuh fungsi pernyataan yang diberikan ntuk memberikan nilai kahir fungsi dapat berupa pernyataan return. tetapi dapat digunakan beberapa kali untuk menghindari duplikasi kode dan menghemap penulisan program maupun penyimpanan kode dalam memori. y). y = inisialisasi ().2 Memberi Nilai Akhir Fungsi .Sebuah fungsi dapat mempunyai nilai keluaran (seperti diperlihatkan pada contoh di atas).*/ #include <stdio. main() { int x. printf("x = %d\n".h> inisialisasi().*/ /* File program : fungsi.

. { if (x < y) return(x).Fungsi 73 .b). hasil = minimum(a.c */ /* Contoh fungsi yang mengandung argumen */ /* ----------------------------------------------------. hasil). printf("Nilai terkecil = %d\n".Bagi suatu fungsi. } contoh eksekusi: C>Minimum Nilai terkecil = 20 Nilai terkecil = 2 Program 6-2 .h> minimum(x.2)).y. maka eksekusi terhadap fungsi akan berakhir dan nilai pada parameter return akabn menjadi keluaran fungsi.Pada contoh berikut. maka tanda } akan digunakan sebagai tanda akhir eksekusi fungsi). int hasil. minimum(3. /* ---------------------------------------------------. int b = 44. jika suatu pernyataan return dieksekusi.*/ /* File program : Minimum. } main() { int a = 20. .Untuk fungsi yang tidak memiliki pernyataan return.*/ #include <stdio.y) int x. fungsi digunakan untuk memperoleh nilai minimum diantara dua nilai yang ada pada parameternya. else return(y). printf("Nilai terkecil = %d\n".

Fungsi 74 .Pada contoh program 6-2.2)). . dengan pernyataan: if (x < y) return(x). . y. . berupa : int x. berupa instruksi untuk menampilkan nilai terkecil antara 3 dan 2. VI. .3 Prototipe Fungsi . . minimum(3. maka keluaran fungsi adalah sebesar y. pendefinisian fungsi dilakukan pada awal program sebelum pernyataan program utama (main()). .Fungsi minimum() dipanggil dua kali. Yang pertama : hasil = minimum(a. . harus dituliskan nama fungsi dan parameternya yang diakhiri dengan tanda titik-koma. maka nilai keluaran fungsi adalah sebesar nilai x o Untuk keadaan selainnya ( x > y).Pernyataan di atas menyatakan: o Jika x < y.Yang kedua dengan pernyataan: printf("Nilai terkecil = %d\n".Pendeklarasian fungsi seperti pada program 6-1 dikenal sebagai prototipe fungsi (function prototype). pendefinisian fungsi dilakukan setelah program utama. else return(y). Model penulisan ini merupakan model klasik. . namun pada awal program (sebelum program utama).Penentuan nilai keluaran fungsi dilakukan pada tubuh fungsi.Pada program 6-1.Dari kedua contoh program di atas.Fungsi pada program di atas mempunyai dua buah parameter berupa x dan y. dapat dilihat bahwa penulisan tubuh fungsi bisa pada awal program maupun pada akhir program.Prototipe fungsi digunakan untuk menjelaskan kepada kompiler mengenai: o Tipe keluaran fungsi . oleh karena itu fungsi juga mengandung bagian untuk mendeklarasikan parameter.b). Yang memberikan nilai terkecil diantara a dan b ke bariabel hasil.

main() { int a = 6. jumlah(20. . /* ----------------------------------------. 0.Bagi kompiler. c = jumlah(a.Fungsi 75 o Jumlah parameter o Tipe dari masing-masing parameter .9)).*/ #include <stdio.float y). int b = 3.1. } hasil eksekusi : c>Jumlah a+b=9 Hasil penjumlahan = 21 Program 6-3 .Salah satu keuntungan penggunaan prototipe. kompiler akan melakukan konversi seandainya antara tipe parameter dalam definisi dan parameter saat pemanggilan fungsi tidak sama. printf("Hasil penjumlahan = %g\n".*/ /* File program : Jumlah.h> float jumlah(float x. printf("a + b = %g\n".b).c).c */ /* Contoh fungsi dengan prototipe */ /* ----------------------------------------. informasi dalam prototipe akan digunakan untuk memeriksa keabsahan (validitas) parameter dalam pemanggilan fungsi. atau akan menunjukkan kesalahan kalau jumlah parameter dalam definisi dan saat pemanggilan berbeda. } float jumlah(float x. float c. float y) { return(x + y).

9 (meskipun bukan berupa variabel). nilai dari parameter aktual akan disalin ke parameter formal. Pada pernyataan: o c = jumlah(a. b). printf("a = %d b = %d\n\n".b). o y = jumlah(20.*/ #include <stdio. b = 77. . a = 88. int).b.1.c */ /* Melihat pengaruh pemanggilan dengan nilai */ /* ------------------------------------------. .Terdapat dua cara untuk melewatkan parameter ke dalam fungsi.Fungsi 76 VI. /* ------------------------------------------. demikian pula 20.a. Pada fungsi jumlah( ) program 6-3. yaitu dengan cara: o Pemanggilan dengan nilai (call by value) o Pemanggilan dengan referensi (call by reference) . printf("Nilai sebelum pemanggilan fungsi\n"). VI. 0.1 dan 0.Pada pemanggilan dengan nilai.a dan b merupakan parameter aktual dari fungsi jumlah ().9).Parameter aktual adalah parameter (tidak selamanya menyatakan variabel) yang digunakan dalam pemanggilan fungsi.4 Parameter Formal dan Parameter Aktual .5 Cara Melewatkan Parameter . . x dan y dinamakan sebagai parameter formal.h> void tukar (int. Dengan cara ini nilai parameter aktual tidak bisa berubah sekalipun nilai parameter formal berubah. main() { int a. .Parameter formal adalah variabel yang ada pada daftar parameter dalam definisi fungsi.Pemanggilan dengan nilai merupakan cara yang digunakan pada contoh fungsi program terdahulu.*/ /* File program : Tukar.

z = x.Fungsi 77 tukar(a. x = y. printf("x = %d y = %d\n\n". printf("Nilai sesudah pemanggilan fungsi\n").Perubahan pertama terletak dalam definisi fungsi. int y) { int z.y). .x.Pemanggilan dengan referensi merupakan upaya untuk melewatkan alamat dari suatu variabel ke dalam fungsi. .Hal ini terjadi karena x hanyalah salinan dari a dan y salinan dari b. . . } hasil eksekusi : c> Tukar Nilai sebelum pemanggilan fungsi a = 88 b = 77 Nilai diakhir fungsi tukar() x = 77 y = 88 Nilai sesudah pemanggilan fungsi a = 88 b = 77 Program 6-4 .b).a. variabel a dan b (yang dilewatkan ke fungsi tukar ( )) tidak berubah. yakni berupa: .Cara ini dapat digunakan untuk mengubah isi suatu variabel di leuar fungsi dengan pelaksanaan pengubahan dilakukan di dalam fungsi.b). } void tukar (int x. printf("Nilai diakhir fungsi tukar()\n"). walaupun pada fungsi tukar ( ) telah terjadi penukaran antara parameter x dan y.Dari contoh program di atas terlihat bahwa hasil pemanggilan fungsi tukar( ). serta definisi fungsi tidak mengembalikan nilai (diawali dengan void dan tidak ada instruksi return( ) ). y = z. printf("a = %d b = %d\n\n".

int *py). /* variabel diawali dengan & */ . *py = z.*/ /* File program : Tukar2. *py. .menyatakan bahwa px dan py adalah suatu variabel pointer.Dalam pemanggilan fungsi &a dan &b masing-masing berarti “alamat a” dan “alamat b” px alamat a py alamat b a b Gambar 6.c */ /* Melihat pengaruh pemanggilan dengan referensi */ /* ---------------------------------------------------------.1 Variabel pointer px menunjuk variabel a dan variabel pointer py menunjuk variabel b.h> void tukar (int *px.Fungsi 78 tukar(int *px.*/ #include <stdio. yaitu variabel yang berisi alamat variabel yang lain. *px = *py. z = *px.Pendeklarasian parameter: int *px.Adapun perubahan dalam parameter aktual adalah sebagai berikut: Tukar(&a.. ……. main() { . int *py) { int z. } . &b). /* ---------------------------------------------------------. .

printf("Nilai diakhir fungsi tukar()\n").Suatu variabel disamping dapat digolongkan berdasarkan jenis/tipe data. printf("a = %d b = %d\n\n". } void tukar (int *px. *px = *py.&b).Penggolongan berdasarkan kelas penyimpanan berupa: . /* parameter alamat a dan alamat b */ printf("Nilai sesudah pemanggilan fungsi\n"). *py = z.*py).a. . b = 77.Fungsi 79 int a. printf("*px = %d *py = %d\n\n". tukar(&a. z = *px.b). int *py) { int z.6 Penggolongan Variabel Berdasarkan Kelas Penyimpanan . a = 88.a.*px. juga dapat digolongkan berdasarkan kelas penyimpanannya (storage class).b). printf("a = %d b = %d\n\n". } Hasil eksekusi : c> Tukar2 Nilai sebelum pemanggilan fungsi a = 88 b = 77 Nilai diakhir fungsi tukar() *px = 77 *py = 88 Nilai sesudah pemanggilan fungsi a = 77 b = 88 Program 6-5 VI. printf("Nilai sebelum pemanggilan fungsi\n").b.

Dalam banyak literatur.Contoh penggunaan variabel eksternal diperlihatkan pada contoh program 6-6 berikut ini.Variabel eksternal merupakan variabel yang dideklarasikan di luar fungsi.Fungsi 80 o o o o Variabel lokal Variabel eksternal Variabel statis Variabel register VI. variabel lokal disebut juga dengan variabel otomatis. yang mempunyai sifat: o Secara otomatis akn diciptakan ketika fungsi dipanggil dan akan hilang (dari memori) ketika eksekusi terhadap fungsi berakhir. VI.2 Variabel Lokal.1 Varibel Lokal . .Contoh variabel lokal adalah: Void fungsi_y(void) { int x. dan tidak dimaksudkan untuk digunakan oleh fungsi yang lain.6.Variabel lokal adalah variabel yang dideklarasikan dalam fungsi. o Hanya dikenal oleh fungsi tempat variabel dideklarasikan o Tidak ada inisialisasi secara otomatis (saat variabel diciptakan nilainya tidak tentu (acak)) .Penerapan variabel lokal yaitu jika variabel tersebut hanya digunakan oleh suatu fungsi tertentu. . fungsi fungsi_y : } Gambar 6. . dan mempunyai sifat: o Dapat diakses oleh semua fungsi o Jika tidak diberi nilai awal.2 Variabel Eksternal . x adalah variabel lokal bagi . secara otomatis diinisialisasi dengan nilai sama dengan nol .6. .

variabel eksternal harus dideklarasikan sebelum definisi fungsi yang akan menggunakannya. . } void tambah (void) { i++. /* variabel eksternal */ void tambah (void). i += 7.i).*/ /* File program : Eksternal.h> int i = 273.Satu hal yang perlu diingat. } Hasil eksekusi: C>Eksternal Nilai awal I = 273 Nilai I kini = 280 Nilai I kini = 281 Nilai I kini = 282 Program 6-6.Jadi i merupakan variabel eksternal. printf("Nilai i kini = %d\n". sehingga dapat digunakan oleh kedua fungsi yang ada pada program 6-6. . printf("Nilai i kini = %d\n".Pada contoh di atas i hanya dideklarasikan di bagian atas program. dan tidak dideklarasikan lagi pada fungsi main() maupun tambah().Fungsi 81 /* --------------------------------------------. .i).i). main() { printf("Nilai awal i = %d\n". . tambah().*/ #include <stdio.c */ /* Penggunaan variabel eksternal */ /* --------------------------------------------.i). printf("Nilai i kini = %d\n". tambah().

3 Variabel Statis .y). */ .*/ #include <stdio. static z. /* statis internal */ : : } /* --------------------------------------------. fungsi_y(). .6. Jika tidak ada inisialisasi oleh pemrogram maka secara otomatis akan diberi nilai awal nol. .Variabel statis diperoleh dengan menambahkan kata-kunci static di depan penentu tipe-data variabel. maka variabel hanya dikenal oleh fungsi tempat variabel dideklarasikan o Jika variabel statis bersifat eksternal.h> void fungsi_y (void). tempat variabel statis dideklarasikan.Fungsi 82 VI.*/ /* File program : Statis. fungsi_y().Variabel statis mempunyai sifat: o Jika variabel statis bersifat internal. o Berbeda dengan variabel lokal.Variabel statis dapat berupa variabel internal (didefinisikan di dalam fungsi) maupun variabel eksternal. { static int y. printf("Nilai y dalam main() = %d\n". main() { int y = 20.c */ /* Penggunaan variabel statis /* --------------------------------------------. maka variabel dapat digunakan oleh semua fungsi yang terletal pada file yang sama. /* statis eksternal */ void fungsi_y(void). yaitu saat fungsi dipanggil yang pertama kali. o Inisialisasi hanya dilakukan sekali. variabel statis tidak akan hilang sekeluarnya dari fungsi (nilai pada variabel akan tetap diingat).

/* variabel register */ int jumlah.Variabel register adalah variabel yang nilainya disimpan dalam register dan bukan dalam memori (RAM).4 Variabel Register .Variabel register biasa digunakan untuk variabel pengendali loop.h> main() { register int i. I++) jumlah++. } Contoh eksekusi: C> Statis Nilai y dalam fungsi_y() = 1 Nilai y dalam fungsi_y() = 2 Nilai y dalam main() = 20 program 6-7 VI.*/ /* File program : Var_reg. i<=100. . .Variabel register hanya dapat diterapkan pada variabel lokal atau parameter formal. printf("Nilai y dalam fungsi_y() = %d\n". y++.Fungsi 83 } void fungsi_y(void) { static int y.Contoh pemakaian variabel register: /* --------------------------------------------.c */ /* Penggunaan variabel register */ /* --------------------------------------------. karena register mempunyai kecepatan yang jauh lebih tinggi dibanding RAM . for (i=1. dengan tujuan untuk mempercepat proses dalam loop.6.y).*/ #include <stdio. yang bertipe char atau int. .

a++) for(b=0.time('\0').h> #include <time. i<20000. misalnya sampai 10000. printf("Waktu total = %d detik\n". waktu_awal = time('\0').j++) .j<20000.b++) . /* dengan variabel register */ waktu_awal = time('\0').*/ /* File program : tes_reg. /* --------------------------------------------.waktu_awal).b<20000.jumlah).*/ #include <stdio.c */ /* Penggunaan variabel register */ /* --------------------------------------------..Fungsi 84 printf("1+2+ . perbesar nilai batas loop. for (i=0. for (a=0.Buatlah program yang sama tapi tidak menggunakan variabel register.Contoh program berikut ini memperlihatkan perbedaan lama waktu eksekusi antara program yang menggunakan variabel register dengan yang tanpa variabel register. . +100 = %d\n". register int a. i++) for(j=0. Jika belum terlihat perbedaannya.h> main() { /* tanpa variabel register */ int i. .. } Program 6-8 . /* variabel register */ long waktu_awal.b. a<20000.j. kemudian bandingkan kecepatan kedua program tersebut.

} Contoh hasil eksekusi: C>tes_reg Waktu total = 4 detik Waktu total = 2 detik Program 6-9 .Fungsi 85 printf("Waktu total = %d detik\n".waktu_awal).time('\0').