minggu v subprogram 2008€¦ · motivasi Üpada dasarnya, manusia adalah makhlukyang lemah....
TRANSCRIPT
subprogramsubprogramMinggu V
MotivasiMotivasiÜ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 kepustakaanBeberapa fungsi kepustakaan
Fungsi char arraystring.hFungsi utilitasstdlib.hFungsi char : tolower, isdigit, …ctype.h
Berisi fungsi matematika dan konstanta
math.h
Ü 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 berbedaSederetan operasi yang kompleks yang membuat arus program sukar diikuti
Cara kerja fungsi Cara kerja fungsi
Fungsi sebagai kotak hitamFungsi sebagai kotak hitamÜMenyembunyikan detailÜDapat menggunakan fungsi tanpa tahu apa yang
ada di dalamnya
Bagian fungsiBagian 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 ke fungsi yang memanggilnya
Mendefinisikan dan memanggil FungsiMendefinisikan 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 mainDalam fungsi tampilkan_PesanKembali ke main
Program Output:
Memanggil FungsiMemanggil 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 mainDalam fungsi tampilkan_PesanKembali 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 menginformasikankompiler tentang return type fungsi, banyak dan tipe parameternya
Semicolon diperlukan
Function header harus sama dengan prototipe
FunctionFunctionÜ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 nilaiFungsi 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 5x 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 nilaiFungsi 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 parameterFungsi 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 :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 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
A B
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 2Versi 2void 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 &)
Argumen DefaultArgumen 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 parameterJenis 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)
TemplateTemplateÜAdakalanya kita ingin melewatkan berbagai jenis
parameter (bisa int,float, dll.) tetapi harusnyafungsi hanya satu saja à gunakan template
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 terpisahProgram yang besar menjadi mudah dimodifikasi dan dirawat
ÜMenyederhanakan programJika 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 FunctionOverloading 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.
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 xy
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 :
a x b = a + a + a + … + a (sebanyak b kali)
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 lineInline functionPelajari algoritma (+ analisis + buat contoh) Listing 3.3 Recursive integer-to-hexadecimal conversion (bandingkandengan Listing 3.21)
Ü [S3] Recursive Function Calls, Pelajari algoritma powerÜ [S4] Chapter 3. Recursion, pelajari mekanisme stack, tail
recursion, 3.3 Questions and AnswersÜ [S5] 9.5 Recursion, pelajari algoritma sum
Fungsi RekursifFungsi 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 rekursifCiri 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 perulanganCiri perulanganÜKapan mulaiÜKapan berhentiÜBerapa kali diulang
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 :
n * faktorial (n-1)
Fungsi rekursifFungsi rekursifFungsi 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 rekursifProsedur rekursifProsedur 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 RekursifIteratif 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 gcdVersi 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).
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 RekursiMacam-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 kasusContoh kasusÜHitunglah nilai dari :
52 + 62 + 72 + 82 + 92 + 102
ÜPohon rekursinya adalah sebagai berikut :
Going Down RecursionGoing 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 RecursionGoing 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 RecursionTwo-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
TF(6,6) ⇑ 6*6=36 TF(9,9) ⇑ 9*9=81
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 ProgrammingTop Down ProgrammingÜMerancang program dengan memecahnya
menjadi bagian yang lebih kecilÜMulai dengan perencanaan global kemudian
mengisi detailnya pada setiap level sampai lengkap
AbstraksiAbstraksiÜ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
TugasTugasÜ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 LaporanKriteria 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 DepanMinggu DepanÜArray 1 dimensiÜPersiapan mid term
Materi : dari awal sampai dengan subprogram termasuk rekursifMenerima pertanyaan apabila ada materi yang belum dikuasai. Siapkan pertanyaan dari rumah !