Function dan Rekursif
FUNCTION
Sebuah function berisi sejumlah
pernyataan yang dikemas dalam sebuah nama. Nama ini selanjutnya dapat dipanggil
beberapa kali di beberapa tempat dalam program. Tujuannya:
1.
memudahkan
dalam mengembangkan program. Program dibagi menjadi beberapa subprogram kecil,
sehingga hal ini menjadi kunci dalam pembuatan program terstruktur.
2.
menghemat
ukuran program, karena beberapa perintah yang sama dan dijalankan beberapa kali
dalam program dapat dijadikan satu kali saja dalam suatu function, kemudian
function tersebut dapat dipanggil berulang kali.
Dalam bahasa C fungsi dapat dibagi
menjadi dua, yaitu fungsi pustaka atau fungsi yang telah tersedia dalam Turbo C
dan fungsi yang didefinisikan atau dibuat oleh programmer.
Fungsi Pustaka Atau Fungsi Yang Telah
Tersedia Dalam Turbo C
a) Fungsi
Operasi String (tersimpan dalam header file “string.h”)
ü strcpy()
Berfungsi untuk menyalin suatu string asal ke
variable string tujuan. Bentuk umum : strcpy(var_tujuan, string_asal);
ü strlen()
Berfungsi untuk memperoleh jumlah karakter dari
suatu string. Bentuk umum : strlen(string);
ü strcat()
Digunakan untuk menambahkan string sumber ke bagian
akhir dari string tujuan. Bentuk umum : strcat(tujuan, sumber);
ü strupr()
Digunakan untuk mengubah setiap huruf dari suatu
string menjadi huruf capital. Bentuk umum : strupr(string);
ü strlwr()
Digunakan untuk mengubah setiap huruf dari suatu
string menjadi huruf kecil semua. Bentuk umum : strlwr(string);
ü strcmp()
Digunakan untuk membandingkan dua buah string.
Hasil dari fungsi ini bertipe integer dengan nilai :
(a) Negative, jika string pertama kurang dari
string kedua.
(b) Nol, jika string pertama sama dengan string
kedua
(c) Positif, jika string pertama lebih besar dari
string kedua.
Bentuk umum : strcmp(string1, string2);
b) Fungsi
Operasi Karakter (tersimpan dalam header “ctype.h”)
♦ islower()
Fungsi akan menghasilkan nilai benar (bukan nol)
jika karakter merupakan huruf kecil. Bentuk umum : islower(char);
♦ isupper()
Fungsi akan menghasilkan nilai benar (bukan nol)
jika karakter merupakan huruf kapital. Bentuk umum : isupper(char);
♦ isdigit()
Fungsi akan menghasilkan nilai benar (bukan nol)
jika karakter merupakan sebuah digit. Bentuk umum : isdigit(char);
♦ tolower()
Fungsi akan mengubah huruf capital menjadi huruf
kecil. Bentuk umum : tolower(char);
♦ toupper()
Fungsi akan
mengubah huruf kecil menjadi huruf kapital. Bentuk umum : toupper(char);
c) Fungsi
Operasi Matematik (tersimpan dalam header “math.h” dan “stdlib.h”)
♦ sqrt()
Digunakan untuk menghitung akar dari sebuah
bilangan. Bentuk umum : sqrt(bilangan);
♦ pow()
Digunakan untuk menghitung pemangkatan suatu bilangan. Bentuk umum :
pow(bilangan, pangkat);
♦ sin(), cos(), tan()
Masing-masing digunakan untuk menghitung nilai sinus,
cosinus dan tangens darisuatu sudut. Bentuk umum :
· sin(sudut);
· cos(sudut);
· tan(sudut);
♦ atof()
Digunakan untuk mengkonversi nilai string menjadi
bilangan bertipe double. Bentuk umum : atof(char x);
♦ atoi()
Digunakan untuk mengkonversi nilai string menjadi
bilangan bertipe integer. Bentuk umum : atoi(char x);
♦ div()
Digunakan untuk menghitung hasil pembagian dan sisa
pembagian. Bentuk umum : div_t div(int x, int y)
Strukturnya :
typedef struct
{ int qout; // hasil pembagian
int rem // sisa pembagian
} div_t;
♦ max()
Digunakan untuk menentukan nilai maksimal dari dua
buah bilangan. Bentuk umum : max(bilangan1, bilangan2);
♦ min()
Digunakan untuk menentukan bilangan terkecil dari
dua buah bilangan. Bentuk umum : min(bilangan1, bilangan2);
Membuat Fungsi Sendiri
a) Deklarasi
Fungsi
Sebelum digunakan (dipanggil), suatu fungsi
harusdideklarasikan dan didefinisikan terlebih dahulu. Bentuk umum
pendeklarasian fungsi adalah : tipe_fungsinama_fungsi (parameter_fungsi);
Sedangkan bentuk umum pendefinisian fungsi adalah
Tipe_fungsi nama_fungsi(parameter_fungsi)
{ statement
Statement
………...
………...
}
b) Hal-hal
yang perlu diperhatikan dalam penggunaan fungsi :
· Kalau
tipe fungsi tidak disebutkan, maka akan dianggap sebagai fungis dengan nilai
keluaran bertipe integer.
· Untuk
fungsi yang memiliki keluaran bertipe bukan integer, maka diperlukan
pendefinisian penentu tipe fungsi.
· Untuk
fungsi yang tidak mempunyai nilai keluaran maka dimasukkan ke dalam tipe void
· Pernyataan
yang diberikan untuk memberikan nilai akhir fungsi berupa pernyataan return.
· Suatu
fungsi dapat menghasilkan nilai balik bagi fungsi pemanggilnya.
Contoh Program :
#include “stdio.h”
#include “conio.h”
long int faktorial(int N); /* prototype fungsi factorial() */
void main()
{ int N;
long int fak;
printf(“Berapa factorial ? “); scanf(“%i”, &N);
fak = faktorial(N); /* pemanggilan fungsi factorial() */
printf(“%i factorial = %ld\n”, N, fak);
getch();
}
long int faktorial(int N) /* definisi fungsi factorial */
{ int I;
long int F = 1;
if(N<=0)
return(0);
for(I=2; I<=N; I++)
F = F * I;
return(F);
}
c) Parameter Formal
dan Parameter Aktual
· Parameter
Formal adalah variabel yang ada pada daftar parameter dalam definisi
fungsi.
· Parameter
Aktual adalah variabel (parameter) yang dipakai dalam pemanggilan
fungsi.
Dalam contoh program pertambahan di atas parameter
formal terdapat pada pendefinisisan fungsi :
float tambah(float x, float y) //parameter formal
{ return (a+b);
}
Sedangkan parameter aktual terdapat pada
pemanggilan fungsi :
void main()
{ ……………
…………..
c = tambah(a, b); //parameter aktual
…………..
}
d) Cara
Melewatkan Parameter
Cara melewatkan suatu parameter dalam Bahasa C ada
dua cara yaitu :
Ø Pemanggilan
Secara Nilai (Call by Value)
ü Call by value
akan menyalin nilai dari parameter aktual ke parameter formal.
ü Yang
dikirimkan ke fungsi adalah nilai dari datanya, bukan alamat memori letak dari
datanya.
ü Fungsi yang
menerima kiriman nilai akan menyimpannya di alamat terpisah dari nilai aslinya
yang digunakan oleh bagian program yang memanggil fungsi.
ü Perubahan
nilai di fungsi (parameter formal) tidak akan merubah nilai asli di bagian
program yang memanggilnya.
ü Pengiriman
parameter secara nilai adalah pengiriman searah, yaitu dari bagian program yang
memanggil fungsi ke fungsi yang dipanggil.
ü Pengiriman
suatu nilai dapat dilakukan untuk suatu ungkapan, tidak hanya untuk sebuah
variabel, elemen array atau konstanta saja.
Contoh Program :
#include “stdio.h”
#include “conio.h”
void tukar(int x, int y); /* pendeklarasian fungsi */
void main()
{ int a,b;
clrscr();
a = 15;
b = 10;
printf(“Nilai sebelum pemanggilan fungsi\n”);
printf(“a = %i b = %i\n\n”, a,
b); // a dan b sebelum pemanggilan fungsi
tukar(a,b); /* pemanggilan fungsi tukar() */
printf(“Nilai setelah
pemanggilan fungsi\n”);
printf(“a = %i b = %i\n\n”, a,
b); // a dan b setelah pemanggilan fungsi
getch();
}
void tukar(int x, int y) /* Pendefinisian fungsi tukar() */
{ int z; /* variabel sementara */
z = x;
x = y;
y = z;
printf(“Nilai di akhir fungsi
tukar()\n”);
printf(“x = %i y = %i\n\n”, x, y);
}
Ø Pemanggilan
Secara Referensi (Call by Reference)
ü Pemanggilan
secara Referensi merupakan upaya untuk melewatkan alamat dari suatu variabel ke
dalam fungsi.
ü Yang
dikirimkan ke fungsi adalah alamat letak dari nilai datanya, bukan nilai
datanya.Fungsi yang menerima kiriman alamat ini makan menggunakan alamat yang
samauntuk mendapatkan nilai datanya.
ü Perubahan
nilai di fungsi akan merubah nilai asli di bagian program yang memanggil
fungsi.
ü Pengiriman
parameter secara referensi adalah pengiriman dua arah, yaitu dari fungsi
pemanggil ke fungsi yang dipanggil dan juga sebaliknya.
ü Pengiriman
secara acuan tidak dapat bdilakukan untuk suatu ungkapan.
Contoh Program :
#include “stdio.h”
#include “conio.h”
void tukar(int *px, int *py);
void main()
{ int a,b;
clrscr();
a = 15;
b = 10;
printf(“Nilai sebelum pemanggilan fungsi\n”);
printf(“a = %i b = %i\n\n”, a, b);
tukar(&a,&b); /* parameter alamat a dan alamat b */
printf(“Nilai setelah pemanggilan fungsi\n”);
printf(“a = %i b = %i\n\n”, a, b);
getch();
}
void tukar(int *px, int *py)
{ int z; /* variabel sementara */
z = *px;
*px = *py;
*py = z;
printf(“Nilai di akhir fungsi tukar()\n”);
printf(“*px = %i *py = %i\n\n”, *px, *py);
}
e) Penggolongan
Variabel berdasarkan Kelas Penyimpanan (Storage Class)
Ø Variabel
lokal
Variabel lokal adalah variabel yang dideklarasikan
di dalam fungsi.
Sifat-sifat variabel lokal :
ü Secara otomatis
akan diciptakan ketika fungsi dipanggil dan akan lenyap ketika proses eksekusi
terhadap fungsi berakhir.
ü Hanya dikenal
oleh fungsi tempat variabel dideklarasikan
ü Tidak ada
inisialisasi secara otomatis (saat variabel diciptakan nilainya random).
ü Dideklarasikan
dengan menambahkan kata “auto” (opsional).
Ø Variabel
global (eksternal)
Variabel global (eksternal) adalah variabel yang
dideklarasikan di luar fungsi.
Sifat-sifat variabel global :
ü Dikenal (dapat
diakses) oleh semua fungsi.
ü Jika tidak
diberi nilai awal secara otomatis berisi nilai nol.
ü Dideklarasikan
dengan menambahkan kata “extern” (opsional).
Contoh Program :
#include “stdio.h”
#include “conio.h”
void tampil(void);
int i = 25; /* variabel global */
void main()
{ clrscr();
printf(“Nilai variabel i dalam fungsi main() adalah %i\n\n”, i);
tampil();
i = i * 4; /* nilai i yang dikali 4 adalah 25 (global) bukan 10 */
printf(“\nNilai variabel i dalam fungsi main() sekarang adalah %i\n\n”, i);
getch();
}
void tampil(void)
{ int i = 10; /* variabel lokal */
printf(“Nilai variabel i dalam fungsi tampil() adalah %i\n\n”, i);
}
Ø Variabel
Statis
Variabel statis adalah variabel yang nilainya tetap
dan bisa berupa variabel lokal (internal) dan variabel global (eksternal).
Sifat-sifat variabel statis :
ü Jika bersifat
internal (lokal), maka variabel hanya dikenal oleh fungsi tempat variabel
dideklarasikan.
ü Jika bersifat
eksternal (global), maka variabel dapat dipergunakan oleh semua fungsi yang
terletak pada program yang sama.
ü Nilai variabel
statis tidak akan hilang walau eksekusi terhadap fungsi telah berakhir.
ü Inisialisasi
hanya perlu dilakukan sekali saja, yaitu pada saat fungsi dipanggil pertama
kali.
ü Jika tidak
diberi nilai awal secara otomatis berisi nilai nol.
ü Dideklarasikan
dengan menambahkan kata “static”.
Ø Variabel
Register
Variabel Register adalah variabel yang nilainya
disimpan dalam resister dan bukan dalam memori RAM.
Sifat-sifat variabel register :
ü Hanya dapat
diterapkan pada variabel lokal yang bertipe int dan char.
ü Digunakan
untuk mengendalikan proses perulangan (looping).
ü Proses
perulangan akan lebih cepat karena variabel register memiliki kecepatan yang
lebih tinggi dibandingkan variabel biasa.
ü Dideklarasikan
dengan menambahkan kata “register”.
Contoh Program :
#include “stdio.h”
#include “conio.h”
void main()
{ register int x; /* variabel register */
int jumlah;
clrscr();
for(i=1; i<=100; i++)
jumlah = jumlah + I;
printf(“1+2+3+…+100 = %i\n”, jumlah);
getch();
}
f) Fungsi
Rekursif
Fungsi rekursif adalah fungsi yang memanggil
dirinya sendiri.
Contoh:
#include “stdio.h”
#include “conio.h”
long int faktorial(int N); /* prototype fungsi
faktorial */
void main()
{ int N;
printf(“Berapa factorial ? “);
scanf(“%i”, &N);
printf(“Faktorial dari %i =
%ld\n”, N, faktorial(N));
getch();
}
long int faktorial(int N) /* definisi fungsi
factorial */
{
if(N==0)
return(1);
else
return(N * faktorial(N - 1)); //
fungsi faktorial() memanggil fungsi factorial()
}
RECURSION
Bentuk rekursi merupakan
alternatif dari bentuk iterasi atau perulangan. Perulangan rekursif merupakan
salah satu metode didalam pemrograman yang mana dalam sebuah fungsi terdapat
instruksi yang memanggil fungsi itu sendiri.
Recursive function, biasa
kalo di bahasa Indonesia disebutnya fungsi rekursif, itu function yang di
dalamnya ada perintah buat manggil function itu sendiri. Gunanya yang paling
utama sih buat ngulang proses yang ada di dalam function itu juga.
Pertanyaannya, ngapain kita pake fungsi rekursif kalo kita bisa pake looping
for, while, atau do while buat ngulang perintah? Karena dalam beberapa kasus,
fungsi iteratif (yang pake looping for, while, & do while tadi) lebih ribet
daripada fungsi rekursif atau malah nggak bisa ngeberesin masalahnya sama
sekali.
Misalnya : n faktorial
(n!)didefinisikan sebagai produk dari semua integer diantara n dan 1. Contoh
lain adalah bilangan asli. 1 adalah bilangan asli.Successor dari 1 adalah
bilangan asli.
Perbedaan rekursi dengan prosedur/fungsi adalah
rekursi bisa memanggil kedirinya sendiri tetapi prosedur atau fungsi harus
dipanggil lewat pemanggil prosedur/fungsi. Ciri masalah yang dapat diselesaikan
secara rekursif adalah masalah tersebut dapat direduksi menjadi satu atau lebih
masalah-masalah serupa yang lebih kecil. Secara umum suatu algoritma rekursif
selalu mengandung 2 macam kasus :
1. satu atau lebih kasus yang pemecahan masalahnya
dilakukan dengan menyelesaikan masalah serupa yg lebih sederhana (menggunakan
recursive call).
2. satu atau lebih kasus pemecahan masalahnya
dilakukan tanpa recursive call. Kasus ini disebut kasus dasar atau penyetop.
Supaya tidak terjadi rekursif tak hingga, maka setiap langkah rekursif haruslah
mengarah ke kasus penyetop.
Sistem komputer mengikuti jalannya program yang
rekursif biasanya dengan menggunakan suatu struktur data yang disebut stack.
Ketika eksekusi program sampai pada suatu rekursif call, ia menghentikan
sementara komputasi yg sedang dilaksanakannya sekarang untuk melakukan
recursive call tsb, agar ia dapat kembali ke keadaan semula setelah recursive
call itu selesai , ia harus menyimpan informasi yang cukup. Informasi yg
diperlukan disebut activation frame. Activation frame disimpan pada
bagian memori yg diatur dalam benruk stack. Rekursif yang berlapis-lapis
dapat menghabiskan memori yang mengakibatkan stack overflow. Masalah yg
mempunyai solusi rekursif juga mempunyai solusi iteratif(menggunakan loop).
Versi iteratif seringkali lebih efisien daripada versi rekursif karena
rekursif biasanya menggunakan memori yg lebih besar dan memerlukan waktu ekstra
u/ penanganan stack of activation frame.
Comments
Post a Comment