Bab 8 - Prosedur dan Fungsi

Dalam pembuatan program, seringkali kita menggunakan beberapa kode secara berulang. Kita bisa memecah kode program yang besar menjadi sub-sub program yang lebih kecil, agar tidak terjadi redundansi kode.

Prosedur

Prosedur adalah sub program yang mana hanya dijalankan ketika dibutuhkan saja. Prosedur tidak bisa mengembalikan nilai atau tidak memiliki return type.

Prosedur dalam Pascal bisa dituliskan sebagai berikut

procedure nama_prosedur( {{ list parameter }} );
const
    { daftar konstanta, jika ada }
var
    { daftar variabel lokal, jika ada }
begin
    { kode }
end;

Contoh prosedur sederhana

procedure cetak_nama(nama : string);
begin
    writeln('Hai ', nama, ', salam kenal..');
end;

Ketika prosedur cetak_nama dipanggil dengan cetak_nama('Joni'), maka akan menghasilkan output

Hai Joni, salam kenal..

Fungsi

Hampir sama dengan prosedur, fungsi bisa mengembalikan nilai. Ambil contoh persamaan f(x) = 3x + 2, ketika kita ubah kedalam blok fungsi di Pascal, akan seperti ini

function f(x : integer) : integer;
begin
    f := 3 * x + 2; { mengembalikan 3x + 2 }
end;

Jadi, anatomi dari fungsi hampir sama dengan prosedur

function nama_fungsi( {{ list parameter }} ) : return_type;
const
    { daftar konstanta, jika ada }
var
    { daftar variabel lokal, jika ada }
begin
    { kode }
end;

Perbedaannya, fungsi harus menyertakan return type (tipe data kembalian).

Contoh fungsi yang mengembalikan nilai faktorial dari N.

function faktorial(N : integer) : longint;
var
    i : integer;
    hasil : longint;
begin
    hasil := 1;
    for i := 1 to N do begin
        hasil := hasil * i;
    end;
    faktorial := hasil; { mengembalikan nilai dari variabel hasil }
end;

Passing by value dan passing by reference

Ketika kode diatas adalah menerapkan passing by value (nilainya yang dipassing ke fungsi, variabel asli tidak diubah), contoh kode berikut menerapkan passing by reference.

procedure tes(var x : integer);
begin
    x := x + 3;
end;

var
    a : integer;
begin
    a := 100;
    writeln('Sebelum pemanggilan prosedur : ', a);
    tes(a);
    writeln('Setelah pemanggilan prosedur : ', a);
end.

Akan menghasilkan output

Sebelum pemanggilan prosedur : 100
Setelah pemanggilan prosedur : 103

Yang dilewatken ke prosedur tes adalah reference yang menunjuk ke alamat memori dari variabel a, sehingga nilai dari a berubah sesuai instruksi di blok tes.

Perbedaanya, terletak di dalam kurung tempat dimana kita mendeklarasikan parameter. Pada passing by value tidak menyertakan keyword var, sedangkan passing by reference menyertakan keyword var.

Rekursif

Rekursif adalah suatu kondisi dimana prosedur atau fungsi dapat memangiil dirinya sendiri sesuai kriteria yang ditentukan sebelumnya. Dalam rekursif wajib terdapat 2 bagian, bagian basis dan rekuren.

Bagian basis adalah bagian yang membatasi agar tidak terjadi rekursif terlalu dalam (rekursif non stop), sedangkan bagian rekuren adalah bagian yang memanggil dirinya sendiri.

Ketika fungsi faktorial diatas diubah kedalam bentuk rekursif, akan seperti ini

function faktorial(N : integer) : longint;
begin
    if (N = 1) then begin
        faktorial := 1; { basis rekursif }
    end else begin
        faktorial := N * faktorial(N - 1); { basis rekuren }
    end;
end;

Ketika fungsi diatas dipanggil dengan faktorial(5), maka akan mengalami proses kira-kira seperti ini

faktorial(5)
        = 5 * faktorial(4)
                      = 4 * faktorial(3)
                                    = 3 * faktorial(2)
                                                  = 2 * faktorial(1)
                                                                = 1

faktorial(5) = 5 * 4 * 3 * 2 * 1 = 120

Contoh rekursif yang lain (bilangan fibonacci)

function fibonacci(N : integer) : longint;
begin
    if ((N = 1) or (N = 2)) then begin
        fibonacci := 1;
    end else begin
        fibonacci := fibonacci(N - 1) + fibonacci(N - 2);
    end;
end;