Fungsi Kuliah 7 – Pengantar Pemrograman 1 FUNGSI Modul program yang mengembalikan/ memberikan (return) sebuah nilai yang bertipe sederhana. tipe data sederhana : integer, real, boolean, dan string Dalam matematika : f(x,y) = 3x – y + xy f adalah sebuah fungsi dengan parameter x dan y. Nilai yang diberikan fungsi tergantung nilai parameter masukannya. FUNGSI (cont.) Fungsi diakses dengan memanggil namanya (sama seperti prosedur). Fungsi dapat mengandung parameter formal berjenis parameter masukan. Fungsi Untuk mendefinisikan sebuah operasi Hanya satu return output Input parameters Function Return Value 4 Mendefinisikan Fungsi Struktur fungsi sama dengan struktur algoritma, yaitu : bagian judul, bagian deklarasi, dan badan fungsi. Setiap fungsi memiliki nama unik serta daftar parameter formalnya (jika ada). Tipe hasil (pada header) menspesifikasikan tipe data dari nilai yang diberikan fungsi. Dua kelas fungsi Fungsi Standar Tersedia dalam Pascal Contoh: Abs(x), sqr(x), sqrt(x), sin(x) User-defined function Didefinisikan oleh user Didefinisikan pada bgian deklarasi program Contoh: pangkat3(x), max(x) 6 Fungsi Function nama_fungsi(parameter): ReturnType; Bagian Deklarasi Begin Operasi … nama_fungsi := Nilai_pengembalian; End; 7 Pemanggilan Fungsi Fungsi diakses dengan memanggil namanya dari program pemanggil (program utama atau modul program lain), diikuti dengan daftar parameter aktual (jika ada). Pemanggilan Fungsi (cont.) Karena fungsi menghasilkan nilai, maka : nilai tersebut dapat ditampung dalam sebuah peubah yang bertipe sama dengan tipe fungsi : Peubah NAMA_FUNGSI(daftar parameter aktual) nilai yang diberikan oleh fungsi dapat langsung dimanipulasi write(NAMA_FUNGSI(daftar parameter)) if 2 * NAMA_FUNGSI(daftar parameter) < 0 then … Pemanggilan Fungsi (cont.) Parameter aktual dapat berupa tetapan, nama tetapan, atau nama peubah asalkan sudah terdefinisi tipe dan harganya. Dalam program pemanggil, prototype fungsi harus dideklarasikan supaya program pemanggil mengenal nama fungsi tersebut serta cara mengaksesnya. Untuk Menggunakan Fungsi Perlu diketahui: Nama fungsi Jumlah parameter yang diperlukan Tipe setiap parameter Tipe nilai yang dikembalikan 11 Contoh Program : x3 Program kalkulator(input, output); Var x,y : integer; Begin write(‘Masukkan sebuah bilangan’); Readln(x); y := x * x * x; writeln(‘Hasilnya adalah’, y) End. 12 Contoh Fungsi : x3 Function pangkat3(bil:integer):integer; Begin pangkat3 := bil * bil * bil; End; 13 Contoh Fungsi: x3 Program kalkulator; Var x,y : integer; Function pangkat3(bil:integer):integer; Begin pangkat3 := bil * bil * bil; End; Begin {program utama} write(‘Masukkan sebuah bilangan’); Readln(x); y := pangkat3(x); writeln(‘Hasilnya adalah’, y) End. 14 Contoh fungsi: bil. terbesar Function max(x,y : integer): integer; Begin if x > y then max := x else max := y End; 15 Contoh: fungsi terkecil Function min(x,y: real): real; Begin if x < y then min := x else min := y End; 16 Contoh: Konversi USD ke IDR Function USD_to_IDR(dollar:real):real; Begin US_to_IDR := dollar * 11500; End; 17 Contoh: luas_lingkaran Function luas_lingkaran(rad:real) :real; Const Nilai_Pi = 3.14; Begin luas_lingkaran := Nilai_Pi * sqr(rad); End; 18 Contoh: volume_lingkaran Function pangkat3(bil:integer):integer; Begin pangkat3 := bil * bil * bil; End; Function volume_lingkaran(rad:real) :real; Const nilai_pi = 3.14 Begin volume_lingkaran := 4/3 * nilai_Pi * pangkat3(rad); End; 19 Contoh: Operasi Array FUNCTION Jum_Array( A : Array_num): integer; Var index, jum : integer; Begin jum:= 0; for index := 1 to 50 do jum:= jum + A[index]; Jum_Array := jum; End; Begin { Prog. Utama} Total: = Jum_Array(array1) + Jum_Array( array2) 20 Contoh: Faktorial FUNCTION Faktorial (X : integer) : integer; Var Hasil : integer; Begin Hasil := 1; While X > 0 do Begin Hasil := Hasil * x; x:= x -1; end; Faktorial := hasil; End; 21 Contoh: Segitiga FUNCION Segitiga (Sudut1,Sudut2,Sudut3 : Real) :Boolean; Begin If Sudut1 + Sudut2 + Sudut3 -180 = 0 then Segitiga := true; end; Begin Readln( sudutA, sudutB, sudutC); If Segitiga(sudutA, sudutB, sudutC) then writeln (‘ketiga sudut membentuk segitiga’); else writeln (‘ketiga sudut tidak membentuk segitiga); End. 22 Contoh: Memeriksa Nama Tulis sebuah fungsi yang memeriksa apakah sebuah nama ditulis benar atau tidak. Misal Nama dikatakan valid jika terdiri dari huruf kapital FUNCTION NamaValid ( Nama : String) : BOOLEAN; Var index : integer; begin NamaValid : = true; For index := 1 to length(Nama) do If (Nama[index] < ‘A’) OR (Nama[index] > ‘Z’) then NamaValid := False; end;{ function} 23 Contoh (cont’d) Begin writeln(‘Masukkan nama’); Readln( NamaOrang); If NamaValid (NamaOrang) then writeln(‘Ok’); End. 24 PERHATIKAN! Cara pendefinisian fungsi Penggunaan parameter masukan, keluaran, dan masukan/keluaran Parsing parameter Tipe data parameter aktual dan formal Nama lokal dan nama global Cara pemanggilan fungsi (bandingkan dengan prosedur) Prosedur atau Fungsi ? Sebuah prosedur dapat dituliskan sebagai fungsi, demikian juga sebaliknya. Sebaiknya buat modul program dalam bentuk : Fungsi jika modul program menghasilkan sebuah nilai. Prosedur jika modul menghasilkan efek netto dari satu/sekumpulan aksi. Modul Program dengan output lebih dari satu tidak elegan dituliskan sebagai fungsi, meskipun hal itu mungkin dilakukan. Well-design program Program kalkulator; Var x: integer; Procedure baca_data (var n:integer); Begin write(‘Masukkan sebuah bilangan’); Readln(n); End; Function pangkat3(:integer):integer; Begin pangkat3 := bil * bil * bil; End; Begin {main routine} baca_data (x); writeln(‘Jika dipangkatkan 3 hasilnya’, power3(x)) End. 27 Rekursi 1. Rekursi adalah kondisi dimana di dalam sebuah sub-proses terdapat instruksi untuk memanggil sub-proses lain yang serupa dengan dirinya. 2. Setiap kali terjadi proses yang rekursif, sejumlah memori akan dipakai untuk mengidentifikasi sub-proses yang baru dan lokasi dari subproses lama yang ditinggalkan. 3. Komputer menyimpan address yang ditinggalkan di dalam memory yang disebut STACK. Penggunaan STACK memastikan alur proses berjalan dengan benar. 4. Karena di dalam sub-proses terjadi pemanggilan sub-proses lain maka STACK yang digunakan untuk menyimpan address saat ini semakin penuh. Rekursi (Lanjutan) 5. Dalam sebuah sub-proses rekursif HARUS terdapat instruksi untuk menghentikan proses rekursif pada suatu nilai tertentu. 6. Besar-kecilnya ukuran STACK yang dipakai ditentukan oleh beberapa faktor: • • • Tipe dari fungsi. Jumlah variabel lokal di dalam fungsi. Kompleksitas instruksi yang ada di dalam fungsi. 7. Pengendalian terhadap alur proses rekursif sepenuhnya menjadi tanggung jawab programmer. 8. Dalam banyak hal, penggunaan fungsi rekursif lebih efisien dibandingkan dengan looping. Kedua model perulangan ini bisa saling dipertukarkan jika memungkinkan. Rekursi dalam prosedur SUB cetak(n) Contoh #1 BEGIN BENAR SALAH n>0 CALL cetak(3) PRINT “Halo” END CALL cetak(n-1) RETURN Rekursi dalam fungsi FUNCTION pangkat(a,b) Contoh #2 hasil = 0 BEGIN SALAH BENAR b == 0 PRINT pangkat(2,4) hasil = a * pangkat(a,b-1) hasil = 1 END RETURN hasil Latihan Tuliskan fungsi untuk mengkonversikan harga karakter angka (0..9) menjadi harga numerik sesuai dengan karakter yang tertulis. Contoh: ‘8’8, ‘4’4 Tuliskan fungsi IsAnA yang mentest apakah sebuah karakter yang diberikan kepadanya adalah sebuah huruf ‘A’. Harga yang dihasilkan adalah benar jika huruf itu ‘A’,salah jika huruf itu bukan ‘A’. Contoh: IsAnA(‘A’) true IsAnA(‘X’) false Tuliskanlah fungsi, yang jika diberikan sebuah angka Cm yang menyatakan panjang dalam cm, akan menghasilkan pasangan harga <x1,x2> sesuai dengan rumus ukuran metris (1 m = 100 cm) sehingga x1*100+x2 = cm. Contoh: F(100) = <1,0> F(355) = <3,55> 32 Latihan Tuliskan fungsi IsPrima(), yang mentest apakah sebuah bilangan integer yang diberikan merupakan bilangan prima atau bukan. Contoh: IsPrima(2)true, IsPrima(15)false. Tuliskan fungsi IsEven(), yang mentest apakah sebuah bilangan integer yang diberikan merupakan bilangan genap atau bukan. Contoh: IsEven(43)false, IsEven(32)true. Tuliskan fungsi IsOdd(), yang mentest apakah sebuah bilangan integer yang diberikan merupakan bilangan ganjil atau bukan. Contoh: IsOdd(24)false, IsOdd(43)true. 33 Latihan Tuliskanlah sebuah fungsi MAX2, yang menerima masukan dua buah bilangan integer dan menghasilkan sebuah bilangan integer yaitu salah satu diantara nilai dua buah bilangan tersebut yang terbesar. Kemudian, dengan memakai fungsi MAX2, tuliskan sebuah fungsi lain MAX3 yang menghasilkan nilai terbesar dari tiga buah bilangan integer. Contoh: MAX2(1,2)2 MAX2(10,2)10 MAX3(1,2,3) adalah MAX2(MAX2(1,2),3)3 MAX3(10,2,3) adalah MAX3(MAX2(10,2),3)10 34 Latihan Didefinisikan tipe terstruktur untuk mewakili hari seperti dalam kalender yang kita pakai sehari-hari: type nama: DATE<tanggal,bulan,tahun> Tuliskan algoritma untuk: Membaca sebuah tanggal dan sebuah kode bahasa penulisan (1=Inggris, 2=Indonesia, 3=Perancis), Menuliskan tanggal keesokan harinya sesuai dengan kode bahasa. Inggris, DATE ditulis dalam: bulan,’/’,tanggal,’/’,tahun Indonesia, DATE ditulis dalam: tanggal,’-’,bulan,’-’,tahun Perancis, DATE ditulis dalam: tanggal,’/’,bulan,’/’,tahun Proses menghitung hari esok dilakukan oleh sebuah fungsi NextDay yang menerima masukan sebuah tanggal dan menghasilkan tanggal keesokan harinya. Contoh: NextDay(<13,4,1990>,1)4/14/1990 NextDay(<30,1,1990>,2)31-1-1990 NextDay(<31,12,1990>,1)1/1/1991 35 Latihan Rekursi 1. Menampilkan deret bilangan: cacah, genap, gasal, fibonacci 2. Menampilkan pola segitiga: pascal, genap, gasal 3. Perhitungan statistik: MAX, MIN, AVERAGE, TOTAL 4. Perhitungan matematika: perkalian, FPB, KPK 5. Menampilkan pola bintang Any Question?