#include <stdio.h>
#include <stdlib.h>
double Absolut(double X); //deklarasi fungsi
main()
{
float Nilai;
Nilai = -123.45;
printf("%7.2f nilai mutlaknya adalah %7.2f\n", Nilai, Absolut(Nilai));
printf("\n");
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
//fungsi untuk memutlakkan nilai negatip
//dimana fungsi dideklarasikan terlebih dahulu
double Absolut(double X) //definisi fungsi
{
if(X<0) X=-X;
return(X);
}
main()
{
float Nilai;
Nilai = -123.45;
printf("%7.2f nilai mutlaknya adalah %7.2f\n", Nilai, Absolut(Nilai));
printf("\n");
system("pause");
}
PROTOTYPE FUNGSI
Prototype fungsi adalah
mendeklarasikan fungsi dengan
menyebutkan argumen fungsinya.
Pada contoh program
ADP_fungsi_1_deklarasi_fungsi.cp
p, prototype fungsi terdapat pada
bagian deklarasi fungsi dimana fungsi
double Absolut menyebutkan
argumen fungsi (double X).
HASIL BALIK FUNGSI
Suatu fungsi dibuat untuk maksud
menyelesaikan tugas tertentu.
Suatu fungsi dapat hanya melakukan suatu
tugas saja tanpa memberikan suatu hasil
balik atau melakukan suatu tugas dan
kemudian memberikan suatu hasil balik.
Fungsi yang hanya melakukan suatu tugas
saja tanpa memberikan hasil balik
misalnya adalah fungsi untuk menampilkan
hasil di layar.
/* --------------------------------------------------------------------------
Nama Program: ADP_fungsi_2_hasil_balik_fungsi.cpp
Hasil Balik Fungsi
--------------------------------------------------------------------------- */
#include <stdio.h>
#include <stdlib.h>
void Tampil_S_N(char *String, int N); //prototype fungsi
main()
{
printf("Contoh Program Hasil Balik Fungsi\n");
printf("_____________________________\n");
printf("\n");
Tampil_S_N("Bahasa C\n",3);
printf("\n");
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
void Tampil_S_N(char *String, int N); //prototype fungsi
main()
{
printf("Contoh Program Hasil Balik Fungsi\n");
printf("_____________________________\n");
printf("\n");
Tampil_S_N("Bahasa C\n",3);
printf("\n");
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
long int Faktorial(int N); //prototype fungsi
main()
{
int N;
long int Fak;
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
float Tambah(float A, float B); //prototype fungsi
main()
{
float Hasil;
Hasil = Tambah(2,3);
printf("%f\n", Hasil); //Hasil variabel lokal fungsi utama
printf("\n");
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
float Tambah(float A, float B); //prototype fungsi
Tambah(2,3);
printf("%f\n",C);
printf("\n");
system("pause");
}
main()
{
int I, N;
long int Fak;
//menghitung N faktorial
if(N<=0) Fak=0;
else
for(I=1;I<=N;I++) Fak=X(I);
printf("%d faktorial = %ld\n", N, Fak);
system("pause");
}
//fungsi X
long int X(long int I) //definisi fungsi
{
static long int F=I;
F = F * I;
return(F);
}
PENGIRIMAN PARAMETER
Pengiriman paramater ke suatu fungsi
dapat dilakukan dengan dua cara, yaitu
pengiriman secara nilai (by value) atau
secara acuan (by reference).
Pengiriman secara nilai yang dikirimkan
adalah nilai, sedangkan pengiriman
secara acuan yang dikirimkan adalah
alamat dari nilainya.
PENGIRIMAN SECARA NILAI
Pengiriman parameter secara nilai mempunyai karakteristik:
1. Yang dikirimkan ke fungsi adalah nilai dari datanya, bukan
alamat memori letak dari datanya.
2. Fungsi yang menerima kiriman nilai ini akan menyimpannya di
alamat yang terpisah dari nilai aslinya yang digunakan oleh
bagian program yang memanggil fungsi.
3. Karena alasan nomor 2 di atas, maka perubahan nilai di fungsi
tidak akan merubah nilai asli di bagian program yang memanggil
fungsi walaupun keduanya menggunakan nama variabel yang
sama.
4. Pengirimannya searah, artinya dari bagian program yang
memanggil fungsi ke fungsi yang dipanggil.
5. Pengiriman suatu nilai dapat dilakukan untuk suatu ungkapan,
tidak hanya untuk sebuah variabel atau elemen larik atau
konstanta saja.
/* ---------------------------------------------------------------------------------------- //fungsi Secara_Nilai
Nama Program: ADP_fungsi_6_pengiriman_parameter_byvalue.cpp void Secara_Nilai(float A, float B, char C) //definisi fungsi
Pengiriman Parameter Secara Nilai (by value) {
---------------------------------------------------------------------------------------- */ float *Alamat_A;
Alamat_A = &A;
#include <stdio.h>
#include <stdlib.h> A = 7;
void Secara_Nilai(float A, float B, char C); //prototype fungsi
printf("Di fungsi Secara_Nilai: \n");
main() printf("Nilai A adalah %f di alamat %p\n", A, Alamat_A);
{ printf("Nilai B adalah %f\n", B);
char C = 'a'; printf("Nilai karakter C adalah %c\n\n", C);
float A = 25, *Alamat_A; }
Alamat_A = &A;
system("pause");
}
HASIL EKSEKUSI PROGRAM
PENGIRIMAN SECARA NILAI
Dari hasil program contoh di atas dapat dijelaskan sebagai berikut:
1. Parameter-parameter aktual yang dikirimkan adalah nilai datanya, yaitu untuk
variabel A, A/3 dan C sebagai berikut:
Secara_Nilai(A, A/3, C);
2. Variabel-variabel A dan C menempati memori berbeda untuk fungsi utama
yang memanggil fungsi dan yang digunakan di fungsi Secara_Nilai(). Untuk
fungsi utama, nilai variabel A disimpan di alamat 0012FF50, sedang di fungsi
Secara_Nilai(), nilai variabel A disimpan di alamat memori 0012FF38.
3. Perubahan nilai variabel A di fungsi Secara_Nilai() menjadi bernilai 7 tidak
merubah nilai variabel A di fungsi utama yang akan tetap bernilai 25.
4. Pengiriman suatu nilai merupakan pengiriman satu arah seperti terlihat
berikut ini
Alamat_A = &*A;
printf("____________________________________________________\n"
);
printf("\n");
system("pause");
}
HASIL EKSEKUSI PROGRAM
PENGIRIMAN SECARA ACUAN
Pengiriman parameter secara acuan adalah pengiriman
alamat dari nilai datanya dan telah diketahui bahwa
alamat dari suatu nilai data dapat diperoleh dengan
menggunakan operator ‘&’ seperti tampak di parameter-
parameter aktual untuk variabel A dan C. Parameter
aktual A/3 dikirimkan secara nilai, karena pengiriman
secara acuan tidak dapat menggunakan suatu ungkapan.
Karena yang dikirimkan adalah alamatnya, maka
parameter-parameter formal di definisi fungsi harus dalam
bentuk pointer. Variabel pointer dapat dideklarasikan
dengan menuliskan nama variabelnya diawali dengan
asterik (‘*’). Hubungan antara parameter aktual dan
parameter formal adalah hubungan dua arah seperti
berikut:
PENGIRIMAN SECARA ACUAN
Karena hubungan dua arah ini, maka
perubahan nilai di fungsi akan
mengakibatkan perubahan nilai di bagian
program yang memanggilnya. Di contoh
program
ADP_fungsi_7_pengiriman_paramete
r_byreference.cpp, nilai di alamat
variabel A dirubah dengan nilai 7 di
fungsi Secara_Acuan(). Akibatnya nilai
variabel A di fungsi utama juga berubah
dari nilai 25 menjadi 7.
PENGIRIMAN SECARA ACUAN
Contoh
ADP_fungsi_7a_pengiriman_parameter_byre
ference.cpp berikut ini menunjukkan dengan jelas
bahwa perubahan nilai di fungsi untuk parameter
yang dikirimkan secara acuan akan merubah juga
nilai di bagian program yang memanggilnya. Karena
sifat dua arah ini, maka pengiriman parameter
secara acuan dapat juga dipakai sebagai pengganti
hasil balik dari fungsi. Di contoh ini, parameter aktual
C akan mengirimkan alamatnya ke fungsi Tambah().
Setelah proses dari fungsi Tambah() selesai, alamat
ini akan berisi dengan hasil proses fungsi, sehingga
dapat digunakan di bagian program yang
memanggilnya sebagai hasil yang diperoleh dari
fungsi yang dipanggil.
/* ---------------------------------------------------------------------------------------------------
Nama Program: ADP_fungsi_7a_pengiriman_parameter_byreference.cpp
Pengiriman Parameter Secara Acuan (by reference)
--------------------------------------------------------------------------------------------------- */
#include <stdio.h>
#include <stdlib.h>
void Tambah(int *A, int *B, int *C); //prototype fungsi
main()
{
int A = 2, B = 3, C;
system("pause");
}
//fungsi Secara_Acuan
void Tambah(int *A, int *B, int *C) //definisi fungsi
{
*C = *A + *B;
return;
}
HASIL EKSEKUSI PROGRAM
/* ---------------------------------------------------------------------------------------------------
Nama Program: ADP_fungsi_7b_pengiriman_parameter_byreference.cpp
Pengiriman Parameter Secara Acuan (by reference)
--------------------------------------------------------------------------------------------------- */
#include <stdio.h>
#include <stdlib.h>
int *Tambah(int *A, int *B); //prototype fungsi
main()
{
int A = 2, B = 3, *C;
C = Tambah(&A, &B);
printf("%d di tambah %d adalah %d\n", A, B, *C);
printf("\n");
system("pause");
}
//fungsi Secara_Acuan
int *Tambah(int *A, int *B) //definisi fungsi
{
int Hasil;
Hasil = *A + *B;
return(&Hasil);
}
HASIL EKSEKUSI PROGRAM
PENGIRIMAN SECARA ACUAN
Contoh program
ADP_fungsi_7a_pengiriman_parameter_byreferenc
e.cpp dapat juga dirubah dengan hasil balik dari fungsi
yang merupakan hasil balik berupa suatu pointer yang
dikirimkan dengan statemen return.
Di fungsi Tambah(), hasil yang dikirimkan adalah
berupa alamat dari variabel Hasil. Alamat dari variabel
ini ditunjukkan oleh &Hasil. Dengan demikian, fungsi
Tambah() ini harus dideklarasikan dengan bentuk
pointer dengan cara nama dari fungsinya ditulis diawali
oleh asterik (‘*’). Di bagian program yang memanggil
fungsi, hasil dari fungsi ini juga harus diterima oleh
suatu variabel pointer, yaitu C yang sudah harus
dideklarasikan sebagai variabel pointer.
PENGIRIMAN PARAMETER
Dengan pengiriman secara parameter (secara
nilai atau acuan), maka variabel-variabel yang
dikirimkan tidak perlu dideklarasikan lagi di
fungsi yang menerimanya. Di contoh program
ADP_fungsi_6_pengiriman_parameter_by
value.cpp, parameter aktual A, A/3, dan C
dikirimkan dan akan diterima oleh
parameter-parameter formal A, B, dan C. Di
definisi fungsi, parameter-parameter formal
ini telah dideklarasikan yang masing-masing
bertipe float, float, dan char. Nama-nama
parameter formal dapat berbeda dengan
nama-nama parameter aktualnya.
REKURSI
Rekursi (recursion) adalah suatu proses
dari fungsi yang memanggil dirinya
sendiri secara berulang-ulang.
Karena proses dilakukan berulang-
ulang, maka harus ada suatu kondisi
yang mengakhiri prosesnya. Jika tidak,
maka proses tidak akan pernah berhenti
sampai memori yang digunakan tidak
dapat menampung lagi.
/* ----------------------------------------------
Nama Program: ADP_rekursi.cpp
Rekursi
---------------------------------------------- */
#include <stdio.h>
#include <stdlib.h>
void Terus_Tidak_Berhenti(void); //prototype fungsi
main()
{
printf("Contoh Program Rekursi\n");
printf("______________________\n");
printf("\n");
Terus_Tidak_Berhenti();
printf("\n");
system("pause");
}
#include <stdio.h>
#include <stdlib.h>
void Berhenti_N_Kali(int N); //prototype fungsi
main()
{
int N=3;
Berhenti_N_Kali(N);
printf("\n");
system("pause");
}
//fungsi menampilkan hasil sebanyak N Kali
void Berhenti_N_Kali(int N) //definisi fungsi
{
static int I=0;
if(N<=0)return;
printf("%d kali\n", ++I);
Berhenti_N_Kali(N-1);
}
HASIL EKSEKUSI PROGRAM
REKURSI
Proses rekursi di program
ADP_rekursi_1.cpp mempunyai kondisi
pengakhiran rekursi, yaitu jika nilai N
sudah lebih kecil atau sama dengan nol.
Setiap kali fungsi memanggil dirinya
sendiri, nilai dari N dikurangi dengan nilai
1, sehingga nilai N akhirnya akan menjadi
nol dan proses rekursi akan diakhiri,
sehingga fungsi ini akan memanggil dirinya
sendiri sebanyak N kali.
/* ------------------------------------------------
Nama Program: ADP_rekursi_2.cpp
Rekursi
------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
long int Fak_Rekursi(int N); //prototype fungsi
main()
{
int N=5;
if(N<=1)return(1);
else{
F = N * Fak_Rekursi(N-1);
return(F);
}
}
HASIL EKSEKUSI PROGRAM
REKURSI
Proses rekursi di program ADP_rekursi_2.cpp dapat dijelaskan sebagai
berikut:
1. Fungsi utama memanggil fungsi Fak_Rekursi() dengan mengirimkan nilai 5
untuk parameter aktual N, yang maksudnya akan dilakukan perhitungan
sebanyak 5 faktorial.
2. Jika nilai dari N pertama kali yang diberikan oleh fungsi utama bernilai
kurang atau sama dengan satu, maka hasil faktorial yang akan diberikan
adalah bernilai 1.
3. Jika nilai N pertama kali yang diberikan oleh fungsi utama lebih besar dari 1,
maka proses rekursi yang pertama adalah:
F = 5 * Fak_Rekursi(4);
Proses ini akan memanggil kembali fungsi dirinya sendiri dengan
mengirimkan nilai sebagai nilai N yang baru. Karena nilai N masih lebih
besar dari 1, maka proses rekursi ke dua akan dilakukan dengan hasilnya
adalah 4 * Fak_Rekursi(3). Untuk N adalah 3, hasil yang diperoleh oleh
rekursi adalah 3 * Fak_Rekursi(2) dan seterusnya sampai nilai N adalah 1.
Untuk nilai N sama dengan 1 ini, statemen return(1) akan mengembalikan
proses ke bagian yang memanggilnya, yaitu statemen setelah statemen F =
5 * Fak_Rekursi(N-1). Statemen return(F) kemudian baru mengembalikan
proses ke fungsi utama. Hasil akhirs nilai F dari penjelasan di atas untuk 5
faktorial dapat dituliskan seperti di slide berikut:
PUSTAKA
Kristanto, Andri. (2009). Algoritma &
Pemrograman dengan C++ Edisi 2.
Yogyakarta. Graha Ilmu.
Hartono, Jogiyanto, MBA., Ph.D. (2002).
Konsep Dasar Pemrograman Bahasa C.
Yogyakarta. Andi.