Thursday, May 1, 2014

Function

Faktorial dari sebuah bilangan cacah N didefinisikan sebagai N x (N-1) x (N-2) x ... x 1, dengan 0! = 1.
Pak Dengklek memberikan Anda sebuah bilangan bulat N (-100 ≤ N ≤ 100). Jika N berada dalam jangkauan 0 hingga 10, keluarkan nilai N!. Jika N negatif atau lebih besar dari 10, keluarkan ditolak.

Format Masukan

Baris pertama berisi sebuah bilangan bulat N.

Format Keluaran

Sebuah baris berisi sesuai dengan permintaan soal.

Contoh Masukan 1

4

Contoh Keluaran 1

24

Contoh Masukan 2

11

Contoh Keluaran 2

ditolak

Petunjuk

Kali ini akan diperkenalkan konsep function (fungsi). Struktur fungsi mirip dengan prosedur, tetapi fungsi dapat mengembalikan suatu nilai untuk si pemanggil fungsi tersebut. Struktur fungsi secara umum adalah seperti berikut ini:
function <nama>(<daftar parameter>): <tipe-hasil>;
<daftar deklarasi>
begin
  <perintah-perintah>
end;
Contohnya, untuk menyelesaikan latihan ini, kita dapat membuat fungsi seperti berikut ini:
function Faktorial(n: integer): longint;
var
    i: integer;
    bil: longint;
begin
    bil := 1;
    for i := 1 to n do
        bil := bil * i;
    Faktorial := bil;
end;
Dan kode program yang memanggilnya sebagai berikut:
var
    bil: integer;
begin
    readln(bil);
    if (bil >= 0) and (bil <= 10) then
        writeln(Faktorial(bil))
    else
        writeln('ditolak');
end.
Program ini akan membaca sebuah integer dari input dan menyimpannya di dalam variabel bil. Setelah itu, jika bil ada di dalam jangkauan 0 hingga 10, faktorial dari bil akan dituliskan ke layar. Sudah dikatakan bahwa sebuah fungsi akan mengembalikan suatu nilai. Karena <tipe-hasil> adalah longint, maka nilai yang dikembalikan oleh fungsi Faktorial bertipe longint.
Ketika fungsi Faktorial dipanggil oleh kode di atas, nilai variabel bil "dimasukkan" ke dalam variabel n di dalam fungsi Faktorial. Setelah itu, fungsi Faktorial akan menghitung nilai faktorial dari n dengan menggunakan sebuah variabel pembantu bernama bil lagi.
Namun, sekarang ada dua variabel bil, satu di dalam fungsi Faktorial dan satu di dalam program utama. Tetapi kita tidak perlu khawatir, karena meskipun memiliki nama yang sama, kedua variabel ini dianggap sebagai dua variabel yang berbeda. Variabel yang dideklarasikan di program utama disebut global variable, dan yang dideklarasikan di dalam fungsi/prosedur disebut local variable. Lebih dari itu, beberapa fungsi dan prosedur yang berbeda bisa memiliki local variable-nya sendiri-sendiri dan bisa memiliki nama yang sama, tetapi dua variabel akan dianggap berbeda jika dideklarasikan pada scope (tempat) yang berbeda.
Perhatikan juga perintah Faktorial := bil; yang berada di akhir fungsi Faktorial. Perintah ini menyatakan bahwa nilai variabel bilmenjadi nilai yang akan dikembalikan oleh fungsi Faktorial setelah fungsi tersebut selesai.
Jadi, misalnya perintah writeln(Faktorial(4)); akan mengeluarkan hasil yang sama dengan perintah writeln(24);. Secara umum, fungsi biasanya digunakan untuk membuat program lebih terstruktur, atau untuk menghindari menuliskan kode berulang kali.
Kita juga dapat membuat sebuah fungsi lain yang bernama Valid sebagai berikut:
function Valid(n: integer): boolean;
begin
    Valid := (n >= 0) and (n <= 10);
end;
dan digunakan di program utama sebagai berikut:
var
    bil: integer;
begin
    readln(bil);
    if (Valid(bil)) then
        writeln(Faktorial(bil))
    else
        writeln('ditolak');
end.
Jadi fungsi Valid akan mengembalikan nilai true atau false, tergantung nilai n (yang diperoleh dari nilai bil). Program ini akan mengeluarkan keluaran yang sama dengan program sebelumnya.
Ada satu konsep lagi yang akan dikenalkan, yaitu konsep fungsi rekursif (ada juga prosedur rekursif). Sebuah fungsi rekursif adalah fungsi yang memanggil dirinya sendiri, dan struktur ini sering dipakai dan memiliki banyak kegunaan. Contoh fungsi rekursif adalah sebagai berikut:
function Faktorial(n: integer): longint;
begin
    if (n = 0)
        Faktorial := 1
    else
        Faktorial := n * Faktorial (n - 1);
end;
Tentu Faktorial(0) akan mengembalikan hasil 1, seperti yang diharapkan. Bagaimana jika Faktorial(1) dipanggil? Fungsi Faktorialakan melakukan perintah Faktorial := 1 * Faktorial(0);, sehingga pada akhirnya fungsi ini akan mengembalikan hasil 1. JikaFaktorial(n) dipanggil, fungsi ini akan melakukan perintah Faktorial := n * Faktorial(n - 1) dan setelah itu, fungsi ini akan dipanggil lagi dengan parameter n yang lebih kecil daripada sebelumnya. Fungsi Faktorial dipanggil terus-menerus oleh dirinya sendiri sampai nilai nmenjadi 0 dan fungsi ini berhenti memanggil dirinya sendiri. Pada akhirnya, nilai yang dikeluarkan oleh Faktorial(n) adalah n * (n - 1) * (n - 2) * ... * 1, yang merupakan hasil yang benar.
Jawabannya adalah :

No comments:

Post a Comment