2.1 Tujuan
Tujuan modul II ini, adalah:
• Praktikan bisa membuat program sederhana berdasarkan algoritma dengan
memakai fungsi
• Praktikan bisa membuat program sederhana berdasarkan algoritma dengan
menggunakan fungsi rekursi
• Praktikan dapat membiasakan diri untuk membuat program secara terstruktur.
• Praktikan memahami algoritma fungsi dan rekursi
2.2 Teori
Modularisasi program (yang disebut juga rutin, prosedur atau fungsi)
memberikan dua keuntungan, yaitu: untuk aktivitas yang harus dilakukan lebih
dari satu kali, modularisasi menghindari penulisan teks program yang sama secara
berulangkali. Disini penggunaan modul program dapat mengurangi panjang
program. Keuntungan kedua adalah kemudahan menulis dan menemukan
kesalahan program. Kemudahan menulis akan sangat berguna pada masalah besar
yang dikerjakan oleh satu tim pemrogram yang beranggotakan beberapa orang.
Bahasa C tidak mengenal istilah prosedur seperti bahasa pascal. Dalam pascal
sendiri, prosedur didefinisikan sebagai suatu proses yang tidak mengembalikan
nilai. Untuk melakukan hal ini di dalam c, maka kita harus membuat suatu fungsi
dengan tipe void, yang berarti tidak memiliki nilai balik (return value).
II-1
II-2
Deklarasi
{Semua nama yang dipakai dalam prosedur dan hanya berlaku local dalam
prosedur didefnisikan disini}
Deskripsi
{badan prosedur, berisi kumpulan instruksi}
Contoh Algoritma 1:
Procedure HitungLuasSegitiga
{Menghitung luas segitiga dengan rumus Luas = (alas x tinggi)/2}
{k.awal : sembarang}
{k.akhir : Luas dicetak ke piranti masukan keluaran}
Deklarasi
Alas : real {panjang alas segitiga, dalam cm}
Tinggi : real {tinggi segitiga, dalam cm}
Luas : real {luas segitiga, dalam cm}
Deskripsi
Read(Alas, Tinggi)
Luas ← (Alas * Tinggi) / 2
Write(Luas)
Algoritma luassegitiga
{program utama untuk menghitung luas segitiga}
Deklarasi
Procedure HitungLuasSegitiga
{menghitung luas segitiga dengan rumus luas = (alas x tinggi)/2}
Deskripsi
Write(‘menghitung luas sebuah segitiga’)
HitungLuasSegitiga
Write(‘selesai’)
Program Algoritma 1:
//program utama untuk menghitung luas segitiga
#include "stdio.h"
int Alas;
int Tinggi;
void HitungLuasSegitiga();
II-3
main(){
printf("Menghitung luas sebuah segitiga\n");
HitungLuasSegitiga();
printf("\nselesai");
}
void HitungLuasSegitiga()
{
float Luas;
printf("Alas : ");scanf("%d",&Alas);
printf("Tinggi : ");scanf("%d",&Tinggi);
luas = (Alas * Tinggi)/2;
printf("%4.2f",Luas);
}
2.2.1.2 Parameter
Parameter aktual adalah parameter yang disertakan pada waktu
pemanggilan, sedangkan parameter formal adalah parameter yang dideklarasikan
di dalam bagian header prosedur itu sendiri. Ketika prosedur dipanggil, parameter
actual menggantikan parameter formal. Tiap-tiap parameter aktual berpasangan
dengan parameter formal yang bersesuaian.
Berdasarkan penggunaannya terdapat 3 jenis parameter formal, yaitu :
• Parameter masukan (input parameter) : parameter yang nilainya berlaku
sebagai masukan untuk prosedur (sering disebut parameter nilai – parameter
by value).
• Parameter keluaran (output parameter) : parameter yang menampung keluaran
yang dihasilkan oleh prosedur.
II-4
Deklarasi
{tidak ada}
Deskripsi
X ← X +1
Y ← Y -1
Write(X, Y)
Algoritma PQR
{contoh program utama yang memanggil prosedur satu}
Deklarasi
A, B : real
Deskripsi
Satu(4,10) {pemanggilan satu yang pertama kali}
Read(a,b)
Satu(a,b) {pemanggilan satu yang kedua kalinya}
Satu(a+5,17) {pemanggilan satu yang ketiga kalinya}
Pada program PQR diatas: x dan y adalah parameter formal; 4 dan 10, a dan b,
a+5 dan 17 adalah parameter aktual.
Contoh algoritma parameter Keluaran:
Procedure Tiga(input X : integer, output Y : real)
{contoh prosedur dengan parameter formal berjenis parameter keluaran
k.awal : nilai x sudah terdefinisi
k.akhir : di dalam prosedur, nilai x ditambah satu, lalu hasilnya dikalikan 3,
disimpan ke dalam y}
II-5
Deklarasi
{tidak ada}
Deskripsi
X←X+1
Y←X*3
Algoritma PQR
Deklarasi
A, B : integer
Deskripsi
Tiga(4, B) {pemanggilan tiga yang pertama kali}
Write(B)
Read (A)
Tiga(A, B) {pemanggilan tiga yang kedua kali}
Write(B)
Tiga(A+5, B) {pemanggilan tiga yang ketiga kali}
Write(B)
Deklarasi
{tidak ada}
Deskripsi
X←X+4
Y←Y+4
Write(‘nilai X dan Y di akhir prosedur empat’)
Write(‘X : ’,X)
Write(‘Y : ‘,Y)
Algoritma PQR
{program yang memperlihatkan efek penggunakan parameter masukan/
keluaran}
Deklarasi
A, B : integer
II-6
Deskripsi
A ← 15
B ← 10
write(‘nilai A dan B sebelum pemanggilan’)
write(‘A : ’,A)
write(‘B : “, B)
empat(A, B)
write(‘nilai A dan B setelah pemanggilan’)
write(‘A : ’,A)
write(‘B : “, B)
Contoh Algoritma 2:
Procedure tukar(input/output X, Y : integer)
{mempertukarkan nilai x dan y
k.awal : nilai X dan Y sudah terdefinisi
k.akhir : X berisi nilai Y yang lama, Y berisi nilai X yang lama}
Deklarasi
Temp : integer {peubah bantu}
Deskripsi
Temp ← X {simpan nilai X ke dalam Temp}
X←Y {isikan nilai Y ke dalam X}
Y ← Temp {isikan nilai Temp ke dalam Y}
Algoritma tukar
{program utama untuk mempertukarkan nilai A dan B, nilai A dan B dibaca
dari piranti masukan}
Deklarasi
A, B : integer
Deskripsi
read(A, B) {baca nilai A dan B terlebih dahulu}
write(A, B) {cetak nilai A dan B sebelum pertukaran}
Tukar(A, B) {pertukaran nilai A dan B dengan memanggil prosedur Tukar}
write(A, B) {cetak nilai A dan B setelah pertukaran}
II-7
Program Algoritma 2:
//program tukar
#include "stdio.h"
main(){
int A, B;
printf("A : ");scanf("%d",&A);
printf("\nB : ");scanf("%d",&B);
printf("\nA : %d",A);
printf("\nB : %d",B);
tukar(&A, &B);
printf("\nA : %d",A);
printf("\nB : %d",B);
}
Contoh Algoritma 3:
Procedure HitungRatarata(input N : integer , output U : real)
{menghitung nilai rata-rata N buah bilangan bulat yang dibaca dari piranti
masukan. Nilai N diasumsikan selalu positif}
{k.awal : N sudah berisi banyaknya data (N>0)}
{k.akhir : U berisi rata-rata seluruh bilangan }
Deklarasi
X : integer {data bilangan bulat yang dibaca dari papan kunci}
K : integer {pencacah banyak bilangan}
Jumlah : integer {jumlah seluruh bilangan}
Deskripsi
Jumlah ← 0 {inisialisasi}
For K ← 1 to N do
Read(X)
Jumlah ← Jumlah + X
Endfor
U ← Jumlah/N
II-8
Algoritma Rataratabilanganbulat
{program utama untuk menghitung nilai rata-rata N buah bilangan bulat yang
dibaca dari piranti masukan}
Deklarasi
N : integer {banyaknya data bilangan bulat. N positif}
U : real {nilai rata-rata seluruh bilangan}
Deskripsi
Read(N)
Write(‘menghitung rata-rata N buah bilangan bulat’)
HitungRatarata(N, U)
Write(U)
Program Algoritma 3:
//program utama untuk menghitung luas segitiga
#include "stdio.h"
int N;
float U;
main(){
printf("Jumlah data : ");scanf("%d", &N);
printf("menghitung rata-rata N buah bilangan bulat\n");
HitungRatarata(N, &U);
printf("%f", U);
}
Jumlah = 0;
for (K=1; K<=N; K++) {
printf("data ke-%d : ",K);scanf("%d", &X);
Jumlah = Jumlah + X;
}
*U = Jumlah/N;
}
II-9
Deklarasi
{semua nama yang dipakai di dalam algoritma fungsi dideklarasikan disini. Nama
yang didefinisikan di dalam deklarasi lokal hanya dikenal dan dipakai di dalam
fungsi ini saja}
Deskripsi
{badan fungsi, berisi instruksi-isntruksi untuk menghasilkan nilai yang akan
dikembalikan oleh fungsi}
return hasil {pengembalian nilai yang dihasilkan fungsi}
Contoh Algoritma 4 :
Function F(input X : real) → real
{mengembalikan nilai f(x) = 2x2 + 5x – 8, x ȏ R)
Deklarasi
{tidak ada}
Deskripsi
Return 2*X*X + 5*X – 8
ATAU,
Function F(input X : real) → real
{mengembalikan nilai f(x) = 2x2 + 5x – 8, x ȏ R)
Deklarasi
Y : real {penampung hasil fungsi F}
Deskripsi
Y ← 2*X*X + 5*X – 8
Return Y
Algoritma fungsiF
{program utama pemanggilan fungsiF}
II-10
Deklarasi
X : integer
Deskripsi
Read(X)
Write(‘F(X) = ’, F(X))
Program Algoritma 4 :
//program fungsi f(x)=2x2+5x-8
#include "stdio.h"
main(){
int X;
printf("X : ");scanf("%d",&X);
printf("\nF(X) : %f",F(X));
}
Contoh Algoritma 5 :
Function Genap(input N : integer)→boolean
{mengembalikan nilai true jika N adalah bilangan genap, false jika sebaliknya}
Deklarasi
Y : integer
Deskripsi
Y ← (N mod 2 = 0)
Return Y
Algoritma GenapGanjil
{program utama yang memanggil fungsi genap}
Deklarasi
Bil : integer
Deskripsi
Read(Bil)
If Genap(Bil) then
Write(Bil, ‘adalah bilangan genap’)
Else
Write(Bil, ‘adalah bilangan ganjil’)
Endif
Program Algoritma 5 :
//program fungsi f(x)=2x2+5x-8
#include "stdio.h"
main(){
int Bil;
printf("Bil : ");scanf("%d",&Bil);
if (Genap(Bil))
printf("\n%d adalah bilangan genap", Bil);
else
printf("\n%d adalah bilangan ganjil", Bil);
}
2.2.3 Rekursi
Suatu obyek disebut sebagai rekursif apabila sebagian berisi atau
didefinisikan sebagai dirinya sendiri. Dengan demikian rekursif adalah suatu
proses berupa pemanggilan diri berupa statement perulangan. Proses rekursif juga
memungkinkan terjadinya komputasi yang tidak berkesudahan sampai memory
yang digunakan tidak dapat menampung lagi, sehingga perlu diperhatikan akan
adanya kondisi untuk menghentikan proses eksekusi program .
Sebagai contoh sederhana mengenai proses rekursif adalah proses menghitung
nilai faktorial dari bilangan bulat positif dan mencari deret fibonnaci dari suatu
bilangan bulat, permainan menara hanoi dan sebagainya.
II-12
Contoh Algoritma 6:
Function Fak(input N : integer) → integer
{mengembalikan nilai N!. algoritma rekursif. basis : jika N = 0, maka 0!=1
rekurens : jika N>0, maka N! = N x (N-1)!}
Deklarasi
{tidak ada}
Deskripsi
If N = 0 then
Return 1 {basis}
Else
Return N*Fak(N-1) {rekurens}
Endif
Algoritma faktorial
{program utama yang memanggil fungsi faktorial}
Deklarasi
Bil : integer
Deskripsi
Read(Bil)
Write(Bil, ‘ ! adalah :’,Fak(Bil))
Program Algoritma 6:
//program fungsi rekursif faktorial
#include "stdio.h"
main(){
int N;
printf("N! : ");scanf("%d",&N);
printf("\n%d! adalah %d", N, Fak(N)); }
2.3 Kasus
2.3.1 Kasus 1
1. Tuliskan prosedur untuk menghitung jumlah N buah bilangan genap pertama
(bilangan genap dimulai dari 0). Prosedur menerima (parameter) masukan N
dan memberikan (parameter) keluaran jumlah N buah bilangan genap pertama.
Dari algoritma tersebut, buatlah program dan cantumkan output/hasilnya.
2. Buatlah algoritma prosedur yang menerima dua buah tanggal (dd-mm-yyy) :
tanggal-1 dan tanggal-2 lalu menghitung berapa hari jarak tanggal-1 ke
tanggal-2 tersebut. Dari algoritma tersebut, buatlah program dan cantumkan
output/hasilnya.
2.3.2 Kasus 2
1. Buatlah sebuah algoritma fungsi yang memberikan durasi antara dua buah jam
(dengan format hh:mm:ss) lebih dari 1 jam. Dari algoritma tersebut, buatlah
program dan cantumkan output/hasilnya.
2. Misalkan panit(n,k) menyatakan jumlah panitia yang terdiri dari k orang yang
dapat dibentuk dari n orang. Sebagai contoh, panit(4,3)=4, karenadiberikan
empat orang A, B, C, dan D, maka terdapat empat kemungkinan panitia, yaitu
ABC, ABD, ACD dan BCD. Buktikan kesamaan berikut:
Panit(n,k) = panit(n-1,k) + panit(n-1,k-1)
Buatlah fungsi rekursifnya untuk n, k ≥ 1.
Deklarasi
{tidak ada}
Deskripsi
If J.SS+1 < 60 then {tidak ada masalah penambahan 1 detik}
J.SS ← J.SS + 1
else {j.ss + 1 = 60}
J.SS←0 {detik kembali menjadi nol, menit bertambah 1, tapi
periksa dulu apakah menit +1 <60}
if J.MM + 1 < 60 then {tidak ada masalah penambahan 1 menit}
J.MM ← J.MM + 1
else {J.MM + 1 = 60}
J.MM ← 0 {menit menjadi nol, jam berambah 1, tapi periksa
dulu apakah jam + 1 <24}
if J.HH + 1 < 24 {tidak ada masalah penambahan 1 jam}
J.HH ← J.HH + 1
else { J.HH + 1 = 24}
J.HH ← 0
endif
endif
endif
Algoritma Jam_Hidup
{membuat jam ‘hidup’ yang selalu bertambah 1 detik terus menerus sampai
jam 00:00:00. masukan jam dibaca dari piranti masukan. Setiap pertambahan
1 detik, jam yang baru ditampilkan sebagai keluaran}
Deklarasi
Type Jam : record<HH : integer, (0≤HH≤59)
MM : integer, (0≤HH≤59)
SS : integer, (0≤HH≤23)
>
J : Jam
Deskripsi
Read(J.HH, J.MM, J.SS)
Write(J.HH, J.MM, J.SS)
Repeat
Tambahsatudetik(J)
Write(J.HH, J.MM, J.SS)
Until (J.HH=0) and (J.MM=0) and (J.SS=0)
Algoritma 2:
Procedure HitungPBT(input M : integer, input N : integer, output PBT :
integer)
{menghitung pembagi bersama terbesar dari dua buah bilangan bulat tak
negative M dan N}
{k.awal : M dan N sudah terdefinisi harganya, M≥N dan M, N ≥0}
{k.akhir : PBT berisi pembagi bersama terbesar dari M dan N}
Deklarasi
R : integer {sisa pembagian M dengan N}
Deskripsi
While N ≠ 0 do
R ← M mod N
M←N
N←R
endwhile {N = 0, maka PBT = M}
PBT ← M
Procedure Tukar(input/output A, B : integer)
{mempertukarkan nilai A dan B}
{k.awal : nilai A dan B sudah terdefinisi}
{k.akhir : A berisi nilai B yang lama, B berisi nilai A yang lama}
Deklarasi
Temp : integer {peubah bantu}
Deskripsi
Temp ← A {simpan nilai A ke dalam Temp}
A←B {isikan nilai B ke dalam A}
B ← Temp {isikan nilai Temp ke dalam B}
Algoritma Euclidean
{program utama untuk menghitung pembagi bersama terbesar dari dua buah
bilangan bulat positif m dan n. harga m dan n dibaca dari piranti masukan}
Deskripsi
M, N : integer {>0}
PBT : integer {pembagi bersama terbesar M dan N}
II-16
Deskripsi
Read(M, N)
If M<N then
Tukar(M, N) {pertukarkan M dan N}
endif
HitungPBT(M, N, PBT)
write(PBT)
Algoritma 3:
Procedure HitungSelisihJam(input J1, J2 : Jam, output J3 : Jam)
{menghitung selisih dua buah jam, J3 = J2 – J1}
{k.awal: J1 dan J2 sudah berisi nilai jam (HH:MM:SS) dan J2.HH > J1.HH}
{k.akhir: J3 berisi selisih jam J2 dengan J1}
Deklarasi
{tidak ada}
Deskripsi
{kurangi mulai dari detik dulu}
if J2.SS ≥ J1.SS then {tidak ada masalah pengurangan detik}
J3.SS ←J2.SS – J1.SS
else {J2.SS < J1.SS, lakukan peminjaman 1 menit = 60 detik dari
J2.MM}
J3.SS ← (J2.SS + 60) – J1.SS
J2.MM ← J2.MM – 1 {J2.MM berkurang 1 karena dipinjam 1 menit}
endif
{kurangi menit}
if J2.MM ≥ J1.MM then {tidak ada masalah pengurangan menit}
J3.MM ← j2.MM – J1.MM
else {J2.MM < J1.MM, lakukan peminjaman 1 jam = 60 menit dari J2.HH}
J3.MM ← (J2.MM + 60) – J1.MM
J2.HH ← J2.HH – 1 {J2.HH berkurang 1 karena dipinjam 1 menit}
endif
{kurangi jam}
J3.HH ← J2.HH – J1.HH
II-17
Algoritma HitungSelisihDuaBuahJam
{menghitung selisih dua buah jam. Data jam dibaca dari piranti masukan}
Deklarasi
Type Jam : record<HH : integer, (0..59)
MM : integer, (0..59)
SS : integer, (0..23)
>
J1, J2, J3 : Jam
Deskripsi
Read(J1.HH, J1.MM, J1.SS)
Read(J2.HH, J2.MM, J2.SS)
HitungSelisihJam(J1, J2, J3)
Write(J3.HH, J3.MM, J3.SS)
Algoritma 4:
Procedure Masukan(input/output Panjang, Lebar : real)
{memasukan nilai panjang dan lebar}
Deklarasi
{tidak ada}
Deskripsi
Read(Panjang, Lebar)
Procedure HitungLuassegiempat(input Panjang, Lebar : real)
{menghitung luas segiempat persegipanjang. Luas segiempat dicetak sebagai
keluaran}
{k.awal: panjang dan lebar sudah terdefinisi nilainya}
{k.akhir: luas segiempat tercetak di piranti keluaran}
Deklarasi
Luas : real
Deskripsi:
Masukan(Panjang, Lebar)
Luas ← Panjang * Lebar
Write(Luas)
Procedure HitungKelilingsegiempat(input Panjang, Lebar : real)
{menghitung keliling segiempat. keliling segiempat dicetak sebagai keluaran}
{k.awal: panjang dan lebar sudah terdefinisi nilainya}
{k.akhir: keliling segiempat tercetak di piranti keluaran}
II-18
Deklarasi
Keliling : real
Deskripsi:
Masukan(Panjang, Lebar)
Keliling ← 2*Panjang + 2*Lebar
Write(Keliling)
Procedure HitungPanjangdiagonal(input Panjang, Lebar : real)
{menghitung panjang diagonal. keliling segiempat dicetak sebagai keluaran}
{k.awal: panjang dan lebar sudah terdefinisi nilainya}
{k.akhir: panjang diagonal segiempat tercetak di piranti keluaran}
Deklarasi
Diagonal : real
Deskripsi:
Masukan(Panjang, Lebar)
Diagonal ← SQRT(Panjang*Panjang + Lebar*Lebar)
Write(Diagonal)
Algoritma Segiempat
{program untuk menampilkan menu perhitungan segiempat (luas, keliling dan
panjang)}
Deklarasi
Panjang, Lebar :real
Nomormenu : integer
Deskripsi
Read(Panjang, Lebar)
Repeat {cetak menu ke layar}
Write(’ MENU SEGIEMPAT ’)
Write(’ 1. hitung luas ’)
II-19
Deklarasi
Const Password = ’abc123’
Deskripsi
return (P = Password)
Algoritma Pemeriksaan_password
{program pemeriksaan kebenaran password, password dibaca dari papan
kunci. Bila password salah, pemasukan password dapat diulang maksimal 3
kali}
Deklarasi
Sandilewat : string {kata sandi yang dibaca dari piranti masukan}
Sah : boolean {true jika password benar, false jika salah}
K : integer {pencatat jumlah pembacaan sandilewat}
Deskripsi
K←1
Sah ← false
repeat
read(Sandilewat)
if Valid(Sandilewat) then
Sah←true
II-20
Algoritma 2
Function Prima(input M : integer)→boolean
{mengembalikan true jika M bilangan prima, false jika M bukan bilangan
prima}
Deklarasi
K : integer
Tes : boolean
Deskripsi
K←2
Tes←true {sesuaikan M pada awalnya bilangan prima}
while (K≤M-1) and (not Tes) do
if M mod K = 0 then {M habis dibagi dengan bilangan K ≤ M-1}
Hasil ← false {kesimpulannya : M bukan bilangan prima}
else
K ← K+1 {coba bagi dengan K berikutnya}
endif
endwhile
return Tes
Algoritma Hitungprima
{program utama menghitung bilangan prima}
Deklarasi
M : integer
Deskripsi
Read(M)
If Prima(M) then
Write(M, ‘bilangan prima)
Else
Write(M,’bukan bilangan prima’)
II-21
Algoritma 3:
Function Balikangka(input N : integer) → integer
{Membalikan urutan bilangan bulat N (misal: 4567 menjadi 7654)
k.awal : nilai N sudah terdefinisi
k.akhir : urutan angka bilangan N dicetak terbalik
basis : jika N < 10, cetak(n)
rekurens : jika N > 10 maks cetak (N mod 10), balikangka(N div 10)}
Deklarasi
{tidak ada}
Deskripsi
If N < 10 then
Write(N) {basis}
Else {rekurens}
Write(N mod 10)
Balikangka(N div 10)
Endif
Algoritma faktorial
{program utama yang memanggil fungsi balikangka}
Deklarasi
N : integer
Deskripsi
Read(N)
Write(N, ‘ dibalik menjadi :’,Balikangka(N))
Algoritma 4:
Function Pangkat(input A, N : integer) → integer
{mengembalikan nilai an, n>0
basis : an = 1 jika n = 0
rekurens : an = a x an-1}
Deklarasi
{tidak ada}
Deskripsi
If N = 0 then
return 1
Else
return A*Pangkat(A, N-1)
II-22
endif
Algoritma Faktorial
{program utama yang memanggil fungsi faktorial}
Deklarasi
Bil : integer
Deskripsi
Read(A, N)
Write(A, ‘ pangkat ‘, N, ‘ adalah :’,Pangkat(A, N))
Algoritma 5
Formula Deret exp :
x 0 x1 x 2 x 3 xn
ex = + + + + ... +
0! 1! 2! 3! n!
Function exp(input x : real) →real
{mengembalikan nilai exp(x)}
Deklarasi
Const n : integer = 10
S: real
X : integer
Deskripsi
S←0
for X→0 to N do
S→S + Pangkat(X, K)/Fak(K)
endfor
return S
Algoritma exponential
{program utama yang memanggil fungsi exp}
Deklarasi
X : integer
II-23
Deskripsi
Read(X)
Write(‘ exponential’,X,’ adalah ‘,Exp(X))