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; }
Top Related