Di bab ini kita belajar fungsi, cara paling ampuh buat ngerapihin kode. Program Data Nilai Mahasiswa yang tadinya kode-nya numpuk di
mainsekarang 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:
mainyang 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:
tipeKembalianadalah jenis nilai yang dikasih fungsi ke pemanggilnya, contohnyastring,int,float. Kalau fungsi nggak ngasih nilai apa-apa, pakai kata kuncivoid.namaFungsiadalah 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. returnngasih hasil balik ke pemanggil. Untuk fungsivoid,returnnggak 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.25Nilai 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:
- Tulis fungsi sebelum
main()(paling simpel, dan ini gaya yang kita pakai di seri ini), atau - Kasih prototype, deklarasi singkat di atas
main:Prototype cuma ngasih tau compiler “ada fungsi kayak gini, nanti definisinya di bawah.”float hitungLuasPersegi(float sisi); // prototype: cuma tanda tanganint main() {cout << hitungLuasPersegi(4.5) << endl;return 0;}float hitungLuasPersegi(float sisi) { // definisi lengkap di bawahreturn sisi * sisi;}
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 nilainyaconst(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:
- Array dikirim ke fungsi dengan cara yang spesial; perhatiin
string nama[]di parameter. Fungsi itu dapet akses ke array yang sama, bukan salinannya. Itulah kenapainputDatabisa ngisinama[]dan perubahannya kebawa sampai kemain. 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. jumlahitu parameter, bukanJUMLAHglobal. 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.- Tiga jenis fungsi dipraktekin sekaligus:
inputDatadantampilkanDataituvoid(ngerjain aksi, nggak ngasih nilai), sedangkanhitungRataRatangasih nilaifloatlewatreturn.
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:
- Dua fungsi konversi yang ngasih nilai (
float):celciusKeFahrenheit(float c), rumusnya(c * 9 / 5) + 32fahrenheitKeCelcius(float f), rumusnya(f - 32) * 5 / 9
- Satu fungsi
voidbuat nampilin hasil, misalnyavoid tampilkanHasil(float nilai, string satuan). - Di
main, minta user pilih arah konversi (misal1= 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): 1Masukkan suhu (Celcius): 3030 Celcius = 86 Fahrenheit
Pilih konversi (1: C ke F, 2: F ke C): 2Masukkan suhu (Fahrenheit): 212212 Fahrenheit = 100 Celcius💡 Hint:
mainharus tetap pendek dan bersih, semua logika di dalem fungsi. Kalaumainkita panjang lebar, ada yang salah.