Cara Menggunakan Fungsi dalam Bahasa C untuk Pemula

Laptop menampilkan kode fungsi bahasa C dengan catatan tulisan tangan di meja kerja

Fungsi adalah cara membungkus sepotong kode supaya bisa dipanggil berulang kali tanpa menulis ulang. Kalau kamu baru selesai berurusan dengan variabel dan percabangan, fungsi adalah langkah berikutnya yang paling mengubah cara kamu menulis program. Panduan ini membahas cara membuat, memanggil, dan mengirim data ke fungsi dalam bahasa C.

Kenapa kode perlu dipecah jadi fungsi

Bayangkan kamu menulis program yang menghitung luas persegi panjang di lima tempat berbeda. Kalau rumusnya kamu tulis ulang tiap kali, satu perbaikan kecil berarti kamu harus mengedit lima bagian. Dengan fungsi, rumus itu cukup ditulis sekali lalu dipanggil lima kali.

Fungsi juga memaksa kamu memberi nama pada tiap bagian program. Nama seperti hitungLuas() atau cetakMenu() langsung memberi tahu pembaca (termasuk kamu sendiri dua minggu kemudian) apa yang dilakukan blok kode itu. Ini alasan program besar di bahasa C selalu terpecah jadi banyak fungsi kecil.

Bentuk dasar fungsi dalam bahasa C

Setiap fungsi punya tiga bagian: tipe nilai kembalian, nama, dan daftar parameter di dalam tanda kurung.

tipe_kembalian nama_fungsi(parameter) {
    // isi fungsi
    return nilai;
}

Contoh paling sederhana, fungsi yang menjumlahkan dua angka:

int tambah(int a, int b) {
    int hasil = a + b;
    return hasil;
}

Kata int di depan artinya fungsi ini mengembalikan bilangan bulat. a dan b adalah parameter, yaitu data yang dikirim saat fungsi dipanggil. Baris return hasil; mengirim nilai kembali ke bagian program yang memanggilnya.

Memanggil fungsi

Setelah fungsi didefinisikan, memanggilnya tinggal menulis namanya diikuti tanda kurung berisi nilai.

#include <stdio.h>

int tambah(int a, int b) {
    return a + b;
}

int main() {
    int total = tambah(3, 5);
    printf("Hasil: %dn", total);
    return 0;
}

Baris tambah(3, 5) menjalankan fungsi dengan a bernilai 3 dan b bernilai 5, lalu hasilnya disimpan ke variabel total. Program ini mencetak Hasil: 8.

Satu hal yang sering bikin bingung pemula: urutan penulisan. Fungsi harus sudah dikenal compiler sebelum dipanggil. Kalau kamu taruh tambah di bawah main, compiler akan protes. Solusinya dua: taruh fungsi di atas main, atau tulis deklarasi fungsi di atas lalu isinya di bawah.

Fungsi tanpa nilai kembalian dan tanpa parameter

Tidak semua fungsi perlu mengembalikan nilai. Fungsi yang cuma mencetak sesuatu ke layar pakai void sebagai tipe kembalian.

void sapa(char nama[]) {
    printf("Halo, %s!n", nama);
}

int main() {
    sapa("Rina");
    return 0;
}

Fungsi sapa tidak punya return karena tidak ada yang perlu dikembalikan. Pemanggilannya juga tidak bisa dipakai di dalam ekspresi seperti int x = sapa("Rina"); karena memang tidak menghasilkan nilai.

Kalau fungsi tidak butuh parameter sama sekali, tulis tanda kurung kosong atau isi dengan void.

void cetakGaris() {
    printf("----------n");
}

Parameter: nilai vs alamat

Di bahasa C, data yang dikirim ke fungsi disalin. Artinya, kalau kamu mengubah parameter di dalam fungsi, variabel aslinya di luar tidak ikut berubah.

void naikkan(int x) {
    x = x + 10;
}

int main() {
    int angka = 5;
    naikkan(angka);
    printf("%dn", angka);  // tetap 5
    return 0;
}

Kalau kamu memang ingin fungsi mengubah variabel aslinya, kamu perlu mengirim alamatnya memakai pointer. Ini konsep yang sudah dibahas di panduan pointer bahasa C, jadi di sini cukup contoh singkatnya.

void naikkan(int *x) {
    *x = *x + 10;
}

int main() {
    int angka = 5;
    naikkan(&angka);
    printf("%dn", angka);  // jadi 15
    return 0;
}

Perhatikan dua perbedaan: parameter ditulis int *x, dan saat memanggil kamu mengirim &angka. Di dalam fungsi, *x mengakses nilai yang ditunjuk alamat tersebut.

Contoh praktis: program kecil dengan beberapa fungsi

Mari gabungkan semuanya dalam satu program yang menghitung rata-rata dari beberapa nilai.

#include <stdio.h>

int jumlahkan(int nilai[], int panjang) {
    int total = 0;
    for (int i = 0; i < panjang; i++) {
        total += nilai[i];
    }
    return total;
}

float hitungRata(int nilai[], int panjang) {
    int total = jumlahkan(nilai, panjang);
    return (float) total / panjang;
}

int main() {
    int nilai[] = {80, 75, 90, 85};
    int banyak = 4;
    float rata = hitungRata(nilai, banyak);
    printf("Rata-rata: %.2fn", rata);
    return 0;
}

Program ini menghasilkan Rata-rata: 82.50. Ada dua hal yang perlu dicatat. Pertama, hitungRata memanggil jumlahkan di dalamnya, dan itu wajar terjadi. Kedua, parameter int nilai[] sebenarnya menerima alamat array, bukan salinan seluruh isinya. Jadi saat kamu kirim array ke fungsi, isi array tetap bisa diubah dari dalam fungsi. Konsep ini dijelaskan lebih lengkap di artikel array bahasa C.

Kalau datanya lebih dari sekadar angka terkait, kamu bisa mengelompokkannya dulu dalam struct lalu kirim satu variabel struct itu ke fungsi. Caranya ada di tutorial struct bahasa C.

Kesalahan umum pemula saat pakai fungsi

  • Lupa menulis tipe kembalian. Di C modern, fungsi wajib punya tipe, meski hanya void.
  • Memanggil fungsi sebelum dideklarasikan. Compiler butuh tahu bentuk fungsinya lebih dulu.
  • Menulis return di fungsi void dengan nilai, misalnya return 0; di fungsi void. Ini akan memicu peringatan.
  • Mengira perubahan parameter di dalam fungsi otomatis mengubah variabel asli. Untuk itu kamu perlu pointer.
  • Membuat satu fungsi yang mengerjakan terlalu banyak hal. Kalau sebuah fungsi butuh komentar panjang untuk menjelaskan tujuannya, biasanya itu tanda perlu dipecah.

Untuk poin terakhir, patokan sederhananya: satu fungsi sebaiknya menyelesaikan satu tugas yang bisa dijelaskan dalam satu kalimat singkat. hitungRata menghitung rata-rata. cetakLaporan mencetak laporan. Kalau kamu mulai menulis nama seperti hitungDanCetakDanSimpan, itu saatnya dipecah.

Ringkasan

Fungsi di bahasa C dibuat dengan menulis tipe kembalian, nama, dan daftar parameter, lalu dipanggil dengan namanya diikuti tanda kurung. Data yang dikirim disalin, jadi perubahan di dalam fungsi tidak memengaruhi variabel asli kecuali kamu memakai pointer. Mulailah membiasakan memecah program jadi fungsi kecil sejak sekarang, karena kebiasaan ini yang membedakan kode yang bisa dirawat dari kode yang bikin pusing.

Pertanyaan yang Sering Diajukan

Apa bedanya deklarasi dan definisi fungsi?

Deklarasi hanya memberi tahu compiler bentuk fungsi, yaitu tipe kembalian, nama, dan tipe parameternya, dan diakhiri titik koma. Definisi berisi isi fungsinya di dalam kurung kurawal. Kamu bisa menaruh deklarasi di atas main lalu definisinya di bawah, supaya urutan kode lebih enak dibaca.

Apakah fungsi bisa memanggil fungsi lain?

Bisa, dan itu hal biasa. Fungsi hitungRata pada contoh di atas memanggil jumlahkan. Satu-satunya hal yang perlu dijaga adalah memastikan fungsi yang dipanggil sudah dideklarasikan sebelum baris pemanggilannya, atau kamu akan kena peringatan dari compiler.

Kapan sebaiknya pakai pointer sebagai parameter fungsi?

Saat fungsi perlu mengubah nilai variabel asli milik pemanggil, atau saat kamu mengirim data besar seperti array dan struct agar tidak disalin. Untuk tipe sederhana seperti int yang cuma dibaca, kirim langsung tanpa pointer supaya kodenya lebih gampang dibaca.