Functions and Procedures
Pada materi sebelumnya, kita telah mempelajari variabel, operator, conditional, dan loop untuk menyusun alur program.
Namun, ketika program mulai menjadi lebih panjang, menuliskan seluruh
instruksi di dalam main() dapat membuat kode sulit dibaca dan dirawat.
Kita mungkin juga perlu menjalankan proses yang sama di beberapa tempat.
Untuk mengatasi hal tersebut, bahasa C menyediakan function. Dengan function, kita dapat memisahkan program menjadi bagian-bagian kecil yang masing-masing memiliki tugas tertentu.
Selain function yang menghasilkan nilai, kita juga dapat membuat function yang hanya melakukan suatu tindakan tanpa mengembalikan nilai. Dalam materi ini, bentuk tersebut akan kita bahas sebagai procedure atau void function.
Tujuan Praktikum
Setelah menyelesaikan praktikum ini, kalian diharapkan mampu:
- Memahami pengertian dan manfaat function.
- Menjelaskan bagian-bagian dari sebuah function.
- Membedakan function declaration, function definition, dan function call.
- Memahami perbedaan parameter dan argument.
- Memahami cara kerja passing argument by value.
- Membuat function yang mengembalikan nilai menggunakan
return. - Membuat procedure atau function bertipe
void. - Memahami perbedaan local variable dan global variable.
- Menggunakan function untuk menyelesaikan permasalahan sederhana.
Apa itu Function?
Function adalah blok kode yang dirancang untuk melakukan tugas tertentu. Function membantu kita membagi program yang kompleks menjadi bagian-bagian yang lebih kecil sehingga lebih mudah dipahami, digunakan kembali, dan diperbaiki.
Misalnya, kita ingin menjumlahkan dua bilangan. Kita dapat menuliskan
operasi penjumlahan secara langsung di dalam main():
#include <stdio.h>
int main(void) {
int a = 5;
int b = 3;
int hasil = a + b;
printf("Hasil = %d\n", hasil);
return 0;
}
Program tersebut menghasilkan:
Hasil = 8
Namun, jika operasi penjumlahan yang sama dibutuhkan beberapa kali, kita dapat memisahkannya ke dalam sebuah function.
int add(int a, int b) {
return a + b;
}
Function add() menerima dua nilai, menjumlahkannya, lalu
mengembalikan hasilnya kepada bagian program yang memanggil function
tersebut.
Manfaat Menggunakan Function
Ada beberapa manfaat utama menggunakan function.
1. Modularity
Program dapat dibagi menjadi bagian-bagian kecil yang masing-masing memiliki tugas tertentu.
Contohnya, program dapat memiliki function calculateArea() untuk
menghitung luas dan function printResult() untuk menampilkan hasil.
2. Reusability
Function dapat dipanggil berkali-kali tanpa harus menulis ulang instruksi yang sama.
int hasil1 = add(5, 3);
int hasil2 = add(10, 2);
Kedua baris tersebut menggunakan function add() dengan argument
yang berbeda.
3. Maintainability
Ketika terdapat kesalahan atau perubahan pada suatu proses, kita dapat memperbaiki bagian function yang berkaitan tanpa harus menelusuri seluruh program.
4. Abstraction
Function menyembunyikan detail proses di dalamnya. Ketika menggunakan function, kita cukup mengetahui tugas dan cara memanggilnya tanpa harus selalu melihat setiap instruksi di dalam function tersebut.
Defining a Function
Untuk membuat function dalam bahasa C, kita dapat menggunakan sintaks dasar berikut:
return_type function_name(parameters) {
// body of the function
}
Perhatikan contoh berikut:
int square(int x) {
return x * x;
}
Function tersebut digunakan untuk menghitung kuadrat sebuah bilangan.
Bagian-Bagian Function
Sebuah function memiliki beberapa bagian utama.
| Bagian | Penjelasan |
|---|---|
return_type | Tipe nilai yang dikembalikan oleh function, misalnya int, float, atau void jika tidak mengembalikan nilai. |
function_name | Nama yang digunakan untuk mengenali dan memanggil function. |
parameters | Variabel yang menerima nilai dari bagian program yang memanggil function. |
body | Blok kode yang berisi instruksi yang akan dijalankan. |
return | Pernyataan untuk mengembalikan nilai kepada pemanggil, jika function memang menghasilkan nilai. |
Mari kita uraikan contoh berikut:
int square(int x) {
return x * x;
}
int → Return type
square → Function name
int x → Parameter
x * x → Proses yang dilakukan
return → Mengembalikan hasil proses
Pada contoh tersebut, square() menerima sebuah bilangan bertipe int
melalui parameter x. Function kemudian menghitung x * x dan
mengembalikan hasilnya sebagai bilangan bertipe int.
Contoh Program Function
Function yang dibuat perlu dipanggil agar instruksi di dalamnya dijalankan. Berikut contoh program lengkapnya:
#include <stdio.h>
int square(int x) {
return x * x;
}
int main(void) {
int hasil = square(5);
printf("Hasil = %d\n", hasil);
return 0;
}
Output di terminal:
Hasil = 25
Pada baris:
int hasil = square(5);
program memanggil function square() dengan argument 5.
Di dalam function, nilai tersebut diterima oleh parameter x.
Kemudian expression:
x * x
menghasilkan 25, dan return mengirimkan nilai tersebut kembali
ke tempat function dipanggil.
Nilai 25 kemudian disimpan ke dalam variabel hasil.
Function Declaration vs. Definition
Dalam bahasa C, kita perlu membedakan function declaration dan function definition.
Function Declaration (Prototype)
Function declaration atau function prototype memberi tahu compiler tentang nama function, return type, serta parameter yang digunakan. Declaration tidak berisi implementasi atau body function.
Contoh:
int add(int a, int b);
Baris tersebut memberi tahu bahwa:
- Nama function adalah
add. - Function mengembalikan nilai bertipe
int. - Function menerima dua parameter bertipe
int.
Perhatikan bahwa declaration diakhiri dengan tanda titik koma (;).
Function Definition
Function definition berisi implementasi sebenarnya dari function, yaitu instruksi yang dijalankan ketika function dipanggil.
Contoh:
int add(int a, int b) {
return a + b;
}
Body function tersebut berisi proses penjumlahan a + b.
Perbedaan Declaration dan Definition
| Declaration | Definition |
|---|---|
| Memperkenalkan bentuk atau signature function kepada compiler. | Menyediakan implementasi function. |
| Tidak memiliki body function. | Memiliki body function di dalam {}. |
Contoh: int add(int a, int b); | Contoh: int add(int a, int b) { return a + b; } |
Contoh Menggunakan Prototype
Prototype berguna ketika kita ingin menuliskan main() lebih dahulu,
sementara definition function diletakkan setelahnya.
#include <stdio.h>
int add(int a, int b);
int main(void) {
int hasil = add(5, 3);
printf("Hasil = %d\n", hasil);
return 0;
}
int add(int a, int b) {
return a + b;
}
Output di terminal:
Hasil = 8
Perhatikan urutan program tersebut:
Function declaration
↓
main()
↓
Function definition
Prototype memberi tahu compiler bagaimana add() digunakan sebelum
compiler mencapai definition-nya.
Function juga dapat didefinisikan terlebih dahulu sebelum main().
Dalam susunan seperti itu, prototype terpisah tidak diperlukan karena
definition sudah muncul sebelum pemanggilan function.
Calling a Function
Function call adalah pernyataan yang digunakan untuk menjalankan function.
Bentuk sederhananya:
function_name(arguments);
Contoh pemanggilan function:
add(5, 3);
Jika function mengembalikan sebuah nilai, hasilnya dapat disimpan ke dalam variabel atau digunakan dalam expression.
int hasil = add(5, 3);
Perhatikan program lengkap berikut:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main(void) {
printf("%d\n", add(5, 3));
printf("%d\n", add(10, 2));
return 0;
}
Output di terminal:
8
12
Function add() dipanggil dua kali dengan argument yang berbeda.
Karena function tersebut dapat digunakan kembali, kita tidak perlu
menulis ulang proses penjumlahan untuk setiap pasangan bilangan.
Parameters and Arguments
Parameter dan argument berkaitan erat, tetapi keduanya memiliki pengertian yang berbeda.
Parameter adalah variabel yang dituliskan pada declaration atau definition function untuk menerima nilai.
Argument adalah nilai atau data aktual yang diberikan ketika function dipanggil.
Perhatikan contoh:
int add(int a, int b) {
return a + b;
}
Pada function tersebut:
a dan b → Parameters
Sekarang perhatikan pemanggilannya:
add(5, 3);
Pada pemanggilan tersebut:
5 dan 3 → Arguments
Argument 5 diberikan kepada parameter a, sedangkan argument 3
diberikan kepada parameter b.
| Istilah | Contoh | Fungsi |
|---|---|---|
| Parameter | int a, int b | Menerima nilai di dalam function. |
| Argument | 5, 3 | Nilai yang dikirim saat function dipanggil. |
Contoh Parameters dan Arguments
#include <stdio.h>
int multiply(int a, int b) {
return a * b;
}
int main(void) {
int hasil = multiply(4, 6);
printf("Hasil perkalian = %d\n", hasil);
return 0;
}
Output di terminal:
Hasil perkalian = 24
Pada pemanggilan:
multiply(4, 6)
nilai 4 dan 6 merupakan argument. Di dalam function,
nilai-nilai tersebut diterima oleh parameter a dan b.
Kemudian function menghitung:
4 * 6 = 24
dan mengembalikan hasilnya.
Passing Arguments to Functions
Dalam bahasa C, argument sederhana seperti nilai bertipe int dikirim
ke function by value.
Artinya, function menerima salinan nilai yang diberikan. Perubahan terhadap parameter di dalam function tidak secara langsung mengubah variabel asli milik pemanggil.
Perhatikan contoh berikut:
#include <stdio.h>
void increment(int x) {
x = x + 1;
printf("Nilai x di dalam function: %d\n", x);
}
int main(void) {
int angka = 5;
increment(angka);
printf("Nilai angka di luar function: %d\n", angka);
return 0;
}
Output di terminal:
Nilai x di dalam function: 6
Nilai angka di luar function: 5
Mengapa hasilnya berbeda?
Awalnya, variabel angka memiliki nilai:
angka = 5
Ketika program menjalankan:
increment(angka);
nilai 5 disalin ke parameter x.
Di dalam function:
x = x + 1;
nilai x berubah menjadi 6. Namun, x adalah parameter lokal yang
menyimpan salinan nilai tersebut. Variabel angka di dalam main()
tetap bernilai 5.
Secara sederhana:
angka = 5
│
└── Nilainya disalin ke x
│
▼
x = 5
│
x + 1
│
▼
x = 6
angka tetap = 5
Pembahasan ini menjelaskan passing by value untuk nilai sederhana,
seperti int.
Pada bahasa C, pointer dapat digunakan ketika sebuah function perlu mengakses atau mengubah objek milik pemanggil melalui alamat memorinya. Pointer merupakan materi tersendiri dan tidak diperlukan untuk memahami contoh di atas.
Returning Values from Functions
Function dapat mengembalikan hasil perhitungannya kepada bagian program
yang memanggilnya dengan menggunakan keyword return.
Contoh:
int multiply(int a, int b) {
return a * b;
}
Pada function tersebut, hasil perkalian a * b dikembalikan sebagai
nilai bertipe int.
Perhatikan program lengkap berikut:
#include <stdio.h>
int multiply(int a, int b) {
return a * b;
}
int main(void) {
int hasil = multiply(6, 4);
printf("Hasil = %d\n", hasil);
return 0;
}
Output di terminal:
Hasil = 24
Baris berikut:
return a * b;
mengembalikan hasil perkalian kepada pemanggil. Nilai yang dikembalikan
kemudian disimpan ke dalam variabel hasil.
Perlu diperhatikan bahwa return type function harus sesuai dengan jenis nilai yang ingin dikembalikan.
Contoh:
int add(int a, int b) {
return a + b;
}
Function add() bertipe int karena mengembalikan sebuah bilangan
bulat.
Void Functions (Procedures)
Tidak semua function dibuat untuk menghasilkan suatu nilai.
Ada kalanya kita hanya ingin menjalankan suatu tindakan, misalnya
menampilkan pesan ke terminal. Untuk kebutuhan tersebut, kita dapat
menggunakan function dengan return type void.
Dalam konteks materi ini, function bertipe void disebut juga
procedure.
Contoh:
void printMessage(void) {
printf("Hello, World!\n");
}
Function printMessage() hanya menampilkan pesan. Function tersebut
tidak mengembalikan nilai kepada pemanggil.
Contoh Program Procedure
#include <stdio.h>
void printMessage(void) {
printf("Hello, World!\n");
}
int main(void) {
printMessage();
return 0;
}
Output di terminal:
Hello, World!
Pada program tersebut:
void printMessage(void)
menandakan bahwa:
- Return type
voidberarti function tidak mengembalikan nilai. - Nama function adalah
printMessage. - Parameter
voidmenandakan bahwa function tidak menerima argument.
Ketika baris:
printMessage();
dijalankan, instruksi printf() yang berada di dalam function akan
dieksekusi.
Gunakan function dengan return type void ketika tujuan utamanya
adalah melakukan tindakan, seperti menampilkan pesan.
Gunakan function dengan return type tertentu, seperti int atau
double, ketika hasilnya perlu dikembalikan untuk digunakan kembali.
Function vs. Procedure
Dalam materi ini, kita membedakan keduanya berdasarkan apakah function mengembalikan nilai atau hanya melakukan suatu tindakan.
| Function yang Mengembalikan Nilai | Procedure (void function) |
|---|---|
| Mengembalikan nilai kepada pemanggil. | Tidak mengembalikan nilai. |
| Biasanya digunakan untuk perhitungan atau menghasilkan suatu hasil. | Biasanya digunakan untuk melakukan tindakan. |
Memiliki return type seperti int atau double. | Menggunakan return type void. |
Contoh: int add(int a, int b) | Contoh: void printMessage(void) |
Perhatikan kedua contoh berikut.
Function yang mengembalikan nilai:
int add(int a, int b) {
return a + b;
}
Procedure yang melakukan tindakan:
void printMessage(void) {
printf("Hello!\n");
}
Perbedaan cara penggunaannya:
int hasil = add(5, 3);
Hasil add(5, 3) dapat disimpan di dalam variabel hasil.
Sementara itu:
printMessage();
digunakan untuk menjalankan tindakan di dalam printMessage().
Perlu diingat bahwa dalam bahasa C, keduanya secara teknis ditulis
menggunakan function. Istilah procedure pada materi ini merujuk pada
function bertipe void yang tidak mengembalikan nilai.
C Variable Scope
Scope adalah wilayah di dalam program tempat sebuah variabel dapat diakses menggunakan namanya.
Dalam materi ini, kita akan mengenal dua jenis variabel berdasarkan scope-nya:
- Local variable
- Global variable
Perbedaan keduanya terletak pada tempat variabel dideklarasikan dan wilayah tempat variabel tersebut dapat diakses.
Local Variable
Local variable adalah variabel yang dideklarasikan di dalam sebuah
function atau blok, misalnya di dalam main(), function lain, loop,
atau conditional statement.
Variabel lokal hanya dapat diakses di wilayah tempat variabel tersebut dideklarasikan.
Contoh:
void myFunction(void) {
int x = 10;
printf("%d\n", x);
}
Variabel x merupakan local variable karena dideklarasikan di dalam
myFunction().
Variabel tersebut dapat digunakan di dalam function tersebut, tetapi
tidak dapat langsung diakses dengan nama x dari function lain.
Perhatikan program lengkap berikut:
#include <stdio.h>
void showNumber(void) {
int localNumber = 10;
printf("Local number = %d\n", localNumber);
}
int main(void) {
showNumber();
return 0;
}
Output di terminal:
Local number = 10
Variabel localNumber hanya dapat digunakan di dalam showNumber().
Variabel tersebut tidak dapat langsung digunakan di dalam main().
Global Variable
Global variable adalah variabel yang dideklarasikan di luar semua function, biasanya di bagian atas file program.
Global variable dapat diakses oleh function-function dalam file yang sama setelah deklarasinya diketahui.
Contoh:
#include <stdio.h>
int globalNumber = 100;
void showNumber(void) {
printf("Nilai global = %d\n", globalNumber);
}
int main(void) {
showNumber();
printf("Di dalam main = %d\n", globalNumber);
return 0;
}
Output di terminal:
Nilai global = 100
Di dalam main = 100
Variabel globalNumber dideklarasikan di luar seluruh function,
sehingga dapat digunakan oleh showNumber() maupun main().
Perbandingan Local dan Global Variable
| Local Variable | Global Variable |
|---|---|
| Dideklarasikan di dalam function atau blok. | Dideklarasikan di luar semua function. |
| Hanya dapat diakses di wilayah deklarasinya. | Dapat diakses oleh function dalam file yang sama setelah deklarasinya. |
| Variabel lokal otomatis biasa memiliki lifetime selama blok tempat variabel tersebut aktif. | Memiliki lifetime sepanjang program berjalan. |
Hindari menggunakan global variable jika nilai tersebut sebenarnya hanya dibutuhkan oleh satu function.
Mengirimkan data melalui parameter biasanya membuat hubungan antar- function lebih jelas dan memudahkan program untuk dipahami serta dirawat.
Best Practices for Using Functions
Ketika mulai membuat program yang lebih besar, ada beberapa kebiasaan baik yang dapat membantu menjaga kode tetap mudah dibaca.
1. Buat function dengan satu tugas yang jelas
Usahakan setiap function memiliki tanggung jawab utama yang mudah dijelaskan.
Contohnya, gunakan calculateArea() untuk menghitung luas dan
printResult() untuk menampilkan hasil.
2. Hindari function yang terlalu panjang
Jika sebuah function melakukan terlalu banyak hal, pertimbangkan untuk memisahkan proses-proses tersebut menjadi beberapa function yang lebih kecil.
3. Gunakan nama function dan parameter yang deskriptif
Nama seperti:
calculateArea()
lebih mudah dipahami daripada nama yang tidak memberikan gambaran tentang tujuannya.
4. Gunakan kembali function yang sudah dibuat
Jika suatu proses dibutuhkan berkali-kali, buat function agar kita tidak perlu menulis ulang implementasi yang sama.
5. Perhatikan return type dan parameter
Pastikan return type sesuai dengan nilai yang dikembalikan dan argument yang dikirim sesuai dengan parameter function.
Common Mistakes to Avoid
Ada beberapa kesalahan yang sering terjadi ketika mulai menggunakan function dalam bahasa C.
1. Lupa Mengembalikan Nilai
Jika sebuah function memiliki return type selain void, pastikan
function mengembalikan nilai yang sesuai.
Contoh yang salah:
int square(int x) {
x * x;
}
Function tersebut bertipe int, tetapi tidak mengembalikan hasil
perhitungannya menggunakan return.
Perbaikannya:
int square(int x) {
return x * x;
}
2. Ketidaksesuaian Parameter dan Argument
Perhatikan prototype:
int add(int a, int b);
Function tersebut mengharapkan dua argument.
Pemanggilan berikut tidak sesuai:
add(5);
Karena hanya satu argument diberikan, sedangkan function memerlukan
dua argument bertipe int.
Pemanggilan yang sesuai:
add(5, 3);
3. Memanggil Function Sebelum Deklarasinya Diketahui
Jika definition function diletakkan setelah main(), berikan prototype
sebelum function tersebut dipanggil.
Contoh:
int add(int a, int b);
int main(void) {
int hasil = add(5, 3);
return 0;
}
int add(int a, int b) {
return a + b;
}
Prototype:
int add(int a, int b);
memberi tahu compiler signature function sebelum pemanggilannya.
Practice
Setelah memahami function dan procedure, cobalah membuat function sendiri untuk menyelesaikan permasalahan berikut.
Pada bagian ini, fokuslah untuk memisahkan proses perhitungan ke dalam
function, kemudian memanggilnya dari main().
Practice 1 — Konversi Suhu
Buatlah dua function untuk mengonversi suhu:
celsiusToFahrenheit()untuk mengonversi Celsius ke Fahrenheit.fahrenheitToCelsius()untuk mengonversi Fahrenheit ke Celsius.
Kedua function menerima sebuah nilai suhu dan mengembalikan hasil konversinya.
Gunakan rumus berikut:
Fahrenheit = (Celsius × 9 / 5) + 32
Celsius = (Fahrenheit - 32) × 5 / 9
Agar perhitungan pecahan tidak terpotong menjadi pembagian bilangan
bulat, gunakan tipe data double dan pastikan pembagian dilakukan
dengan nilai pecahan, misalnya 9.0 / 5.0.
Uji function dengan nilai berikut:
25 Celsius
77 Fahrenheit
Hasil konversi yang diharapkan:
25.00 Celsius = 77.00 Fahrenheit
77.00 Fahrenheit = 25.00 Celsius
Petunjuk:
- Gunakan return type
double. - Terima suhu melalui parameter.
- Kembalikan hasil perhitungan menggunakan
return. - Panggil kedua function dari
main(). - Gunakan
printf()dengan%.2funtuk menampilkan dua angka di belakang koma.
Practice 2 — Maximum of Three Numbers
Buatlah sebuah function bernama findMax yang menerima tiga bilangan
bulat sebagai parameter dan mengembalikan bilangan terbesar dari
ketiganya.
Gunakan signature berikut:
int findMax(int a, int b, int c);
Contoh pemanggilan:
findMax(12, 7, 20);
Hasil yang diharapkan:
Maximum = 20
Uji juga function tersebut dengan beberapa kombinasi nilai lain, termasuk ketika bilangan terbesar berada pada parameter pertama, kedua, atau ketiga.
Petunjuk:
- Bandingkan ketiga nilai yang diterima function.
- Tentukan nilai terbesar.
- Kembalikan nilai terbesar menggunakan
return. - Panggil
findMax()darimain()dan tampilkan hasilnya.
Ringkasan
Pada materi ini, kita telah mempelajari bahwa function membantu membagi program menjadi bagian-bagian yang lebih kecil dan dapat digunakan kembali.
Konsep utama yang perlu diingat:
Function
→ Blok kode untuk melakukan tugas tertentu.
Declaration / Prototype
→ Memberi tahu compiler tentang signature function.
Definition
→ Berisi implementasi atau body function.
Function Call
→ Menjalankan function.
Parameter
→ Variabel yang menerima nilai di dalam function.
Argument
→ Nilai yang diberikan ketika function dipanggil.
return
→ Mengembalikan nilai kepada pemanggil.
void function / Procedure
→ Function yang tidak mengembalikan nilai.
Local Variable
→ Variabel yang hanya dapat diakses pada wilayah deklarasinya.
Global Variable
→ Variabel yang dideklarasikan di luar semua function.
Dengan menggunakan function secara tepat, program menjadi lebih modular, lebih mudah digunakan kembali, dan lebih mudah dipelihara.