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