Seri Tutorial Bahasa C – Bagian 6: Melibatkan Penggunaan Fungsi-fungsi

Bagian artikel ini menunjukkan bagaimana pernyataan-pernyataan dapat dibungkus ke dalam sebuah “fungsi” untuk dijalankan saat dipanggil oleh program C.


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.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Deklarasikan tiga prototipe fungsi.

    void fPertama() ;
    int fPersegi3() ;
    int fKubus3() ;
  3. Tambahkan sebuah fungsi main yang mendeklarasikan sebuah vaiabel bilangan bulat.

    int main()
    {
        int vBilangan ;
    }
  4. Setelah fungsi main(), definisikan fungsi-fungsi tersuai.

    void fPertama()
    {
        printf( "Halo dari fungsi pertama.\n" ) ;
    }
    
    int vPersegi3()
    {
        int vPersegi = 3 * 3 ;
        return vPersegi ;
    }
    
    int fKubus3()
    {
        int vKubus = ( 3 * 3 ) * 3 ;
        return vKubus ;
    }
  5. Sekarang masukkan panggilan fungsi dalam blok fungsi main().

    fPertama();
    vBilangan = fPersegi3() ;
    printf( "3 × 3 = %d\n" , vBilangan ) ;
    printf( "3 × 3 × 3 %d\n" , fKubus3() ) ;
  6. Pada akhir blok fungsi utama berikan nilai keluaran berupa sebuah bilangan bulat bernilai nol seperti yang disyaratkan pada saat deklarasi fungsi.

    return 0 ;
  7. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran fungsi-fungsi tersuai.

    GAMBAR

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 fAksi( char vFc , int vFi , float vFf , double vFd ) ;

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.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Deklarasikan tiga prototipe fungsi tersuai dengan satu argumen yang dilewatkan untuk masing-masingnya ketika dipanggil.

    void fTampilan( char vFLarikKarakter[] ) ;
    int fPersegi( int vFx ) ;
    int fKubus( int vFy ) ;
  3. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah variabel bilangan bulat dan sebuah variabel larik karakter yang diinisialisasi dengan sebuah kalimat.

    int main()
    {
        int vBilangan ;
        char vLarikPesan[50] = "Kalimat yang dilewatkan ke sebuah fungsi" ;
    }
  4. Setelah fungsi main(), definisikan fungsi-fungsi tersuai.

    void fTampilan( char vFLarikKarakter[] )
    {
        printf( "%s\n" , vFLarikKarakter ) ;
    }
    
    int fPersegi( int vFx )
    {
        return ( vFx * vFx ) ;
    }
    
    int fKubus( int vFy )
    {
        return ( vFy * vFy ) * vFy ;
    }
  5. Sekarang dalam fungsi main(), masukkan pernyataan-pernyataan untuk memanggil setiap fungsi tersuai dan memasukkan nilai-nilai argumen.

    fTampilan( vLarikPesan ) ;
    vBilangan = fPersegi( 6 ) ;
    printf( "6 x 6 = %d\n" , vBilangan ) ;
    printf( "6 x 6 x 6 = %d\n" , fKubus( 4 ) ) ;
  6. Pada akhir blok fungsi main() berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan pada pendeklarasian fungsi.

    return 0 ;
  7. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat keluaran dari fungsi-fungsi tersuai menggunakan nilai-nilai yang dilewatkan melalui argumen.

    GAMBAR

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.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Deklarasikan sebuah prototipe fungsi dengan sebuah argumen yang dilewatkan ketika dipanggil.

    void fHitung_mundur_dari( int vFBilangan ) ;
  3. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah variabel bilangan bulat.

    int main()
    {
        int vBilanganAwal ;
    }
  4. 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" , &vBilanganAwal ) ;
  5. Sekarang dalam blok fungsi main() tambahkan sebuah panggilan untuk fungsi tersuai dan melewatkan nilai yang telah dimasukkan oleh pengguna.

    fHitung_mundur_dari( vBilanganAwal ) ;
  6. Dalam blok fungsi main() tambahkan sebuah pernyataan keluaran berupa sebuah pesan ketika kendali dikembalikan dari fungsi tersuai.

    printf( "Meluncur!\n" ) ;
  7. Pada akhir blok fungsi main() berikan keluaran nilai bilangan bulat nol seperti yang disyaratkan pada saat pendeklarasian fungsi.

    return 0 ;
  8. Setelah blok fungsi main(), mulailah membuat definisi fungsi tersuai dengan sebuah pernyataan untuk mengeluarkan nilai argumen yang dilewatkan selama pemanggilan fungsi.

    void fHitung_mundur_dari( int vFBilangan )
    {
        printf( "%d\n" , vFBilangan ) ;
    }
  9. Selanjutnya dalam blok fungsi tersuai, kurangi nilai yang dilewatkan sebagai argumen.

    --vFBilangan ;
  10. 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( vFBilangan < 0 ) return ;
    else
    fHitung_mundur_dari( vFBilangan )
  11. Simpanlah berkas program kemudian kompilasi dan jalankan program, masukkan sebuah bilangan bulat yang diminta, untuk melihat keluaran dari pemanggilang fungsi rekursif.

    GAMBAR 1
    			
    GAMBAR 2
    			

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 < dan > yang digunakan untuk mengikutsertakan berkas header standar.

  1. Buatlah sebuah berkas header tersuai bernama “utils.h” yang berisi definisi sebuah fungsi.

    int fPersegi( int vFBilangan )
    {
        return ( vFBilangan * vFBilangan ) ;
    }
  2. 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"
  3. Deklarasikan sebuah prototipe fungsi tersuai dengan tanpa argumen.

    void fAmbilBilangan() ;
  4. Tambahkan sebuah fungsi main() untuk memanggil fungsi lainnya kemudia memberikan keluaran sebuah bilangan bulat seperti yang disyaratkan dalam pendeklarasian fungsi.

    int main()
    {
        fAmbilBilangan() ;
        return 0 ;
    }
  5. Setelah fungsi main(), mulailah membuat definisi fungsi kedua yang mendeklarasikan dua variabel.

    void fAmbilBilangan()
    {
        int vBilangan ;
        char vLagi ;
    }
  6. 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" , &vBilangan ) ;
  7. Sekarang keluarkan sebuah hasil dengan memanggil dungsi dalam berkas header tersuai, memasukkan sebuah nilai masukan ke dalam argumennya.

    printf( "%d kuadrat adalah %d\n" , vBilangan , fPersegi( vBilangan ) ) ;
  8. 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" , &vLagi ) ; 
  9. Terakhir, tambahkan sebuah uji kondisional untuk menjalankan fungsi tersebut sekali lagi atau mengembalikan kendali ke fungsi main().

    if( ( vLagi == 'Y' ) || ( vLagi == 'y' ) ) fAmbilBilangan() ;
    else return ;
  10. Simpanlah berkas program kemudian kompilasi dan jalankan program, masukkan sebuah bilangan bulat dan karakter ketika diminta, untuk melihat keluaran pemanggilan fungsi.

    GAMBAR

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 fPersegi() dan fPerkalian() tidak dapat dipanggil langsung dari fungsi main() dalam contoh berikut:

  1. 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>
  2. Deklarasikan sebuah prototipe fungsi tersuai dengan tanpa argumen.

    void fMenu() ;
  3. Tambahkan sebuah fungsi main() untuk memanggil fungsi tersuai kemudian berikan keluaran nilai bilangan bulat nol seperti yang disyaratkan pada saat pendeklarasian fungsi.

    int main()
    {
        fMenu() ;
        return 0 ;
    }
  4. Setelah blok fungsi main(), definisikan fungsi-fungsi tersuai untuk melewati sebuah pilihan menu sebagai sebuah argumen bagu fungsi lain.

    void fMenu()
    {
        int vPilihan ;
        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" , &vPilihan ) ;
        fAksi( vPilihan ) ;
    }
  5. Sekarang mulailah membuat berkas program kedua bernama “aksi.c” dengan sebuah prapemroses untuk mengikutsertakan fungsi-fungsi masukan/keluaran standar.

    #include <stdio.h>
  6. Selanjutnya definisikan dua fungsi static sederhana.

    static fPersegi( int vFa ) { return ( vFa * vFa ) ; }
    static fPerkalian( int vFa , vFb ) { return vFa * vFb ; }
  7. Sekarang definisikan fungsi yang dilewatkan pilihan menu dari pemanggilan dalam fungsi main() untuk menjalankan aksi yang bersesuaian — memanggil fungsi-fungsi static yang dibuat dalam berkas ini saat dibutuhkan.

    void fAksi( int vFPilihan ) 
    {
        int vN1 , vN2 ;
    
        if( vFPilihan == 1 )
        {
            printf( "Masukkan sebuah bilangan bulat yang hendak dikuadratkan: " ) ;
            scanf( "%d" , &vN1 ) ;
            printf( "%d x %d = %d \n" , vN1 , vN1 , fPersegi( vN1 ) ) ;
            fMenu() ;
        }
        else if( vFPilihan == 2 )
        {
            printf( "Masukkan dua bilangan bulat yang hendak dikalikan, " ) ;
            printf( "pisahkan dengan sebuah spasi: " ) ;
            scanf( "%d" , &vN1 ) ; scanf( "%d" , &vN2 ) ;
            printf( "%d x %d = %d\n" , vN1 , vN2 , fPerkalian( vN1 , vN2 ) ) ;
            fMenu() ;
        }
        else return ;
    }
  8. Simpanlah berkas kedua program kemudian kompilasi dan jalankan program untuk melihat keluaran yang diberikan oleh fungsi-fungsi static.

    GAMBAR

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 fungsi main.
  • 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

  1. Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
  2. Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
  3. McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
  4. Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.
FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail