Bab 9 Fungsi Fungsi mirip dengan prosedur, tapi fungsi musti dideklarasikan dengan tipenya. Hal ini berkaitan dengan hasil dari fungsi tersebut, tipe deklarasi itu adalah menunjukkan tipe hasil dari fungsi. Tipe tersebut ditulis pada akhir deklarasi fungsi yang didahului dengan titik koma, sebagai berikut: Function identifier (daftar parameter):type; Contoh: Function Faktorial(var Fak,hasil:integer):integer; Function Pangka(X,Y:real):real; Blok fungsi sama dengan blok prosedur, yaitu diawali dengan Begin dan diakhiri dengan End dan titik koma. Contoh program: fungsi.pas uses crt; Function Hitung(Var A,B:integer):integer; begin hitung:=A+B; end; Var X,Y:integer; Begin clrscr; Write(' Nilai X ? '); Readln(X); Write(' Nilai Y ? '); Readln(Y); Writeln; Writeln(X,' + ',Y,' = ', hitung(X,Y)); repeat until keypressed; End. 9.1. Fungsi tanpa parameter Suatu fungsi dapat juga tanpa parameter, hal ini berarti bahwa hasil dari fungsi tersebut merupakan nilai yang sudah pasti. Parameter merupakan input pada fungsi dan fungsi akan memberikan hasil balik sesuai dengan input yang diberikan. Sedang pada fungsi tanpa parameter, hasil tidak tergantung pada program luar yang menggunakan fungsi tersebut tapi bergantung pada fungsi itu sendiri. Fungsi jenis ini jarang digunakan. Contoh program : noparam.pas Function Deteksi:boolean; begin deteksi:=true; end; begin writeln(deteksi); end. Fungsi seperti ini jarang digunakan, karena memang tidak ada gunanya sebab nilai yang dihasilkan dapat langsung ditentukan dengan statemen : Writeln(TRUE); 9.2. Parameter dalam fungsi Seperti halnya pada prosedur, maka parameter dalam fungsi ada dua jenis, yaitu yang dikirimkan secara nilai (by value) atau secara acuan (by reference). Contoh tata penulisannya adalah sebagai berikut : Function Hitung(A,B:integer):integer; Contoh : Program berikut adalah untuk mendeteksi mana yang lebih besar dari 2 buah nilai real. Terbesar.pas uses crt; Function Terbesar(X,Y:real):real; begin if x>y then terbesar:=x else terbesar:=y; end; var angka1,angka2:real; begin clrscr; write(' Angka pertama : ');readln(angka1); write(' Angka kedua : ');readln(angka2); writeln(' Nilai terbesar adalah ',terbesar(angka1,angka1):9:2); repeat until keypressed; end. 9.3. Pengiriman parameter secara acuan Sedang tata penulisan judul fungsi yang menggunakan parameter dalah sebagai berikut : Function Hitung (var A,B :integer):integer; Bisa kita lihat adanya tambahan kata var pada fungsi tersebut yang menunjukkan bahwa pengiriman parameter tersebut adalah dengan acuan (by reference). Contoh program: acuan.pas uses crt; Function Hitung (var A,B,C :integer):integer; begin hitung:=A+B; C:=A*B; end; var X,Y,Z:integer; Begin clrscr; Write(' Nilai Y : '); readln(X); Write(' Nilai Y : '); readln(Y); writeln; writeln(X,' + ',Y,' = ',hitung(X,Y,Z)); writeln(X,' x ',Y,' = ',Z); repeat until keypressed; End. 9.3. Fungsi memanggil dirinya sendiri Seperti halnya dalam prosedur, fungsi dapat juga memanggil dirinya sendiri. Proses ini disebut juga proses recursion. Contoh Program : faktoria.pas uses crt; Function Faktorial(Nilai:integer):real; Begin IF Nilai = 0 then Faktorial:=1 else Faktorial:=Nilai*faktorial(Nilai-1); end; Var N:integer; Begin clrscr; Write(' Berapa faktorial : '); Readln(N); Writeln(N,' Faktorial = ',Faktorial(N):9:0); repeat until keypressed; End. 9.4. Fungsi memanggil fungsi yang lain Suatu fungsi dapat juga memanggil fungsi yang lainnya. Fungsi yang dipanggil letaknya harus berada pada fungsi yang memanggil. Contoh: Besarnya nilai uang pada periode mendatang bila dihitung dengan bunga majemuk (compound interest) adalah sebesar : Nilai mendatang = Nilai sekarang.(1+Bunga)Periode Akan dibuat suatu fungsi untuk menghitung nilai mendatang ini. Pada rumus nilai mendatang ini diperlukan suatu proses perpangkatan. Karena pascal tidak menyediakan fungsi untuk perpangkatan banyak maka perlu dibikin dulu fungsi perpangkatan banyak. Program perpangkatan : pangkat.pas uses crt; Function PangkatI(X:real;Y:integer):real; var Pangkat:real; I :integer; Begin Pangkat:=1; For I:=1 to Y do Pangkat:=Pangkat*X; PangkatI:=Pangkat; end; var A : Real; B : integer; begin clrscr; writeln(' 2 pangkat 4 = ',PangkatI(2,4):9:2); readln; end. Fungsi perpangkatan diatas mempunyai keterbatasan yaitu, bahwa pangkat yang diijinkan cuman dalam bilangan bulat (integer) sedang pada hal-hal tertentu kita membutuhkan pangkat real. Nilai perpangkatan dapat dihitung denngan cara lain yaitu, dengan rumus exponensial sebagai berikut : Xn = e(Ln X).n Rumus perpangkatan tersebut dapat diselesaikan dengan memanfaatkan fungsi-fungsi standar yang disediakan oleh pascal, yaitu fungsi Exp untuk menghitung nilai ex dan fungsi standar Ln untuk menghitung nilai Ln X. Program perpangkatan bilangan real : pangkat1.pas uses crt; Function Pangkat(X,N:real):real; begin Pangkat:=Exp(Ln(X)*N); end; Var A,B:real; Begin clrscr; Writeln('2.5 pangkat 3.6 = ',pangkat(2.5,3.6):9:3); repeat until keypressed; End. Untuk menghitung nilai bunga majemuk yang paling tepat dipakai fungsi perpangkatan yang kedua. Program interest.pas uses crt; Function Pangkat(X,N:real):real; begin Pangkat:=Exp(Ln(X)*N); end; Function BungaMajemuk(Nilai,Bunga,Periode:real):real; Begin BungaMajemuk:=Nilai*Pangkat((1+Bunga/100),periode); end; Var NS,Bunga,N:real; Begin clrscr; Write(' Nilai sekarang : ');Readln(NS); Write(' Tingkat Bunga : ');Readln(Bunga); Write(' Lama Peminjaman : ');Readln(N); Writeln; Writeln('Nilai besok = ',BungaMajemuk(NS,Bunga,N):9:2); repeat until keypressed; End. 9.5. Fungsi tersarang Fungsi tersarang (nested function) adalah fungsi yang letaknya berada di dalam fungsi yang lain. Contoh program : sarang.pas uses crt; Function Fungsi1(X:integer):integer; Function Fungsi2(Y:integer):integer; begin Fungsi2:=Y*2; end; Begin Fungsi1:=Fungsi2(X)+5; end; begin clrscr; writeln(Fungsi1(3)); repeat until keypressed; end.