Bagian artikel ini menunjukkan bagaimana pernyataan-pernyataan dapat dibungkus ke dalam sebuah “fungsi” untuk dijalankan saat dipanggil oleh program C.
- 6.1. Mendeklarasikan Fungsi-fungsi [ video ]
- 6.2. Memberikan Argumen-argumen [ video ]
- 6.3. Memanggil Secara Rekursif [ video ]
- 6.4. Menempatkan Fungsi-fungsi dalam Header [ video ]
- 6.5. Membatasi Aksesibilitas [ video ]
- 6.6. Ringkasan
Catatan:
- Silahkan Anda mengeklik icon menu untuk berpindah subbagian.
- Video pelengkap dalam tutorial ini akan lebih jelas dilihat dengan resolusi 720p dan mode Full screen.
6.1. Mendeklarasikan Fungsi-fungsi
Contoh-contoh sebelumnya dalam artikel ini telah menggunakan fungsi wajib yang disebut main()
dan juga fungsi-fungsi standar yang terkandung di pustaka header C seperti misalnya fungsi printf()
dari berkas stdio.h
. Bagaimana juga, kebanyakan program C mengandung sejumlah fungsi tersuai (custom) yang dapat dipanggil sesuai kebutuhan saat program dijalankan.
Sebuah blok fungsi, sederhananya mengandung sekelompok pernyataan yang dijalankan ketika fungsi tersebut dipanggil. Sekali pernyataan-pernyataan fungsi telah dijalankan maka aliran progam akan dilanjutkan pada titik fungsi tersebut dipanggil. Modularitas tersebut sangat berguna dalam pemrograman C untuk mengisolasi sehimpunan rutin sehingga mereka bisa dipanggil berulang kali.
Untuk memperkenalkan sebuah fungsi tersuai ke sebuah program C maka ia harus pertama kali dideklarasikan, sama seperti variabel-variabel harus dideklarasikan sebelum mereka digunakan. Deklarasi-deklarasi fungsi ditambahkan sebelum blok fungsi main()
.
Seperti fungsi main()
, fungsi tersuai dapat memberikan keluaran sebuah nilai. Tipe data yang akan dikeluarkan harus diikutsertakan dalam deklarasi fungsi. Apabila fungsi tersebut tidak mengeluarkan nilai maka tipe data keluarannya dideklarasikan dengan kata kunci void
. Pemberian nama fungsi mengikuti aturan-aturan seperti pada penamaan variabel.
Deklarasi fungsi lebih tepatnya dikenal sebagai “prototipe fungsi” atau “purwarupa fungsi” dan hanya memberitahu compiler tentang fungsi. Definisi fungsi sebenarnya yang mengikutsertakan pernyataan-pernyataan eksekusi berada setelah fungsi main()
. Untuk menjalankan pernyataan-pernyataannya, fungsi tersuai dipanggil dari dalam fungsi main()
sesuai kebutuhan.
Apabila sebuah fungsi tersuai memberikan keluaran sebuah nilai maka ia bisa disematkan pada sebuah variabel yang memiliki tipe data sama, atau bisa juga menampilkannya sebagai keluaran dengan penentu format yang bersesuaian.
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.
#include <stdio.h>
-
Deklarasikan tiga prototipe fungsi.
void f__pertama() ; int f__persegi() ; int f__kubik() ;
-
Tambahkan sebuah fungsi
main
yang mendeklarasikan sebuah vaiabel bilangan bulat.int main() { int v__bilangan ; }
-
Setelah fungsi
main()
, definisikan fungsi-fungsi tersuai.void f__pertama() { printf( "Halo dari fungsi pertama.\n" ) ; } int f__persegi() { int v__persegi = 3 * 3 ; return v__persegi ; } int f__kubik() { int v__kubik = ( 3 * 3 ) * 3 ; return v__kubik ; }
-
Sekarang masukkan panggilan fungsi dalam blok fungsi
main()
.f__pertama() ; v__bilangan = f__persegi() ; printf( "3 × 3 = %d\n" , v__bilangan ) ; printf( "3 × 3 × 3 = %d\n" , f__kubik() ) ;
-
Pada akhir blok fungsi utama berikan nilai keluaran berupa sebuah bilangan bulat bernilai nol seperti yang disyaratkan pada saat deklarasi fungsi.
return 0 ;
-
Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran fungsi-fungsi tersuai.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 6.1 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
6.2. Memberikan Argumen-argumen
Data dapat dilewatkan sebagai “argumen-argumen” untuk fungsi tersuai, yang kemudian data tersebut dapat digunakan untuk menjalankan pernyataan-pernyataan. Prototipe fungsi-fungsi harus mengikutsertakan nama dan tipe data setiap argumen.
Dalam pemrograman C, merupakan hal yang penting untuk mengetahui bahwa data dilewatkan “dengan nilai” (by value) ke variabel tertentu sebagai argumen fungsi. Hal tersebut berbeda dengan bahasa pemrograman lainnya, misalnya Pascal, yang argumennya dilewatkan “dengan acuan” (by reference) — dengan mana fungsi beroperasi pada nilai orisinalnya, bukan salinannya.
Argumen-argumen dalam sebuah prototipe fungsi dikenal sebagai “parameter-parameter formal” fungsi. Itu berarti, tipe data yang berbeda dan beberapa argumen dapat diberikan ke fungsi tunggal apabila dipisahkan dengan sebuah tanda koma. Sebagai contoh, sebuah prototipe fungsi dengan argumen yang memiliki empat tipe data bisa dilihat sebagai berikut:
void f__aksi( char vf__c , int vf__i , float vf__f , double vf__d ) ;
Compiler memeriksa bahwa parameter-parameter formal yang diberikan ke dalam prototipe fungsi cocok dengan apa yang ada dalam definisi fungsi dan akan melaporkan sebuah kesalahan apabila mereka tidak cocok.
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.
#include <stdio.h>
-
Deklarasikan tiga prototipe fungsi tersuai dengan satu argumen yang dilewatkan untuk masing-masingnya ketika dipanggil.
void f__tampilan( char vf__larik_karakter[] ) ; int f__persegi( int vf__x ) ; int f__kubik( int vf__y ) ;
-
Tambahkan sebuah fungsi
main()
yang mendeklarasikan sebuah variabel bilangan bulat dan sebuah variabel larik karakter yang diinisialisasi dengan sebuah kalimat.int main() { int v__bilangan ; char v__larik_pesan[50] = "Kalimat yang dilewatkan ke sebuah fungsi" ; }
-
Setelah fungsi
main()
, definisikan fungsi-fungsi tersuai.void f__tampilan( char vf__larik_karakter[] ) { printf( "%s\n" , vf__larik_karakter ) ; } int f__persegi( int vf__x ) { return ( vf__x * vf__x ) ; } int f__kubik( int vf__y ) { return ( vf__y * vf__y ) * vf__y ; }
-
Sekarang dalam fungsi
main()
, masukkan pernyataan-pernyataan untuk memanggil setiap fungsi tersuai dan memasukkan nilai-nilai argumen.f__tampilan( v__larik_pesan ) ; v__bilangan = f__persegi( 6 ) ; printf( "6 x 6 = %d\n" , v__bilangan ) ; printf( "4 x 4 x 4 = %d\n" , f__kubik( 4 ) ) ;
-
Pada akhir blok fungsi
main()
berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan pada pendeklarasian fungsi.return 0 ;
-
Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran dari fungsi-fungsi tersuai menggunakan nilai-nilai yang dilewatkan melalui argumen.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 6.2 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
6.3. Memanggil Secara Rekursif
Pernyataan-pernyataan dalam fungsi tersuai bisa dengan bebas memanggil fungsi-fungsi tersuai lainnya sesiap fungsi-fungsi pustaka standar seperti printf()
.
Fungsi-fungsi tambahan dapat memanggil diri mereka sendiri dan itu dikenal sebagai “fungsi-fungsi rekursif”. Seperti halnya perulangan maka merupakan hal yang penting bahwa fungsi-fungsi rekursif harus mengubah sebuah ungkapan uji untuk menghindari eksekusi yang terus-menerus — sehingga pemanggilan fungsi berakhir pada suatu titik.
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.
#include <stdio.h>
-
Deklarasikan sebuah prototipe fungsi dengan sebuah argumen yang dilewatkan ketika dipanggil.
void f__hitung_mundur_dari( int vf__bilangan ) ;
-
Tambahkan sebuah fungsi
main()
yang mendeklarasikan sebuah variabel bilangan bulat.int main() { int v__bilangan_awal ; }
-
Selanjutnya dalam blok fungsi
main()
, masukkan sebuah pernyataan yang meminta masukan dari pengguna berupa sebuah bilangan bulat yang nantinya disematkan ke variabel.printf( "Masukkan sebuah bilangan bulat positif sebagai awal bilangan untuk hitungan mundur: " ) ; scanf( "%d" , &v__bilangan_awal ) ;
-
Sekarang dalam blok fungsi
main()
tambahkan sebuah panggilan untuk fungsi tersuai dan melewatkan nilai yang telah dimasukkan oleh pengguna.f__hitung_mundur_dari( v__bilangan_awal ) ;
-
Dalam blok fungsi
main()
tambahkan sebuah pernyataan keluaran berupa sebuah pesan ketika kendali dikembalikan dari fungsi tersuai.printf( "Meluncur!\n" ) ;
-
Pada akhir blok fungsi
main()
berikan keluaran nilai bilangan bulat nol seperti yang disyaratkan pada saat pendeklarasian fungsi.return 0 ;
-
Setelah blok fungsi
main()
, mulailah membuat definisi fungsi tersuai dengan sebuah pernyataan untuk mengeluarkan nilai argumen yang dilewatkan selama pemanggilan fungsi.void f__hitung_mundur_dari( int vf__bilangan ) { printf( "%d\n" , vf__bilangan ) ; }
-
Selanjutnya dalam blok fungsi tersuai, kurangi nilai yang dilewatkan sebagai argumen.
--vf__bilangan ;
-
Sekarang dalam blok fungsi tersuai, tambahkan sebuah uji kondisional untuk mengembalikan kendali ke fungsi
main()
apabila pengurangan nilai berada di bawah nilai nol atau lewatkan nilai tersebut sebagai argumen dalam pemanggilan rekursif untuk fungsi yang sama.if( vf__bilangan < 0 ) return ; else f__hitung_mundur_dari( vf__bilangan )
-
Simpanlah berkas program kemudian kompilasi dan jalankan program, masukkan sebuah bilangan bulat yang diminta, untuk melihat keluaran dari pemanggilan fungsi rekursif.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 6.3 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
6.4. Menempatkan Fungsi-fungsi dalam Header
Contoh program-program yang ditampilkan sepanjang artikel ini tergolong kecil mengingat keterbatasan ruang namun dalam kenyataannya kebanyakan program C akan berisi kode yang secara signifikan lebih banyak.
Ketika mengembangkan program-program yang lebih besar maka beberapa pertimbangan diperlukan pada bagaimana struktur programnya. Memelihara keseluruhan kode program dalam sebuah berkas menjadi berat seiring membesarnya program.
Untuk menyederhanakan struktur program maka sebuah berkas header tersuai bisa dibuat dan berisi fungsi-fungsi yang bisa digunakan berulang kali. Berkas tersebut diberi nama dengan sebuah berkas ekstensi “.h”, seperti halnya berkas-berkas header standar dalam pustaka C.
Fungsi-fungsi dalam berkas header tersuai bisa disediakan ke program dengan menambahkan sebuah direktif prapemroses #include
pada awal berkas yang berisi fungsi main()
. Nama berkas header dikurung dengan menggunakan tanda petik dua dalam direktif prapemroses alih-alih dengan menggunakan kurung siku buka <
dan tutup >
yang digunakan untuk mengikutsertakan berkas header standar.
-
Buatlah sebuah berkas header tersuai bernama “utils.h” yang berisi definisi sebuah fungsi.
int f__persegi( int vf__bilangan ) { return ( vf__bilangan * vf__bilangan ) ; }
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar dan berkas header tersuai.
#include <stdio.h> #include "utils.h"
-
Deklarasikan sebuah prototipe fungsi tersuai dengan tanpa argumen.
void f__ambil_bilangan() ;
-
Tambahkan sebuah fungsi
main()
untuk memanggil fungsi lainnya kemudian memberikan keluaran sebuah bilangan bulat seperti yang disyaratkan dalam pendeklarasian fungsi.int main() { f__ambil_bilangan() ; return 0 ; }
-
Setelah fungsi
main()
, mulailah membuat definisi fungsi kedua yang mendeklarasikan dua variabel.void f__ambil_bilangan() { int v__bilangan ; char v__lagi ; }
-
Selanjutnya dalam definisi fungsi tersebut tambahkan pernyataan untuk meminta masukan dari pengguna dan menyematkan nilainya ke sebuah variabel.
printf( "Masukkan sebuah bilangan bulat untuk dikuadratkan: " ) ; scanf( "%d" , &v__bilangan ) ;
-
Sekarang keluarkan sebuah hasil dengan memanggil fungsi dalam berkas header tersuai, memasukkan sebuah nilai masukan ke dalam argumennya.
printf( "%d kuadrat = %d\n" , v__bilangan , f__persegi( v__bilangan ) ) ;
-
Tambahkan sebuah pernyataan untuk meminta masukan dari pengguna lebih lanjut dan menyematkan nilainya ke sebuah variabel.
printf( "Anda ingin menguadratkan bilangan lainnya? Y atau T: " ) ; scanf( "%1s" , &v__lagi ) ;
-
Terakhir, tambahkan sebuah uji kondisional untuk menjalankan fungsi tersebut sekali lagi atau mengembalikan kendali ke fungsi
main()
.if( ( v__lagi == 'Y' ) || ( v__lagi == 'y' ) ) f__ambil_bilangan() ; else return ;
-
Simpanlah berkas program kemudian kompilasi dan jalankan program, masukkan sebuah bilangan bulat dan karakter ketika diminta, untuk melihat keluaran pemanggilan fungsi.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 6.4 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
6.5. Membatasi Aksesibilitas
Kata kunci static
bisa digunakan untuk membatasi aksesibilitas fungsi-fungsi sebatas berkas tempat mereka dibuat, tepat sama dengan variabel-variabel static
yang memiliki aksesibilitas terbatas.
Hal tersebut merupakan praktik yang direkomendasikan dalam program-program besar yang tersebar dalam beberapa berkas “.c” untuk menjaga penyalahgunaan fungsi-fungsi yang tidak disengaja. Sebagai contoh, fungsi f__persegi()
dan f__perkalian()
tidak dapat dipanggil langsung dari fungsi main()
dalam contoh berikut:
-
Mulailah membuat sebuah program baru bernama “
menu.c
” dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi yang ada dalam pustaka masukan/keluaran standar.#include <stdio.h>
-
Deklarasikan sebuah prototipe fungsi tersuai dengan tanpa argumen.
void f__menu() ;
-
Tambahkan sebuah fungsi
main()
untuk memanggil fungsi tersuai kemudian berikan keluaran nilai bilangan bulat nol seperti yang disyaratkan pada saat pendeklarasian fungsi.int main() { f__menu() ; return 0 ; }
-
Setelah blok fungsi
main()
, definisikan fungsi-fungsi tersuai untuk melewati sebuah pilihan menu sebagai sebuah argumen bagu fungsi lain.void f__menu() { int v__pilihan ; printf( "\n\tApa yang Anda ingin lakukan?" ) ; printf( "\n\t1. Menguadratkan sebuah bilangan" ) ; printf( "\n\t2. Mengalikan dua bilangan" ) ; printf( "\n\t3. Keluar\n" ) ; scanf( "%d" , &v__pilihan ) ; f__aksi( v__pilihan ) ; }
-
Sekarang mulailah membuat berkas program kedua bernama “aksi.c” dengan sebuah prapemroses untuk mengikutsertakan fungsi-fungsi masukan/keluaran standar.
#include <stdio.h>
-
Selanjutnya definisikan dua fungsi
static
sederhana.static f__persegi( int vf__a ) { return ( vf__a * vf__a ) ; } static f__perkalian( int vf__a , vf__b ) { return vf__a * vf__b ; }
-
Sekarang definisikan fungsi yang dilewatkan pilihan menu dari pemanggilan dalam fungsi
main()
untuk menjalankan aksi yang bersesuaian — memanggil fungsi-fungsistatic
yang dibuat dalam berkas ini saat dibutuhkan.void f__aksi( int vf__pilihan ) { int v__n1 , v__n2 ; if( vf__pilihan == 1 ) { printf( "Masukkan sebuah bilangan bulat yang hendak dikuadratkan: " ) ; scanf( "%d" , &v__n1 ) ; printf( "%d x %d = %d \n" , v__n1 , v__n1 , f__persegi( v__n1 ) ) ; f__menu() ; } else if( vf__pilihan == 2 ) { printf( "Masukkan dua bilangan bulat yang hendak dikalikan, " ) ; printf( "pisahkan dengan sebuah spasi: " ) ; scanf( "%d" , &v__n1 ) ; scanf( "%d" , &v__n2 ) ; printf( "%d x %d = %d\n" , v__n1 , v__n2 , f__perkalian( v__n1 , v__n2 ) ) ; f__menu() ; } else return ; }
-
Simpanlah berkas kedua program kemudian kompilasi dan jalankan program untuk melihat keluaran yang diberikan oleh fungsi-fungsi
static
.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 6.5 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
6.6. Ringkasan
- Fungsi-fungsi tersuai (custom) dideklarasikan dengan menyatakan tipe data yang dikembalikan fungsi tersebut, kemudian namanya yang diikuti dengan tanda kurung, dan diakhiri dengan sebuah tanda titik-koma (semi-colon).
- Deklarasi-deklarasi fungsi dikenal juga sebagai “prototipe fungsi” dan harus muncul sebelum fungsi
main()
— sehingga compiler mengetahui keberadaan mereka ketika membaca fungsimain
. - Definisi-definsi fungsi mengandung pernyataan-pernyataan aktual yang dijalankan saat fungsi tersebut dipanggil, harus diletakkan setelah blok fungsi
main()
. - Secara pilihan, dalam tanda kurung deklarasi fungsi bisa mengikutsertakan sederet argumen yang dipisahkan oleh tanda koma. Nilai-nilai dilewatkan ke fungsi oleh pemanggilnya melalui argumen tersebut, masing-masing menyatakan sebuah tipe data dan nama.
- Argumen-argumen tertentu dalam sebuah definisi fungsi harus cocok dengan deklarasinya, yang merupakan sebagai parameter-parameter formalnya.
- Dalam pemrograman C, argumen-argumen dilewatkan dengan nilai — sehingga fungsi-fungsi beroperasi pada sebuah salinan nilai orisinal.
- Sebuah fungsi bisa memanggil diri mereka sendiri secara rekursif, namun harus mengikutsertakan sebuah pernyataan untuk mengubah sebuah ungkapan uji untuk keluar pada suatu titik.
- Berkas header tersuai memiliki ekstensi berkas “.h”.
- Direktif prapemroses
#include
untuk sebuah berkas header tersuai harus diikutsertakan namanya dalam kurung tanda petik dua. - Kata kunci
static
dapat digunakan dalam deklarasi dan definisi fungsi untuk membatasi aksesibilitas dengan mengurangi cakupannya hanya pada berkas tempat mereka muncul. - Program-program besar sebaiknya mendeklarasikan fungsi-fungsi mereka sebagai
static
kecuali ada beberapa alasan tertentu yang menjadikan mereka boleh terlihat dari luar berkas mereka. - Prototipe-prototipe fungsi tidak dibutuhkan untuk fungsi-fungsi yang berada di luar berkas yang mengandung fungsi
main()
.
Daftar Pustaka
- Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
- Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
- McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
- Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.