#4 Fungsi
overview

#4 Fungsi

September 15, 2026
2 min read

Di bab ini kita belajar fungsi, cara paling ampuh buat ngerapihin kode. Program Data Nilai Mahasiswa yang tadinya kode-nya numpuk di main sekarang dipecah jadi blok-blok kecil yang rapi dan bisa dipake ulang.

Fungsi Itu Kayak Resep Masakan

Bayangin kita jualan nasi goreng. Setiap ada pesanan, kita nggak mikirin dari nol, karena udah punya resep: bahan masuk, diolah, keluar nasi goreng. Kalau ada 20 pesanan, kita tinggal lakuin resep yang sama 20 kali, nggak perlu nulis ulang caranya di setiap pesanan.

Fungsi di C++ persis kayak resep itu: sebuah blok kode yang punya nama dan bisa dipanggil berkali-kali. Sekali bikin, sisanya tinggal “panggil resepnya”.

Kenapa ini penting banget?

  • Nggak ngulang kode: tulis sekali, pakai seribu kali.
  • Kode lebih rapi: main yang tadinya panjang lebar jadi pendek, tinggal deretan “panggil resep”.
  • Gampang dicari bug: ada masalah di bagian input? Tinggal buka fungsi input, nggak usah nyari-nyari di tumpukan kode.

Anatomi Fungsi

Ini bentuk umumnya:

tipeKembalian namaFungsi(parameter1, parameter2, ...) {
// isi fungsi
return nilaiKembalian;
}

Bedah satu-satu:

  • tipeKembalian adalah jenis nilai yang dikasih fungsi ke pemanggilnya, contohnya string, int, float. Kalau fungsi nggak ngasih nilai apa-apa, pakai kata kunci void.
  • namaFungsi adalah nama yang kita panggil. Ikutin aturan penamaan variabel yang sama (huruf/underscore, tanpa spasi, case-sensitive).
  • Parameter adalah “bahan” yang masuk ke fungsi, ditulis kayak deklarasi variabel: int angka, string nama. Bisa nol, satu, atau banyak.
  • return ngasih hasil balik ke pemanggil. Untuk fungsi void, return nggak wajib dan nggak boleh ngasih nilai.

Fungsi yang Ngasih Nilai

float hitungLuasPersegi(float sisi) {
float luas = sisi * sisi;
return luas;
}

Dipakai gini:

float luasKamar = hitungLuasPersegi(4.5);
cout << luasKamar << endl; // cetak 20.25

Nilai 4.5 masuk ke parameter sisi, fungsi ngitung, lalu return ngasih hasil 20.25 yang ditampung di luasKamar.

Fungsi Void (Nggak Ngasih Nilai)

void sapa(string nama) {
cout << "Halo, " << nama << "! Semangat belajar C++ ya." << endl;
}

Dipakai gini:

sapa("Budi"); // cetak: Halo, Budi! Semangat belajar C++ ya.

Fungsi void itu kayak resep yang ngerjain aksi tapi nggak ngasih hasil, kayak fungsi nampilin menu atau nyetak laporan.

Prototype: Perkenalan Dulu Sebelum Dipakai

C++ itu dibaca dari atas ke bawah. Kalau main() manggil fungsi yang ditulis di bawahnya, compiler bakal bingung: “ini fungsi apa?” Solusinya ada dua:

  1. Tulis fungsi sebelum main() (paling simpel, dan ini gaya yang kita pakai di seri ini), atau
  2. Kasih prototype, deklarasi singkat di atas main:
    float hitungLuasPersegi(float sisi); // prototype: cuma tanda tangan
    int main() {
    cout << hitungLuasPersegi(4.5) << endl;
    return 0;
    }
    float hitungLuasPersegi(float sisi) { // definisi lengkap di bawah
    return sisi * sisi;
    }
    Prototype cuma ngasih tau compiler “ada fungsi kayak gini, nanti definisinya di bawah.”

Scope Variabel: Jangkauan “Dunia” Variabel

Setiap variabel punya scope, daerah di mana dia “hidup”. Aturan utamanya:

  • Variabel yang dideklarasikan di dalam fungsi (termasuk parameter) itu variabel lokal; cuma bisa diakses di dalam fungsi itu. Luar fungsi? Nggak kenal.
  • Variabel yang dideklarasikan di luar semua fungsi itu variabel global; bisa diakses di mana aja.
int nilaiGlobal = 10; // global: bisa dipake di mana aja
void fungsiA() {
int nilaiLokal = 5; // lokal: cuma ada di fungsiA
cout << nilaiGlobal; // oke, global bisa diakses
// cout << nilaiLokal2; // ERROR: nggak ada di sini
}
void fungsiB() {
// cout << nilaiLokal; // ERROR: nilaiLokal cuma hidup di fungsiA
}

Kenapa lokal itu bagus? Karena isolasi: variabel di satu fungsi nggak bisa ketabrak atau kesenggol fungsi lain. Kalaupun dua fungsi punya variabel nama yang sama, mereka nggak saling ganggu. Struktur program makin aman.

Catatan: di bab ini kita tetap punya satu variabel global, yaitu const int JUMLAH. Itu disengaja karena nilainya const (tetap) dan dipakai semua fungsi. Yang di-global-kan sebisa mungkin cuma yang read-only kayak gini.

Program Berkelanjutan: Kode yang Rapi & Bisa Dipake Ulang

Inget program bab 04? Input 5 mahasiswa terus tampilin, semua di dalem main. Sekarang kita rombak: tiap bagian jadi fungsi sendiri. Perhatiin betul-betul, karena kode ini bakal jadi tameng kita sampe bab terakhir.

#include <iostream>
using namespace std;
const int JUMLAH = 5;
void inputData(string nama[], float ipk[], int jumlah) {
for (int i = 0; i < jumlah; i++) {
cout << "--- Mahasiswa ke-" << (i + 1) << " ---" << endl;
cout << "Nama: ";
cin >> nama[i];
cout << "IPK : ";
cin >> ipk[i];
}
}
void tampilkanData(string nama[], float ipk[], int jumlah) {
cout << "\n=== Data Mahasiswa ===" << endl;
for (int i = 0; i < jumlah; i++) {
cout << (i + 1) << ". " << nama[i] << " (IPK " << ipk[i] << ")" << endl;
}
}
float hitungRataRata(float ipk[], int jumlah) {
float total = 0;
for (int i = 0; i < jumlah; i++) {
total += ipk[i];
}
return total / jumlah;
}
int main() {
string nama[JUMLAH];
float ipk[JUMLAH];
inputData(nama, ipk, JUMLAH);
tampilkanData(nama, ipk, JUMLAH);
cout << "Rata-rata IPK: " << hitungRataRata(ipk, JUMLAH) << endl;
return 0;
}

Lihat perbedaannya? main jadi pendek dan bersih, tinggal tiga baris yang jelas: input, tampil, hitung rata-rata. Mau tau detailnya? Tinggal buka fungsi masing-masing.

Beberapa hal yang perlu dicermati:

  1. Array dikirim ke fungsi dengan cara yang spesial; perhatiin string nama[] di parameter. Fungsi itu dapet akses ke array yang sama, bukan salinannya. Itulah kenapa inputData bisa ngisi nama[] dan perubahannya kebawa sampai ke main. Di bab-bab selanjutnya (pointer) kita bakal ngerti kenapa bisa gitu; buat sekarang cukup diinget: array masuk fungsi = yang diubah di dalam kelihatan di luar.
  2. jumlah itu parameter, bukan JUMLAH global. Fungsi nerima ukuran lewat parameter (int jumlah) biar fleksibel: satu fungsi bisa dipake buat array ukuran 3, 5, atau 100, cukup kirim ukurannya pas manggil.
  3. Tiga jenis fungsi dipraktekin sekaligus: inputData dan tampilkanData itu void (ngerjain aksi, nggak ngasih nilai), sedangkan hitungRataRata ngasih nilai float lewat return.

Coba liat alur rata-ratanya: hitungRataRata(ipk, JUMLAH) muter loop buat nambahin semua ipk[i] ke total, terus return total / jumlah. Nilainya langsung nyambung ke cout. Puisinya kode, pokoknya.

Latihan Soal: Konversi Suhu

Buatkan program konversi suhu yang rapi pakai fungsi. Requirement-nya:

  1. Dua fungsi konversi yang ngasih nilai (float):
    • celciusKeFahrenheit(float c), rumusnya (c * 9 / 5) + 32
    • fahrenheitKeCelcius(float f), rumusnya (f - 32) * 5 / 9
  2. Satu fungsi void buat nampilin hasil, misalnya void tampilkanHasil(float nilai, string satuan).
  3. Di main, minta user pilih arah konversi (misal 1 = C ke F, 2 = F ke C), minta nilai suhunya, panggil fungsi yang sesuai, terus tampilkan hasil.

Contoh jalannya:

Pilih konversi (1: C ke F, 2: F ke C): 1
Masukkan suhu (Celcius): 30
30 Celcius = 86 Fahrenheit
Pilih konversi (1: C ke F, 2: F ke C): 2
Masukkan suhu (Fahrenheit): 212
212 Fahrenheit = 100 Celcius

💡 Hint: main harus tetap pendek dan bersih, semua logika di dalem fungsi. Kalau main kita panjang lebar, ada yang salah.

Discussion