subprogram
subprogram
Motivasi
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
Beberapa fungsi kepustakaan
Fungsi char array string.h
Fungsi utilitas stdlib.h
Fungsi char : tolower, isdigit, … ctype.h
Berisi fungsi matematika dan konstanta
Ü 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
Fungsi sebagai kotak hitam
ÜMenyembunyikan detail
ÜDapat menggunakan fungsi tanpa tahu apa yang
Bagian fungsi
Bagian fungsi
Ü Return type : tipe data dari harga yang dikembalikan oleh fungsi
Ü Nama : identifier yang deskriptif dan valid
Ü Daftar parameter : variabel yang menangani harga yang dilewatkan ke fungsi
Ü Badan : pernyataan yang melakukan operasi fungsi Ü Bentuk umum :
Return_type Nama (daftar parameter) { Badan fungsi
Pemanggilan fungsi (function call)
Pemanggilan fungsi (function call)
output = function( input1, input2)
• argument (input1 dan input2)
menyediakan informasi ke program
• Mengembalikan harga (informasi) kembali
Mendefinisikan dan memanggil Fungsi
Mendefinisikan dan memanggil Fungsi
void tampilkan_Pesan ( void ){
cout << “Dalam fungsi tampilkan_Pesan \n”; }
void main ( void ) {
cout << “Di dalam main\n”; tampilkan_Pesan( );
cout << “Kembali ke main.\n”; } Afile.cpp Definisi Function main function Function call
Return type Nama Daftar Parameter
Function header
Di dalam main
Dalam fungsi tampilkan_Pesan Kembali ke main
Memanggil Fungsi
Memanggil Fungsi
void tampilkan_Pesan ( void ) {
cout << “Dalam fungsi tampilkan_Pesan \n”; }
void main ( void ) {
cout << “Di dalam main\n”; tampilkan_Pesan( );
cout << “Kembali ke main.\n”; } Afile.cpp Definisi Function main function Function call
Return type Nama Daftar Parameter
Di dalam main
Dalam fungsi tampilkan_Pesan Kembali ke main Program Output: 1. Eksekusi program mulai di sini 2. Function call dieksekusi dan mengarah ke definisi fungsi
3. Badan fungsi
di-eksekusi sampai selesai
4. Setelah fungsi selesai dieksekusi
Prototipe Fungsi
void tampilkan_Pesan ( void ) {
cout << “Dalam fungsi tampilkan_Pesan \n”; }
void main ( void ) {
cout << “Di dalam main\n”; tampilkan_Pesan( );
cout << “Kembali ke main.\n”; } Afile.cpp Definisi fungsi main function Function call #include <iostream.h>
void tampilkan_Pesan ( void );
Prototipe Fungsi menginformasikan kompiler tentang return type fungsi, banyak dan tipe parameternya Semicolon diperlukan Function header harus sama dengan prototipe
Function
Function
ÜFungsi pada dasarnya mengembalikan nilai
(return value)
ÜFungsi yang tidak mengembalikan nilai à
prosedur (yang dikembalikan void)
ÜAdakalanya ada lebih dari satu parameter yang
Fungsi yang mengembalikan 1 nilai
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)
Bahasa C++ #include <iostream.h> int tambah5(int x) { return (x+5); } main() { int x, y;
cout << "Masukkan harga x : "; cin >> x; y = tambah5(x);
cout << "Setelah masuk fungsi bernilai : " << y; return 0;
Fungsi yang tak mengembalikan nilai
Fungsi yang tak mengembalikan nilai
ÜMisalkan akan dicetak bilangan dari 1 sampai nBahasa C++
#include <iostream.h>
void cetak(int n) {
int i;
for (i=1; i<=n; i++)
cout << "Harga n = " << i << endl; }
main() { int n;
cout << "Masukkan harga n : "; cin >> n; cetak(n);
return 0; }
Fungsi yang mengubah nilai parameter
Fungsi yang mengubah nilai parameter
ÜDinamakan pass by referenceÜFungsi menggunakan variabel asal (tidak
menggunakan copy)
ÜArgumen harus berupa variabel, tidak boleh
konstanta
Contoh :
Contoh :
ÜBuatlah fungsi untuk menukar nilai dari dua
variabel.
ÜAnalisis :
ÜMisalkan kita punya variabel A = 3 dan B = 5
(input)
Langkah algoritma
Langkah algoritma
TEMP
No. Langkah Algoritma 1. temp diisi A temp ß A 2. (A kosong) A diisi B A ß B 3. (B kosong) B diisi temp B ß temp
prosedur tukar (input/output a : integer; b : integer)
{menukar isi dua nilai a menjadi nilai b, demikian pula sebaliknya} Deklarasi temp : integer Deskripsi temp ß a a ß b b ß temp
#include <iostream.h> void tukar (int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } main() { int a = 3, b = 5;
cout << "Sebelum Tukar\n";
cout << "Isi Nilai1 = " << a << endl; cout << "Isi Nilai2 = " << b << endl; tukar (&a,&b);
cout << "Sesudah Tukar\n";
cout << "Isi Nilai1 = " << a << endl; cout << "Isi Nilai2 = " << b << endl; return 0;
Passing Parameter (versi 1)
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
main() {
int a = 3, b = 5;
cout << "Sebelum Tukar\n";
cout << "Isi Nilai1 = " << a << endl; cout << "Isi Nilai2 = " << b << endl; tukar (&a,&b);
cout << "Sesudah Tukar\n";
cout << "Isi Nilai1 = " << a << endl; cout << "Isi Nilai2 = " << b << endl; return 0;
Versi 2
Versi 2
void swap( double & a, double & b) { double temp; temp = a; a = b; b = temp; }
ÜPemanggilan fungsi di atas sama dengan cara
Argumen Default
Argumen Default
Ü Argumen default dilewatkan parameter bila saat fungsi dipanggil tidak menyertakan argumen
Ü Fungsi di atas dapat dipanggil dengan : Ü luas_lingkaran(); // output : 0
Ü luas_lingkaran(3); // output : 28.26
const float phi = 3.14;
void luas_lingkaran(int r=0) { cout << phi*r*r << endl;
Jenis parameter
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 :
Jenis parameter Bahasa C++ parameter nilai menggunakan const
parameter variabel melalui pointer
Karakteristik Bahasa C++ mulai dengan … tipe hasil
nilai akhir dari fungsi return(hasil akhir)
Prototipe tipe_hasil nama(deklarasi variabel) contoh float rata(larik x, int n)
Template
Template
ÜAdakalanya kita ingin melewatkan berbagai jenis
parameter (bisa int,float, dll.) tetapi harusnya
Bahasa C++ #include <iostream.h> template<class T> T tambah5(T x) { return (x+5); } main() { int x; float y;
cout << "Masukkan harga x (integer) : "; cin >> x;
cout << "Setelah masuk fungsi bernilai : " << tambah5(x) << endl; cout << "Masukkan harga x (float) : "; cin >> y;
cout << "Setelah masuk fungsi bernilai : " << tambah5(y); return 0;
Mengapa menggunakan Fungsi ?
Mengapa menggunakan Fungsi ?
ÜMembagi program ke dalam unit (modul) kecil
yang mudah diatur (di-manage)
Setiap unit terpisah
Program yang besar menjadi mudah dimodifikasi dan dirawat
ÜMenyederhanakan program
Jika suatu tugas dilakukan beberapa kali dalam program, panggil fungsi jika diperlukan
Kasus 5.2.
Kasus 5.2.
ÜBuatlah fungsi yang menentukan nilai terbesar dari 2 bilangan bulat.
Fungsi maksimum2(input a, b : integer) : integer Deskripsi
if (a>b) then return a else return b
Overloading Function
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
Bahasa C++ #include <iostream.h>
int max(int x, int y) {
return (x > y ? x : y); }
int max(int x, int y, int z) {
int m = (x > y ? x : y); // m = max(x,y) return (z > m ? z : m);
}
int main() {
cout << "Maksimum 2 bilangan : " << max(99,77) << endl; cout << "Maksimum 3 bilangan : " << max(55,66,33);
return 0; }
Kasus 5.3.
Kasus 5.3.
ÜDengan menggunakan fungsi ln dan exp,
buatlah fungsi untuk menghasilkan nilai
x
y Analisis :ÜDengan menggunakan sifat logaritma : ln(xy) = y*ln(x)
exp(ln(xy)) = exp(y*ln(x)) xy = exp(y*ln(x))
Fungsi Pangkat(input x, y : integer) {Menghitung nilai dari x pangkat y} Deskripsi
pangkat ß exp(y*ln(x))
Bahasa C++ #include <iostream.h>
#include <math.h>
float pangkat(int x, int y) { return(exp(y*log(x))); } main() {
float hasil; int a, b;
cout << "Menghitung hasil perpangkatan\n"; cout << "Tulis sebuah bilangan : "; cin >> a; cout << "Mau dipangkat berapa : "; cin >> b; hasil = pangkat(a,b);
cout << a << " pangkat " << b << " = " << hasil; return 0;
Kasus 5.4.
Kasus 5.4.
ÜBuatlah fungsi perkalian 2 bilangan bulat dengan menggunakan operator
penjumlahan. Analisis :
ÜMisalkan a dikalikan b (input) ÜProses :
Fungsi kali(input a, b : integer) : integer
{ Menghitung hasil perkalian a dan b menggunakan Operator Penjumlahan } Deklarasi hasil, i : integer Deskripsi hasil ß 0 for i ß1 to b do hasil ß hasil + a kali ß hasil
Bahasa C++
#include <iostream.h> #include <math.h>
int kali(int m, int n) { int i, hasil=0;
for (i=1; i<=abs(n); i++) hasil += m;
if (n<0) return(-hasil); else return(hasil); }
main() { int a, b;
cout << "Masukkan bilangan : "; cin >> a; cout << "Akan dikali dengan : "; cin >> b;
cout << "Nilai " << a << " x " << b << " = " << kali(a,b); return 0;
Bahan bacaan (kuis)
Bahan bacaan (kuis)
Ü [A4] Chapter 9: Functions Ü [S1] Ch 6: Functions
Ü [S2] 3.1 Functions Command line Inline function
Pelajari algoritma (+ analisis + buat contoh) Listing 3.3
Recursive integer-to-hexadecimal conversion (bandingkan dengan Listing 3.21)
Ü [S3] Recursive Function Calls, Pelajari algoritma power Ü [S4] Chapter 3. Recursion, pelajari mekanisme stack, tail
recursion, 3.3 Questions and Answers
Fungsi Rekursif
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
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
Ciri perulangan
Ciri perulangan
ÜKapan mulai ÜKapan berhenti
Kasus 5.5.
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 :
Fungsi rekursif
Fungsi rekursif
Fungsi faktorial(input n : integer) : longint Deklarasi
i : integer
faktorial : long integer
Deskripsi (rekursif) if (n=0) or (n=1) then faktorial ß 1 else faktorial ß n * faktorial(n-1) Deskripsi (iteratif) faktorial ß1 for i ß 1 to n do faktorial ß faktorial * i
Prosedur rekursif
Prosedur rekursif
Prosedur cetak(input n : integer) Deklarasi
i : integer
Deskripsi (rekursif) // nilai awal n
if (n>0) // kasus penyetop
cetak(n-1) // pemanggilan rekursi write(n)
endif
Deskripsi (iteratif) // nilai awal 1 // nilai akhir n
// naik 1 setiap kali berulang for i ß1 to n
write(i) endfor
Kasus 5.6.
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.
fungsi fibonacci (input n : integer) : integer Deskripsi
if (n = 1) or (n = 2) then fibonacci ß 1 { kasus penyetop }
else fibonacci ß fibonacci(n-1) + fibonacci(n-2) { kasus rekursif } endif
Bahasa C++
#include <iostream.h>
int fibonacci (int n)
{ if ((n == 1) || (n == 2)) return(1);
else return(fibonacci(n-1) + fibonacci(n-2)); }
main() { int i, n;
cout << "Sampai suku ke : "; cin >> n;
for (i = 1; i <= n; i++) cout << fibonacci(i) << " "; return 0;
Iteratif Versus Rekursif
Iteratif Versus Rekursif
ÜCetaklah suatu kalimat dengan cara iteratif maupun cara rekursif.
Iteratif Rekursif
#include <iostream.h> #include <string.h> void balik(char *s) { int i;
for (i=strlen(s)-1; i>=0; i--) cout << s[i];
}
main(){
char *kata = "Algoritma"; balik(kata); return 0; } #include <iostream.h> #include <string.h> void balik(char *s) { if (*s != '\0') { balik(&s[1]); cout << s[0]; } } main() {
char *kata = "Algoritma"; balik(kata);
return 0; }
Kasus 5.8.
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. Inilah hasil dari gcd(190,34). 34 | 190 à 190 = 5(34) + 20, r = 20 20 | 34 à 34 = 1(20) + 14, r = 14 14 | 20 à 20 = 1(14) + 6, r = 6 6 | 14 à 14 = 2(6) + 2, r = 2 2 | 6 à 6 = 3(2) + 0, r = 0 stop !
Versi rekursif gcd
Versi rekursif gcd
Ügcd didefinisikan sebagai berikut :
gcd(c,d) = c, jika d = 0
= gcd(c-d, d), jika d > 0 dan c > d.
fungsi gcd(c, d : integer) : integer
versi iteratif versi rekursif Deskripsi
while (d > 0) do r ß c mod d
c ß d { menyimpan harga r terakhir } d ß r { harga r terakhir untuk
menghentikan perulangan } endwhile gcd ß c Deskripsi if (d=0) then gcd ß c else if (c<d) then gcd ß gcd(d,c) else gcd ß gcd(c-d, d)
versi iteratif versi rekursif int gcd(int c, int d)
{ int r; while (d > 0) { r = c % d; c = d; d = r; } return (c); }
int gcd(int c, int d) {
if (d==0) return(c);
if (c<d) return(gcd(d,c)); return(gcd(c-d, d));
Macam-macam Metode Rekursi
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
Contoh kasus
ÜHitunglah nilai dari :
52 + 62 + 72 + 82 + 92 + 102
Going Down Recursion
Going Down Recursion
Going Down Recursion pemanggilan rekursi return value
GDR(5,10) ⇓ GDR(5,9)+10*10 ⇑ 25+36+49+64+81+100=355 GDR(5,9) ⇓ GDR(5,8) + 9*9 ⇑ 25+36+49+64+81=255 GDR(5,8) ⇓ GDR(5,7) + 8*8 ⇑ 25+36+49+64=174 GDR(5,7) ⇓ GDR(5,6) + 7*7 ⇑ 25+36+49=110 GDR(5,6) ⇓ GDR(5,5) + 6*6 ⇑ 25+36=61 GDR(5,5) 5*5 ⇑ 25
Going Up Recursion
Going Up Recursion
Going Up Recursion pemanggilan rekursi return value
GUR(5,10) ⇓ GUR(6,10)+ 5*5 ⇑ 100+81+64+49+36+25=355 GUR(6, 10) ⇓ GUR(7,10) + 6*6 ⇑ 100+81+64+49+36=330 GUR(7, 10) ⇓ GUR(8,10) + 7*7 ⇑ 100+81+64+49=294 GUR(8, 10) ⇓ GUR(9,10) + 8*8 ⇑ 100+81+64=245 GUR(9, 10) ⇓ GUR(10,10) + 9*9 ⇑ 100+81=181 GUR(10, 10) 10*10 ⇑ 100
Two-Half Recursion
Two-Half Recursion
Two Half rekursif call return value rekursif call return value
TF(5,10) ⇓ TF(5,7) + TF(8,10) ⇑ 110+245=355
TF(5,7) ⇓ TF(5,6) + TF(7,7) ⇑ 61+49=110 TF(8,10) ⇓ TF(8,9)+TF(10,10) ⇑ 145+10*10=245
TF(5,6) ⇓ TF(5,5) + TF(6,6) ⇑25+36=61 TF(8,9) ⇓ TF(8,8)+TF(9,9) ⇑ 64+81=145
TF(5,5) ⇑ 5*5=25 TF(8,8) ⇑ 8*8=64
Keuntungan menggunakan
fungsi
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
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
Abstraksi
ÜMerujuk ke aksi dan menghindari detail untuk
berkonsentrasi pada substansi
ÜDapat menggunakan hal yang kompleks dengan
usaha yang kecil
Tugas
Tugas
ÜBuat analisis cara kerja dari fungsi rekursif
berikut : int zeros( int n ) {
if ( n == 0 ) return 1; if ( n < 10 ) return 0; if ( n % 10 == 0 ) return 1 + zeros( n / 10 ); else return zeros( n / 10 ); }
int factors(int n, int m) { if (n%m != 0) return 0; return 1 + factors(n/m, m); }
Cobalah dengan berbagai macam argumen.
Contoh :
zeros(20020); factors(1020, 2);
Kriteria Laporan
Kriteria Laporan
Ü Dengan memanggil fungsi, gambarlah menggunakan stack, perubahan pemanggilan pada proses rekursi (seperti contoh faktorial)
Ü Simpulkan cara kerjanya dengan kalimat naratif(cerita) Ü Buatlah versi iteratifnya !
Petunjuk : pelajari karakteristik perulangan (for, while, do .. While) beserta dengan karakteristik rekursi. Carilah
kesamaan dari 2 mtode tersebut
Ü Boleh bekerja berkelompok tetapi tetap mengumpulkan sendiri-sendiri. Bila kerja berkelompok tulislah di
sebelah kanan atas pekerjaan anda : BERKELOMPOK Ü Bila tidak tertulis : BERKELOMPOK, diasumsikan
bekerja sendiri. Apabila ada kesamaan dengan pekerjaan mahasiswa lain à tidak dinilai !
Minggu Depan
Minggu Depan
ÜArray 1 dimensi
ÜPersiapan mid term
Materi : dari awal sampai dengan subprogram termasuk rekursif
Menerima pertanyaan apabila ada materi yang belum dikuasai. Siapkan pertanyaan dari rumah !