modul algoritma Bab 5

Post on 20-Jul-2015

52 views 2 download

Transcript of modul algoritma Bab 5

BAB 5

SUB PROGRAM

Pada dasarnya, manusia adalah makhluk yang lemah dan berkemampuan terbatas. Untuk mengerjakan sesuatu hal yang besar

dan kompleks, manusia membagi pekerjaan menjadi bagian yang lebih kecil yang memungkinkan untuk di selesaikan. Bagian

yan lebih kecil dan telah diselesaikan itu disebut dengan modul. Dalam algoritma pun juga terdapat paradigma untuk membagi

pekerjaan besar menjadi pekerjaan yang lebih kecil. Prinsip ini di kenal dengan divide and conquer (bagi lalu selesaikan).

A. Prosedur (Procedure)

Prosedur di kategorikan sebagai sub (subprogram) yang menghasilkan output lebih dari satu atau hanya sekedar

melakukan tindakan tertentu.

Contoh 5.1

Buatlah prosedure untuk menukar nilai dari dua variable.

Analisis :

Untuk memindahkan posisi huruf A pada posisi huruf B dan sebaliknya, maka kita perlu tempat sementara (temp) sebelum huruf

B. Karena kita tidak bisa begitu saja menaruh huruf ke posisi B, yang akan berakibat huruf B akan “hilang”. Langkah –

langkahnya adalah sebagai berikut :

TEMP

No. Langkah Algoritma

1. Temp di isi A temp A

2. (A kosong) A di isi B A B

3. (B kosong) B di isi temp B temp

Algoritma 5.1

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

B A

Translasi 5.1

Bahasa Pascal Bahasa C

program Tukar_Nilai;

uses wincrt; var a, b : integer;

procedure tukar (var a, b : integer); var temp : integer;

begin temp := a;

a := b; b := temp; end;

begin

a := 100; b:= 50; writeln (‘Sebelum Tukar’);

writeln (‘Isi Nilai =’,a); writeln (‘Isi Nilai =’,b); tukar (a,b);

writeln (‘Sesudah Tukar’); writeln (‘Isi Nilai1 = ‘,a);

writeln (‘Isi Nilai2 = ‘,b); end.

#include <stdio.h>

void tukar (int *a, int *b)

{ int temp; temp = *a; *a = *b;

*b = temp; }

Main () {

int a = 100, b = 50; printf(“Sebelum Tukar\n”); printf(“isi Nilai1 = %d\n”,a);

printf(“isi Nilai2 = %\n”,b); tukar (&a,&b);

printf(“Sesudah Tukar\n”); printf(“Isi Nilai1 =%d\n”,a); printf(“isi Nilai2 =%d\n”,b);

return 0; }

B. Fungsi (Function)

Sebagaimana pengertian fungsi dalam matematika, fungsi dalam algoritma adalah subprogram yang menghasilkan satu

nilai. Perbedaan penulisan fungsi dalam bahaasa Pascal dan Bahasa C adalah sebagai berikut :

Karakteristik Bahasa Pascal Bahasa C

mulai dengan … keyword function tipe hasil

nilai akhir dan fungsi disimpan pada nama fungsi return(hasil akhir)

prototipe function nama(deklarasi variable tipe_hasil;

tipe_hasil nama (deklarasi variable)

contoh function rata(x : larik; n : integer) : real float rata(larik x, int n)

Fungsi dipanggil dengan dua cara :

1. Langsung digunakan, misalnya pada saat mencetak hasil

2. di-assign ke suatu vaiabel

Bahasa Pascal Bahasa C

writeln(‘Hasil hitung rata-rata =’,rata(A,n)); printf(“Hasil hitung rata-rata = %f\n” (A,n));

hitung_rata := rata(A,n); Hitung_rata = rata (A,n);

C. Parameter Dalam Subprogram

Dalam subprogram dapat dideklarasikan variable sendiri, yang nantinya akan digunakan Variabel yang dideklarasikan

dalam subprogram bersifat lokal, artinya hanya dikenal dalam procedure itu sendiri, dan tidak di kenal diluar procedure. Ada 2

jenis parameter yang dideklarasikan dalam subprogram, yaitu :

1. parameter nilai (value parameter) : variable yang dikirim tidak mengalami perubahan

sekeluar dari subprogram)

2. parameter variable (variable parameter) : variable yang dikirim tidak mengalami

perubahan sekeluar dari subprogram)

Jenis Parameter Bahasa Pascal Bahasa C

parameter nilai ----- menggunakan const

parameter variabel menggunakan var melalui pointer

Contoh 5.2

Buatlah fungsi yang menentukan nilai terbesar dari 2 bilangan bulat.

Algoritma 5.2

Fungsi maksimum2 (input a,b : integer) : integer

Deskripsi if (a>b) then maksimum2 a else maksimum2 b

Translasi 5.2

Bahasa Pascal Bahasa C

program nilai_maksimum_2_bilangan;

user wincrt; var x,y : integer;

function maksimum2(a,b : integer) : integer;

begin

If (a>b) then maksimum2 : = a Else maksimum2 := b; end;

begin writeln(‘Masukkan dua integer :’);

write(‘Bilangan pertama : ‘); readln(x); write(‘Bilangan kedua : ‘); readln(y); write(‘Nilai terbesar:’,maksimum2(x,y));

end.

#include <stdio.h> int maksimum2(int a, int b)

{ if (a>b) return(a);

else return(b); }

Main () { Int x, y; Printf(“Massukkan dua integer : \n”);

Scanf(“Bilangan pertama : “); Scanf(“%d”,&x);

Printf(“Bilangan kedua : “); scand(“%d”,&y) Printf(“Bilangan terbesar

:d“,maksimum2(x,y)); return 0;

}

Contoh 5.3

Dengan menggunakan fungsi In dan exp, buatlah fungsi untuk menghasikan nilai 𝑥𝑦.

Analisis :

Dengan menggunakan sifat logaritma :

In(𝑥𝑦) = y*In(𝑥)

exp(In(𝑥𝑦)) = exp(y*In(𝑥))

sehingga :

𝑥𝑦 = exp(y*In(𝑥))

Algoritma 5.3

Fungsi Pangkat(input x,y : integer)

{Menghitung nilai dari x pangkat y}

Deskripsi

pangkat exp(y*In(x))

Translasi 5.3

Bahasa Pascal Bahasa C

Program pangkat_fungsi;

uses wincrt;

var hasil : real a, b : integer

#include <stdio.h> #include <math.h>

float pangkat(int x, int y)

{ return(exp(y*log(x))) }

function pangkat(x, y : integer) : real;

begin

pangkat := exp(y*ln(x)); end;

begin writeln (‘Menghitung hasil

perpangkatan ‘); write(‘Tulis sebuah bilangan : ‘); readln

(a); write(‘Mau dipangkat berapa : ‘); readln (b);

hasil := pangkat(a, b); writeln (a,’ pangkat ‘,b,’ = ‘,hasil:6:0);

end

main() }

float hasil;

int a, b; printf(“Menghitung hasil

perpangkatan\n”); printf(“Tulis sebuah bilangan : “); scanf(“%d”,&a)

printf(“Mau dipangkat berapa : “); scanf(“%d”,&b)

hasil = pangkat(a, b); printf(“%d pangkat %d = %6.0f\n”,a,b,hasil);

return 0; }

Contoh 5.4

Buatlah fungsi perkalian 2 bilangan bulat dengan menggunakan operator penjumlahan.

Analisis :

a × b = a + a + a + … + a (sebanyak b kali)

Algoritma 5.4

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

Translasi 5.4

Bahasa Pascal Bahasa C

program

Perkalian_dengan_cara_menjumlah;

{menghitung nilai dari m × n dengan cara

menjumlah : m+m+m+ … +m sebanyak n

kali}

uses wincrt;

var a, b : integer;

function kali(m, n : integer) : integer;

var i, hasil : integer; begin

#include

int kali(int m, int n)

{ int i, hasil =0;

for (i=1;i<=n; i++) hasil = hasil + m;

return(hasil); }

hasil :=0; for i:=1 to n do

hasil := hasil + m;

kali := hasil; end

begin

write (‘Masukkan bilangan :’); readln (a);

write (‘Akan dikali dengan ;’); readln (b);

writeln (‘Nilai ‘,a,’ x ‘,b,’ = ‘,kali(a,b)); end

main() }

int a, b; printf(“Masukkan bilangan : “);

scanf(“%d”,&a); printf(“Akan dikali dengan : “);

scanf(“%d”,&b); printf(“Nilai %d x %d = %d”,a,b,kali(a,b));

return 0; }

C. Fungsi Rekursif

Rekursif berasal dari bahasa Latin recur (re = kembali, cure : eksekusi). Fungsi rekursif adalah fungsi yang melakukan

proses perulangan dengan cara memanggil dirinya sendiri. Ini berbeda dengan versi iterative yang menggunakan perulangan for,

while maupun repeat until. Fungsi rekursif dapat dipandang sebagai sebuah “operator”. Misalkan kita lihat contoh 4.4 dimana

secara iteratif n factorial didefenisikan sebagai :

n! = 1 × 2 × 3 × … × n = ∏ 𝑖𝑝𝑖=1

n factorial didefinidikan secara rekursif sebagai berikut :

n! = 1 , untuk n = 0 atau n = 1

= n*(n-1)! , n > 2

Dapat dilihat ternyata pada sisi kanan terdapat operator yang sama dengan sisi kiri. Dengan demikian nilai dan factorial

baru bisa (n-1) factorial telah diperoleh. Tentu saja n factorial “lebih kompleks” disbanding dengan (n-1) factorial. Pencarian ini

berakhir bila sudah sampai pada nilai konstan, yakni telah dicapai harga n=0 atau n=1 yaitu 0!=1 atau 1!=1.

Untuk itu dapat diambil kesimpulan bahwa untuk fungsi rekursif ada 2 syarat, yaitu :

1. Kasus penyetop. Dalam kasus ini terdapat nilai konstan.

2. Kasus pemanggilan rekursif. Dalam kasus ini terdapat pemanggilan fungsi itu sendiri,

tetapi harus mengarah kepada kasus penyetop.

Contoh 5.5

buatlah fungsi factorial secara rekursif untuk mencari n!

Algoritma 5.5

Fungsi factorial(input n : integer) : longint

Deskripsi

if (n=0) or (n=1) then factorial 1

else factorial n * faktorial(n-1)

Translasi 5.5

Bahasa Pascal Bahasa C

program Faktorial_Fungsi_Rekursif;

uses wincrt;

var bil : integer function factorial(N : integer):logint;

begin if (N = 0) or (N = 1) then factorial := 1

else factorial := N * factorial(N-1); end;

begin

write (‘ Masukkan integer n : ‘);

readln(bil); writeln (bil.’!= ‘,kaktorial(b il))); end.

#include <stdio.h> long faktorial(int n)

{ if ((n==0 || (n==1)) return(1); else return (n*faktorial(n-1)); }

main() {

int n;

long hasil; printf(“Masukkan integer n : “); scanf(“%d”,&n);

hasil = faktorial printf(“Nilai %d!=%ld”, n,hasil);

return 0; }

Contoh 5.6

Diberikan deret Fibonacci sebagai berikut :

1, 1, 2, 3, 5, 8, …

Buatlah fungsi yang mnghitung 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.

Algoritma 5.6

Fungsi Fibonacci (input n : integer) : integer

Deskripsi

if (n = 1) or (n = 2) then fibonacci 1

else Fibonacci fibonacci(n-1) + Fibonacci(n-2) endif

Translasi 5.6

Bahasa Pascal Bahasa C

Program Deret_Fibonacci; uses wincrt;

var I, n : integer;

function fibonacci(n : integer) : integer;

begin

if (n = 1) or (n = 2) then fibonacci :=1

else

fibonacci := Fibonacci(n-1) + fibonacci(n-2);

end; begin

write (‘Sampai suku ke :’);readln (n);

for I := 1 to n do write (fibonacci(i),’,’); end

#include <stdio.h>

Int fibonacci (int n)

{ if ((n == 1) ||( n == 2)) return(1); else return(fibonacci(n-1) + fibonacci(n-

2)); }

Main () {

Int I, n;

printf(“Sampai suku ke :”);scanf(“%d”,&n); for (I = 1 ; I <= n; 1++)

printf (“%d, “,Fibonacci(i))); return

}

D. Iteratif Versus Rekursif

Dengan pengalaman memprogram, seorang programmer akan tahu, kapan mneggunakan perulangan iterative dan kapan

menggunakan perulangan rekursif. Beberapa kasus berikut akan memberikan wawasan memprogram dengan kedua versi, yaitu

versi interatif dan rekursif.

Contoh 5.7

Cetaklah satu kalimat dengan cara iterative maupun cara rekursif.

Translasi 5.7.a. Versi Iteratif

Bahsa Pascal Bahasa C

Program balik_kalimat_iteratif;

uses wincrt; var kata : string;

procedure balik(s : string);

var i : integer; begin

for i:=length(s) downto 1 do write(s[i])

end;

begin

kata := ‘algoritma’; balik(kata)

end.

#include <stdio.h> #include <string.h>

void balik(char *s)

{ int I;

for (i=strlen(s)-1 ; i>=0; i--) putchar(s[i]); }

main() {

char *kata = “Algoritma”; balik(kata); return 0;

}

Translasai 5.7.b. Versi Rekursif

Bahasa Pascal Bahasa C

program balik_kalimat_rekursif;

uses wincrt;

var kata : string;

procedure balik(s : string; n : integer);

begin

if (n<>0) then begin

write(s[n]); balik(s, n-1);

end;

end;

begin

kata := ‘Algoritma’; balik(kata, length(kata));

end.

#include <stdio.h> #include <string.h>

void balik(char *s)

{ if (*s != ‘\0’) {

balik(&s[1]);

putchar(s[0]); }

} main () {

char *kata = “Algoritma”; balik(kata); return 0;

}

Contoh 5.8

Buatlah algoritma iterative dan rekursif 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).

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

Harga r ≠ 0 terakhir dicapai adalah r = 2. Inilah hasil dari gcd(190,34). Versi rekursif, gcd didefinisikan sebagai berikut :

gcd(c,d) = c, jika d = 0

= gcd(c-d, d), jika d > 0 dan c > d.

Juga berlaku hokum komunatif, gcd(c,d) = gcd(d,c).

Algoritma 5.8

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)

Translasi 5.8.a Versi Iteratif

Bahasa Pascal Bahasa C

Program mencari_GCD;

uses wincrt;

var a, b, hitung : integer; function gcd(c, d : integer) : integer;

var r : integer; begin

while (d > 0) do begin

r := c mod d; c := d;

d := r; end;

gcd := c;

end;

begin { program utama }

write(‘Masukkan bilangan pertama : ‘); readln(a); write(‘Masukkan bilangan ke dua : ‘);

readln(b); hitung(‘GCD dari ‘,a,’ dan ‘,b,’ =

‘,hitung); end.

#include <stdio.h> int gcd(int c, int d)

{ int r; while (d > 0) {

r = c % d; c = d; d = r;

} return (c);

} main () }

int x, y, hitung; printf(“Masukkan bilangan pertama :”);

scanf(“%d”,&x); printf(“Masukkan bilangan kedua : “); hitung(“%d”,&y);

printf(“gcd(%d,%d) = %d\n”, x, y, hitung);

return 0; }

Translasi 5.8.b. Versi Rekursif

Bahasa Pascal Bahasa C

Program mencari_GCD;

uses wincrt; var a, b, hitung : integer;

function gcd(c, d : integer) : integer;

begin

if (d=0) then gcd := c

else if (c<d) then gcd := gcd(d,c) else gcd := gcd(c-d, d);

end; begin { program utama }

write(‘Masukkan bilangan pertama : ‘);

readln(a); write(‘Masukkan bilangan kedua : ‘);

readln(b); hitung := gcd(a,b); write(‘GCD dari ‘,a,’ dan ‘,b,’ =

‘,hitung); end.

#include <stdio.h>

int gcd(int c, int d)

{

if (d==0) return(c); if (c<d) return(gcd(d,c)); return(gcd(c-d, d));

} main () {

int x, y, hitung; printf(“Masukkan bilangan pertama : “); scanf(“%d”,&x);

printf(“Masukkan bilangan kedua : “); scanf(“%d”,&y);

hitung = gcd(x,y); printf(“gcd(%d,%d) = %d\n”, x, y, hitung);

return 0; }