Subprogram Minggu V – VI Wahyu Pujiyono yywahyup@yahoo.com Teknik Informatika Universitas Ahmad Dahlan
Motivasi Pada dasarnya, manusia adalah makhluk yang lemah. Contoh : Untuk membangun gedung, tentulah dibangun dari bata satu ke bata yang lain. Dari ruang ke ruang yang lain dst. Metode : Divide & Conquer (dibagi-bagi menjadi bagian yang lebih kecil, lalu selesaikan masalah yang dihadapi)
Gedung bisa diibaratkan sebagai fungsi main() sedangkan bagian yang lebih kecil merupakan fungsi yang menyelesaikan tugas tertentu. Contoh : int main(void) // fungsi utama { float z; z = sqrt(9); // fungsi kepustakaan }
Beberapa fungsi kepustakaan math.h Berisi fungsi matematika dan konstanta ctype.h Fungsi char : tolower, isdigit, … stdlib.h Fungsi utilitas string.h Fungsi char array
Bila kepustakaan tidak menyediakan fungsi yang kita perlukan buat fungsi sendiri (user defined function) Kapan fungsi diperlukan ? Sesuatu yang dikerjakan beberapa kali dalam program Sesuatu yang akan dikerjakan pada program yang berbeda Sederetan operasi yang kompleks yang membuat arus program sukar diikuti
Cara kerja fungsi
Fungsi sebagai kotak hitam Menyembunyikan detail Dapat menggunakan fungsi tanpa tahu apa yang ada di dalamnya
output = function( input1, input2) argument (input1 dan input2) menyediakan informasi ke program Mengembalikan harga (informasi) kembali ke fungsi yang memanggilnya
Function Fungsi pada dasarnya mengembalikan nilai (return value) Fungsi yang tidak mengembalikan nilai prosedur (yang dikembalikan void) Adakalanya ada lebih dari satu parameter yang berubah nilainya dalam fungsi
Fungsi yang mengembalikan 1 nilai Pengertiannya sama dengan fungsi dalam matematika Contoh : Fungsi y = f(x)= x + 5. Untuk setiap harga x maka akan mengakibatkan nilai y bertambah dengan 5 x dikatakan sebagai variabel independen (input) y dikatakan sebagai variabel dependen (output)
Fungsi yang tak mengembalikan nilai Misalkan akan dicetak bilangan dari 1 sampai n
Raptor : http://tutorialalgorithm.com judul : Function in raptor
Fungsi yang mengubah nilai parameter Dinamakan pass by reference Fungsi menggunakan variabel asal (tidak menggunakan copy) Argumen harus berupa variabel, tidak boleh konstanta Dapat mengembalikan lebih dari satu nilai
Contoh : Buatlah fungsi untuk menukar nilai dari dua variabel. Analisis : Misalkan kita punya variabel A = 3 dan B = 5 (input) Output : A = 5 dan B = 3
Langkah algoritma
Raptor : http://tutorialalgorithm Raptor : http://tutorialalgorithm.com judul : Sub-program parameters in raptor : swap
Passing Parameter (versi 1) Dari contoh terakhir, terlihat ada pernyataan : tukar (&a,&b); Pernyataan ini dinamakan function call. Tanda & (alamat) dimaksudkan bahwa parameter a dan b nantinya dapat diubah dalam fungsi. Sebagai konsekuensinya dalam badan fungsi menjadi : void tukar (int *a, int *b) Tanda * menandakan variabelnya bertipe pointer
Versi 2 void swap( double & a, double & b) { double temp; temp = a; a = b; b = temp; } Pemanggilan fungsi di atas sama dengan cara call by value (tanpa tanda &)
Jenis parameter Ada 2 jenis parameter yang dideklarasikan dalam subprogram, yaitu : parameter nilai (value parameter) : variabel yang dikirimkan tidak mengalami perubahan sekeluar dari subprogram) parameter variabel (variable parameter) : variabel yang dikirimkan tidak mengalami perubahan sekeluar dari subprogram)
Jenis parameter Bentuk umum fungsi :
Template Adakalanya kita ingin melewatkan berbagai jenis parameter (bisa int,float, dll.) tetapi harusnya fungsi hanya satu saja gunakan template
Kasus 5.2. Buatlah fungsi yang menentukan nilai terbesar dari 2 bilangan bulat.
Overloading Function Kadang diinginkan beberapa fungsi yang namanya sama namun dengan banyak parameter yang berbeda overloading function Contoh : Fungsi untuk mencari maksimum dari 2 bilangan dan untuk mencari maksimum dari 3 bilangan.
exp(ln(xy)) = exp(y*ln(x)) Kasus 5.3. Dengan menggunakan fungsi ln dan exp, buatlah fungsi untuk menghasilkan nilai xy Analisis : Dengan menggunakan sifat logaritma : ln(xy) = y*ln(x) exp(ln(xy)) = exp(y*ln(x)) xy = exp(y*ln(x))
a x b = a + a + a + … + a (sebanyak b kali) Kasus 5.4. Buatlah fungsi perkalian 2 bilangan bulat dengan menggunakan operator penjumlahan. Analisis : Misalkan a dikalikan b (input) Proses : a x b = a + a + a + … + a (sebanyak b kali)
Fungsi Rekursif adalah fungsi yang melakukan proses perulangan dengan cara memanggil dirinya sendiri. berbeda dengan versi iteratif yang menggunakan perulangan for, while maupun do while. Fungsi rekursif dapat dipandang sebagai sebuah “operator”.
Ciri fungsi rekursif Kasus penyetop. Dalam kasus ini terdapat nilai konstan (return value) Kasus pemanggilan rekursif. Dalam kasus ini terdapat pemanggilan fungsi itu sendiri, tetapi harus mengarah kepada kasus penyetop.
Ciri perulangan Kapan mulai Kapan berhenti Berapa kali diulang Raptor : http://tutorialalgorithm.com judul : How To : Recursion in the raptor
Kasus 5.5. Buatlah fungsi faktorial secara rekursif untuk mencari n!. Analisis : Kasus penyetop (= nilai awal) n = 0 atau n = 1 yaitu bernilai konstan 1 Kasus rekursif : n * faktorial (n-1)
Fungsi rekursif
Prosedur rekursif
fibonacci(n) = fibonacci(n-1) + fibonacci(n-2) Kasus 5.6. Diberikan deret Fibonacci sebagai berikut : 1, 1, 2, 3, 5, 8, … Buatlah fungsi yang menghitung suku ke-n dari deret Fibonacci dengan menggunakan cara rekursif. Analisis : Suku ke-n dari deret Fibonacci diperoleh dengan rumus : fibonacci(n) = fibonacci(n-1) + fibonacci(n-2) dengan nilai awal untuk n=1 dan n=2 berharga 1.
Iteratif Versus Rekursif Cetaklah suatu kalimat dengan cara iteratif maupun cara rekursif.
Kasus 5.8. Buatlah algoritma iteratif dan rekursif untuk menghitung gcd dari dua bilangan bulat positif. Analisis : Jika n 0 dan m integer non negatif, kita dapat menulis m = q.n + r untuk suatu integer non negatif q dan r dengan 0 r < n.
Contoh : Jika n = 3, m = 16 maka 16 = 5(3) + 1, yaitu q = 5 dan r = 1. Jika n = 10, m = 3 maka 3 = 0(10) + 3, yaitu q = 0 dan r = 3. Untuk mencari nilai gcd dari dua integer. kita bisa menggunakan cara menulis di atas. Misalkan kita mau cari gcd(190,34).
Harga r 0 terakhir dicapai adalah r = 2 Harga r 0 terakhir dicapai adalah r = 2. Inilah hasil dari gcd(190,34).
Versi rekursif gcd gcd didefinisikan sebagai berikut : gcd(c,d) = c, jika d = 0 = gcd(c-d, d), jika d > 0 dan c > d. berlaku hukum komutatif, gcd(c,d) = gcd(d,c).
Macam-macam Metode Rekursi Going Down Recursion (rekursi menurun), yaitu parameter menurun nilainya sampai dicapai kasus berhenti Going Up Recursion (rekursi menaik), yaitu parameter menaik nilainya sampai dicapai kasus berhenti Two Half (rekursi separuh-separuh), rekursi dibagi menjadi 2 bagian, di mana setiap bagian juga merupakan subprogram rekursi.
Contoh kasus Hitunglah nilai dari : 52 + 62 + 72 + 82 + 92 + 102 Pohon rekursinya adalah sebagai berikut :
Going Down Recursion
Going Up Recursion
Two-Half Recursion
Keuntungan menggunakan fungsi Program yang dikerjakan team dalam proyek besar Menyederhanakan tugas-tugas Setiap fungsi adalah unit terpisah Pendekatan pemrograman Top Down Abstraksi prosedural Information hiding Reuseability
Top Down Programming Merancang program dengan memecahnya menjadi bagian yang lebih kecil Mulai dengan perencanaan global kemudian mengisi detailnya pada setiap level sampai lengkap
Abstraksi Merujuk ke aksi dan menghindari detail untuk berkonsentrasi pada substansi Dapat menggunakan hal yang kompleks dengan usaha yang kecil Nama fungsi akan merefleksikan “peri laku”nya