Anda di halaman 1dari 301

Logika

Algoritma
Penyusun

Sunarya Djajaprawira Marwah


Editor

Envermy Vem

PENERBIT
UNIVERSITAS BINA NUSANTARA
JAKARTA

PRAKATA
Dengan nama Allah yang Maha Pengasih lagi Maha Penyayang,
Puji syukur dipanjatkan kehadirat Allah SWT atas ridhaNya sehingga penyusunan buku
Logika-Algoritma ini dapat diselesaikan sesuai dengan jadwal yang telah ditetapkan. Kemudian
ucapan rasa terima kasih disampaikan kepada pimpinan Universitas Bina Nusantara yang telah
memberikan kepercayaan untuk menyusun buku ini, khusunya kepada Ibu Ir. Th. Widya, MM.
selaku Rektor Universitas Bina-Nusantara, Bapak Once Kurniawan, S.Kom, MM. sebagai
Direktur Riset dan Pengembangan yang telah menugasi saya untuk menulis buku ini, Bapak H.
Mohammad Subekti, M.Sc. sebagai Kepala Biro Penerbitan yang telah memberikan arahan
berupa format penulisan buku Seri Catatan Kuliah, Bapak Ir. Sablin Yusuf, M.Sc., M.Comp.
selaku Koordinator Sains Komputer dan Pemrograman yang telah memberikan arahan terhadap
isi / materi buku ini, terakhir kepada Bapak Envermy Vem,M.Sc. yang telah meluangkan waktu
sebagai Editor.
Buku Logika-Algoritma ini merupakan kelanjutan dari buku Algoritma Pascal yang telah
diterbitkan oleh Universitas Bina Nusantara sejak tahun 1993. Perubahan yang mendasar adalah
penekanan pada penulisan dan contoh-contoh algoritma yang makin diperluas dan diperbanyak,
demikian juga soal soal untuk latihan, ragam permasalahannya makin diperkaya. Selain itu,
ditambahkan pula bab Studi Kasus yang memuat contoh-contoh yang lebih nyata, sehingga
pembaca dapat melihat lebih jauh penggunaan teori-teori yang telah dibahas pada bab-bab
sebelumnya, digunakan dalam contoh-contoh tersebut
Walaupun perbaikan telah diusahakan semaksimal mungkin, tetapi karena terbatasnya
pengetahuan penulis, maka tentu saja disana sini masih terdapat kesalahan dan kekurangan,
untuk itulah penulis mengharapkan adanya saran dan kritik dari para pembaca untuk perbaikan
dimasa mendatang.
Akhirul kata, sekali lagi disampaikan ucapkan terima kasih yang sebesar-besarnya
kepada semua pihak yang telah membantu kelancaran penulisan buku ini, termasuk Isteri dan
Anak-anak yang telah merelakan waktu mereka tersita oleh penulisan buku ini. Semoga Allah
SWT memberikan rakhmat dan karuniaNya kepada kita sekalian.

1 Februari, 1999
H. Sunarya D. Marwah

Logika-Algoritma

DAFTAR ISI
1. PENDAHULUAN

1.1

Logika 1

1.2

Algoritma dan Pemrograman

1.3

Contoh Permasalahan

1.4

Teknik-teknik Algoritma

8
13

2. PENGANTAR BAHASA PASCAL

18

2.1

Sejarah dan Perkembangan Pascal

2.2

Struktur Bahasa Pascal

2.3

Dasar-dasar Bahasa Pascal

18

20
22

2.3.1

Unsur-unsur Pemrograman

2.3.2

Pengertian Identifier

2.3.3

Variabel dan Konstanta

2.3.4

Tipe Data

2.3.5

Operator

30

2.3.6

Ekspresi

32

22

23
25

26

3. MASUKAN DAN KELUARAN


3.1

Statemen Assignment

3.2

Statemen Masukan

36

3.3

Statemen Keluaran

38

3.4

Format Penulisan

3.5

Keluaran ke Printer

3.6

Penguasaan Layar Monitor

35

35

40
42
43

4. STRUKTUR PENGENDALI
4.1

4.2

Struktur Pengulangan

47

47

4.1.1

Konstruksi For-Do

4.1.2

Konstruksi While-Do dan Repeat-Until

Struktur Pemilihan

47
57

61

4.2.1

Konstruksi If-Then-Else

4.2.2

Konstruksi Case-Of

61

65

UNIVERSITAS BINA NUSANTARA

ii

Logika-Algoritma

Daftar Isi (lanjutan)


5. PROCEDURE DAN FUNCTION

70

5.1

Procedure

5.2

Identifier Global dan Local

5.3

Transfer Parameter

5.4

Function

5.5

Procedure dan Function Standar

70
72

74

81

5.5.1

Procedure Standar

5.5.2

Function Standar

84

84
85

6. ARRAY

89

6.1

Array Dimensi Satu

90

6.2

Array Multi Dimensi

96

6.3

Pengolahan String

101

7. RECORD

107

7.1

Pendefinisian Tipe Record

7.2

Statemen With

111

7.3

Variant Record

112

107

8. SET

116

8.1

Pendefinisian Tipe Set

8.2

Membangun Set

8.3

Operator Tipe Set

8.4

Operator Pembanding

8.5

Contoh Penggunaan Set

116

116
118
119
120

9. REKURSI

128

9.1

Modul Rekursif

9.2

Mekanisme Pemanggilan Rekursif

9.3

Redundancy dalam Rekursi

9.4

Contoh Penggunaan Rekursi

129
131

133
135

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

iii

Daftar Isi (lanjutan)


10. PENGURUTAN DAN PENCARIAN
10.1

Pengurutan

140

140

10.1.1 Pemilihan (Selection)

140

10.1.2 Pertukaran (Exchange)

142

10.1.3 Penyisipan (Insertion)


10.1.4 Quicksort

148

10.1.5 Mergesort

152

146

10.2

Perbandingan Kecepatan Pengurutan

10.3

Pencarian

154

155

10.3.1 Pencarian Berurut (Sequential Search)


10.3.2 Pencarian Biner (Binary Search)
10.3.3 Pencarian Interpolasi

156

156

158

11. POINTER

161

11.1

Pendeklarasian Tipe Pointer

11.2

Alokasi Memori Dinamis

11.3

Pengertian Segmen Data dan Heap

11.4

Simpul-Berantai (Linked-List)

161

162
166

167

11.4.1 Pembuatan Simpul-berantai

169

11.4.2 Penyisipan dan Penghapusan Simpul


11.5

Penggunaan Simpul-berantai

11.5.1 Representasi Polinom


11.5.2 Pengurutan Insertion
11.6

Simpul-berantai Ganda

11.6.1 Inisialisasi
11.6.2 Penyisipan

173

177

177
180

182

183
183

11.6.3 Penghapusan

185

11.6.4 Penggunaan Simpul-berantai Ganda 186

UNIVERSITAS BINA NUSANTARA

iv

Logika-Algoritma

Daftar Isi (lanjutan)


12. FILE
12.1

188
File Bertipe

189

12.1.1 Pendeklarasian File Bertipe


12.1.2 Memberi Nama File
12.1.3 Membuka File
12.1.4 Pointer File

189

190

190

191

12.1.5 Menyimpan Data ke File


12.1.6 Menutup File

192

192

12.1.7 Mengambil Data dari File

193

12.1.8 Memindhkan Pointer File secara Acak


12.1.9 Menyimpan Tabel
12.2

File Text

195

197

12.2.1 Pendeklarasian File Text


12.2.2 Membuka File Text

198

198

12.2.3 Perintah Write dan Writeln

199

12.2.4 Perintah Read dan Readln

200

12.2.5 Studi Kasus File Text


12.3

194

File Tidak Bertipe

201

206

12.3.1 Perintah BlockRead dan BlockWrite

206

12.3.2 Parameter String pada Command Line

208

13. STUDI KASUS


13.1

211

Perhitungan Pajak Penghasilan (PPh) Perorangan

13.1.1 Uraian Komponen-komponen Pajak


13.1.2 Penulisan Program

215

13.1.3 Contoh Pemakaian

224

13.2

Konversi Angka Romawi ke Angka Latin

13.2.1 Permasalahan

13.2.3 Program Konversi

227

229
229

Menggambar Citra dengan Chain-code

13.3.1 Chain-code

212

227

13.2.2 Algoritma Konversi


13.3

211

234

234

13.3.2 Operasi-operasi pada Chain-code


13.3.3 Program Chain-code

235

240

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

Daftar Isi (lanjutan)


13.4

Pengukuran Daya AC dengan Tiga Voltmeter

13.4.1 Rangkaian Pengukuran


13.4.2 Pengembangan Model

252

252
252

13.4.3 Analisis Kesalahan Pengukuran


13.4.4 Algoritma Perhitungan Daya
13.4.5 Program Perhitungan Daya

254

254
254

13.5 Penyunting Teks Sederhana (Text Editor)


13.5.1 Komponen Dasar dan Operasi Karakter
13.5.2 Operasi Baris

256
256

259

13.5.3 Operasi Naskah

261

13.5.4 Program Penyunting Teks

261

DAFTAR PUSTAKA

275

APPENDIX A

KATA TERLINDUNG (Reserved Word)

277

APPENDIX B

TABEL ASCII

279

APPENDIX C

KODE TOMBOL EXTENDED

282

APPENDIX D

LISTING PROGRAM UJI PENGURUTAN

284

APPENDIX E

LISTING UNIT MOUSE

292

UNIVERSITAS BINA NUSANTARA

vi

Logika-Algoritma
DAFTAR ALGORITMA
Algoritma 1.1 Perhitungan Upah Buruh 8
Algoritma 1.2 Perhitungan Bunga Pinjaman Flat 10
Algoritma 1.3 Konversi Nilai variabel Proses 12
Algoritma 1.4 Perjalanan Pedagang (Traveling Salesman) 14
Algoritma 1.5 Menara Hanoi 16
Algoritma 3.1 Menghitung Luas Segi-Empat 36
Algoritma 4.1 Menghitung Nilai Rerata 49
Algoritma 4.2 Mencari Akar-akar Persamaan Kwadrat 61
Algoritma 5.1 Menguji Bilangan Prima 83
Algoritma 6.1 Evaluasi Polinom 92
Algoritma 6.2 Evaluasi Polinom; Metoda Horner 93
Algoritma 6.3 Mencari Nilai Minimum

95

Algoritma 6.4 Mencari Nilai Maksimum


Algoritma 6.5 Perkalian Matriks
Algoritma 6.6 Palindrom

95

98

104

Algoritma 8.1 Minimum Spanning Trees; Metoda Prim 125


Algoritma 10.1 Pemilihan (Selection Sort) 141
Algoritma 10.2 Pertukaran (Exchange / Bubble Sort) 144
Algoritma 10.3 Penyisipan (Insertion Sort)
Algoritma 10.4 Quick Sort

146

149

Algoritma 10.5 Pencarian Berurut (Sequential Search)


Algoritma 10.6 Pencarian Biner (Binary Search)

156

156

Algoritma 11.1 Pengurutan Insertion dengan Simpul-berantai


Algoritma 13.1 Perhitungan PPh Pribadi

181

211

Algoritma 13.2 Konversi Angka Romawi ke Angka Latin

229

Algoritma 13.3 Perhitungan Lebar dari Citra Chain-code

237

Algoritma 13.4 Perhitungan Tinggi dari Citra Chain-code

238

Algoritma 13.5 Perhitungan Luas dari Citra Chain-code

239

Algoritma 13.6 Perhitungan Daya AC; Metoda Tiga Voltmeter

254

Algoritma 13.7 Menambah/Menyisipkan Karakter; Penyunting Teks


Algoritma 13.8 Menghapus Karakter; Penyunting Teks

257

Algoritma 13.9 Menghapus Mundur Karakter; Penyunting Teks


Algoritma 13.10 Menambah Baris; Penyunting Teks
Algoritma 13.11 Menghapus Baris; Penyunting Teks

259
260

UNIVERSITAS BINA NUSANTARA

258

257

Logika-Algoritma

1. PENDAHULUAN
Pada pendahuluan ini hanya dibahas sedikit pengenalan tentang ilmu logika dan tentang
pengertian algoritma. Dalam pengenalan ilmu logika, pembahasan sangat disederhanakan
atau sangat ringkas sekedar penghantar pada pengertian tentang logika, supaya mudah
diterapkan atau digunakan dalam algoritma dan pemrograman. Sedangkan definisi algoritma
beserta beberapa contoh algoritma yang dibahas disini, terutama dimaksudkan untuk
menjelaskan bagaimana tahapan pemrograman dilakukan.

1.1. Logika
Logika, dalam bahasa asing adalah logic - science or method of reasoning - yaitu suatu
metoda untuk mengambil keputusan dari suatu fakta atau pernyataan.

Seringkali logika

disepadankan dengan nalar, yaitu proses berfikir manusia untuk menghubung-hubungkan


fakta atau pernyataan sehingga sampai pada suatu kesimpulan.

Data, fakta ataupun

pernyataan yang akan dinalar boleh salah boleh benar. Disinilah letak kerja penalaran.
1.1.1.

Logika Proposisional

Proposisi atau statement, adalah suatu kalimat pernyataan yang nilai pernyataan tersebut
dapat diklasifikasikan sebagai benar atau salah. Logika proposisional, merupakan perangkat
yang kuat untuk mempelajari proses pengambilan kesimpulan dari suatu statemen atau
statemen-statemen.
Contoh proposisi :
1. Brunei adalah sebuah negara

: bernilai benar

2. 10 lebih besar dari 12

: bernilai salah

3. Medan adalah sebuah negara

: bernilai salah

4. 3 kali 4 sama dengan 12

: bernilai benar

Beberapa penyataan dapat digabungkan dengan kata penghubung sehingga menjadi satu
pernyataan. Kata penghubung yang digunakan adalah dan , atau . Suatu statemen dapat
diubah nilai kebenarannya dengan bukan.
Contoh : Brunei adalah sebuah negara dan kerajaan gabungan dari :
Brunei adalah sebuah negara dan Brunei adalah kerajaan
Medan adalah sebuah negara : bernilai salah, akan menjadi
Medan bukan sebuah negara : bernilai benar

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

Pada logika proposisional, kita tidak melihat keseluruhan makna dari pernyataan yang
digabung, seperti :
Brunei adalah sebuah negara dan 10 lebih besar dari 12
jelas tidak mempunyai makna atau pengertian ditinjau dari aspek bahasa manusia, walaupun
demikian statemen diatas tetap memiliki nilai yaitu salah, karena pernyataan pertama benar,
pernyataan kedua salah.
Sedangkan statemen : Medan bukan sebuah negara dan Brunei adalah sebuah negara
bernilai benar, karena pernyataan pertama dan kedua benar. Kemudian statemen :
12 sama dengan 4 kali tiga atau 10 lebih besar dari 12 : bernilai benar.
Notasi yang digunakan dalam logika proposisional adalah : , , dan yang menyatakan
kata penghubung dan , atau, bukan , T untuk benar (true) dan F untuk salah (false).

1.1.2. Tabel Kebenaran


Melihat contoh-contoh diatas, nilai-nilai kebenaran dapat ditabulasikan dalam suatu tabel
yang disebut Tabel Kebenaran atau Truth Table.
Table 1.1. Tabel Kebenaran
P

PQ

PQ

Bila P = true, Q = false, R = false, maka :


P (Q R) bernilai true,
karena Q R = false ,
(Q R) = true, dan
P = true.
P P bernilai true, apapun nilai P
P P bernilai false, apapun nilai P

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

1.1.3. Predikat
Predikat adalah suatu statemen yang memuat satu atau lebih variabel, dengan demikian nilai
kebenaran dari statemen tersebut akan tergantung dari nilai-nilai variabel yang bersangkutan.
P(x) = (x < 4) (x > 2),

X adalah variabel yang berisi bilangan bulat.

Predikat P(x) = true, jika dan hanya jika x = 3.


Bila suatu nilai menggantikan variabel didalam predikat, maka ia menjadi preposisi :
P(2) = (2 < 4) (2 > 2) dengan nilai false
P(3) = (3 < 4) (3 > 2) dengan nilai true
P(4) = (4 < 4) (4 > 2) dengan nilai false
Dengan demikian, dapat dikatakan bahwa suatu predikat merupakan kumpulan dari banyak
preposisi, satu macam preposisi untuk setiap kombinasi nilai variabel.
Perhatikan predikat berikut ini :
P(x,y,z) = (x < y) (y > z)
yang akan mewakili 1000 preposisi yang berbeda bila x, y dan z masing-masing nilainya
dibatasi untuk harga : 1, ,9. Bila x, y dan z bisa bernilai seluruh bilangan bulat yang ada
maka P(x,y,z) akan mewakili preposisi yang tak berhingga.
Contoh lain predikat :
Jawaban = Y N > 30
Variabel Jawaban dapat berisi Y atau karakter selain Y dan variabel N berisi bilangan
bulat. Pernyataan gabungan diatas baru bernilai salah atau benar bila variabel Jawaban dan
N diberi nilai.
Predikat akan banyak digunakan pada struktur pengendalian, yaitu struktur pengulangan dan
pemilihan, baik dalam algoritma maupun pemrograman, hanya saja dalam bentuk kode
pemrograman, kata-kata penghubung menggunakan istilah dalam bahasa Inggris yaitu :
and, or, not masing-masing untuk : dan, atau, bukan.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

1.2. Algoritma dan Pemrograman


Menurut batasan umum, algoritma adalah :
Sekumpulan langkah-langkah atau instruksi-instruksi yang terbatas,
untuk menyelesaikan suatu masalah.
Asal kata algoritma - terjemahan dari istilah asing algorithm - diambil dari sebuah nama,
seorang astronom dan ahli matematika bangsa Arab, yaitu Al-Khowarizmi yang mengarang
kitab Al-Jabr W'al Muqabala, dikenal sekarang sebagai ilmu aljabar. Semula, langkah-langkah
seperti

disebutkan

pada

batasan

diatas

dikaitkan

dengan

langkah-langkah

untuk

penyelesaian masalah numerik, tetapi pada akhirnya digunakan pada hal-hal yang lebih
umum.
Sekumpulan langkah-langkah untuk penyelesaian suatu masalah dengan bantuan komputer
disebut program, sedangkan proses membuat program disebut pemrograman atau dalam
istilah bahasa asing disebut : programming, kemudian bahasa untuk menuliskan langkahlangkah dalam bentuk perintah dan pernyataan (statement) disebut bahasa pemrograman
atau dalam istilah bahasa asing disebut : programming language.

1.2.1 Tahap-tahap Pemrograman


Tahap-tahap yang diperlukan untuk menyelesaikan suatu masalah dengan komputer, dari
saat masalah tersebut diberikan hingga akhir penyelesaian adalah :
1. Menentukan batasan masalah
2. Pengembangan Model
3. Rancangan Algoritma
4. Koreksi Algoritma
5. Pemrograman
6. Pengujian dan Analisis Program
7. Dokumentasi
Tahap-tahap tersebut diatas diantaranya ada yang memerlukan tinjau ulang seperti
ditunjukkan dalam gambar dihalaman berikut.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

Mulai

Batasan
Masalah

Pengembangan
Model

Rancangan
Algoritma

Pemrograman

Koreksi
Algoritma

Pengujian dan
Analisis

Dokumentasi

Selesai

Gambar 1.1 Tahap-tahap Algoritma dan Pemrograman

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma
Pembatasan Masalah

Seringkali masalah yang dihadapi masih belum begitu jelas, batasan masih kabur dan pada
beberapa hal, inti permasalahan masih kabur. Untuk itulah diperlukan pemahaman atas
masalah yang dihadapi, sehingga pembatasan masalah dapat dibuat lebih jelas, demikian
juga ruang lingkup permasalahan bisa ditentukan dengan tegas. Namun demikian, pada
tahap ini perlu difikirkan hal-hal yang dapat menampung perkembangan masalah dikemudian
hari. Dapat dikatakan bahwa pemahaman yang baik terhadap suatu permasalahan berarti
setengah dari pekerjaan untuk menyelesaikan masalah tersebut telah dilalui.

Pengembangan Model

Model adalah suatu sistim yang secara fisis ataupun matematis mengikuti kondisi-kondisi
yang telah ditetapkan dalam sistim aslinya, dimana sifat yang diperoleh dari model tersebut
dapat dipergunakan untuk memahami sistim asli tanpa harus berurusan secara langsung
dengan sistim aslinya. Dengan mengembangkan model atas suatu permasalahan, maka
diharapkan pemecahan masalah tersebut dapat dilaksanakan secara lebih sistimatis.

Rancangan Algoritma

Setelah suatu masalah dipahami dengan jelas yaitu melalui pembatasan masalah, kemudian
model sudah dibuat, maka tahap selanjutnya adalah menyusun langkah-langkah untuk
penyelesaian masalah, kebenaran langkah-langkah tersebut secara logika harus dapat
ditelusuri. Walupun langkah-langkah yang dibuat dalam rancangan algoritma ini masih
merupakan langkah-langkah yang tidak terlampau rinci, tetapi secara keseluruhan ia harus
dapat mengambarkan tahapan penyelesaian dengan jelas, untuk itulah dikembangkan teknik
teknik algoritma yang akan dijelaskan pada bab mendatang.

Koreksi Algoritma

Koreksi dilakukan secara dini untuk memperbaiki alur logika yang dianggap kurang tepat,
karena langkah-langkah pada rancangan algoritma belum melibatkan hal hal yang terlalu rinci
maka koreksi pada tahap ini lebih mudah dilaksanakan. Bila ada kerancuan dalam algoritma,
maka yang perlu ditinjau ulang adalah model, besar kemungkinan model yang dibuat tidak
mencerminkan secara tepat kondisi-kondisi aslinya. Kemungkinan lain adalah meninjau ulang
pembatasan masalah, karena model dapat keliru bila batasan masalah tidak jelas.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

Pemrograman

Pemilihan bahasa yang tepat untuk menyelesaikan suatu permasalahan sangat penting disini
karena ada beberapa bahasa yang khusus diarahkan pada suatu keperluan tertentu, seperti :
Bahasa Cobol untuk keperluan bisnis
Bahasa C, Modula-2 untuk pemrograman sistem
Bahasa Simula untuk simulasi
Untuk hal hal yang lebih umum bahasa-bahasa : Pascal, Basic, bahkan bahasa-bahasa yang
disebutkan diatas dapat digunakan, tentunya dengan beberapa kendala yang akan dihadapi.
Pada tahap pemrograman ini, selain penentuan bahasa pemrograman yang akan digunakan,
seringkali harus ditentukan struktur data yang sesuai dengan model yang telah dibuat, untuk
mencapai penyelesaian yang berdaya guna dan berhasil guna. Dalam kaitan ini pemilihan
bahasa pemrograman harus lebih teliti karena tidak semua bahasa pemrograman
mendukung struktur data yang diinginkan.

Pengujian dan Analisis

Program yang telah selesai dibuat, kemudian diuji dilaboratorium dan hasilnya dianalisis,
untuk melihat : kecepatan, pemakaian memori, dsb. Seringkali program diuji dilapangan oleh
calon pemakai atau bila perlu oleh pihak lain yang lebih luas untuk memperoleh umpan balik
yang lebih sempurna.

Dokumentasi

Meskipun dalam gambar 1.1 diatas, terlihat bahwa blok Dokumentasi berada pada bagian
akhir, tetapi kegiatan dokumentasi dilakukan secara menyeluruh, yaitu dimulai dari tahap
awal hingga pengujian dan analisis. Hal ini diperlukan karena setiap peninjauan ulang dan
koreksi memerlukan dokumentasi yang lengkap. Dokumentasi diperlukan juga untuk kegiatan
pemeliharaan dan pengembangan program.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

1.3 Contoh Permasalahan


Contoh 1.1. Perhitungan Upah Buruh
Perhitungan upah buruh dalam satu minggu (5 hari kerja), terdiri dari dua komponen :
1. Upah Harian, (H rupiah / hari) bila ia bekerja 8 jam sehari
2. Upah Lembur, (L rupiah /jam) bila ia bekerja lebih dari 8 jam dalam sehari
Kita ingin menghitung pendapatan seorang buruh dalam satu minggu, bila diketahui data jam
kerja untuk setiap harinya.
Algoritma 1.1 Perhitungan Upah Buruh
1. Total Pendapatan 0
2. Baca data jam kerja untuk hari ke 1
3. Upah Hari Ini = H + (jam kerja - 8) x L ,
4. Total Pendapatan Total Pendapatan + Upah Hari Ini
5. Ulangi 2 s/d 4 hingga hari ke 5.
Misalkan Upah Harian H = 6000 rupiah / hari
Upah Lembur L = 1000 rupiah / jam
Jam kerja hari ke 1 s/ d 5 adalah : 10, 8, 12, 8 dan 8 jam
Pendapatan hari ke 1 = 6000 + (10-8) x 1000
Pendapatan hari ke 2 = 6000
Pendapatan hari ke 3 = 6000 + (12-4) x 1000
Pendapatan hari ke 4 = 6000
Pendapatan hari ke 5 = 6000
Total Pendapatan dalam seminggu (5 hari) kerja = 36.000 rupiah.
Contoh ini menunjukkan bagaimana pembatasan masalah masih belum begitu jelas, karena
masih harus dipertanyakan lagi beberapa hal, misalnya :
a. Bagaimana perhitungan bila jam kerja kurang dari 8 jam
b. Apakah ada jumlah minimal dan maksimal jam lembur
Bila pertanyaan-pertanyaan dapat dijawab, maka algoritma perlu ditinjau kembali, sehingga
perhitungan menjadi benar, tidak merugikan buruh ataupun majikan. Pembatasan ini akan
menjadi soal untuk latihan.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

Contoh 1.2. Perhitungan Konversi Bunga Surut ke Bunga Rata


Koperasi menerapkan aturan bunga pinjaman berdasarkan perhitungan bunga dari saldo
pinjaman. Misalkan ada pinjaman sebesar Rp. 1.000.000,- dengan jangka waktu 10 bulan,
dikenakan bunga 4 % per bulan, maka cicilan pokok per bulan adalah Rp 100.000,- ditambah
dengan bungan 4% x Rp 1.000.000,- maka peminjam harus membayar cicilan sebesar Rp
140.000,-

pada bulan pertama, kemudian pada bulan kedua ia harus membayar Rp

100.000,- + 4% x Rp 900.000,- = Rp 136.000,- demikian seterusnya hingga bulan ke 10.


Terlihat dari angka-angka diatas bahwa bunga yang harus dibayar setiap bulannya tidak
sama, yaitu selalu berkurang sejalan dengan dengan berkurangnya saldo pinjaman.
Masalah yang harus diselesaikan adalah menghitung ekivalen bunga rata atau flat, yaitu
rerata bunga per bulan dari perhitungan bunga surut seperti contoh diatas.
Batasan sudah cukup jelas, selanjutnya akan dikembangkan suatu model matematis untuk
mempermudah pembuatan algoritma. Misalkan dibuat notasi-notasi sebagai berikut :
P

= Jumlah pinjaman

= Bunga per bulan

= Jangka waktu pinjaman

bunga total BT yang harus dibayar adalah dengan menghitung :


1. Cicilan Pokok per Bulan : P/J
2. Saldo Pinjaman : P (P/J).Mi
dengan :

i = bulan ke i, 1 i J
Mi = i 1

3. BT adalah jumlah Saldo Pinjaman dikalikan Bunga selama jangka


waktu J, atau dapat dituliskan secara matematis :
J
P
BT = (B.(P .M i ))
J
i =1

bunga flat BF dapat dihitung dengan :

BF =

BT
J

maka sekarang kita dapat menuliskan algoritma sebagai berikut :

UNIVERSITAS BINA NUSANTARA

10

Logika-Algoritma
Algoritma 1.2 Perhitungan Bunga Rerata
1. Masukkan nilai-nilai P, B dan J
2. Hitung cicilan pokok = P/J
3. Hitung bunga total BT
4. Hitung bunga flat BF

Contoh perhitungan : Jumlah Pinjaman Rp. 12.000.000,- untuk jangka waktu pinjaman
selama 6 bulan, dengan bunga 4% dihitung dari sisa pinjaman. Menurut algoritma diatas,
urutan perhitungan adalah :
1. Hitung cicilan pokok per bulan (CP) :
CP = 12.000.000,-/6 = 2.000.000,2. Saldo pinjaman dan bunga yang harus dibayar pada :
Bulan ke 1 = 12.000.000,- ,
bunga yang dibayar = 4% x 12.000.000,- = 480.000,Bulan ke 2 = 10.000.000,- ,
bunga yang dibayar = 4% x 10.000.000,- = 400.000,Bulan ke 3 = 8.000.000,- ,
bunga yang dibayar = 4% x 8.000.000,- = 320.000,Bulan ke 4 = 6.000.000,- ,
bunga yang dibayar = 4% x 6.000.000,- = 240.000,Bulan ke 5 = 4.000.000,- ,
bunga yang dibayar = 4% x 4.000.000,- = 160.000,Bulan ke 6 = 2.000.000,- ,
bunga yang dibayar = 4% x 2.000.000,- =

80.000,-

3. Hitung rerata bunga yang dibayarkan :


Yaitu dengan menghitung jumlah bunga yang dibayarkan dalam jangka waktu 6
bulan kemudian dibagi dengan jumlah bulan:
480.000 + 400.000 + 320.000 + 240.000 + 160.000 + 80.000 = 1.680.000,BR = (1.680.000) / 6 = 280.000,- per bulan
4. Bunga flat = (280.000/12.000.000) x 100% = 2.33% per bulan

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

11

Contoh 1.3. Perhitungan Konversi Pengukuran Variabel Proses


Dalam sistem pengukuran variabel proses (tinggi permukaan, tekanan, suhu) di industri,
pengukuran dari lapangan dikirim ke ruang kendali (control room) dengan sinyal listrik 4 mA
hingga 20 mA. Arus listrik sebesar 4 mA menyatakan sinyal 0% dan 20 mA menyatakan
sinyal 100% . Sinyal 4 mA digunakan sebagai sinyal 0%, karena diperlukan perbedaan
antara keadaan sinyal 0 dan sinyal terputus, misal akibat kabel transmisis putus, bila
digunakan arus 0 mA, maka sulit dibedakan apakah hasil pengukuran di ruang kendali
sebesar 0 mA, disebabkan kabel terputus atau memang sinyal dalam keadaan paling rendah
yaitu 0.
Umpama variabel proses yang kita konversikan adalah tinggi permukaan didalam suatu
tangki, nilai 0% bersesuaian dengan 0.2 m, sedangkan nilai 100% bersesuaian dengan tinggi
permukaan sebesar 1.2 m. Kita ingin membuat algoritma, untuk mengetahui berapa
ketinggian tanki bila hasil pengukuran dalam sinyal transmisi yaitu mA.

1.2 m = 100%

0.2 m = 0%
0.2

LT
4 s/d 20 mA

Gambar 1. 2. Pengukuran Tinggi Zat Cair dalam Tanki


Maka sekarang kita buat suatu notasi-notasi untuk pengembangan model.
hmin = Tinggi Minimum
hmax = Tinggi Maksimum
h1 = Tinggi Pengukuran
Sph = Span ketinggian zat cair , yaitu hmax hmin
Smin = Sinyal Nol , yaitu 4 mA
Smax = Sinyal Penuh, yaitu 20 mA
S1 = Sinyal Pengukuran
Sps = Span sinyal transmisi, yaitu Smax - Smin
Smin = hmin , yaitu 4 mA = 0.2 m dan Smax = hmax , yaitu 20 mA = 1.2 m
Sph = 1.2 m 0.2 m = 1.0 m
Ssx = 20 mA 4 mA = 16 mA

UNIVERSITAS BINA NUSANTARA

12

Logika-Algoritma
Bila keadaan ini kita gambarkan dalam koordinat h dan S, maka didapat :
h
1.2 m

h1

0.2 m
S
4mA

S1

20 mA

Gambar 1.3 Koordinat h-S


Rumus umum suatu garis lurus adalah : h = a.S + b
dengan a = slope, yaitu (hmax hmin)/(Smax Smin)
b = perpotongan garis dengan sumbu h
b dapat dicari dari salah satu titik yang sudah diketahui :
b = hmin (hmax hmin)/(Smax Smin) x Smin (1)
sehingga rumus yang dapat digunakan dalam algoritma kita :

h1 =

hmax hmin
xS1 + b (2)
S max S min

sehingga algoritma dapat ditulis sebagai berikut :


Algoritma 1.3. Konversi Nilai Variabel Proses
1. Baca Nilai S1, hmin dan hmax
(Smin dan Smax dapat dibuat sebagai konstanta, karena sudah dibakukan
sebagai nilai standar sinyal di industri).
2. Hitung span ketinggian, Sph
3. Hitung span sinyal, Sps
4. Hitung Slope, Sph/Sps
5. Hitung b dengan rumus (1) diatas
6. Hitung h1 dengan rumus (2) diatas.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

13

Contoh penggunaan algoritma dengan angka-angka tersebut diatas :


Sinyal 8 mA akan dibaca sebagai ketinggian :
(1 m/16 mA) x 8 mA - 0.05 m = 0.50 m 0.05 m = 0.45 m
Sinyal 12 mA akan dibaca sebagai ketinggian :
(1 m/16 mA) x 12 mA - 0.05 m = 0.75 m 0.05 m = 0.70 m
Sinyal 16 mA akan dibaca sebagai ketinggian :
(1 m/16 mA) x 16 mA - 0.05 m = 1.00 m 0.05 m = 0.95 m
Sinyal 20 mA akan dibaca sebagai ketinggian :
(1 m/16 mA) x 20 mA - 0.05 m = 1.25 m 0.05 m = 1.20 m

1.3. Teknik-teknik Algoritma


Teknik mengembangkan algoritma untuk persoalan seperti diatas, mudah kita selesaikan
selama kita dapat memahami persoalan yang diberikan dan dapat merumuskan secara
matematis. Tetapi banyak pula persoalan yang tidak selalu menggunakan model matematis,
teknik-teknik algoritma seperti itu telah banyak dibuat, namun hanya beberapa teknik yang
sudah umum digunakan dan tidak terlalu sulit untuk dipahami akan dibahas dalam
pendahuluan ini, teknik-teknik yang dimaksud adalah :

Hill Climbing

Dimulai dari perkiraan awal, kemudian dilanjutkan dengan memilih langkah terbaik
yang ada pada saat itu, dan menyelesaikannya seepat mungkin. Disebut Hill
Climbing, karena teknik ini selalau mencari jalan yang menanjak sebagai usaha untuk
mencapai puncak, tetapi pada akhirnya bisa keliru ketika jalan yang menanjak tadi
diakhiri dengan turunan, sehingga didapat puncak yang tidak sebenarnya diinginkan.
Teknik ini termasuk metoda greedy.

Sub Goal

Menyederhanakan suatu masalah besar menjadi serentetan masalah-masalah yang


lebih kecil, dengan harapan dapat menyelesaikan masalah-masalah yang lebih kecil
tadi secara bertahap untuk akhirnya mencapai masalah yang besar tadi.

Working Backward

Dimulai dari target atau tujuan, kemudian mundur kebagian awal, bila langkah dapat
dibalik maka langkah-langkah dimulai lagi dari awal hingga selesai.

UNIVERSITAS BINA NUSANTARA

14

Logika-Algoritma

Contoh 1.4. Perjalanan Pedagang (Traveling Salesman)


Seorang pedagang harus mengunjungi sebanyak n kota, dalam proses perjalanan tersebut,
salesman tidak boleh mengunjungi kembali kota yang telah dikunjungi sebelumnya, kecuali
kota awal tempat pedagang tersebut kembali dari akhir perjalanan.

A
E

Gambar 1.4 Jalur-jalur 5-kota (A,B,C,D.E)


Karena jarak, keadaan alam dan kemudahan transportasi dari satu kota ke kota lain bisa
sangat berbeda, maka masalah yang harus dipecahkan adalah mencari rute perjalanan yang
termurah, sehingga total biaya yang harus dikeluarkan menjadi paling murah. Biaya
perjalanan (relatif) antar kota dapat dilihat pada tabel 1.2
Tabel 1.2 Biaya Perjalanan
A

Algoritma 1.4. Perjalanan Pedagang: Hill Climbing


1.

Pilih kota awal

2.

Pilih kota tujuan selanjutnya, yaitu jalur termurah

3.

Ulangi langkah ke 2 sehingga seluruh kota dikunjungi


dan tidak ada kota yang dikunjungi lebih dari sekali.

4. Kembali ke kota awal.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

15

Bila diambil kota A, sebagai kota awal, maka rute yang terpilih sesuai dengan algoritma
diatas adalah :
A - B dengan ongkos = 1
B - E dengan ongkos = 3
E - C dengan ongkos = 2
C - D dengan ongkos = 1
D - A dengan ongkos = 7
---------------- +
Total Biaya

= 14

Biaya sebesar 14 bukan biaya yang termurah karena jalur :


A-B-E-D-C-A

mempunyai biaya total = 10

Meskipun demikian, jalur pertama tadi juga bukan yang termahal, karena jalur :
A-D-B-C-E-A

mempunyai biaya total = 22

merupakan jalur yang termahal.


Dengan demikian, maka teknik Hill Climbing yang digunakan untuk memecahkan masalah
perjalanan salesman ini :

Menjamin untuk tidak mendapatkan hasil yang terburuk

Belum menjamin hasil yang terbaik (optimum).

Oleh karena itu ia bersifat heuristic, yaitu cepat tapi tidak menjamin hasil yang terbaik. Untuk
mendapatkan hasil yang optimal, diperlukan algoritma yang lebih rumit seperti : Branch and
Bound ataupun dengan Dynamic Programing. Algoritma-algoritma tersebut diluar cakupan
buku ini.

Contoh 1.5. Menara Hanoi


Persoalan Menara Hanoi adalah bagaimana memindahkan n piringan dari pilar kiri ke pilar
kanan dengan pilar tengah digunakan sebagai pilar antara. Piringan yang berada di pilar kiri
tersusun sedemikian rupa menyerupai menara, yaitu piringan yang lebih kecil selalu berada
diatas. Pada proses pemindahan piringan piringan tersebut, susunan menara yaitu posisi
piringan kecil selalu berada diatas piringan besar, harus selalu dijaga.

UNIVERSITAS BINA NUSANTARA

16

Logika-Algoritma

Gambar 1.5 Menara Hanoi dengan 4-piringan


Algoritma 1.5. Menara Hanoi : Working Backward
1. Pindahkan (n-1) piringan paling atas dari pilar kiri ke pilar tengah
dengan pilar kanan sebagai pilar antara.
2. Pindahkan piringan terahir ke piringan kanan.
3. Pindahkan (n-1) dari piringan yang berada di pilar tengah ke pilar
kanan dengan pilar kiri sebagai antara.
Langkah 2 s/d 3 diulang secara rekursif, dalam hal ini pilar-pilar awal, antara dan tujuan akan
berubah sesuai dengan keadaan, jadi pilar tengah bisa menjadi pilar awal, pilar kiri menjadi
pilar tujuan dan pilar kanan menjadi pilar antara, dst.
Algoritma ini menggunakan teknik

Working Backward, karena untuk memindahkan n

piringan, yaitu sebagai tujuan, berjalan mundur, yaitu :


1. Untuk memindahkan n pringan, dilakukan pemindahan (n-1) piringan
2.

Untuk memindahkan (n-1) pringan,dilakukan pemindahan (n-2) piringan

3.

Untuk memindahkan (n-2) piringan, dilakukan pemindahan (n-3) piringan

4.

Akhirnya hanya diperlukan pemindahan satu piringan, piringan terakhir.

Hasil dari algoritma 1.5 untuk 3 piringan :


-

Pindahkan piringan no. 1 dari pilar kiri ke pilar kanan

Pindahkan piringan no. 2 dari pilar kiri ke pilar tengah

Pindahkan piringan no. 1 dari pilar kanan ke pilar tengah

Pindahkan piringan no. 3 dari pilar kiri ke pilar kanan

Pindahkan piringan no. 1 dari pilar tengah ke pilar kiri

Pindahkan piringan no. 2 dari pilar tengah ke pilar kanan

Pindahkan piringan no. 1 dari pilar kiri ke pilar kanan

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

17

Soal-soal
1. Buat algoritma untuk menyelesaikan masalah-masalah berikut :
a.

Ada 25 koin, semua mempunyai berat yang sama kecuali satu koin yang mempunyai
berat lebih dari koin lainnya. Cari koin yang berbobot lebih tadi dengan cara
penimbangan, menggunakan neraca. (Hill Climbing)

b.

Diberikan dua gelas ukur, masing-masing berkapasitas 5 dan 3 liter. Dapatkan air
tepat sebanyak 4 liter, dengan cara pemindahan diantara gelas ukur dan terdapat
drum yang cukup besar untuk menumpahkan air dan/atau mengisi gelas ukur tadi.
(Working Backward).

2. Buat model dan algoritma untuk menyelesaikan masalah berikut :


Komputer membangkitkan dua bilangan acak N1 dan N2 dengan kendala
sebagai berikut :
-

N1 dan N2 harus bilangan non-negatip

N1 25

S = |N1 - N2| dimana 50 S 100

setelah kedua bilangan dibangkitkan dan ditampilkan dilayar, maka giliran pemain untuk
menebak nilai rerata dari kedua bilangan tersebut,

sementara itu komputer juga menghitung

nilai rerata dengan tepat. Setelah jawaban diketikan oleh pemain, kemudian komputer
mentayangkan hasil perhitungan tadi, sehingga pemain tahu seberapa tepat tebakannya tadi.
3

Jelaskan, bahwa algoritma menara Hanoi juga menggunakan teknik Sub-goal

4.

Tentukan nilai kebenaran preposisi dibawah ini :


a. P (Q R)
b. (P Q) (P R)

5. Tentukan nilai kebenaran predikat dibawah ini untuk x = 1, . . . , 10 dan Y = 1, . . . , 5


P(x,y) = ((x 3) (x 7)) ((y 1) (y 5))
Ada berapa preposisi untuk nilai x dan y seperti ditulis diatas.

UNIVERSITAS BINA NUSANTARA

18

Logika-Algoritma

2. PENGANTAR BAHASA PEMROGRAMAN PASCAL


2.1. Sejarah dan Perkembangan Pascal
Sejarah perkembangan Pascal dimulai pada tahun 1960, yaitu ketika bahasa ALGOL 60
digunakan sebagai algorithmic language. Salah seorang anggota komisi ALGOL saat itu,
Niklaus Wirth, mengembangkan ALGOL 60 menjadi ALGOL W yang kemudian dikenal
dengan ALGOL 68 sebuah bahasa pemrograman multiguna, sementara itu ALGOL 60 telah
menjadi bagian dari dunia ilmu pengetahuan, yaitu bahasa yang berorientasi ilmiah. Pada
akhir tahun 1969, Niklaus Wirth merancang suatu bahasa yang lebih tajam dari ALGOL 68
yang multiguna, bahasa pemrograman tersebut diberi nama Pascal diambil dari nama
seorang ahli matematika dan ilmu pengetahuan bangsa Perancis, yaitu Blaise Pascal(16231662).
Niklaus Wirth dari Sekolah Teknik Tinggi Zurich - Swiss, menjadi terkenal sebagai perancang
bahasa Pascal, compiler pertama yang dilaksanakan pada tahun 1970, kemudian direvisi
pada tahun 1973 bersama K. Jensen, baru kemudian pada tahun 1983 bahasa Pascal dapat
dibakukan secara resmi dengan adanya Pascal Standard dari ISO yaitu Badan Internasional
untuk Standar-standar. Sejak itu Pascal dipakai secara meluas terutama dikalangan
Universitas dan Perguruan Tinggi, jangkauan pelaksanaan juga sangat luas mulai dari
komputer mikro hingga mainframe. Sebagai bahasa yang menekankan pada pemrograman
yang terstruktur, Pascal sangat membantu dalam mengajarkan bahasa tingkat tinggi yang
berdisiplin.
Perkembangan bahasa Pascal ternyata tidak berhenti sampai disitu, Niklaus Wirth kemudian
'menyadari' bahwa Pascal sebetulnya tidak lebih dari bahasa sequential, maka ia merancang
bahasa yang dikembangkan dari Pascal untuk keperluan pemrograman parallel, yaitu suatu
bahasa real time, bahasa ini diarahkan untuk pengendalian proses pada prosesor tunggal.
Bahasa tersebut diberi nama Modula pada tahun 1976, kemudian dikenal sebagai Modula-2
pada tahun 1978. Meskipun Modula-2 dikenal sebagai bahasa pemrograman paralel, tetapi
sebetulnya sebelum itu telah ada Concurrent Pascal yang dikembangkan oleh Brinch Hansen
dari California Institute of Technology pada tahun 1974, untuk maksud yang sama yaitu
bahasa real time.
Pada tahun 1980 atas permintaan CCITT (Comite Consultatif International Telegraphique et
Telephonique) dirancang suatu bahasa

yang dimaksudkan untuk pemrograman sistim

telekomunikasi, bahasa tersebut kemudian dikenal sebagai CHILL (Ccitt HIgh Level
Language), dimana bagian sekuentialnya diambil dari bahasa Pascal.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

19

Menyusul kemudian Departemen Pertahanan Amerika Serikat (DOD), meminta supaya


dirancangkan suatu bahasa untuk pemrograman paralel, dengan penggunaan yang paling
utama pada komputer embedded.

Sekali lagi bagian sekuential dari bahasa Pascal

digunakan dalam bahasa tersebut yang kemudian diberi nama Ada pada tahun 1982.

ALGOL 60

Pascal

Modula 2

CHILL

ADA

Gambar 2.1 Bagan Perkembangan Bahasa Pascal


Dengan mempelajari bahasa Pascal diperoleh beberapa manfaat yaitu : pemrograman yang
terstruktur dan berdisiplin, kemudian terbuka cakrawala bahasa pemrograman modern yang
lebih luas. Meskipun dalam bagan diatas tidak tergambarkan, tetapi pada kenyataan
sekarang ini telah tercipta suatu bahasa yang menggunakan bahasa Pascal dalam
lingkungan Windows 95, yaitu bahasa DELPHI. Bahasa ini walaupun menggunakan struktur
dan statement-statement Pascal tetapi secara umum ia berorientasi terhadap objek (object
oriented). Saat buku ini ditulis, versi bahasa tersebut sudah mencapai versi keempat yaitu
DELPHI 4.

UNIVERSITAS BINA NUSANTARA

20

Logika-Algoritma

2.1.1. Versi versi Pascal


Seperti telah disebutkan diatas, penggunaan Pascal telah meluas sedemikian rupa dari mulai
kalangan perguruan tinggi, riset hingga bisnis, hal ini merangsang timbulnya versi-versi
Pascal yang sedikit banyak bergeser dari Pascal standar yang telah ditetapkan oleh ISO
pada tahun 1982.4. Diantara versi-versi Pascal tersebut diantaranya adalah :
UCSD Pascal, dikembangkan di University of California at San Diego
Microsoft Pascal
Concurrent Pascal
TURBO Pascal, dsb.
Turbo Pascal saat ini merupakan versi yang paling populer, karena pengembangan kompiler
yang semakin canggih, dimana editor dapat digunakan secara terpadu dengan kompiler dan
pelacak kesalahan (debugger), pengembangannya sedemikian pesatnya sehingga sudah
banyak bertambah dari standar Pascal, dalam arti memperkaya kemampuan bahasa Pascal
itu sendiri. Melihat kenyataan yang demikian, maka sedikit banyak pelaksanaan algoritma
dengan bahasa Pascal ini akan menggunakan versi TURBO Pacal.

2.2. Struktur Bahasa Pascal


Secara garis besar, Pascal terdiri dari tiga bagian utama, yaitu :
Bagian Judul Program (Nama Program).
Bagian Deklarasi : Terdiri dari
Deklarasi / Definisi Tipe Data
Deklarasi / Definisi Konstanta
Deklarasi Label
Deklarasi Variabel
Deklarasi Procedure dan/atau Function
Bagian Program Utama.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

21

Bagian judul program merupakan nama dari program baik dalam standar Pascal maupun
pada versi-versi lainnya, walaupun demikian TURBO Pascal menganggap judul ini sebagai
pilihan (optional), artinya bila judul ditulis, maka ia harus mengikuti aturan Pascal dan
berfungsi sebagai nama program, kompiler tidak akan memproses lebih lanjut, kecuali
memeriksa sintaks (tata cara penulisan), bila judul ini tidak ditulis maka TURBO Pascal akan
langsung mengolah bagian deklarasi.
Sintaks judul program adalah dengan menuliskan kata program kemudian diikuti dengan
nama program itu sendiri, contoh penulisan :
Program Menghitung_Luas_Lingkaran;
PROGRAM PALINDROM;
Contoh 2.1. Penambahan dua buah bilangan, data langsung dimasukkan ke masingmasing variabel dan hasilnya berada di memori.
Program Tambah;

{Judul Program}

Var x,y,z : integer;

{Deklarasi Variabel}

Begin

{Awal Program }

x := 20;
y := 30;
z := x + y;
End.

{Akhir Program}

Contoh 2.2 Program menghitung luas lingkaran


Data jejari dibaca dari papantombol, kemudian hasil perhitungan ditayangkan
di layar monitor.
Program Luas_lingkaran;

{Judul Program}

Const Pi = 2.4.14;

{Deklarasi Konstanta}

Var Jejari : real;

{Deklarasi Variabel}

Luas : real;
Begin

{Awal Program}

Read(Jejari);

{Membaca data dari papan tombol}

Luas := Pi * SQR(Jejari);

{Menghitung Luas}

Write('Luas = ', Luas:5:2);

{Menampilkan hasil di layar monitor}

End;

{Akhir Program}

UNIVERSITAS BINA NUSANTARA

22

Logika-Algoritma

2.3. Dasar-dasar Bahasa Pemrograman Pascal

2.3.1. Unsur-unsur Pemrograman


Pada dasarnya bahasa pemrograman digunakan untuk melaksanakan suatu algoritma dalam
rangka menyelesaikan suatu permasalahan dengan bantuan komputer. Dalam banyak hal,
setiap pemrograman selalu berkaitan dengan pengolahan data, dengan demikian dapat
dikatakan bahwa unsur-unsur pemrograman secara umum adalah :
1. Mendapatkan data
Dengan cara membaca dari papan tombol, file disk atau secara on-line.
2. Menyimpan data di memori
Dengan menggunakan struktur data yang sesuai
3. Mengolah data
Dengan instruksi-instruksi yang sesuai
4. Menampilkan hasil pengolahan
Ke layar monitor atau mencetak ke kertas printer atau menyimpan hasil ke file disk.
Dalam mengolah data, diperlukan pengorganisasian instruksi-instruksi
sedemikian rupa sehingga :
5. Beberapa instruksi dilaksanakan secara berulang untuk jumlah pengulangan yang
tertentu.
6. Instruksi-instruksi dilaksanakan untuk suatu persyaratan tertentu, yaitu pemilihan.
7. Instruksi-instruksi dikelompokkan pada suatu modul untuk melaksanakan tugas
tertentu.
Melihat uraian unsur-unsur pemrograman diatas, maka setiap pemrograman tidak bisa
terlepas dari hal-hal tersebut diatas terutama empat unsur pada bagian pertama. Didalam
bahasa Pascal, tiga unsur pada bagian yang terakhir, merupakan ciri pemrograman yang
terstruktur, yaitu :
a. Setiap pengulangan, pemilihan mempunyai blok-blok yang jelas, mana blok yang
diulang, mana blok yang dipilih dan mana blok yang berupa modul.
b. Satu jalan masuk, satu jalan keluar pada setiap blok.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

23

2.3.2. Pengertian Identifier


Komputer sesungguhnya hanya mengerti bahasa mesin yaitu bahasa yang perbendaharaan
kata-katanya terdiri dari simbol bilangan biner yaitu kombinasi 1 dan 0. Pada pemrograman
dengan bahasa mesin, data disimpan pada alamat memori yang sudah tertentu, pemrogram
bertanggung jawab untuk menempatkan data di alamat yang aman yang tidak akan
tercampur dengan program. Pada bahasa tingkat tinggi seperti Pascal, hal-hal yang
sedemikian rumit hanya untuk menempatkan data di memori tidak lagi diperlukan, karena
pemrogram hanya memerlukan suatu identifier selanjutnya adalah urusan kompiler untuk
menentukan lokasi memori yang tepat. Dengan kata lain identifier diperlukan sebagai tanda
pengenal untuk mencapai suatu lokasi memori.
Identifier digunakan untuk :

Nama Program

Nama Variabel, Konstanta, Label dan Tipe Data

Nama Procedure dan Function.

dengan identifier inilah maka objek-objek pemrograman dipanggil untuk digunakan.


Ketentuan penulisan identifier :
1.

Identifier harus dimulai oleh karakter huruf, yaitu : a ... z, atau A ... Z , atau karakter garis
bawah (underscore) yaitu : _

2.

Karakter berikutnya boleh menggunakan karakter numerik

yaitu 0 ... 9 atau kombinasi

dari karakter huruf dan numerik.


3.

Jumlah karakter yang digunakan tergantung dari versi Pascal, tetapi umumnya tidak lebih
dari 63 karakter, secara praktis angka ini sudah lebih dari cukup.

4.

Tidak boleh menggunakan karakter istimewa

5.

Tidak membedakan huruf besar (kapital) dengan huruf kecil

Karakter istimewa adalah karakter karakter yang telah dicadangkan untuk keperluan tertentu
umpamanya sebagai operator atau sebagai pembatas dan sebagainya. Karakter istimewa
yang dimaksud adalah :
+ -

<

>

] . ,

( ) 0 :

; ^

@ {

UNIVERSITAS BINA NUSANTARA

24

Logika-Algoritma

fungsi karakter-karakter istimewa , diantaranya adalah :


+ - * / digunakan untuk operasi aritmatika
= < >

digunakan untuk operasi relasional

. ; sebagai delimiter , batas suatu program, statemen atau procedure


{ } sebagai tanda yang membatasi suatu komentar,
dan sebagainya.
Contoh penulisan identifier yang benar :
A

_B

B2

Sudut_A

LuasLingkaran

ABC3FG

Contoh penulisan identifier yang salah


2D, karena karakter numerik tidak boleh ditulis pada posisi awal
Sisi B, karena tidak diijinkan adanya karakter kosong (blank)
Sudut-C, karena tanda - digunakan sebagai operator minus
BC#,

karena karakter # adalah karakter istimewa.

Identifier dibedakan dalam tiga jenis :


Identifier Umum
Identifier Standar
Identifier Terlindung (Kata Terlindung)
Identifier umum adalah identifier yang dapat ditulis secara bebas, sepanjang mengikuti
aturan-aturan diatas. Sedangkan identifier standar adalah identifier yang pada dasarnya telah
digunakan oleh Pascal didalam kepustakaannya, walaupun demikian pemrogram boleh
mendeklarasikan kembali. Sebagai contoh dari identifier standar yang digunakan oleh
TURBO Pascal, adalah : pi, blue, maxint, dsb., daftar selengkapnya dapat dilihat dalam
buku manual. Bila suatu identifier standar

hendak digunakan, pemrogram tidak perlu

mendeklarasikan identifier tersebut, tetapi harus mengetahui secara pasti dengan objek apa
identifier tersebut dikaitkan, apakah dengan variable, konstanta, procedure, function atau
objek lainnya. Identifier terlindung, di lain fihak, merupakan identifier yang juga digunakan
oleh Pascal, tetapi sama sekali tidak boleh dideklarasikan kembali oleh pemrogram , contoh
identifier terlindung atau kata terlindung (reserved word) :
program, begin, end, var, const, type, while, do

dsb.

Daftar kata terlindung selengkapnya, dapat dilihat pada appendix A.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

25

2.3.3. Variabel dan Konstanta


Variabel adalah konsep matematis yang menggunakan simbol, dimana simbol tersebut dapat
dioperasikan dengan nilai yang berbeda dan boleh berbeda pada setiap saat tergantung
keperluan. Misal y = a. x , variabel y akan mempunyai nilai yang berbeda tergantung dari
nilai a dan x pada saat itu. Konsep variabel dalam bahasa pemrograman khususnya Pascal
mempunyai pengertian lebih jauh, yaitu adanya suatu lokasi memori yang terkait pada setiap
variabel, keterkaitan dengan suatu tipe data, dan dengan demikian ukuran lokasi memori
yang disediakan untuk suatu variabel akan berbeda tergantung dari tipe data yang dikaitkan
dengan variabel tersebut. Lebih dari itu, suatu variabel didalam bahasa pemrograman akan
mempunyai seperangkat operator yang dapat mengoperasikan variabel tersebut. Membaca
data dari papan tombol atau dari file, pada dasarnya memindahkan nilai data tersebut ke
suatu lokasi memori yang sebelumnya telah dideklarasikan sebagai variabel dan diidentifikasi
kan dengan nama variabel.
Konstanta, bila dilihat dari konsep pemrograman tidak lain adalah sebuah lokasi memori yang
telah diberi identifier, hanya saja isi dari lokasi tersebut tetap sepanjang program berjalan.
Seperti halnya variabel, suatu konstanta juga mempunyai keterkaitan dengan tipe data dan
seperangkat operator.
Mendeklarasikan variabel adalah :
1.

Menentukan atau memberi identitas dengan cara memberi nama variabel

2.

Menentukan tipe data

Mendefinisikan konstanta adalah :


1. Menentukan atau memberi identitas dengan cara memberi nama konstanta
2. Menentukan nilai konstanta, dari nilai konstanta tersebut dapat diketahui tipe data.
Proses pendeklarasian identifier - konstanta dan variabel - inilah yang pertama kali harus
difikirkan oleh seorang pemrogram, karena judul program hanyalah sebuah nama program.
Pemahaman seorang pemrogram atas persoalan yang harus dipecahkan, dapat secara dini
diketahui dari bagaimana caranya dia mendeklarasikan variabel dan konstanta yang sesuai
dengan persoalan.
Contoh deklarasi variabel :
var x : integer;
Contoh deklarasi konstanta :
const k = 10;

UNIVERSITAS BINA NUSANTARA

26

Logika-Algoritma

2.3.4. Tipe Data


Setiap variabel mempunyai satu identifier yaitu nama variabel, juga harus dideklarasikan
untuk tipe data apa, variabel tersebut digunakan. Pascal membagi tipe data menjadi tiga
bagian utama, yaitu :
1.

Tipe Data Sederhana


Integer (Bilangan Bulat)
Real (Bilangan Pecahan)
Char (Karakter alphanumerik dan tanda-tanda baca)
Boolean (Logika)

2.

Tipe Data Terstruktur


Array
Record,
Set dan
File

3.

Tipe Data Pointer

2.3.4.1. Tipe Data Integer


Merupakan tipe data numerik yang mempunyai tanda bilangan negatip dan positip, tipe ini
menempati 2 byte (16 bit) memori, dimana bit ke 15 berfungsi sebagai tanda bilangan yaitu
bila bit 15 bernilai 1 maka bilangan bertanda negatip, dan sebaliknya bila bit 15 bernilai 0,
maka bilangan bertanda positip, rentang nilai yang bisa ditampung oleh variabel yang
dideklare sebagai tipe integer dapat dilihat pada tabel 2.4.1.
Contoh deklarasi variabel integer :
var x : integer;
Contoh deklarasi konstanta integer :
Const a = 50;
Dengan deklarasi diatas maka seluruh identifier yang ditulis setelah kata var tersebut
dinyatakan sebagai variabel dan

x adalah nama variabel, sedangkan integer adalah

identifier standar untuk menyatakan bahwa variable x akan berisi data berupa bilangan bulat.
Untuk seterusnya, selama program berjalan, variabel x hanya dapat menerima data dengan
tipe integer. Sedangkan konstanta a berisi nilai 50 sepanjang program berjalan.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

27

Tabel 2.1. Tipe Data Sederhana


Tipe Data

Ukuran Lokasi

Rentang Nilai

Integer

2 Byte

-32768

Real

6 Byte

Char

1 Byte

Tabel ASCII

Boolean

1 Byte

False, True

29 x 10-39

s/d 32767
s/d

1.7 x 1038

TURBO Pascal memperkaya tipe integer ini dengan tipe yang serupa, yaitu tipe bilangan
bulat tetapi dengan rentang nilai yang berbeda :
A. Word, dengan rentang nilai : 0 ... 65535, berupa bilangan bulat
tak bertanda
B. Byte, dengan rentang nilai : 0 ... 255, bilangan bulat tak bertanda,
memerlukan hanya 1 byte memori.
C. ShortInt, dengan rentang nilai : -128 ... 127, bilangan bulat bertanda,
memerlukan hanya 1 byte memori.
D. LongInt, dengan rentang nilai : -2147483648 ... 2147483647, bilangan
bulat bertanda, memerlukan 4 byte memori.
Contoh deklarasi
var a : integer;
b: byte;
c: word;
d : shortint;
Bila ada beberapa variable yang dideklarasikan dengan tipe data yang sama, penulisan dapat
disingkat :
var x,y,z : integer;
P,q : byte;

UNIVERSITAS BINA NUSANTARA

28

Logika-Algoritma

2.3.4.2. Tipe Data Real


Suatu variabel yang dideklarasikan dengan tipe data real (bilangan pecahan) akan
menempati memori sebanyak 6 byte, dengan rentang nilai seperti tampak pada tabel 2.4.1.
Contoh deklarasi variabel real :
var x : real;
Contoh deklarasi konstanta real :
const m = 12.7;
TURBO Pascal juga melengkapi tipe real ini dengan tipe sejenis yaitu :
single, double, extended dan comp.
keterangan tentang tipe-tipe data tersebut dapat dilihat pada buku manual TURBO Pascal.
Tidak seperti halnya tipe integer, tipe real memerlukan aturan khusus untuk cara (format)
penulisan.
Contoh :

1.0 dan 22.4.67


1E6 untuk menyatakan 1000 000 dalam tipe real
1.5E-3 cara lain untuk menyatakan nilai 0.0015

2.3.4.3. Tipe Data Char dan String


Tipe char merupakan tipe data yang non-numerik , nilai yang dapat diberikan kepada suatu
variabel dengan tipe data char, adalah semua karakter yang ada di tabel ASCII (American
Standard Code for Information Interchange), tabel ini dapat dilihat pada appendix B.
Contoh deklarasi variabel char :
var c : char;
Contoh deklarasi konstanta char :
const Tidak = T;
Penulisan karakter adalah dengan mengapit karakter dengan tanda petik tunggal ('), sebagai
contoh, karakter A harus ditulis 'A',

demikian juga karakter numerik,

numerik 6 harus ditulis '6'.

UNIVERSITAS BINA NUSANTARA

misalnya karakter

Logika-Algoritma

29

TURBO Pascal memperkaya tipe char dengan apa yang disebut dengan tipe String, yaitu tipe
data yang dapat mendeklarasikan suatu variabel sehingga dapat menampung lebih dari satu
karakter. Bila suatu variabel direncanakan untuk menampung 10 karakter, maka ia harus
dideklarasikan sebagai tipe string, yaitu dengan deklarasi variabel :
var s : string[10];
Deklarasi konstanta string :
const E = Tekan Tombol Enter;
bila jumlah karakter tidak disebutkan maka, ditafsirkan sebagai string dengan jumlah karakter
maksimal yaitu 255 karakter, contoh :
var ss : string;
Bila suatu variable dideklarasikan sebagai string, misalnya string[30], tidak berarti variabel
tersebut harus berisi 30 karakter, angka 30 menunjukkan jumlah maksimum karakter yang
dapat ditampung, jadi setiap variabel yang dideklarasikan sebagai string dapat berisi

karakter atau string kosong, hingga maksimum karakter yang ditentukan dalam deklarasi.
Banyaknya byte yang dialokasikan adalah jumlah karakter maksimum ditambah satu byte
untuk mencatat jumlah karakter yang ada di variabel tersebut.
Penulisan string sama seperti tipe char yaitu dengan menggunakan tanda kutip tunggal,
sebagai contoh :
'21 Januari 1993'

'Pelabuhan Ratu'

'' = String Kosong

'Nilai "Khusus" ' = Nilai 'Khusus'.

2.3.4.4.. Tipe Data Boolean


Boolean berasal dari Boole, nama seorang ahli matematika, yang memperkenalkan aljabar
Boole, yaitu aljabar yang mengoperasikan bilangan biner yaitu bilangan dengan dasar (radix)
2, yaitu 0 dan 1. Suatu variabel yang dideklarasikan sebagai boolean, juga hanya mempunyai
dua kemungkinan nilai, bukan 0 atau1, tetapi True atau False. Tipe data ini akan sangat
berguna

dalam

pengorganisasian

instruksi-instruksi,

khususnya

pengulangan dan pemilihan.


Contoh deklarasi tipe boolean :
var sukses : boolean;

UNIVERSITAS BINA NUSANTARA

pada

konstruksi

30

Logika-Algoritma

Penulisan nilai boolean tidak menggunakan tanda kutip tunggal, karena nilai tersebut bukan
tipe string tetapi sudah merupakan identifier standar. Jadi penulisan 'True' atau 'False' bukan
merupakan nilai boolean tetapi berupa string seperti dijelaskan diatas.

2.3.4.5. Tipe Data Terstruktur dan Pointer


Tipe-tipe data terstruktur ini pada dasarnya menggunakan tipe data sederhana, kecuali
pointer, dimana hubungan antar data diikat dengan aturan tertentu. Termasuk tipe data
terstruktur, adalah :

Array , data bersifat homogen

Record, data dapat bersifat heterogen

Array of Record, data berbentuk tabel / daftar

File, data yang berkaitan dengan memori eksternal (file-disk)

2.3.5. Operator
Beberapa jenis operator standar , yaitu operator aritmatika, boolean, relational, set dan
string,

dimana pada bab ini hanya akan ditampilkan operator aritmatika, boolean dan

relational dalam bentuk tabel, sedangkan operator set dan string akan dijelaskan pada bab
yang berkaitan dengannya.
Tabel 2.2. Operator Aritmatik
Operator
+
*
/

Operasi
Penambahan
Pengurangan
Perkalian
Pembagian

Tipe Operand

Tipe Hasil Operasi

Integer

Integer atau

Real

Real

Integer

Integer

Real

Real

Integer

Integer

Real

Real

Integer

Real

Real

Real

div

Pembagian

Integer

Integer

mod

Sisa Pembagian

Integer

Integer

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

31

Tabel 2.3. Operator Boolean


Operator

Operasi

Tipe Operand

Tipe Hasil Operasi

not

Negasi

Boolean

Boolean

and

Logika And

Boolean

Boolean

or

Logika Or

Boolean

Boolean

xor

Logika Xor

Boolean

Boolean

Tabel 2.4. Operator Relational


Operator
=

Operasi
Sama Dengan

Tipe Operand

Tipe Hasil Operasi

Sederhana,String

Boolean

Pointer, dan Set


<>

Tidak Sama

Idem

Boolean

Dengan
<

Lebih Kecil Dari

Sederhana,String

Boolean

>

Lebih Besar Dari

Idem

Boolean

<=

Lebih Kecil atau

Idem

Boolean

Idem

Boolean

Sama Dengan
>=

Lebih Besar atau


Sama Dengan

Tabel 2.5. Tabel Kebenaran


A

Not A

A and B

A or B

True

True

False

True

True

False

True

False

False

False

True

True

False

True

True

False

True

True

False

False

True

False

False

False

UNIVERSITAS BINA NUSANTARA

A xor B

32

Logika-Algoritma

2.3.6. Ekspresi
Ekspresi pada hakekatnya adalah kombinasi atau gabungan antara operator dengan
operand(variabel, konstanta, bilangan dsb.), contoh ekspresi yang paling sederhana adalah
sebuah variabel, misalkan :
var a : integer;
variabel a merupakan ekspresi yang paling sederhana, karena ekspresi selalu menghasilkan
suatu nilai, pada contoh diatas nilai ekpresi a adalah isi dari variabel a itu sendiri.
Ada beberapa macam ekspresi sesuai dengan jenis nilai yang dihasilkan, yaitu :
Ekspresi Numerik, nilainya selalu numerik, integer atau real
Ekspresi Boolean, nilainya selalu boolean, true atau false.
Ekspresi String, dengan nilai string.
Penulisan (sintaks) ekspresi dalam notasi matematika dan dalam notasi pemrograman dapat
berbeda , tabel berikut menunjukkan perbandingan cara penulisan ekspresi matematika dan
Pascal.
Tabel 2.6. Perbandingan Penulisan Ekspresi
Ekspresi Matematika

Ekspresi Pascal

a+b

a+b

x(y+z)

x * (y + z)

b2 - 4.a.c

b*b-4*a*c

Contoh Ekspresi Numerik :


Misalkan dideklarasikan dua variabel integer :
var x,y : integer;
kemudian

x := 5; y := 7; artinya variabel x dan y masing-masing diisi dengan 5 dan 7

maka : x + y merupakan ekspresi numerik, dengan nilai = 12 dan

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

33

Kemudian kita ambil contoh tipe real :


Const k = 12.5;
Var Q : real;
Misalkan Q := 8;

maka nilai ekspresi numerik

k * Q adalah 100

Contoh Ekspresi Boolean :


Var K,L,M : Boolean;
K := True; L := False; M := False;
maka :
(K and L) or (L and M) adalah ekspresi boolean dengan nilai kebenaran False
kemudian kita punya dua variabel tipe integer :
Var A, B : Integer
A := 20; B := 25;
maka :
A < B adalah ekspresi boolean dengan nilai kebenaran True
(K or L) and (A > B) adalah ekspresi boolean dengan nilai kebenaran True
Misalkan dideklarasikan tipe char :
Var Jawab : Char;
Jawab := Y:
Maka :
Jawab = Y merupakan ekspresi boolean dengan nilai True
Jawab = T bernilai False.
(Jawab = Y) and K and (A < B) bernilai True.
Ekspresi boolean dapat terdiri dari gabungan beberapa variabel dengan tipe berbeda, tetapi
menggunakan operator boolean, seperti terlihat pada tabel 2.3 .dan 2.4.

UNIVERSITAS BINA NUSANTARA

34

Logika-Algoritma

Soal-soal :
1.

Tunjukan penulisan identifier berikut yang tidak memenuhi ketentuan sintaks Pascal dan
jelaskan dimana letak kesalahan :
$US

Dimensi2

Sisi-B

3Dimensi

Panjang#1

Sudut_D

2. Apa perbedaan dan persamaan tipe data Integer dengan tipe data Word
3. Tipe data String mempunyai batas default 255 karakter, tetapi didalam deklarasi dapat
ditentukan batas lain misalnya String[30] atau String[1]. Apakah String[1] sama dengan
tipe data Char ?. Jelaskan jawaban Anda.
4. Untuk deklarasi variable-variabel berikut,
Var X,Y,Z : Integer;
P,Q,R

: Booelan;

A,B,C

: String;

kemudian dimisalkan :
X, Y dan Z masing-masing diisi dengan

: 5, 10 dan 5

P, Q dan R masing-masing diisi dengan

: True, False dan True

A, B dan C masing-masing diisi dengan

: '25', '500' dan '1000'

tentukan nilai-nilai dari ekspresi :


a. X + Y * Z ;
b. (X + Y) * Z;
c. X * Y + Y * Z;
d. (P OR Q) AND R;
e. (P OR (NOT Q)) AND (NOT R);
f. X + Z > Y;
g. A + B;
h. A + B = C;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

35

3. MASUKAN - KELUARAN

3.1. Statemen Assignment


Seperti telah disinggung pada bab terdahulu, bahwa penyelesaian suatu masalah dengan
bantuan komputer, memerlukan data untuk diolah, dan pengolahan data terjadi di memori,
karena komputer atau lebih tepatnya CPU (Central Processing Unit) hanya dapat mengolah
data, bila data telah berada di memori, bahkan lebih dalam lagi beberapa pengolahan data
memerlukan tempat di register CPU. Cara paling sederhana untuk menempatkan data di
memori, bisa dilakukan dengan satemen assignment seperti pada contoh program berikut.
Akan diselesaikan perhitungan luas suatu segi-empat, dari langkah-langkah yang kita ketahui
selama ini dalam menghitung luas segi empat, maka kita dapat menyusun algoritma sebagai
berikut :
Algoritma 3.1. Menghitung Luas Segi Empat
1. Berikan data panjang
2. Berikan data lebar
3. Hitung Luas = panjang x lebar
Setelah kita mendapatkan langkah-langkah yang diperlukan, pekerjaan selanjutnya adalah
membuat program. Dalam pemrograman, yang pertama harus

diperhatikan adalah

mendeklarasikan variabel yang diperlukan, dalam contoh ini jelas diperlukan tiga variabel
yaitu masing masing untuk : panjang, lebar dan luas, katakanlah data panjang dan lebar
semuanya berupa bilangan bulat yaitu masing masing 5 dan 4 (cm), maka program
selengkapnya menjadi :
Contoh 3.1 Menghitung Luas Segitiga
Program Hitung_Luas_Segi_4;
var panjang,lebar,luas : integer;
{Deklarasi Variabel}
begin
panjang := 5;
lebar := 4;
luas := panjang * lebar;
end.

UNIVERSITAS BINA NUSANTARA

36

Logika-Algoritma

Disini data diberikan langsung dengan statemen assignment yaitu dengan simbol := , artinya
nilai 5 diisikan kepada variabel panjang dan nilai 4 diisikan kepada variabel lebar. Sekilas
sudah dapat diketahui, kelemahan cara memasukan nilai-nilai seperti diatas, yaitu adanya
kekakuan dalam memberikan data, Ekspresi panjang * lebar menghasilkan suatu nilai hasil
kali panjang dengan lebar dan hasil ini diserahkan kepada variabel luas. Bila kita ingin
mengubah data, maka tidak ada cara lain, kecuali dengan memasukkan data baru, setelah
program dihentikan, misalnya panjang := 10; dan lebar := 8;. Kekurangan ini dapat diatasi
dengan menggunakan statemen input, yaitu membaca data dari luar melalui papan tombol.

3.2. Statemen Masukan


Seperti dijelaskan diatas, pemrograman dengan cara langsung menyerahkan data kepada
variabel dengan statemen assignment ( := ), dan ternyata kurang memuaskan. Maka
diperlukan statemen input yaitu suatu perintah untuk membaca data dari luar, dalam hal ini
melalui papan tombol. Dalam bahasa Pascal perintah ini dilaksanakan dengan statemen :
read(x);
artinya : masukan data dari papan tombol ke variabel x.
Dengan perintah read(), maka program diatas dapat ditulis kembali menjadi :
Contoh 3.2 Membaca Data dari Papan-tombol
Program Hitung_Luas_Segi_4;
var panjang,lebar,luas : integer;
{Deklarasi Variabel}
begin
read(panjang);
read(lebar);
luas := panjang * lebar;
end.
Perintah read(panjang) dan read(lebar), masing masing meminta supaya data dibaca lewat
papan tombol untuk disimpan di variabel-variabel panjang dan lebar.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

37

Kemudian hasil perkalian kedua variabel berupa perhitungan luas, disimpan di variabel luas.
Dengan cara ini dapat dihitung luas untuk berbagai data panjang dan lebar.
Statemen input lain yang serupa, adalah perintah readln, tetapi dianjurkan apabila diperlukan
pembacaan data secara beruntun, maka gunakan readln(), Perintah read ataupun readln
dapat menggunakan lebih dari satu argumen, read(x,yz) atau readln(A,B,C,D,E).
Contoh 3.3. Read atau Readln dengan 2 (dua) argumen
Contoh ini akan menunjukkan penggunaan perintah Read atau Readln dengan dua argumen
untuk masukan data perhitungan jarak antara dua titik dalam koordinat X-Y.

Jarak diantara

dua titik A dan B yang masing-masing dinyatakan dengan pasangan (x1,y1) dan (x2,y2)
dalam koordinat X-Y dapat dihitung dengan menggunakan titik ketiga yaitu (x1,y2) atau
(x2,y1) sehingga dibentuk segitiga seperti gambar dibawah ini. Maka sisi miring (jarak A B)
dengan mudah dicari, yaitu dengan :
d=

( x1 x 2) 2 + ( y1 y 2) 2

X
y2

B=(x2,y2)

d
A=(x1,y1)
y1

C=(x2,y1)
Y
x1

x2

Gambar 3.1. Perhitungan Jarak A dengan B pada koordinat X-Y


Program Hitung_Jarak;
var d,x1,y1,x2,y2: Real;
begin
readln(x1,y1); readln(x2,y2);
d:= Sqrt(Sqr(x1-x2) + sqr(y1-y2));
end.

UNIVERSITAS BINA NUSANTARA

38

Logika-Algoritma

Perintah Sqrt(X) adalah perintah untuk menghitung akar dari X dan Sqr(Y) adalah perintah
untuk menghitung X pangkat 2, jadi Y * Y dapat ditulis dengan Sqr(Y). Memasukkan data
dengan perintah readln(x1,y1) adalah dengan :
1. Masukan nilai untuk x1, misalkan : 2.5
2. Kemudian tekan tombol Spasi (Bar)
3. Masukan nilai untuk y1, misalkan : 8.6
4. Tekan tombol Enter.
Lebih dari itu, tipe data untuk setiap argumen bisa berbeda artinya bila kita tulis read(x,y,z)
atau readln(x,y,z), maka tipe data variabel x dapat berbeda dengan tipe data variabel y atau
dengan tipe data variabel z. Tipe data yang diijinkan adalah : tipe char, integer, real dan
string. Data dengan tipe boolean, dan pointer tidak bisa dibaca dari papan tombol.
Data yang dimasukkan lewat perintah read() atau readln(), akan ditampilkan dilayar monitor
pada posisi kursor , sehingga operator dapat melihat data yang baru dimasukkannya, bila
data tidak ingin ditampilkan dilayar monitor maka TURBO Pascal menyediakan perintah
ReadKey, tetapi perintah ini hanya untuk membaca data tipe Char.

3.3. Statemen Keluaran


3.3.1. Keluaran ke Layar Monitor
Hasil perkalian panjang dengan lebar pada program hitung_luas_segi_4 diatas, terbenam di
dalam memori yaitu berada di variabel luas. Untuk mentayangkan hasil perkalian tersebut di
layar monitor diperlukan statemen keluaran. Didalam bahasa Pascal ada dua macam
perintah untuk menayangkan niliai dari suatu variabel, kedua perintah tersebut adalah :
write dan writeln. Perbedaan antara write dan writeln dapat dijelaskan sebagai berikut.
write('TEST');

Dengan perintah write, kata TEST akan ditayangkan di layar monitor,


pada posisi kursor sebelum perintah dijalankan, setelah perintah
dijalankan, kursor pindah ke ujung kata TEST.

writeln('TEST');

Sama seperti perintah write, tetapi posisi kursor pindah ke baris


berikutnya, setelah perintah writeln dijalankan.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

39

Contoh 3.3 Menampilkan Hasil di Layar Monitor


Program Hitung_Luas_Segi_4;
var panjang,lebar,luas : integer;
begin
{1} write('Masukan data panjang : '); readln(panjang);
{2} write('Masukan data lebar : '); readln(lebar);
{3} luas := panjang * lebar;
{4} writeln('Luas = ', luas);
end.
Apabila program diatas dijalankan akan tampak dialog dilayar monitor :
Masukan data panjang : 21
Masukan data lebar : 11
Luas = 231
Text yang diberi garis bawah adalah masukan data oleh operator. Dari contoh diatas, terlihat
bahwa dengan menambah perintah write pada baris 1 dan 2, operator akan tahu, data apa
yang harus dimasukan, panjang atau lebar.
Contoh 3.4 Menampilkan Hasil di Layar Monitor dan mengganti Write dengan Writeln.
Program Hitung_Luas_Segi_4;
var panjang,lebar,luas : integer;
begin
{1} writeln('Masukan data panjang : '); readln(panjang);
{2} writeln('Masukan data lebar : '); readln(lebar);
{3} luas := panjang * lebar;
{4} writeln('Luas = ', luas);
end.
Ketika program diatas dijalankan akan tampak dialog dilayar monitor, sebagai berikut :
Masukan data panjang :
21
Masukan data lebar :
11
Luas = 231

UNIVERSITAS BINA NUSANTARA

40

Logika-Algoritma

Jadi dengan perintah Writeln, text apapun setelah text yang ditulis dengan perintah itu akan
ditampilkan dibaris berikutnya.
Ekspresi dapat menjadi argumen dalam statemen write atau writeln, seperti contoh pada
baris ke tiga dan ke empat pada program utama diatas :
luas := panjang * lebar; dan

writeln('Luas = ', luas);

dapat digantikan dengan satu baris perintah :


writeln('Luas = ', panjang*lebar);
Penggunaan cara diatas sepenuhnya menjadi pilihan pemrogram, karena pada beberapa
kasus, penulisan yang pertama lebih jelas dan variabel luas dapat digunakan untuk
pengolahan berikutnya, misalkan untuk menghitung isi.
Contoh 3.5. Menghitung volume kotak dengan membaca tiga data sekaligus
Program Hitung_Luas_Segi_4;
var p,l,t,v : integer;
begin
{1} write('Masukan data panjang,lebar,tinggi : '); readln(p, l,t);
{2} v := p * l * t;
{3} writeln('Luas = ', luas);
end.
Dialog berikut akan tampak, bila program diatas dijalankan.
Masukan data panjang, lebar, tinggi : 10 6 4
Luas : 240

3.4. Format Penulisan


Statemen write dan writeln dapat dilengkapi dengan format penulisan,

ada dua format

penulisan, yang pertama untuk penulisan tipe integer dan string, yang kedua adalah untuk
penulisan tipe real.
Format penulisan untuk tipe integer dan string :

write(A:n) atau writeln(B:n)

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

41

dengan : A, B = variabel yang akan ditampilkan nilainya


n = maksimum tempat yang disediakan, penulisan akan diratakan
disebelah kanan (right justified), n harus lebih besar dari jumlah
atau angka yang berada di variabel A atau B.
Misalkan isi variabel A adalah 4
Perintah

Ditampilkan di layar monitor

writeln(A : 5);

writeln(A*10 : 5);

40

writeln(A*100 : 5);

400

Misalkan isi variabel S1 := 'Lektor Muda', S2 := 'Mahasiswa dan S3 := 'Dosen'


Perintah

Ditampilkan di layar monitor

writeln(S1 : 7);

Lektor Muda

writeln(S2 : 7);

Mahasiswa

writeln(S3 : 7);

Dosen

Tempat yang disediakan, dimulai dari posisi kursor, hingga n karakter. Bila string melebihi
tempat yang disediakan maka string akan terpotong dibagian awal.
Format penulisan untuk tipe real :

write(X : n : d) atau writeln(Y : n : d)

dengan X,Y = variabel yang akan ditampilkan nilainya


n = maksimum tempat yang disediakan untuk angka-angka,
termasuk termasuk tanda titik, sebagai pemisah desimal.
d = maksimum tempat yang disediakan untuk angka desimal.
Bila X = 123.75 dan Y = 12.375
Perintah

Ditampilkan di layar monitor

writeln(X : 6 : 2);

123.75

writeln(Y : 6 : 2);

12.37

Bila suatu variabel X dan Y ditampilkan di layar monitor dengan perintah write atau writeln
tanpa format maka yang akan tampak di monitor adalah :
variabel X : 1.2375E2

variabel Y : 1.2375E1

sebagai tampilan standar untuk tipe real.

UNIVERSITAS BINA NUSANTARA

42

Logika-Algoritma

Contoh 3.5. Penulisan Format Bilangan Real


Program Bonus;
const k = 1.5;
var

x : real;

begin
write('Masukan gaji anda : '); readln(x);
writeln('Anda mendapat bonus 50 % ');
writeln('bulan ini anda terima rp : ', x * k : 9 : 2);
end.
Akan tampak dilayar monitor :
Masukan gaji anda : 1000000
Anda mendapat bonus 50 %
Bulan ini anda terima rp 1500000.00

3.5.Keluaran ke Printer
Statemen ini bukan merupakan perintah standar Pascal, tetapi khusus untuk pemrogram
yang menggunakan TURBO Pascal. Perintah untuk menuliskan suatu hasil atau apapun ke
printer dapat dilakukan dengan statemen write dan writeln, tetapi dengan tambahan argumen
yaitu identifier standar TURBO Pascal LST.
Contoh

Write(Lst, x), maka isi variabel x akan dicetak di kertas printer.

Penggunaan

argumen lst, harus didahului dengan penulisan uses printer pada awal

program, artinya pemrogram memberitahu kompiler TURBO Pascal bahwa unit printer akan
digunakan. Perlu diketahui bahwa sebagai kelengkapan Library, mulai dari versi 4.0 keatas
TURBO Pascal menyediakan unit library pilihan yaitu :
Unit CRT untuk manipulasi layar
Unit PRINTER untuk printer
Unit GRAPH untuk penggunaan grafik
Jadi perintah-perintah yang berkenaan dengan grafik akan terdapat pada Unit Graph dan
perintah-perintah berkenaan dengan layar monitor akan terdapat pada Unit CRT. Keterangan
lebih rinci, dapat ditemui pada buku manual TURBO Pascal.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

43

Contoh 3.6. Penulisan Hasil ke Printer


Uses printer;
var

x : real;

begin
write('Masukan gaji anda : '); readln(x);
writeln(Lst,'Anda mendapat bonus 50 % ');
writeln(Lst,'bulan ini anda terima rp : ', 1.5*x : 9 : 2);
end.
Bila program dijalankan, yang tampak di layar monitor hanya dialog :
Masukan gaji anda : 1000000

3.6. Penguasaan Layar Monitor


Layar monitor dibagi dalam baris dan kolom, untuk penggunaan yang umum jumlah baris ada
25 dan jumlah kolom ada 80. Posisi kursor di layar dapat dinyatakan dengan koordinat bariskolom, bila kita nyatakan kolom dengan simbol x dan baris dengan y, maka posisi kursor
dilayar dapat dinyatakan dengan pasangan (x,y). Posisi kursor demikian pentingnya dalam
perintah output ke layar monitor, karena write atau writeln akan menampilkan objeknya tepat
pada posisi kursor saat itu.

Poisisi x,y = 1,1

Poisisi x,y = 80,1

Layar Moinitor

Posisi x,y = 1,25

Posisi x,y = 80,25

Gambar 3.1 Koordinat Layar, modus teks

UNIVERSITAS BINA NUSANTARA

44

Logika-Algoritma

Perintah untuk memindahkan kursor dari suatu tempat ke tempat lain didaerah layar,
dilaksanakan dengan statemen :
gotoxy(x,y).
dengan X = kolom dan Y = baris.
Posisi (1,1) menunjukkan posisi kiri-atas, dan (80,25) menunjukkan posisi kanan-bawah,
sekali lagi, perintah ini bukan standar Pascal, hanya ada pada TURBO Pascal, untuk itu perlu
ditambah penulisan unit pada bagian deklarasi, yaitu Uses Crt.

Pada unit ini juga bisa

digunakan statemen clrscr yang berguna untuk menghapus seluruh tampilan pada layar
monitor.
Contoh 3.7. Penggunaan Clrscr dan Gotoxy(x,y).
Uses Crt;
var p, l, ls, kll : real;
begin
clrscr;

{ membersihkan layar }

gotoxy(30,10);

{ memindahkan kursor ke posisi x,y = 30,10 }

write('Panjang : ');

{ tulis 'Panjang' pada posisi 30,10 }

read(p);

{ baca data dari papan tombol ke variabel p }

gotoxy(30,11); write('Lebar

: '); read(l);

kll := 2 * (p + l );

{ menghitung keliling }

ls := p * l ;

{ menghitung luas}

gotoxy(30,13); write('Keliling = ', kll : 8 : 2);


gotoxy(30,14); write('Luas

= ', ls : 8 : 2);

end.
Hasilnya adalah :
Panjang : 25.8
Lebar : 8.4
Keliling : 68.40
Luas : 216.72
Turbo Pascal melengkapi perintah penampilan text di layar monitor dengan perintah
AssignCrt, dengan perintah ini, proses transfer data dan tampilan di layar menjadi lebih cepat.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

45

Contoh 3.8. Penggunaan AssignCRT


Uses Crt;
Var p, l, ls, kll : Real;
F : Text
Begin
clrscr;

{ membersihkan layar }

gotoxy(30,10);

{ memindahkan kursor ke posisi x,y = 30,10 }

write('Panjang : ');

{ tulis 'Panjang' pada posisi 30,10 }

read(p);

{ baca data dari papan tombol ke variabel p }

gotoxy(30,11); write('Lebar

: '); read(l);

kll := 2 * (p + l );

{ menghitung keliling }

ls := p * l ;

{ menghitung luas}

write(Print atau Screen [P/S] ? );


if upcase(Readkey) = S
then AssignCRT(F)
else Assign(F,PRN);
gotoxy(30,13); write(F, 'Keliling = ', kll : 8 : 2);
gotoxy(30,14); write(F, 'Luas

= ', ls : 8 : 2);

End.

UNIVERSITAS BINA NUSANTARA

46

Logika-Algoritma

Soal-soal :
1.

Bila variable x bertipe integer, apa yang terjadi dengan statemen :

x := 20/10;

Apa yang harus diperbaiki supaya statemen diatas berfungsi dengan baik.
2. Tuliskan bentuk bilangan real berikut dalam notasi desimal
0.2771E-2 dan 2.7667E+3
3. Buat format penulisan bilangan integer untuk untuk 5 angka
4. Buat format penulisan bilangan real untuk 8 angka total dan 2 angka dibelakang koma.
5. Buat algoritma dan kemudian program untuk menghitung isi silinder dengan diameter = d
dan tinggi = h, dasar silinder tidak rata melainkan membentuk kerucut dengan tinggi
kerucut = t dan t 0.1*h.

Hasil perhitungan ditampilkan di layar printer dan harus bisa

dicetak di printer.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

47

4. STRUKTUR PENGENDALI
Sejauh ini telah dibahas bagaimana membaca data dari papan tombol ke variabel, untuk
kemudian diolah dan hasilnya kemudian ditampilkan di layar monitor atau printer. Pengolahan
data selama ini masih terbatas pada instruksi-instruksi yang sifatnya berurutan (sequential),
sementara masih banyak permasalahan yang harus diselesaikan dengan pengorganisasian
instruksi-instruksi, yang tidak hanya berurutan tetapi memerlukan struktur pengendali (control
structure) yang berupa :
Struktur Pengulangan
Beberapa instruksi diulang untuk suatu jumlah pengulangan yang tertentu, jumlah
pengulangan dapat diketahui sebelumnya atau ditentukan dalam perjalanan
program, kedua hal ini ditangani dengan konstruksi pengulangan yang berbeda.
Struktur Pemilihan
Seringkali instruksi-instruksi dilaksanakan bila suatu persyaratan dipenuhi, dalam
struktur pemilihan, suatu instruksi atau sekelompok instruksi dapat dilewat,
sementara instruksi lain dijalankan.

4.1. Struktur Pengulangan


4.1.1 Konstruksi FOR-DO
Konstruksi ini digunakan bila banyaknya pengulangan telah diketahui sebelumnya, sintaks
dari pengulangan for-do adalah :
For <variabel identifier> := <ekspresi awal> to/downto <ekspresi akhir>
Do <statemen> ;
Contoh :

For counter := min to max Do readln(data);


For counter := max downto min Do readln(data);
For counter := min to (max div 2) Do readln(data);
atau

UNIVERSITAS BINA NUSANTARA

48

Logika-Algoritma
For bilangan := 1 to 100 Do write(bilangan);
For bilangan := 100 downto 1 Do write(bilangan);

Bila jumlah statemen diulang lebih satu, statemen-statemen tersebut harus diblok dengan
begin end.
For I := 1 to 5 Do
Begin
Write(Masukan data : );
ReadLn(Data);
End;

For I := <Nilai Awal> to <Nilai Akhir> Do <Statemen>

I := Nilai Awal

Nilai Akhir := Ekspresi Akhir

I := Nilai Akhir
?

Ya

Tidak
Do Statemen

I := I + 1

Keluar

Gambar 4.1 Diagram Alir Konstruksi For-Do

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

49

Contoh 4.1 Menghitung Nilai Rerata.


Pemakaian bahan bakar (bensin) untuk kendaraan bermotor, dihitung dalam rupiah,
seseorang ingin mengetahui rerata pengeluaran uang untuk pembelian bensin tersebut
selama satu bulan. Data (dalam rupiah) yang harus dimasukan adalah :
32.000,- 29.000,- 33.000,- 30.000,- untuk minggu ke 1, 2, 3 dan 4
Untuk menyelesaikan persoalan diatas, kita perlu satu variabel D untuk menampung hasil
pembacaan data pembelian bensin, kemudian satu variabel lain J, yaitu untuk menampung
penjumlahan data, data mingguan dijumlahkan untuk jangka waktu satu bulan (4 minggu),
sebelum perhitungan dimulai, variabel J ini harus dalam keadaan kosong. Hasil perhitungan
rerata diperoleh dari pembagian J oleh jumlah minggu, yaitu J/4 disimpan di variabel R.
Algoritma 4.1 Menghitung Nilai Rerata
1. Kosongkan variabel J
2. Baca data ke variabel D
3. Tambahkan D ke J
4. Ulangi langkah 2 dan 3 sebanyak 4 kali
5. Variabel J dibagi 4, hasilnya simpan di variabel R
Jangan lupa, dalam pelaksanaan algoritma dengan menggunakan konstruksi pengulangan
For-Do diperlukan satu variabel lagi untuk pengendali pengulangan, biasanya digunakan
variabel I singkatan dari iteration atau pengulangan, dalam contoh ini bertipe integer.
Program Hitung_rerata;
Var D, J, R : real; I : integer;
Begin
J := 0.0;
For I := 1 to 4 do
begin
write('Data minggu ke ', I, ' : '); readln(D);
J := J + D;
end;
R := J/4;
Writeln('Rerata pengeluaran bensin dalam satu bulan, Rp ',R:8:2);
End.

UNIVERSITAS BINA NUSANTARA

50

Logika-Algoritma

Bila kita ikuti program diatas dengan memantau isi variabel-variabel yang terkait, maka untuk
setiap pengulangan termasuk juga keadaan sebelum dan setelah pengulangan - dapat
ditabelkan sebagai berikut.
Tabel 4.1 Isi Variabel Hasil Pengulangan
Pengulangan

Isi Variabel

Isi Variabel

Isi Variabel

sebelum

32000

32000

29000

61000

33000

94000

30000

124000

setelah

30000

124000

31000

Ketika program diatas dijalankan, tampak di layar monitor (text yang diberi garis bawah
adalah masukan data dari operator) :
Data minggu ke 1 : 32000
Data minggu ke 2 : 29000
Data minggu ke 3 : 33000
Data minggu ke 4 : 30000
Rerata pengeluaran bensin dalam satu bulan, Rp 31000.00

4.1.1.1 Tipe Data Ordinal, Enumerated dan Subrange.


Variabel yang digunakan sebagai variabel pengendali pada konstruksi pengulangan for-do,
mensyaratkan bahwa tipe data variabel tersebut harus bertipe Ordinal. Oleh karena itu sudah
tiba saatnya untuk membahas lebih jauh klasifikasi tipe data Sederhana didalam Pascal.
Gambar 4.2 , pada halaman berikut menunjukkan bahwa ada cabang yang membagi tipe
data Sederhana menjadi dua bagian yaitu tipe Real dan tipe Ordinal. Mengenai tipe Real, kita
semua sudah mengetahui, bahwa tipe data tersebut adalah tipe bilangan pecahan. Kata
Ordinal, bila dicari padanan dalam bahasa Indonesia adalah nomor urut. Oleh karena itu,
seluruh nilai tipe data Ordinal mempunyai nomor urut, yang selalu dimulai dari nomor 0,
kecuali tipe Integer dimana nomor urut dari nilai Integer sama dengan nilai itu sendiri.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

51

Tipe Data Sederhana

Ordinal

Integer

Real

Char

Enumerated

Boolean

Sub-range

Gambar 4.2 Kerangka Tipe Data Sederhana


Tipe data ordinal memiliki 4 (empat) ciri :
1. Nilai pertama dari tipe ordinal (kecuali tipe integer) mempunyai nomor urut atau
ordinality sama dengan 0,

berikutnya mempunyai ordinality 1, demikian

seterusnya, hingga nilai dalam tipe tersebut berakhir. Tipe integer, mempunyai
ordinality, sesuai dengan nilainya sendiri.
2. Function standar Ord dapat digunakan, untuk mendapatkan ordinality atau nomor
urut dari nilai tipe data yang bersangkutan.
3. Function standar Pred dapat digunakan, untuk mendapatkan nilai sebelumnya
dari nilai data yang bersangkutan.
4. Function standar Succ dapat digunakan, untuk mendapatkan nilai setelahnya dari
nilai data yang bersangkutan.
Tipe Boolean termasuk tipe Ordinal, karena nilai True dan False dapat dikaitkan dengan
suatu urutan.
False

= 0

True

= 1

Sedangkan nomor urut dari tipe Char dapat dilihat dari tabel ASCCI, pada Apendix C.
Contoh:
Ord(A) = 65

Ord(a) = 97

Ord(1) = 49

Ord(9) = 57

UNIVERSITAS BINA NUSANTARA

52

Logika-Algoritma

Seluruh tipe data Sederhana, kecuali tipe Real, termasuk dalam kategori tipe Ordinal.
kemudian ditambah dengan tipe Enumerated. Enumerated berarti menyebutkan satu demi
satu. Jadi, mendefinisikan tipe data Enumerated adalah dengan cara menyebutkan identifier
satu demi satu untuk setiap nilai yang hendak digunakan. Mendefinisikan tipe Enumerated,
dilakukan di bagian deklarasi dengan didahului oleh kata terlindung, type
Contoh :
type
warna = (ungu,biru, hijau, kuning, jingga, merah);
asean = (myanmar, vietnam, indonesia, malaysia, thailand, brunei, singapore);
kendaraan_darat = (sepeda, beca, motor, mobil);
Maka :
Ord(ungu) = 0

Ord(jingga) = 4,

Pred(jingga) = kuning

Succ(beca) = motor

Demikian pula untuk tipe-tipe Ordinal lainnya, seperti tipe Char dan Integer :
Pred(h) = g

Ord(A) = 65

Succ(10) =11

Pred(43) = 42

Ord(88) = 88

Tipe Enumerated merupakan tipe yang dapat didefinisikan oleh pemrogram secara bebas
(user defined type) asal jumlah elemen tidak melebihi 256.
Seperti telah disinggung diatas, tipe data Real tidak termasuk tipe Ordinal, karena elemen
didalam tipe real tidak dapat dapat dikaitkan dengan urutan bilangan bulat. Sebagai contoh,
diantara nilai 1.000 (baca : satu koma nol nol nol) dengan 2.000 akan terdapat bilangan real
yang tak berhingga.
Tipe Subrange, adalah tipe dimana rentang nilainya merupakan bagian dari tipe data
sederhana, apakah berasal dari tipe Integer, Char, atau dari tipe Enumerated. Berikut ini
beberapa contoh pendefinisian tipe Subrange.
Subrange dari tipe char :
type huruf_kapital = 'A' .. 'Z';

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

53

Subrange dari tipe integer :


type nilai = 1..100;
Subrange dari tipe warna (lihat pendefinisian warna sebagai tipe Enumerated)
type warna_dingin = ungu .. hijau;
warna_panas = kuning .. merah;

Contoh 4.2 Tabel Kebenaran


Penggunaan tipe Boolean dalam program yang menggunakan konstruksi pengulangan for-do
dapat dilihat pada program berikut.
Program Tabel_Kebenaran;
Var P,Q : boolean;
Begin
writeln('============================================');
writeln('

PorQ

PandQ

NotP

PxorQ');

writeln('============================================');
for P := true downto false do
for Q := true downto false do
writeln(P:8, Q:8, P or Q : 8, P and Q : 8, Not P : 8, P xor Q : 8);
writeln('============================================');
End.
Tampilan di layar monitor :
P

PorQ

PandQ NotP

PxorQ

====================================
TRUE TRUE TRUE TRUE FALSE TRUE
TRUE FALSE TRUE FALSE FALSE FALSE
FALSE TRUE TRUE FALSE TRUE FALSE
FALSE FALSE FALSE FALSE TRUE TRUE
====================================

UNIVERSITAS BINA NUSANTARA

54

Logika-Algoritma

Sekarang, kita gunakan tipe warna (enumerated) pada program berikut :


Program Tampil_Ulang;
Type warna = (ungu,biru,hijau,kuning,jingga,merah);
Var x : warna;
Begin
for x := ungu to merah do writeln('TEST');
End.
Bila program ini dijalankan, akan ditampilkan TEST di layar monitor sebanyak 6 baris,
demikian juga bila kita balik manjadi :
for x := merah downto ungu do writeln('TEST');
tetap akan tampil 6 baris kata TEST.
Contoh 4.3. Penggunaan Tipe Subrange
Tipe subrange dapat membatasi rentang nilai-nilai yang mungkin digunakan. Seperti jumlah
pengulangan pada program hitung_rerata, sudah jelas sebanyak 4 kali, maka variabel yang
digunakan sebagai pengendali akan lebih tepat bila dideklarasikan sebagai tipe subrange,
seperti berikut :
Program Hitung_rerata;
Type minggu = 1..4;
Var D, J, R : real;
U : minggu;
Begin
J := 0.0;
For U := 1 to 4 do
begin
write('Data minggu ke ', U, ' : '); readln(D);
J := J + D;
end;
R := J / 4;
Writeln('Rerata pengeluaran bensin dalam satu bulan, Rp ',R:8:2);
End.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

55

Konstruksi pengulangan for-do dapat berada didalam konstruksi for-do, sehingga dikenal
pengulangan bagian luar dan bagian dalam. Contoh-contoh berikut akan menunjukkan
bagaimana konstruksi for-do di dalam for-do (nested for-do loops).
Contoh 4.4 Segitiga Angka Jenis Pertama
Tulis program untuk membentuk segitiga angka seperti berikut :
1
12
123
1234
12345
123456
1234567
12345678
123456789
Untuk menyelesaikan persoalan diatas diperlukan dua konstruksi for-do, konstruksi for-do
yang pertama (bagian luar) digunakan untuk membentuk baris, sebanyak 9 baris dan
konstruksi for-do yang kedua (bagian dalam) untuk membentuk kolom dalam setiap baris
yang jumlah kolom bertambah dari 1 hingga 9 bersamaan dengan bertambahnya baris.
Penyelesaian program contoh soal 4.4
Program SegitigaAngka01;
Uses CRT;
Var I,J:Integer;
Begin
ClrScr;
For I := 1 to 9 do
Begin
for J := 1 to I do write(J);
writeln;
End;
ReadLn;
End.

UNIVERSITAS BINA NUSANTARA

56

Logika-Algoritma

Contoh 4.5 Segitiga Angka Jenis Kedua


Tulis program untuk membentuk segitiga angka seperti berikut :
1
2 3
3 4 5
4 5 6 7
5 6 7 8 9
6 7 8 9 0 1
7 8 9 0 1 2 3
8 9 0 1 2 3 4 5
9 0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8 9
Persoalan ini hampir sama seperti contoh soal 4.4, hanya pada permulaan angka pada barisbaris berikutnya naik satu tingkat, kemudian urutan angka setelah mencapai nilai 9, balik
kembali ke angka nol untuk kemudian naik lagi. Untuk pengulangan angka dari 9 ke 0
digunakan operator mod 10.
Penyelesaian program contoh soal 4.5
Program SegitigaAngka02;
Uses CRT;
Var I, J , K, M : Integer;
Begin
ClrScr; M := 10;
For I := 1 to 10 do
Begin
K := I -1 ;
GotoXY(M,I);
For J := 1 to I do write((J+K) mod 10);
Writeln;
M := M - 1;
End;
ReadLn;
End.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

57

4.1.2. Konstruksi WHILE-DO dan REPEAT-UNTIL


Bila jumlah pengulangan belum diketahui sebelumnya, maka konstruksi FOR-DO tidak dapat
digunakan, sebagai pilihan dapat digunakan WHILE-DO atau REPEAT-UNTIL.
Program hitung_jarak dan hitung_luas_segi_4 dapat digunakan kembali sebagai contoh , bila
pemakai ingin menghitung luas segi empat lebih dari satu kali, maka perlu pengulangan
program utama. Jumlah pengulangan belum diketahui, karena mungkin data yang tersedia
hanya untuk 3 perhitungan atau mungkin 20 perhitungan, tidak ada yang tahu sebelumnya.
Sintaks konstruksi WHILE-DO :
While <ekspresi boolean> Do <statemen> ;
Statemen atau kelompok statemen akan diulang selama ekspresi boolean bernilai True. Oleh
karena itu, untuk menghentikan pengulangan, diperlukan adanya suatu statemen didalam
blok yang dapat mengubah nilai ekspresi boolean dari True menjadi False. Seperti biasa, bila
jumlah statemen yang harus diulang lebih dari satu, maka keolmpok statemen diblok oleh
begin-end.
While <ekspresi boolean> Do
Begin
<statemen1>;
<statemen2>;
...
<statemenN>;
End;

Tidak

True
?
Ya
Do Statemen

Keluar

Gambar 4.3 Diagram Alir Konstruksi While-Do

UNIVERSITAS BINA NUSANTARA

58

Logika-Algoritma

Sintaks konstruksi REPEAT-UNTIL


Repeat <statemen> until <ekspresi boolean> atau
Repeat
<statemen1>;
<statemen2>;
...
<satemenN>;
Until <ekspresi boolean>;
Statemen atau kelompok statemen akan diulang selama ekspresi boolean bernilai False, jadi
salah satu statemen didalam loop harus dapat mengubah ekspresi boolean menjadi True,
sehingga dapat menghentikan pengulangan pada waktunya.

Do Statemen

Tidak

True
?

Ya
Keluar
Gambar 4.4 Diagram Alir Konstruksi Repeat Until
Perbedaan diantara konstruksi WHILE-DO dan REPEAT-UNTIL adalah :
Pada konstruksi While-Do, statemen atau kelompok statemen mungkin tidak akan
pernah dilaksanakan, bila nilai ekspresi boolean bernilai false.
Pada konstruksi Repeat-Until, statemen atau kelompok statemen pasti dikerjakan
paling sedikit satu kali.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

59

Kembali pada program hitunng_jarak dan hitung_luas_segi_4, yang akan digunakan untuk
menunjukkan konstruksi while-do dan repeat-until dalam suatu pengulangan. Dalam kedua
konstruksi ini harus difikirkan bagaimana menghentikan pengulangan secara tertib, ada dua
cara yang dapat digunakan, yaitu :
1.

Pertanyaan, apakah pengulangan akan dilanjutkan.

2.

Sentinel atau Pembatas dengan kode khusus

Contoh 4.6. Cara 'pertanyaan' pada konstruksi while-do.


Uses Crt;
Var d,x1,y1,x2,y2 : integer;
Jawab : char;
Begin
writeln(Menghitung jarak diantara dua titik pada koordinat X-Y);
writeln;
write('Teruskan Perhitungan (Y/T) ? '); readln(jawab);
while upcase(jawab)='Y' do
begin
write('Titik A [x1 dan y1] : '); readln(x1,Y1);
write('Titik B [x2 dan y2] : '); readln(x2,Y2);
d := SQRT(SQR(x1-x2)+SQR(y1-y2));
writeln(Jarak A dengan B = ,d:6:2);
write('Teruskan Perhitungan ? (Y/T) '); readln(jawab);
end;
End.
Bila program diatas dijalankan akan tampak dialog sebagai berikut :
Menghitung jarak diantara dua titik pada koordinat X-Y
Teruskan Perhitungan (Y/T) ? Y
Titik A [x1 dan y1] : 1.2 24.7
Titik B [x2 dan y2] : 11.7 4.3
Jarak A dengan B = 22.94
Teruskan Perhitungan (Y/T) ? T

UNIVERSITAS BINA NUSANTARA

60

Logika-Algoritma

Pada contoh diatas, terlihat, bahwa sebelum memasuki konstruksi while-do, diberikan
pertanyaan

yang jawabannya akan menjadi keputusan apakah statemen atau kelompok

statemen didalam while-do

dilaksanakan atau tidak.

Kemudian didalam blok while-do

pertanyaan yang serupa diajukan kembali, sehingga pada waktu kembali ke statemen while,
akan diputuskan apakah akan mengulang statemen didalam blok while-do atau keluar dari
konstruksi pengulangan while-do ini.
Contoh 4.7. Cara sentinel pada konstruksi repeat-until.
Sebagai sentinel, digunakan nilai 0 pada variabel x1 atau variabel lebar pada contoh
perhitungan luas segi-empat.
Begin
Repeat
write('Masukan data panjang [0=selesai] : '); readln(panjang);
write('Masukan data lebar

[0=selesai] : '); readln(lebar);

luas := panjang * lebar; writeln('Luas = ',luas);

writeln;

Until (panjang = 0) or (lebar = 0);


End.
Bila program diatas dijalankan akan tampak dialog sebagai berikut :
Masukan data panjang [0=selesai] : 10
Masukan data lebar

[0=selesai] : 5

Luas = 50
Masukan data panjang [0=selesai] : 0
Masukan data lebar

[0=selesai] : 0

Luas = 0
Dari dua contoh diatas, dapat dilihat bahwa pemilihan antara while-do dan repeat-until
tergantung dari permasalahan yang sedang dihadapi, keduanya dapat dipertukarkan tetapi
ada permasalahan dimana logika dengan konstruksi pengulangan tertentu akan lebih jelas.
Contoh : Kita akan masukan suatu bilangan ke variabel X dengan validasi 50 X 100.
Repeat
Readln(x);
Until (X >= 50) and (X <= 100);
Coba ubahlah konstruksi Repeat-Until diatas menjadi konstruksi While-Do !

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

61

4.2. Struktur Pemilihan


4.2.1. Konstruksi IF-THEN-ELSE
Pada kesempatan ini akan diambil contoh klasik, mencari akar-akar persamaan kwadrat :
ax2 + bx + c = 0
pemrogram cenderung akan menulis algoritma sebagai berikut :
1. Dapatkan koefisien a, b dan c
2. Hitung x1 dengan rumus
3. Hitung x2 dengan rumus
Bila ekspresi

b2 - 4.a.c, menghasilkan nilai negatip, maka akan didapat bilangan khayal

yang dalam permasalahan ini tidak diijinkan, sehingga akan terjadi kesalahan, mungkin
program akan berhenti secara tidak wajar. Dari persoalan ini tersirat bahwa kita harus
menggunakan struktur pemilihan if-then-else yang sintaksnya adalah :
If <ekspresi boolean> then <statemen1> else <statemen2>; atau
If <ekspresi boolean>
then begin <statemen-a1>; . . . ; <statemen-aN> end
else begin <statemen-b1>; . . . ; <statemen-bN> end;
Statemen1 atau kelompok statemen a, akan dikerjakan bila ekspresi boolean bernilai TRUE,
sedangkan statemen 2 atau kelompok statemen b, akan dilewat. Sebaliknya, bila ekspresi
boolean bernilai False, maka statemen 1 atau kelompok statemen b dikerjakan, sedangkan
statemen 1 atau kelompok statemen a dilewat.
Contoh 4.8. Persamaan Kwadrat
Dengan menggunakan struktur pemilihan, kita dapat memperbaiki algoritma tadi menjadi :
Algoritma 4.2 Mencari Akar-akar Persamaan Kwadrat
1. Dapatkan koefisien a, b, dan c
2. Hitung diskriminan d = b2 - 4.a.c
3. Bila d > 0 maka hitung x1 dan x2, bila d < 0 , selesai
4. Selesai

UNIVERSITAS BINA NUSANTARA

62

Logika-Algoritma

Program untuk menghitung akar-akar persamaan kwadrat :


Program Pers_kwadrat;
Uses Crt;
Var a,b,c,d,x1,x2 : real;
Begin
write('Masukan koef a : '); readln(a);
write('Masukan koef b : '); readln(b);
write('Masukan koef c : '); readln(c);
d := sqr(b) - 4 * a * c;
if d >= 0 then begin
x1 := (-b + sqrt(d)) / (2 * a);
x2 := (-b - sqrt(d)) / (2 * a);
writeln(x1 = , x1:6:2, x2 = ,x2:6:2);
end
else writeln('Tidak ada akar untuk persamaan ! ');
End.
Hasil dari menjalankan program diatas :
Masukan koef a : 2
Masukan koef b : -9
Masukan koef c : 3
x1 = 4.14 x2 = 0.36
Masukan koef a : 6
Masukan koef b : -7
Masukan koef c : 4
Tidak ada akar untuk persamaan
Masukan koef a : 2
Masukan koef b : 4
Masukan koef c : 2
x1 = -2.0 x2 = -2.0
Kata terlindung else tidak selalu digunakan, perbedaan alur logika dapat dijelaskan dengan
gambar 4.5. pada halaman berikut.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

63

Statemen-1

Statemen-1

Tidak

True
?

Tidak

True
?
Ya

Ya
Statemen-A

Statemen-A

Statemen-B

Statemen-2

Statemen-2
IF-THEN

IF-THEN-ELSE

Gambar 4.5 Perbedaan Konstruksi IF-THEN-ELSE dengan IF-THEN

Konstruksi If-Then-Else dapat digunakan secara bertingkat :


If <ekspresi boolean 1> then <statemen 1> else
if <ekspresi boolean 2> then <statemen 2> else
...
if <ekspresi boolean N> then <statemen N>;

Contoh 4.9. Perhitungan Nilai Ujian Mahasiswa


Tabel 4.2. Tabel Nilai
Nilai Akhir

Bobot

Nilai Huruf

85 100

A : Sangat Baik

75 84

B : Baik

65 74

C : Cukup

50 64

D : Kurang

0 - 49

E : Gagal

UNIVERSITAS BINA NUSANTARA

64

Logika-Algoritma

Dari buku pedoman Universitas Bina Nusantara, dapat dilihat sistim penilaian seperti terlihat
dari tabel 4.2 diatas. Mata kuliah Logika-Algoritma dilengkapi dengan praktikum di

Lab.

Software, sehingga nilai akhir dihitung dengan :


Nilai Akhir = 50% (Ujian Semester) + 20%(Ujian Mid Semester)
+ 20%(Tugas Mandiri + 10%(Absensi).
Nilai nilai tersebut dapat dihitung dan ditampilkan, dengan konstruksi If - Then - Else secara
bertingkat :
Program Tampilan_Nilai;
Uses CRT;
Var Absensi,Tugas,Mid,Final,Nilai_Akhir : 0..100;
Nilai : Real; Jawab : Char;
Begin
ClrScr;
Write('Teruskan (Y/T) ? '); readln(Jawab);
While upcase(Jawab) = 'Y' do
Begin
Write('Nilai Kehadiran

(0 - 100 : '); Readln(Absensi);

Write('Nilai Tugas Mandiri (0..100) : '); Readln(Tugas);


Write('Nilai Mid Semester (0..100) : '); Readln(Mid);
Write('Nilai Semester

(0..100) : '); Readln(Final);

Nilai:=(0.1*Absensi) + (0.2*Tugas) + (0.2*Mid)+(0.5*Final);


Nilai_akhir := round(nilai);
If(Nilai_akhir >=85) and (Nilai_akhir <= 100)
then writeln(Nilai_akhir,' = A) else
If(Nilai_akhir > =75) and (Nilai_akhir <= 84)
then writeln(Nilai_akhir, ' = B) else
If(Nilai_akhir > =65) and (Nilai_akhir <= 74)
then writeln(Nilai_akhir, ' = C') else
If(Nilai_akhir > =50) and (Nilai_akhir <= 64)
then writeln(Nilai_akhir, ' = D') else
If(Nilai_akhir > =0) and (Nilai_akhir <= 49)
then writeln(Nilai_akhir, ' = E ');
Writeln; Write('Teruskan (Y/T) ? '); Readln(Jawab);
end;
End.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

65

4.2.2. Konstruksi CASE-OF-END


Konstruksi ini digunakan sebagai pengganti konstruksi IF - THEN - ELSE, bila konstruksi ifthen-else bertingkat terlalu banyak, sehingga menjadi sulit dibaca. Sintaks konstruksi CASEOF-END :
Case <ekspresi> of
label case 1 : statemen1;
label case 2 : statemen2;
...
label case N : statemenN;
End;
Ekspresi yang diuji, dapat berupa ekspresi numerik atau boolean, bila ekspresi boolean, tentu
saja label case hanya mempunyai dua kemungkinan, yaitu : TRUE atau FALSE. Bila ekspresi
numerik atau karakter, maka seluruh nilai yang berada dalam rentang nilai tipe tersebut dapat
digunakan dalam label case.
Else, dapat digunakan dalam konstruksi case-of-end ini, tetapi tempatnya harus paling akhir,
bila else digunakan, maka seluruh nilai yang tidak dipakai dalam label case diatasnya,
berlaku pada bagian else ini
Case <ekspresi> of
label case 1 : statemen1;
label case 2 : statemen2;
...
label case N : statemen N;
Else Statemen P;
End;

Contoh 4.10. Penggunaan Case-End pada Program Nilai Mahasiswa


Program diatas dapat ditulis kembali dengan menggunakan konstruksi case-of-end.
(Bagian deklarasi sama seperti contoh diatas).

UNIVERSITAS BINA NUSANTARA

66

Logika-Algoritma

Begin
clrscr;
write('Teruskan (Y/T) ? '); readln(Jawab);
while upcase(Jawab) = 'Y' do
begin
write('Nilai Kehadiran

(0 - 100 : '); readln(Absensi);

write('Nilai Tugas Mandiri (0..100) : '); readln(Tugas);


write('Nilai Mid Semester (0..100) : '); readln(Mid);
write('Nilai Semester

(0..100) : '); readln(Final);

Nilai := (0.1*Absensi)+(0.2*Tugas)+(0.2*Mid)+(0.5*Final);
Nilai_akhir := round(nilai);
case Nilai_akhir of
85..100 : writeln(Nilai_akhir, ' =A);
75..84 : writeln(Nilai_akhir, ' = B);
65..74 : writeln(Nilai_akhir, ' = C);
50..64 : writeln(Nilai_akhir, ' = D);
0 ..49 : writeln(Nilai_akhir, ' = E);
end;
writeln; write('Teruskan (Y/T) ? '); readln(Jawab);
end;
End.
Tampak bahwa konstruksi case-of-end, lebih ringkas dan jelas bila dibandingkan dengan
konstruksi if-then-else yang bertingkat.

Contoh Soal 4.11 Perhitungan Pajak Penghasilan Terutang Menggunakan If-Then-Else


dan Case-End.
Menurut buku Petunjuk Pengisian SPT Tahunan PPh Wajib Pajak Orang Pribadi, yang
diterbitkan oleh Dirjen Pajak tahun 1996, tertera disitu daftar perhitungan PPh Terutang :
Penghasilan Kena Pajak

Tarif

0 sampai dengan 25 Juta

10%

25 Juta sampai dengan 50 Juta

15%

Diatas 50 Juta

30%

Misalkan Penghasilan Tidak Kena Pajak seorang Wajib Pajak adalah Rp. 57.000.000,-

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

67

Maka perhitungan Pajak Penghasilan terutang adalah :


10% x Rp. 25.000.000,- = Rp. 2.500.000,15% x Rp. 25.000.000,- = Rp. 3.750.000,30% x Rp. 7.000.000,- = Rp. 2.100.000,PPh Terutang

= Rp. 6.250.000,-

Bila kita gunakan konstruksi If-Then-Else, perhitungan diatas ditulis sebagai berikut :
(Penghasilan dalam ribuan rupiah)
If (Penghasilan > 0) or (Penghasilan <= 25000)
Then PPh_Terutang := 0.1*Penghasilan Else
If (Penghasilan > 25000) or (Penghasilan <= 50000)
Then PPh_Terutang := 0.1*Penghasilan + 0.15*(Penghasilan-25000) Else
If (Penghasilan > 50000)
Then PPh_Terutang := 0.1*Penghasilan + 0.15*25000 + 0.3*(Penghasilan-50000);
Ubahlah konstruksi If-Then-Else diatas, menjadi konstruksi Case-End.
Jawab :
Case Penghasilan of
0..25000 : PPh_Terutang := 0.1 * Penghasilan;
25000..50000 : PPh_Terutang := 0.1*25000 + 0.15*(Penghasilan-25000);
Else PPh_Terutang := 0.1*25000 + 0.15*25000 + 0.3*(Penghasilan-50000);
End;

UNIVERSITAS BINA NUSANTARA

68

Logika-Algoritma

Soal-soal
1. Berapa nilai x setelah program berikut ini dijalankan :
Type i = (irak, iran india, israel, irlandia, italia);
Var x : integer; rudal : i ;
Begin
x := 10;
for rudal := irak to israel
do if (rudal mod 2) = 0
then x := x + 2
else x := X - 1;
End.

2. Konstruksi for-do dapat dilakukan secara nested yaitu for-do berada


didalam for-do lainnya, gambarkan apa yang nampak dilayar monitor
untuk program berikut :
Var c : char;
i, j : integer;
Begin
c := 'x';
for i := 1 to 5 do
begin
for j := 1 to i do write(c);
writeln;
End.
3. Tunjukkan hasil penulisan variabel (i + j) pada program berikut :
Var i, j : integer;
Begin
For i := 1 to 2 do
For j := i to 3 do
write(i + j);
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

69

4. Apa yang terjadi bila konstruksi Repeat-Until :


Repeat
Readln(X);
Until (X 10) and (X 20);
diganti dengan
Repeat
Readln(X);
Until (X 10) or (X 20);
5. Ubahlah konstruksi if-then bertingkat, menjadi hanya satu if-then
If (Tanda = Naik) then
if (B > 5) then if (B < 25) then B := B + 1;

6. Tulis program untuk membentuk pramida angka seperti dibawah ini :


(lihat Contoh soal 4.4)

1
232
34543
4567654
567898765
67890109876
7890123210987
890123454321098
90123456765432109
0123456789876543210

UNIVERSITAS BINA NUSANTARA

70

Logika-Algoritma

5. PROCEDURE DAN FUNCTION


Penggunaan struktur pengulangan dan pemilihan dalam pemrograman sudah mencukupi
untuk menyelesaikan persoalan,

tetapi akan lebih baik lagi

dalam arti lebih terstruktur

apabila beberapa instruksi untuk menyelesaikan satu atau beberapa tugas yang berkaitan
diorganisasikan dalam satu blok atau modul.

Didalam bahasa Pascal, pengelompokkan

instruksi-instruksi untuk suatu tugas dapat dilaksanakan dengan dua cara yaitu:
Procedure
Function
Secara umum, procedure dan function akan disebut sebagai modul. Dengan modul, maka
pemrogram dapat memfokuskan pada logika pemrograman. Karena masalah dapat dipecah
menjadi sub-masalah yang lebih kecil yang dapat diselesaikan dalam modul, maka
pelaksanaan pemrograman untuk setiap modul dapat dikerjakan oleh pemrogram yang
berbeda, pembagian tugas menjadi lebih jelas.

Selain itu pemeliharaan program akan

menjadi lebih mudah karena setiap perbaikan atau pengembangan dapat difokuskan pada
modul yang bersangkutan.
Seperti telah disinggung diatas, modul digunakan untuk melaksanakan suatu tugas atau
beberapa tugas yang berkaitan erat. Suatu modul dapat dikatakan berhasil guna apabila
procedure tersebut sering dipakai atau dipanggil, tolak ukur ini dinyatakan dengan fan-in,
makin tinggi fan-in, yaitu makin sering procedure digunakan, maka procedure tersebut makin
berdaya guna. Sementara itu makin sedikit tugas yang dikerjakan oleh suatu procedure,
idealnya satu tugas untuk satu modul meskipun hal ini jarang dipenuhi karena eratnya kaitan
satu tugas dengan tugas lain sehingga seringkali beberapa tugas yang serupa digabungkan,
tolak ukur untuk ini disebut fan-out , makin rendah fan-out, makin baik perencanaan modul
tersebut.

5.1. Procedure
Procedure merupakan suatu modul, dimana ia umumnya mengembalikan lebih dari satu nilai,
hasil dari suatu perhitungan atau proses. Tetapi procedure dapat pula melakukan tugas
dengan sama sekali tidak mengembalikan nilai, karena memang tidak ada nilai
dihasilkan.

UNIVERSITAS BINA NUSANTARA

yang

Logika-Algoritma

71

Struktur procedure sangat menyerupai struktur program seperti tampak pada sintaks berikut
ini :
Procedure <identifier procedure> (<daftar parameter>);
<deklarasi variabel, konstanta, tipe data, procedure, function >
Begin
<satetemen1
. . .
statemen N>
End;
Dari struktur diatas, terlihat bahwa suatu procedure dapat mengandung procedure dan/atau
function. Daftar parameter dan bagian deklarasi tidak harus selalu digunakan, sedangkan
identifier sebagai nama procedure harus diberikan, karena dengan identifier tersebut,
procedure ini digunakan, yaitu dengan memanggil nama procedure.
Contoh penggunaan procedure pada program tampilan_nilai.
Program tampilan_nilai, dapat dibagi dalam tiga modul, yang nantinya akan berbentuk
procedure, mereka adalah :
1. Modul Baca Data Nilai
2. Modul Hitung Nilai Akhir
3. Modul Tampil Nilai Akhir dan Kwalifikasi nilai.
Dengan pembagian ini, akan terlihat jelas bahwa logika pemrograman lebih mudah diikuti,
dengan kata lain program menjadi jauh lebih mudah dibaca.
Program Pengolahan_Nilai_Mahasiswa;
Uses CRT;
Var Absensi,Tugas,Mid,Final,Nilai_Akhir : 0..100;
Nilai : real; Jawab

: char;

Procedure Baca_Nilai;
Begin
write('Nilai Kehadiran

(0 - 100 : '); readln(Absensi);

write('Nilai Tugas Mandiri (0..100) : '); readln(Tugas);


write('Nilai Mid Semester (0..100) : '); readln(Mid);
write('Nilai Semester

(0..100) : '); readln(Final);

End;

UNIVERSITAS BINA NUSANTARA

72

Logika-Algoritma
Procedure Hitung_Nilai_Akhir;
Begin
Nilai := (0.1*Absensi)+(0.2*Tugas)+(0.2*Mid)+(0.5*Final);
Nilai_akhir := round(nilai);
End;
Procedure Tampilan_Nilai_Akhir;
Begin
Case Nilai_akhir of
85..100 : writeln(Nilai_akhir, ' = A (Sangat Baik), bobot 4');
75..84 : writeln(Nilai_akhir, ' = B (Baik), bobot 3');
65..74 : writeln(Nilai_akhir, ' = C (Cukup), bobot 2');
50..64 : writeln(Nilai_akhir, ' = D (Kurang), bobot 1');
0 ..49 : writeln(Nilai_akhir, ' = E (Gagal), bobot 0');
End;
End;
Begin { Program Utama }
Repeat
Baca_Nilai;
Hitung_Nilai_Akhir;
Tampilan_Nilai;
Writeln;
Write('Teruskan (Y/T) ? '); Readln(Jawab);
Until UpCase(Jawab) = Y
End. { Program Utama }

5.2. Identifier Global dan Lokal


Identifier global adalah seluruh identifier yang dideklarasikan di bagian deklarasi program
utama, sebagai contoh pada program Tampilan_nilai, variabel-variabel Absen, Tugas, Mid,
Final, Nilai, Nilai_akhir dan Jawab, semuanya merupakan identifier global. Bila identifier
dideklarasikan didalam suatu modul, procedure atau function, maka identifier tersebut
dinamakan identifier lokal.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

73

Program Utama;
Var X,Y,Z : Integer;
Procedure A
Var A1,A2:Real;

Procedure B
Var B1,B2:Char;

Begin
Statemen Memanggil A dan B
End.

Gambar 5.1 Variabel Global dan Lokal


Dari gambar 5.1 diatas terlihat bahwa variabel : X, Y dan Z adalah global dan dengan
demikian dapat digunakan diseluruh program termasuk procedure-procedure yang ada
didalamnya, sedangkan variabel A1, A2 adalah lokal untuk procedure A, procedure B tidak
akan mengenal A1 dan A2. Program Utama juga tidak akan mengenal A1,A2,B1 dan B2.
Contoh 5.1. Variabel Global dan Lokal
Program Rerata;
Var N,J:Real;
Procedure InputData;
Var Jawab : Char; X:Real
Begin
N := 1; J := 0
Repeat
Write(Data ke ,N, : ); Readln(X); J := J + X; N := N+1;
Write(Masih ada data [Y/T] ? ); Readln(Jawab);
Until UpCase(Jawab) = T;
End;

UNIVERSITAS BINA NUSANTARA

74

Logika-Algoritma
Begin
InputData;
Writeln(Rerata : ,J/N:6:2);
End.

Variabel N dan J adalah global, sehingga dapat dikenal dari dalam procedure InputData,
sedangkan variabel Jawab dan X merupakan variabel-variabel lokal yang hanya dikenal di
dalam procedure InputData. Jangkauan identifier global sifatnya menyeluruh, artinya identifier
tersebut dikenal disemua bagian dari program termasuk modul-modul didalamnya,
sedangkan jangkauan identifier lokal, terbatas hanya didalam modul dimana identifier
tersebut dideklarasikan.
Modul dapat mencukupi kebutuhannya sendiri (self contained) dimana variabel, konstanta,
sedapat mungkin di deklarasikan didalam. Tetapi hal ini hampir mustahil terjadi, karena
bagaimanapun juga suatu modul, sedikit atau banyak akan memerlukan data dari luar untuk
diolah, dan hasilnya dipakai sendiri atau dikembalikan kepada yang pemanggil.
Bila demikian halnya maka diperlukan suatu cara untuk mentransfer data dari luar kedalam
modul dan sebaliknya mentransfer data dari dalam modul ke modul lain atau ke program
utama.
Identifier pada dasarnya dapat dideklarasikan kembali ditempat lain, sebagai contoh, variabel
Y dapat dideklarasikan kembali di procedure A, variabel Z dideklarasikan kembali diprocedure
B. Dalam hal ini, bila kita bekerja diprogram utama maka variabel Y dan Z yang aktif adalah
variabel Y dan Z global, sedangkan bila kita sedang bekerja di procedure A, maka variabel Y
yang aktif adalah Y lokal, tetapi Z aktif adalah Z global, tetapi bila kita sedang bekerja di
procedure B maka variabel Y yang aktif adalah Y global, tetapi Z aktif adalah Z lokal

5.3. Transfer Parameter.


Suatu modul yang memerlukan data dari luar, harus mempunyai cara untuk mendapatkan
data tersebut, atau sebaliknya bila ia harus mengembalikan suatu nilai atau beberapa nilai,
maka juga harus ada cara untuk mentransfer nilai tersebut. Selama ini digunakan transfer
data atau nilai melalui pusat atau melalui variabel global, cara ini kelihatannya sederhana,
karena semua dipusatkan di program utama, tetapi ada suatu kekhawatiran bila data tidak
diserahkan langsung ke/dari suatu modul akan mendapat gangguan dari modul lain. atau dari
program utama itu sendiri. Terutama pada program besar, transfer data melalui identifier
global harus digunakan dengan lebih hati-hati dan sebaiknya dihindari.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

75

Daftar parameter, digunakan untuk mentransfer data, baik yang menuju modul untuk diolah,
maupun untuk mengembalikan nilai hasil pengolahan. Hubungan antara pemanggil atau
pengguna modul dengan modul, hanya dilakukan lewat daftar parameter. Diluar itu hanya
terjadi interaksi lewat identifier global yang dapat mengalami efek samping atau side efect,
yang tidak diduga.

Program Utama
Atau
Procedure / Function Lain
Side
Effec
Daftar Parameter

Procedure
Gambar 5.2 Side Effect Pada Procedure
Dikenal dua cara transfer parameter yaitu :
By Value
Disini nilai dikirim ke modul untuk diolah, biasanya pemanggil tidak
mengharapkan hasil pengolahan. Dalam hal ini hanya terjadi aliran
data satu arah, yaitu dari pengguna ke modul.
By Location
Pemanggil mentransfer lokasi, apakah lokasi tersebut berisi data atau
sama sekali kosong. Tetapi pengguna mengharapkan lokasi tersebut
nantinya diisi nilai hasil pengolahan atau hasil dari tugas yang dilaksanakan dalam modul (misalnya, membaca data dari papan tombol atau
hasil perhitungan). Komunikasi dua arah terjadi disini.

UNIVERSITAS BINA NUSANTARA

76

Logika-Algoritma

Pemanggil

14

Yang Dipanggil

Pemanggil

14

Yang Dipanggil

14

Pemanggil

14

Yang Dipanggil

28

X := X * 2;

Pemanggil

14

Yang Dipanggil

28

Gambar 5.2 Proses Transfer by Value

A
Pemanggil

14

X
Yang Dipanggil

Pemanggil

Yang Dipanggil

14

Pemanggil

Yang Dipanggil

28

X := X * 2;

Pemanggil

28

Yang Dipanggil

Pemanggil

28

Yang Dipanggil

Gambar 5.3 Proses Transfer by Location


Seperti tampak dari gambar 5.2 dan 5.3 diatas, pada transfer by value terjadi transfer nilai
dari variable A ke variabel X, dalam hal ini terdapat dua lokasi yang berbeda A dan X.
Sedangkan pada transfer by location, hanya terdapat satu lokasi, yang terlihat dari pemanggil
sebagai variabel A dan terlihat dari yang dipanggil sebagai variabel X. Lokasi kedua variabel
tersebut masih itu-itu juga.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

77

Transfer data by value umumnya digunakan apabila pemanggil hanya mentransfer data
kepada yang dipanggil dan tidak memerlukan hasil dari transfer tersebut. Hasil transfer
digunakan oleh yang dipanggil untuk keperluan dirinya sendiri misalkan untuk tampilan di
layar atau di printer.
Contoh 5.2 Transfer By Value;
Program Transfer_Data;
Var A : Integer;
Procedure Tampil(X:Integer);
Var I : Byte;
Begin
X := X * 2;
For I := 1 to X Do
Begin
Write(I, );
If (I mod 10) = 0 then Writeln;
End;
Begin
Write(Nilai A = ); Readln(A);
Tampil(A);
Writeln(A = ,A);
End.
Bila program diatas dijalankan, tampak dialog berikut :
Nilai A = 14
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28
A = 14
Sedangkan transfer data by location, digunakan apabila pemanggil ingin mendapatkan hasil
dari operasi yang dilakukan terhadap data yang ditransfer tadi. Umpamanya kita ingin
mendapatkan pengandaan (perkalian dengan 2) terhadap setiap data yang ditransfer.

UNIVERSITAS BINA NUSANTARA

78

Logika-Algoritma

Contoh 5.3 Transfer By Location;


Var A : Integer;
Procedure Ganda(Var X:Integer);
Begin
X := X * 2;
End;
Begin
A := 14:
Writeln(Nilai A Sebelum Memanggil Procedure Ganda = , A);
Ganda(A);
Writeln(Nilai A Setelah Memanggil Procedure Ganda = , A);
End.
Setelah program dijalankan, kita mendapat hasil sebagai berikut :
Nilai A Sebelum Memanggil Procedure Ganda = 14
Nilai A Setelah Memanggil Procedure Ganda = 28
Contoh 5.4 Menggambar Garis dengan Transfer by Value
Var a : Char;
Procedure Garis( X : Char);
Var i : Integer;
Begin
For i := 1 to 10 Do Write(X);
End;
Begin
Write(Jenis Karakter Garis [ - + = > < ] : ); Readln(a);
Garis(a);
End.
Hasilnya adalah :
Jenis Karakter Garis [ - + = > < ] : +
++++++++++

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma
Pada contoh diatas,

79
X disebut parameter formal, sedangkan a yang berada sebagai

argumen pada procedure pemanggil disebut parameter aktual. Meskipun variabel a berada
didalam parameter aktual, tetapi yang ditransfer adalah nilai dari variabel a tersebut yaitu
karakter '+'.

Oleh karena itu pemanggilan procedure garis bisa dilakukan langsung

memasukan nilai sebagai parameter aktual, yaitu :


Contoh 5.5 Menggambar Garis Transfer Nilai Langsung;
Procedure Garis( X : Char);
Var i : Integer;
Begin
For i := 1 to 10 Do Write(X);
End;
Begin
Garis(+);
End.
Contoh 5.6 Transfer parameter by location
Var x, y, p, q : Integer;
Procedure Hitung(x,y:Integer; var p,q:Integer);
Begin
p := x + y ; q := x * y;
End;
Begin
Wrie(Masukan Nilai untuk X dan Y : ); Readln(x,y);
Hitung(x,y,p,q);
Writeln(x, ' + ',y,' = ', p);
Writeln(x, ' x ', y,' = ', q);
End.
Hasil program diatas :
Masukan Nilai untuk X dan Y : 4 5
4+5 =9
4 x 5 = 20

UNIVERSITAS BINA NUSANTARA

80

Logika-Algoritma

Perbedaan sintaks, antara transfer by value dengan transfer by location, dilihat dari adanya
kata terlindung var sebelum variabel yang digunakan dalam transfer by location. Dengan
demikian, terjadi transfer by value pada x ,y dan transfer by location pada p,q.
Kekeliruan dapat terjadi karena lupa menuliskan kata var untuk variabel yang akan digunakan
dalam transfer by location.
Contoh 5.7 dibawah ini, memberikan gambaran sederhana, bagaimana kekeliruan terjadi.
Program Lupa;

Program TidakLupa;

Var X,Y : Integer;

Var X,Y : Integer;

Procedure Tukar(A,B:Integer);

Procedure Tukar(Var A,B:Integer);

Var C : Integer;

Var C : Integer;

Begin

Begin

C := A; A := B; B := C;

C := A; A := B; B := C;

End;

End;

Begin

Begin

X := 10 ; Y := 30 ;

X := 10 ; Y := 30 ;

Tukar(X,Y);

Tukar(X,Y);

Writeln('X = ',X,' Y = ',Y);

Writeln('X = ',X,' Y = ',Y);

End.

End.

Hasilnya :
X = 10 Y = 30

X = 30 Y = 10

Pada kedua procedure tukar, kiri maupun kanan, terjadi pertukaran nilai variabel, nilai
variabel a akan berada di b, dan sebaliknya nilai variabel b berada di a. Tetapi pada
parameter formal, yang berada di pengguna,

terjadi perbedaan,

untuk procedure tukar

sebelah kiri tidak terjadi perubahan pada nilai-nilai variabel, sedangkan pada procedure tukar
sebelah kanan terjadi perubahan, yaitu nilai-nilai variabel sudah dipertukarkan. Ini
dikarenakan procedure tukar sebelah kiri menggunakan transfer by value, yang sifatnya satu
arah, sedangkan procedure tukar sebelah kanan menggunakan transfer by location, yang
sifatnya dua arah, sehingga perubahan atau pertukaran nilai

didalam procedure dapat

dirasakan oleh pemanggil atau pengguna.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

81

5.4. Function
Struktur function :
function <identifier function> (<daftar parameter>) : <tipe data>;
< deklarasi variabel, konstanta, tipe data, procedure atau function >
begin
<statemen 1>
<statemen 2>
. . .
<statemen N>
end;
Function, dirancang untuk mengembalikan hanya satu nilai, nilai ini dikembalikan melalui
identifier function, oleh karena itu identifier function berfungsi ganda, yaitu pertama sebagai
nama function, dengan nama tersebut function tersebut di panggil atau digunakan, fungsi
yang kedua adalah sebagai variabel, kedalam variabel tersebut function mengembalikan nilai
hasil pengolahan didalam dirinya. Oleh karena itu identifier function harus dideklarasikan
untuk suatu tipe data tertentu. Daftar parameter digunakan untuk mentransfer data dari luar
(data import). Walaupun demikian tidak dilarang untuk mentransfer data keluar (data export)
melalui daftar parameter, tetapi kegunaan function menjadi rancu.

Program Utama
Atau
Procedure / Function Lain
Side
Effect
Nama Function

Argumen

Function

Gambar 5.5 Side Effect dalam Function

UNIVERSITAS BINA NUSANTARA

82

Logika-Algoritma

Contoh 5.8 Menyelesaikan persamaan y = x a


ln y = ln xa = a. ln x
maka y = e(a.ln x)
didalam Pascal dikenal function standar ln(x) dan exp(x) , sehingga mereka dapat digunakan
dalam function berikut ini :
Var x : Real; a: Integer;
Function x_pangkat_a(x,a:Integer):real;
Begin
x_pangkat_a := exp(a*ln(x));
End;
Begin
Writeln(Perhitungan x pangkat a);
Writeln;
Write(x = ); Readln(x);
Write(a = ); Readln(a);
Writeln(x:3:1, pangkat , a, = , x_pangkat_a(x,a):6:3) ;
End;
Setelah program dijalankan, hasilnya adalah :
Perhitungan x pangkat a
x = 2.5
a=3
2.5 pangkat 3 = 15.625
Perhatikan, bahwa identifier function selalu digunakan dalam statemen assignment, karena
melalui identifier itulah, nilai yang diolah akan dikirim kembali kepada pemanggil.
Contoh 5.9 Menghitung factorial : n!
Perhitungan faktorial N atau N! adalah N * (N-1) * N(-2) * . . . * 1
5! = 5 * 4 * 3 * 2 * 1

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

83

function fact(n:integer):integer;
var x,y:integer;
begin
if n <= 1 then fact := 1
else begin
y := 1;
for x := 2 to n do y := x * y;
fact := y;
end
end;

Contoh 5.10 Menguji apakah suatu bilangan, N adalah prima.


Algoritma 5.1 Bilangan Prima
1. Bila N = 1, maka N bukan bilangan prima, selesai
2. Bila N = 2, maka N adalah prima, selesai
3. Bila N > 2 maka lakukan langkah langkah berikut :
3.1. Untuk setiap X yang berada : 1 < X < N, uji apakah
X merupakan pembagi dari N
3.2. Bila ada X, sebagai pembagi dari N maka N bukan
prima, bila tidak ada, maka N adalah prima.
Untuk menyatakan bahwa X adalah pembagi bilangan N, digunakan
N mod X = 0,
maka langkah 3 dapat dituliskan dengan statemen-statemen berikut :
Sementara, N adalah prima;
For X := 2 to N-1 do
If (N mod X = 0)
Then N bukan prima;
Teknik seperti ini menurut Savitch(1987) disebut :
guilty-until-proven-innocent
yaitu diperlukan pengujian seluruh bilangan X hingga dibuktikan bahwa N bukan prima.

UNIVERSITAS BINA NUSANTARA

84

Logika-Algoritma

Bila identifier function diberi nama Prima, maka :


Prima := true;
for X := 2 to N-1 do
if (N mod X = 0)
then Prima := false;
dan function selengkapnya adalah :
Function Prima(N:integer):boolean;
Var X : integer;
Begin
Case N of
1 : Prima := False;
2 : Prima := True;
else begin
Prima := true;
for X := 2 to N-1 do
if (N mod X = 0) then Prima := False
end
End;
End;

5.5. Procedure dan Function Standar


Pascal telah menyediakan beberapa procedure dan function, dimana pemrogram dapat
menggunakan untuk mempercepat penyelesaian, banyaknya procedure dan function didalam
bahasa Pascal berbeda dari satu versi ke versi lainnya.

5.5.1 Procedure Standar


Procedure-procedure standar yang telah digunakan sampai saat ini adalah :
Read( ) dan Readln( )
Write( ) dan Writeln( )
TURBO Pascal procedure : GotoXY( ), ClrScr dan AssignCRT.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

85

Beberapa procedure standar yang lain akan dibahas pada bab yang berkaitan dengan itu,
misalnya new dan dispose akan dibahas pada bab pointer, sedangkan procedure reset dan
rewrite akan dibahas pada bab tentang file. Perlu diketahui bahwa banyak procedure yang
telah dibuat oleh TURBO Pascal jauh melebihi Pascal Standar, secara kelompok dapat
ditunjukkan, diantaranya adalah :
- Pengolahan File dan Pointer
- Pengolahan String dan Numerik
- Pengolahan Grafik
- Pengolahan System Operasi (DOS)
5.5.2. Function Standar
Function standar yang telah digunakan sampai saat ini adalah :
Round(X) : Untuk mendapatkan nilai pembulatan bilangan real X, dan hasilnya
berupa bilangan integer.
Ln(X) : menghitung nilai natural log dari X atau loge(X)
Exp(X) : menghitung eX
Ord(X) : mendapatkan ordinality (No. Urut) dari suatu elemen/objek
Pred(X) : mendapatkan elemen sebelum elemen X
Succ(X) : mendapatkan elemen setelah elemen X
Sqr(X) : menghitung X2
Sqrt(x) : menghitung akar X
Function standar lainnya adalah :
Sin(X) : menghitung sinus x, x : integer atau real , hasilnya tipe real dalam radian
Cos(X) : menghitung cosinus x, x integer atau real , hasilnya tipe real dalam radian
ArcTan(X) : menghitung arctangent x, x : integer atau real , hasilnya tipe real
dalam radian
Trunc(X) : menghasilkan bagian integer dari x

UNIVERSITAS BINA NUSANTARA

86

Logika-Algoritma
Abs(X) : menghasilkan nilai absolut dari x
Chr(X) : menghasilkan karakter dari tabel ASCII dengan no. urut X.

Contoh 5.11. Menghitung Log(X)

log(a ) = f . ln(a )

f =

log(a) log(10)
1
=
=
= 0.4342945
ln(a)
ln(10) ln(10)

Function Log(X:Real):Real;
Begin
Log := Ln(X) * 0.4342945;
End;

Contoh 5.12. Menghitung Sin(X), X dalam derajat

R1
X
R2

Radian adalah sudut X yang diapit oleh jejari R1 dan R2 dengan busur B, dimana
R1, R2 dan busur B sama panjang. Karena Function Sin(X), menghitung sinus
dengan argumen dalam radian, maka untuk menghitung sinus dengan argumen
dalam derajat, maka x harus dikalikan dengan 0.0175 atau akan lebih presisi
bila dikalikan dengan /180.
Function Sinus(X : Real):Real;
Begin
Sinus := Sin(X*Pi/180);
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

87

Contoh 5.13. Menggambar Spiral


Mengambar Lingkaran umumnya dilakukan dengan menggunakan persamaan polar :
X = XP + R.Cos()
Y = YP + R.Sin()
Dengan : sudut dalam radian dari 0 hingga 2
R : Jejari
XP,YP : Titik Pusat Lingkaran
Karena panjang busur = R. dan R = konstan maka titik-titik yang dihasilkan dari persamaan
polar ini akan mempunyai jarak yang sama (spasi yang sama).
Program spiral merupakan variasi dari bentuk lingkaran, dimana bentuk spiral ini dibuat
dengan menaikan panjang jejari sambil memperbesar sudut polarnya.
Program Spiral;
Uses CRT;
Const AspectRatio = 2.5;
Var Theta,Jejari : Real;
Procedure PlotSpiral(Jejari,Theta:Real);
Var X,Y:Real;
Begin
X := Jejari * Cos(Theta)*AspectRatio;
Y := Jejari * Sin(Theta);
GotoXY(Round(40+X),Round(14+Y)); Write('*');
End;
BEGIN
ClrScr;
Jejari := 1;
Theta := 0;
Repeat
Jejari := Jejari + 0.1; Theta := Theta + 0.2;
PlotSpiral(Jejari, Theta);
Until Jejari > 14;
END.

UNIVERSITAS BINA NUSANTARA

88

Logika-Algoritma

Soal-soal
1.

Laksanakan contoh 1.1 pada halaman 8, dengan menggunakan procedure dan atau
function. Gunakan variabel global

2.

Sama seperti soal no. 1, tetapi gunakan variable lokal dan daftar parameter.

3.

Laksanakan contoh 1.2 pada halaman 9, dengan menggunakan procedure dan atau
function. Gunakan variabel global

4.

Sama seperti soal no. 3, tetapi gunakan variable lokal dan daftar parameter.

Tulis kembali program persamaan kwadrat yang terdapat pada halaman 62 dengan
menggunakan procedure atau function dan menggunakan daftar parameter.

6. Buat function untuk mengembalikan nilai terbesar dari tiga nilai yang diberikan.
Function Terbesar(N1,N2,N3:Integer):Integer;
7.

Perbaiki pemanggilan Procedure/Function berikut :


Procedure ABC(Var X:Integer); Dipanggil dengan : ABC(5); ABC(X+1);
Procedure XYZ(M:Integer); Dipanggil dengan : XYZ(5.1); XYZ(P/Q);
Function OK(X:Real):Boolean;
Dipanggil dengan Write(OK(10 div 3));
If OK(Selesaikan) Then .

8. Buat Function untuk menghitung ArcSin(X), Tan(X).


9. Buat Program untuk menggambar lingkaran seperti dijelaskan pada contoh 5.13

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

89

6. ARRAY

Dalam beberapa permasalahan seringkali diperlukan variabel-variabel untuk diolah secara


bersamaan, misalkan ada empat variabel: A, B, C dan D, hendak dijumlahkan dan nilainya
masuk ke variabel X. Maka dengan mudah dibuat statemen berikut :
X := A + B + C + D ;
Bila ada 10 data, maka cara penyimpanan dan penjumlahan data seperti diatas tentunya
tidak efisien karena statemen diatas menjadi panjang sekali. Demikian pula bila data tersebut
hendak dibuat urutan, maka akan sulit sekali mengolahnya. Notasi matematis memecahkan
masalah ini dengan menggunakan variabel berindeks, jadi bila ada 10 variabel yang hendak
dijumlahkan, digunakan notasi berikut :
X := A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10
dengan notasi variabel berindeks ini, notasi penjumlahan dapat disederhanakan menjadi :
10

X = AI
I =1

Bahasa Pascal dan bahasa pemrograman lainnya meniru konsep variabel berindeks dengan
tipe data terstruktur array. Dengan array, maka n data akan disimpan secara terstruktur
sehingga pengolahan dapat dilakukan secara kolektif, dengan tidak meninggalkan sifat
individunya, sehingga secara elementer, data dapat diolah satu per satu secara acak.

Nama Array

Indeks

A[I]
Variabel Berindeks
Gambar 6.1. Anatomi Struktur Array

UNIVERSITAS BINA NUSANTARA

90

Logika-Algoritma

Secara kolektif, array dicapai dengan nama array A, secara elementer, atau individu, dicapai
dengan variabel berindeks A[I]. Indeks I, harus bertipe ordinal, digunakan untuk menyatakan
kedudukan elemen didalam struktur array. Hubungan antar data didalam array, dinyatakan
dengan hubungan indeks. Lebih lanjut lagi array dapat

dideklarasikan untuk berbagai

dimensi : dimensi satu, dan multidimensi (dimensi dua, tiga, dsb).

6.1. Array Dimensi Satu


Array dimensi satu dideklarasi sebagai berikut :
var <nama arrayl> : array [ <rentang indeks>] of <tipe data>;
atau definisikan dahulu suatu identifier sebagai tipe array
type <identifier tipe aray> = array [ <rentang indeks>] of < tipe data>;
kemudian gunakan identifier tipe array untuk mendeklarasikan variabel :
Contoh :

Type ARR1 = array[1..10] of integer;


Var A : ARR1;

Dengan adanya deklarasi diatas, maka telah dialokasikan tempat di memori yang dapat
digambarkan sebagai berikut :

A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]
Gambar 6.2 Struktur Array di Memori
Mengisi data ke elemen array dilakukan dengan penyerahan (assignment) suatu nilai ke
variabel berindeks :
A[4] := 27; dan A[7] := 15 ;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

91

27

15

A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]
Gambar 6.3. Pengisian Data pada Elemen Array A
Pengisian seluruh elemen didalam array A dapat dilakukan dengan procedure baca data:
Procedure Baca_Data(Var A:ARR1);
Var i : integer;
Begin
for i := 1 to 10 do
begin
write('Masukan data ke ',i,' : ');
readln(A[i]);
end;
End;
Bila data yang dimasukan secara berurutan adalah :
12

45 23

23

67

11

55

maka isi array A :

12

45

23

23

67

11

55

A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]
Gambar 6.4 Pengisian Seluruh Elemen Array A
Bila elemen A[3] dan A[9] hendak ditampilkan di layar monitor, digunakan statemen:
Write(A[3]);

atau

Writeln(A[9]);

UNIVERSITAS BINA NUSANTARA

92

Logika-Algoritma

Statemen :

A[3] := A[2] * A[9] akan menghasilkan keadaan array A seperti gambar dibawah

ini.
12

16

23

23

67

11

55

A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]
Gambar 6.5 Keadaan Array A Setelah Perkalian Antar Elemen

Contoh 6.1. Evaluasi Polinom


Suatu polinom berderajat n :
Evaluasi pada titik xi dapat dilakukan secara langsung dengan algoritma
berikut :
Algoritma 6.1 Evaluasi Polinom
Input

: Koefisien p(x) didalam array A, X dan n 1

Output : P, nilai dari p(x)


P := A[0] + A[1] * X;
XPower := X;
For I := 2 to n Do
Begin
XPower := XPower * X
P := P + A[I] * XPower;
End;
Algoritma diatas memerlukan 2n perkalian dan n penjumlahan.
Apakah ada cara yang lebih baik ?
Jawabannya : ada !, coba perhatikan cara evaluasi :
a.b + a.c
yang terdiri dari 2 perkalian dan 1 penjumlahan, sekarang ekspresi diubah menjadi a(b + c)
dan ternyata hanya diperlukan 1 penjumlahan dan satu perkalian. Metoda Horner
menggunakan prinsip diatas, sehingga evaluasi polinom dapat dilakukan dengan faktorisasi
p, seperti contoh berikut :

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

93

6x3 + 3x2 + 2x + 10 menjadi :


((6x + 3)x + 2)x + 10
Maka secara umum dapat ditulis :
p(x) = [(anx + an-1) x + an-2) x + + a1] x + a0
sehingga sekarang hanya diperlukan n perkalian dan n penjumlahan.
Algoritma 6.2 Algoritma Evaluasi Polinom, Metoda Horner
: Koefisien p(x) didalam array A, X dan n 1

Input

Output : P, nilai dari p(x)


P := A[n];
For I := n-1 down to 0
Do P := P * X + A[I];
Program evaluasi polinom dengan metoda Horner selengkapnya :
Program Evaluasi_Polinom;
Const n = {diisi sendiri};
Type koef = real ;
AK = Array [0..n] of koef;
Var A : AK;
X : Integer;
Procedure Isi_Koef(Var A:AK);
Var I : Integer;
Begin
For I := 0 to n Do
Begin
Write('Koefisien ',I,' : '); Readln(A[I]);
End;
End;

UNIVERSITAS BINA NUSANTARA

94

Logika-Algoritma
Procedure Eval(A:AK; n:Integer; X:Integer; Var P : Real);
Var I : Integer;
Begin
P := A[n];
For I := n-1 down to 0 Do
P := P * X + A[I];
End;
Begin
Isi_Koef(A);
Write(' X : '); Readln(X);
Eval(A,n,X,P);
Writeln('P(',X,') : ', P:8:2);
End.

Contoh 6.2. Evaluasi Curah Hujan


Dari data curah hujan di kota Abe untuk tahun 1992, akan diolah sedemikian rupa sehingga
dapat di tampilkan :
Rata-rata curah hujan selama tahun tersebut
Bulan dimana terjadi curah hujan terendah
Bulan dimana terjadi curah hujan tertinggi
Tabel 6.1 Data Curah Hujan
Jan

Peb

Mar

Apr

Mei

Jun

Jul

Ags

Sep

Okt

Nop

Des

171

179

154

108

93

62

15

63

75

86

117

143

TURBO Pascal melengkapi deklarasi konstanta dengan apa yang dinamakan


Typed Constant
yang berfungsi sebagai variabel yang diisi mula atau initialized variabel.
Contoh :
Const X : Integer = 345;
M : Array[1..2] of String[5] = ( 'HIDUP' , 'MATI' );

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

95

Dalam pemrograman untuk mengolah data curah hujan, type constant akan digunakan untuk
menyimpan data.
Const
AH : Array[1..12] of integer = (171,179,154,108,93,62,15,63,75,86,117,143);
Mencari nilai-nilai minimum dan maksimum dari suatu daftar yang berisi N data,
Algoritma 6.3 Mencari Nilai Minimum
1. Min Maxint , Min diisi nilai terbesar.
2. Untuk setiap X : 1 X N
bila X < Min maka Min X
Algoritma 6.4 Mencari Nilai Maksimum
1. Max 0 , Max diisi nilai terkecil.
2. Untuk setiap X : 1 X N
bila X > Max maka Max X
Program selengkapanya :
Program Curah_Hujan;
Type

AH = array [1..12] of integer;

Const A : AH = (171,179,154,108,93,62,15,63,75,86,117,143);
Var Max, Min : Integer;
Function Minimum(X:AH):Integer;
Var I, Min: integer;
Begin
Min := Maxint;
For I := 1 to 12 do
if X[I] < Min then Min := X[I];
Minimum := Min;
End;

UNIVERSITAS BINA NUSANTARA

96

Logika-Algoritma
Function Maksimum(X:AH):Integer;
Var I, Max: integer;
Begin
Max := 0;
For I := 1 to 12 do
if X[I] > Max then Max := X[I];
Maksimum := Max;
End;
Function Rerata(X:AH):real;
Var I, J : integer;
Begin
J := 0;
For I := 1 to 12 do J := J + X[I];
Rerata := J / 12;
End;
Begin
Min := Minimum(A);
Writeln('Curah hujan minimum : ',min,' mm');
Max := Maksimum(A);
Writeln('Curah hujan maksimum : ',max,' mm');
Writeln('Rerata curah hujan tahun 1992 : ',Rerata(A2):6:2);
End;

Terlihat dari contoh contoh diatas, elemen didalam array dapat dicapai secara acak, artinya
untuk mendapatkan elemen pada indeks 10, tidak harus melalui indeks 1..9, tetapi dapat
langsung ke tujuan. Pencapaian seperti ini disebut random access.
Kekurangan yang bisa dicatat dari struktur array, tipe data untuk seluruh elemen harus sama,
maka dikatakan bahwa tipe data array bersifat homogen.

6.2. Array Multidimensi


Array multidimensi yang paling banyak dipakai adalah array dimensi dua,seperti matriks,
array dimensi dua terdiri dari baris dan kolom, deklarasinya adalah :

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

97

Var <nama array> : array [<rentang indeks baris>,<rentang indeks kolom>]


of <tipe data> ;
atau seperti pada array dimensi satu, definisikan suatu identifier sebagai tipe array dimensi
dua, kemudian gunakan identifier tersebut untuk mendeklarasikan variabel untuk tipe array
dimensi dua.
Contoh : Type AD2 = array [ 1..3, 1..5] of integer;
Var A : AD2;
Dengan adanya deklarasi diatas, maka telah dialokasikan di memori untuk variabel A, dengan
gambaran baris dan kolom.

A[Baris,Kolom]

A[Baris,Kolom]

1
2
3
Gambar 6.6 Struktur Array Dimensi Dua

Contoh 6.3 Penjumlahan dan Perkalian Matriks


Penjumlahan dan perkalian matriks A dengan B, hasilnya disimpan di matriks C.
Pada penjumlahan matriks, A dan B harus berukuran sama, yaitu : baris sama banyak dan
kolom sama banyak, sedangkan pada perkalian dua matriks, banyaknya kolom matriks A
harus sama dengan banyaknya baris matriks B.
Misalkan :
A adalah matriks berukuran : m x p
B adalah matriks berukuran : p x n
C = A x B merupakan matriks berukuran : m x n

UNIVERSITAS BINA NUSANTARA

98

Logika-Algoritma
Algoritma 6.5 Perkalian Matriks
1. j 1
2. Untuk i : 1 i m
p

C [i , j ] = ( A [i , k ]xB [k , j ])
k =1

3. Ulangi langkah 2, untuk j : 1 < j n


4. Selesai
Pada contoh program dibawah ini, digunakan dua matriks berukuran :
Masing-masing : 3 x 3 dan 3 x 3 untuk operasi penambahan
Masing-masing : 3 x 4 dan 4 x 2 untuk operasi perkalian
Program Operasi_Matriks;
Const maks = 5;
Type matriks = array[1..maks,1..maks] of real;
Var A, B, C : matriks;
Procedure Baca_Data(Var X:matriks; b,k:integer);
Var I, J : integer;
Begin
For I := 1 to b do
For J := 1 to k do
begin
write('Baris ,'I',' Kolom ',J,' : '); readln(X[I,J]);
end;
End;
Procedure Tambah(X,Y:matriks; var Z:matriks; b,k:integer);
Var I, J : integer;
Begin
For I := 1 to b do
For J := 1 to k do
begin
Z[I,J] := X[I,J] + Y[I,J];
end;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

99

Procedure Kali(X,Y:matriks; var Z:matriks; p,q,n:integer);


Var I, J : integer;
Begin
for I := 1 to p do
for J := 1 to q do
begin
Z[I,J] := 0;
for K := 1 to n do Z[I,J] := Z[I,J] + X[I,K] * Y[K,J]
end;
End;
Procedure Tampil_matriks(X:matriks; b,k:integer);
Var I, J : integer;
Begin
For I := 1 to b do
begin
for J := 1 to k do write(X[I,J],' '); writeln;
end;
End;
Begin
Baca_Data(A,3,3); Baca_Data(B,3,3);
Tambah(A,B,C,3,3); Tampil(C,3,3);
Baca_Data(A,3,4); Baca_Data(B,4,2);
Kali(A,B,C,3,2,4); Tampil(C,3,2);
End.
Didalam matriks dimensi dua, penulisan variabel berindeks dapat dilakukan dengan dua cara,
yaitu : A[I,J] dan A [I] [J]

Contoh 6.4. Mencetak Spiral.


Berbeda dengan memplot spiral (contoh 5. 13 - hal 87) pada layar monitor, dimana setiap
titik-titik didalam koordinat layar monitor dapat dijangkau dengan perintah GotoXY(X,Y),
sedangkan pada pencetakan titik-titik pada kertas printer tidak dapat dijangkau oleh perintah
GotoXY(X,Y). Oleh karena itu diperlukan bantuan array dimensi dua, untuk mensimulasi
keadaan koordinat layar monitor (lihat gambar 3.1 - hal 43), dengan demikian akan dibuat
deklarasi Array[1..25,1..80] of Char untuk menampung gambar spiral

UNIVERSITAS BINA NUSANTARA

100

Logika-Algoritma
PROGRAM Spiral; {Mencetak Spiral di kertas printer}
Uses CRT,PRINTER;
Const AspectRatio = 1.5;
Type ArraySpiral = Array[1..25,1..80] of Char;
Var Theta,Jejari : Real; A : ArraySpiral;
Procedure InitialisasiArray(Var A:ArraySpiral);
Var I,J:Byte;
Begin
For I := 1 to 25 Do
For J := 1 to 80 Do A[I,J] := ' ';
End;
Procedure IsiArray(Jejari,Theta:Real;Var A:ArraySpiral);
Var X,Y:Real;
Begin
X := Jejari*Cos(Theta)*AspectRatio; Y := Jejari*Sin(Theta);
A[Round(14+Y),Round(40+X)] := '*';
End;
Procedure PlotArraySpiral(Var A:ArraySpiral);
Var I,J:Byte;
Begin
For I := 1 to 25 Do
Begin
For J := 1 to 80 Do Write(LST,A[I,J]); Writeln(LST);
End;
End;
BEGIN
InitialisasiArray(A);
Theta := 0; Jejari := 1;
Repeat
Theta := Theta + 0.2; Jejari := Jejari + 0.1;
IsiArray(Jejari,Theta,A);
Until Jejari > 14;
PlotArraySpiral(A);
END.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

101

6.3. Pengolahan String


Tipe string hanya ada dalam versi TURBO Pascal, pada dasarnya string serupa dengan tipe
array, yaitu array karakter. Perbedaan terletak pada attribute panjang string yang secara
dinamis dapat berubah ketika program sedang berjalan. Dengan adanya attribut panjang ini
maka jumlah byte dalam string menjadi n + 1 byte, dimana n = banyaknya karakter dalam
string atau panjang string, dan 1 byte untuk attribut panjang string.
Karakter dalam string dapat dicapai sama seperti dalam array dimensi satu, yaitu dengan
dengan variabel berindeks, indeks 0 dapat digunakan untuk mencapai attribut panjang.
String diolah dengan mengoperasikan beberapa procedure dan function standar yang telah
disediakan oleh TURBO Pascal.
Misalkan telah dideklarasikan beberapa identifier, seperti :
Type

STR14 = string[14];

Var

S1, S2, S3 : STR14;


C : char;
L, P : integer;

Kemudian string S1 diisi :


S1 := BANK NUSANTARA ;
14

S1

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

Gambar 6.7 String S1


Beberapa function yang khusus disediakan untuk mengolah atau mengoperasikan tipe string
adalah :
Function Length(S);
Mengembalikan nilai, berupa panjang string yang berada di string S.
Contoh : L := Length(S1); maka isi L = 14.
Function Copy(S,P,N);
Mengembalikan nilai string sebanyak N karakter dari string S, mulai dari posisi P.
Contoh : S2 := Copy(S1, 6, 4), maka isi S2 = 'NUSA';

UNIVERSITAS BINA NUSANTARA

102

Logika-Algoritma

Function Pos(Objek,S);
Mengembalikan nilai, berupa posisi Objek dalam string S.
Contoh : P := Pos('NUSA',S1), maka isi P = 6;
P := Pos('A',S2), maka P = 4, posisi 'A' yang pertama.
Function Concat(S1,S2,...,SN);
Mengembalikan nilai string, hasil penyambungan string S1,S2, SN.
Contoh : Bila S2 := 'GUNUNG'; dan S3 := ' PUTRI';
maka statemen S2 := CONCAT(S2,S3); akan menghasilkan
S2 = 'GUNUNG PUTRI'.
Function Concat sama dengan S2 := S2 + S3.
Perhatikan bahwa dengan function Copy(), dapat di ambil satu atau beberapa karakter, tetapi
nilai yang dikembalikan berupa string, walaupun yang diambil hanya satu karakter, maka
statemen seperti :
C := Copy(S,1,1);
akan menyebabkan kesalahan 'Type Mismatch' , karena C dideklarasikan sebagai tipe Char.
Untuk itu, gunakan variabel berindeks :
C := S[1];

maka isi variabel C = 'B'.

C := S[6];

menghasilkan C = N .

Pascal juga melengkapi pengolahan string dengan beberapa procedure


Procedure Delete(S,P,N);
Menghilangkan sebanyak N karakter, mulai dari posisi P dari string S.
Contoh : Delete(S1,6,3) akan menjadikan string S1 seperti gambar
dibawah ini :
11

S1

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

Gambar 6.8 String S1 Setelah Delete(S1,6,3)

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

103

Procedure Insert(Objek,S,P)
Kebalikan dari procedure delete, disini objek berupa ekspresi string
disisipkan ke string S, di posisi P.
Contoh : Insert('TIK ',S1,11); akan menjadikan string S1 seperti tampak pada
gambar 6.9 :
14

S1

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

Gambar 6.9 String S1 Setelah Insert('TIK ',S1,11)


Procedure Str(N,S)
Mengubah (konversi) nilai numerik dalam variabel N, menjadi tipe String dan disimpan di
variabel S.
Contoh : Misal N = 345, statemen Str(N,S) akan menghasilkan S = '345'.
Procedure Str ini juga menampung nilai N, dengan perintah format
Contoh : Str(N:5,S), akan menyebabkan S = ' 345'.
Fasilitas format seperti ini berlaku pula untuk bilangan real.
Contoh : Str(N:6:2,S), akan menyebabkan S = '345.00.
Procedure Val(S,N,Er)
Sebaliknya dari procedure Str(), disini data numerik yang disimpan di variabel S sebagai
tipe string, diubah menjadi numerik (integer atau real) hasilnya disimpan di variabel N.
Variabel Er akan menampung

kode konversi, bila tidak ada kesalahan dalam konversi

maka variabel Er ( yang bertipe integer) akan bernilai 0, bila terjadi kesalahan konversi
variabel Er akan bernilai 1.

Contoh 6.5 Palindrom.


Untuk memberikan gambaran tentang pengolahan string, berikut ini akan dibuat program
untuk menentukan apakah suatu string bersifat PALINDROM.
dimana susunan karakter didalamnya simetris, contoh
TAMAT = Palindrom
KASUR KAKAK RUSAK = Palindrom
MAKAN = Bukan Palindrom

UNIVERSITAS BINA NUSANTARA

Palindrom adalah string

104

Logika-Algoritma
Algoritma 6.6 Palindrom
1. Baca string ke variabel S
2. L Length(S)
3. Untuk setiap i diantara : 1 I (L div 2) , dan
setiap j diantara : L j (L div 2)
bila S[i] <> S[j], maka S bukan palindrom.

Program Palindrom selengkapnya :


Program Palindrom;
Uses CRT;
Type STR30 = String[30];
Var S : STR30;

P : Boolean;

A : Char;

Procedure Analisis(S:STR30; var Pal : boolean);


Var I,J : integer;
Begin
J := Length(S); Pal := true;
For I := 1 to (J div 2) do
Begin
If S[I] <> S[J] Then Pal := false;
J := J - 1;
End;
End;
Begin
Write('TERUSKAN (Y/T) ? '); readln(A);
While upcase(A) = 'Y' do
Begin
Write('Masukan String (max 30 karakter ) :'); Readln(S);
Analisis(S,P);
If P Then Writeln(' PALINDROM') Else Writeln(' BUKAN PALINDROM');
Write('TERUSKAN (Y/T) ? '); Readln(A);
End;
End.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

105

Bila program Palindrom dijalankan, tampak dialog berikut :


TERUSKAN (Y/T) ? Y
Masukan String (max 30 karakter ) : Makam PALINDROM
TERUSKAN (Y/T) ? Y
Masukan String (max 30 karakter ) : Malam PALINDROM
TERUSKAN (Y/T) ? Y
Masukan String (max 30 karakter ) : Makan BUKAN PALINDROM
TERUSKAN (Y/T) ? T

UNIVERSITAS BINA NUSANTARA

106

Logika-Algoritma

Soal-soal

1.

Buat program untuk tabel yang memuat konversi dari derajat F ke derajat C setiap 1 oF
mulai dari 0 oF hingga 120 oF, rumus konversi adalah :
C = 5/9 (F-32)

2. Buat program untuk mengolah data dalam tabel personil seperti berikut :
Nama

Umur

Jabatan

Gaji

Status

(ribuan)
Sumarno Prawiro

36

Kepala Seksi

2,000

K-3

Iwan Setiawan

33

Wakil Ka. Seksi

1,500

K-2

Lydia Sutanto

26

Sekretaris

750

Lukas Silahatua

24

Programer

950

Akhmad Chusaeni

32

Engineer

1,100

K-3

Putu Wardana

35

Teknisi Senior

1,000

K-4

Mahmud Junaedi

29

Teknisi

900

K-2

Sukanto

22

Pembantu Teknisi

650

Wiryawan

38

Pesuruh

450

K-1

a. Mencari umur pegawai tertua dan rata-rata umur pegawai


b. Mencari pegawai yang masih lajang (single)
c. Mencari pegawai dengan anak terbanyak
3. Buat program untuk tabel sinus dan cosinus untuk sudut : 0, 5, 10, ... , 900
4. Apa yang dimaksud (jelaskan dengan kata-kata sendiri) dengan sifat :
a. Random Access
b. Homogen
didalam type data terstruktur array ?.
5. Didalam soal no 1 diatas, akan terjadi konversi dari string ke numerik, pada kolom yang
mana dari tabel tersebut diatas diperlukan konversi.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

107

7. RECORD
Pada bab sebelumnya telah dibahas tentang tipe data terstruktur array, kekurangan dari tipe
data ini adalah sifat homogenitasnya, sehingga data pegawai pada soal No.2 - bab 6 yang
lalu, terpaksa harus ditampung dalam beberapa array. Pascal melengkapi tipe data
terstruktur dengan tipe record, dimana beberapa komponen dengan tipe data yang berbeda
dapat dihimpun dalam struktur tipe record. Dengan demikian record bersifat heterogen.

7.1. Pendefinisian Tipe Record


Type

<identifier tipe record> = record


<identifier field1> : <tipe data 1>;
<identifier field2> : <tipe data 2>;
...
<identifier fieldN> : <tipe data N>
end;

Var <identifier variabel record> : <identifier tipe record>


Komponen didalam struktur record disebut field. setiap field dapat dideklarasikan untuk tipe
data yang berbeda. Contoh Deklarasi :
Type RMahasiswa = Record
Nama : String;
NIM : String;
Nilai : Real;
End;
Var X : RMahasiswa;
Tipe record tidak hanya digunakan untuk deklarasi variabel tunggal, tetapi sering digunakan
bersama-sama denga tipe array atau tipe pointer. Misalkan ada 80 mahasiswa dalam suatu
kelas, maka dibuat deklarasi array of record.
Var M : Array[1..80] of RMahasiswa;

atau

Type ARM = Array[1..80] of RMahasiswa;


Var M : ARM;

UNIVERSITAS BINA NUSANTARA

108

Logika-Algoritma

Variabel Record

Variabel Field

X[I].F

X.F

Variabel Record
Berindeks

Field Designator

Gambar 7.1 Anatomi Struktur Record

Contoh 7.1 Operasi Bilangan Kompleks


Bilangan kompleks terdiri dari bilangan nyata dan khayal dengan notasi misalnya : a + bi
dengan i =

1 , a adalah bagian nyata dan b adalah bagian khayal.

Operator bilangan khayal adalah : kali, bagi, tambah dan kurang.


Misalkan ada dua bilangan kompleks :
X = a + bi

dan

Y = c + di

Operasi Tambah
X + Y = (a + bi) + (c + di) = (a + c) + (b + d)i
Operasi Kurang
X + Y = (a + bi) - (c + di) = (a - c) + (b - d)i
Operasi Kali
X .* Y = (a + bi) * (c + di) = ( a*c - b*d) + (a*d + b*c) I
Operasi Bagi
a.c + b.d

c.b - d.a

X / Y = (a + bi) / (c + di) = ------------- + -------------- i


c2 + d2

c2 + d2

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

109

Dengan mengetahui operasi bilangan kompleks seperti diatas, sekarang kita siap untuk
menulis program penambahan dua bilangan kompleks, dengan terlebih dahulu membuat
deklarasi untuk tipe kompleks.
Type kompleks = record
Re : Real; {bagian nyata (real)}
Im : Real; {bagian khayal(imaginer)}
end;
Var X,Y,Z : kompleks;
Procedure Tambah(X,Y:kompleks; Var Z : Kompleks);
Begin
Z.Re := X.Re + Y.Re;
Z.Im := X.Im + Y.Im;
End.
Perhatikan bagaimana cara mencapai field didalam record, Re dan Im adalah field-field yang
harus dicapai dengan sintaks :
< identifier variabel-record > . <identifier field >

yaitu :

X.Re, X.Im, Y.Re, Y.Im dan Z.Re, Z.Im

Contoh 7.2 Array of Record_Pegawai


Pada contoh ini akan ditunjukkan bagaimana menggunakan gabungan array dengan record
dalam bentuk : array of record. Procedure-procedure yang dibuat disini adalah procedure
untuk masukkan data pegawai dan procedure untuk mencari pegawai dengan umur tertua.
Type

Rec_pers = Record
nama : string[30];
umur : 1..60;
jabatan : string[15];
gaji

: real;

status : string[3];
End;
Arr_rec = Array[1..9] of Rec_pers;

UNIVERSITAS BINA NUSANTARA

110

Logika-Algoritma
Var Personil : arr_rec; Indeks : Byte;

Dengan deklarasi diatas kita dapatkan bentuk array of record Pegawai :


Struktur Record
Nama

Umur

Jabatan

Gaji

Status

Struktur Array [1..9]

(ribuan)
Sumarno Prawiro

36

Kepala Seksi

2,000

K-3

Iwan Setiawan

33

Wakil Ka. Seksi

1,500

K-2

Lydia Sutanto

26

Sekretaris

750

Lukas Silahatua

24

Programer

950

Akhmad Chusaeni

32

Engineer

1,100

K-3

Putu Wardana

35

Teknisi Senior

1,000

K-4

Mahmud Junaedi

29

Teknisi

900

K-2

Sukanto

22

Pembantu Teknisi

650

Wiryawan

38

Pesuruh

450

K-1

Gambar 7.2. Array of Record Pegawai

Setelah deklarasi array of record, seperti dilakukan sebelumnya, berikut adalah penggalan
program, berupa procedure mengisi array of record dan procedure untuk mencari umur
pegawai yang paling tua.
Procedure Baca_Data(Var P:arr_rec) ;
Var I : Integer;
Begin
For I := 1 to 9 Do
Begin
Write('Nama

: '); Readln(P[I].nama);

Write('Umur

: '); Readln(P[I].umur);

Write('Jabatan

: '); Readln(P[I].jabatan);

Write('Gaji :

'); Readln(P[I].gaji);

Write('Status

: '); Readln(P[I].status);

End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

111

Procedure Umur_Tertua(P:Arr_rec; Var Indeks:byte);


Var I,Maks : Integer;
Begin
Maks := 0;
For I := 1 to 9 Do
Begin
If P[I].Umur > Maks
Then Begin
Maks := P[I].Umur;
Indeks := I;
End;
End;
End;
BEGIN
Masukan_Data(Personil);
Umur_Tertua(Personil,Indeks);
Writeln(Pegawai Tertua adalah :);
Writeln(Personil[Indeks].Nama, Umur : ,Personil[Indeks].Umur);
END.

7.2. Statemen WITH


With adalah kata terlindung, yang digunakan untuk menyingkat penulisan variabel record bila
pemrogram ingin mencapai field.
Sintaks With
With <identifier variabel-record> Do <statemen> atau
With <identifier variabel-record> Do
Begin
<statemen1>; ... <statemen n>;
End;
Procedure Umur_Tertua dapat ditulis kembali dengan menggunakan statemen with.

UNIVERSITAS BINA NUSANTARA

112

Logika-Algoritma
Procedure Umur_Tertua(P:Arr_rec; Var Indeks:byte);
Var I,Maks : Integer;
Begin
Maks := 0;
For I := 1 to 9 Do
With P[I] Do
Begin
If Umur > Maks
Then Begin
Maks := Umur;
Indeks := I;
End;
End;
End;

7.3. Variant Record


Jenis variant record ini meskipun jarang digunakan, tetapi ada baiknya dibahas sebagai
perbandingan terhadap record biasa.

Variant record, adalah record dimana diperlukan

pendefinisian kembali field-field untuk menampung dua atau lebih keinginan yang berbeda
tapi masih dalam satu struktur. Keuntungan dari penggunaan variant record adalah dalam
penghematan memory. Permasalahan yang memerlukan variant record, misalnya record
tentang pasien rumah sakit seperti contoh berikut :
Pasien Rawat-Inap

Pasien Rawat-Jalan

1. Nama

1. Nama

2. Alamat

2. Alamat

3. Umur

3. Umur

4. Ruang

4. Periksa Ulang

5. Diet
Dari daftar diatas, data 1 s/d 3 baik untuk pasien rawat-inap maupun pasien rawat-jalan
mempunyai kesamaan, selebihnya berbeda, seperti pasien opnam memerlukan data ruang
dan diet makanan, sedangkan pasien rawat jalan memerlukan data tentang kapan
pemeriksaan berikutnya. Bila data kedua jenis pasien ini harus dihimpun, maka digunakan
variant record.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

113

Deklarasi yang diperlukan untuk data pasien seperti diatas adalah :


Type pas_rec = record
{Bagian Invariant}
nama : string[30];
alamat : string[35];
umur : 1..150;
{Bagian Variant}
case opnam : boolean of
true : (ruang : string[5];
diet : (gula,garam, normal));
false : (periksaulang : string[8]);
end; { end untuk record }

Beberapa hal penting dari struktur variant record yang perlu diketahui adalah :
Bagian invariant atau bagian tetap yang harus selalu berada dibagian pertama baru
kemudian bagian yang bersifat variant. Dengan kata lain, bagian variant harus berada di
bagian akhir dalam struktur record.
Identifier opnam merupakan tag field sedangkan boolean adalah tipe data dari tag-field
tersebut. Tag-field harus mempunyai tipe data ordinal.
Tag-field adalah field sejati dalam struktur record, ia dapat diperlakukan seperti field-field
lain, maka statemen berikut dapat dibenarkan :
X.opname := true;

atau

with X do
if opname = true
then writeln('Ruangan : ',ruang);
else writeln('Periksa Ulang ; ', periksaulang);
Pencapaian field-field pada bagian varian hanya terjadi setelah tag-field diberikan nilai
tertentu, dalam contoh adalah nilai true atau false, setelah assigment true pada tag-filed
opname, maka field periksa_ulang tidak dapat dicapai (non aktif).
Field-field pada bagian variant, berada didalam tanda kurung.

UNIVERSITAS BINA NUSANTARA

114

Logika-Algoritma

Field pada bagian variant, tidak selalu harus digunakan, seperti :


case opname : boolean of
true : (ruang : string[5];
diet : (gula,garam, normal));
false : ();
Konstruksi Case-of, tidak diakhiri dengan kata terlindung end. Ini disebabkan bagian
variant selalu berada pada bagian paling akhir, sehingga penutup konstruksi case-of
dapat digabungkan dengan penutup konstruksi record itu sendiri.
Bagian variant dapat mengandung variant yang lain.
Misalkan ada beberapa macam tagihan pembayaran untuk pasen yang dinyatakan dalam
definisi tipe data :
Type tipe_tagihan = (pribadi, askes, kontrak);
jenis_cakupan = (A,B,C,D);
-------------------------------------------------------------Case opname = boolean
true : (ruang : string[5];
diet :(gula,garam,normal);
case tagihan : tipe_tagihan of
pribadi : ();
askes : (instansi :string[20];
golongan : string[5]);
kontrak :(perusahaan : string[20];
cakupan : jenis_cakupan));
false : (periksa_ulang : string[8]);

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

115

Soal-soal
1.

Selesaikan program bilangan kompleks (halaman 107), untuk perhitungan kali dan bagi,
juga dilengkapi dengan program utama.

2.

Berikan contoh, bagaimana variant record dapat menghemat memory.

3.

Jelaskan, apa yang dimaksud dengan tag filed, tipe data apa yang dapat digunakan
dalam tag field.

4.

Perhatikan dua buah record dibawah ini :


Type RecordPertama = Record
A : String;
B : Integer;
C : Real;
D : Boolean;
End;
Type RecordKedua = Record
A : Real;
B : Boolean;
C : String;
End;

Identifier A, B dan C yang sudah digunakan didalam RecordPertama sebagai field, digunakan
lagi pada RecordKedua juga sebagai field. Apakah penulisan ini dapat dibenarkan, berikan
penjelasan tentang hal ini.
5. Buat deklarasi dengan menggunakan variant record untuk persoalan berikut :
Disuatu perusahaan terdapat dua golongan pegawai, pertama pegawai tetap yang kedua
adalah pegawai honorer. Data pegawai tetap adalah : nama, umur, jabatan, status kawin
dan gaji, sedangkan data pegawai honorer adalah : nama, umur dan gaji.

UNIVERSITAS BINA NUSANTARA

116

Logika-Algoritma

8. SET
Dalam matematika, set atau himpunan merupakan koleksi dari beberapa objek yang dapat
diklasifikasikan sama, misalnya himpunan alat-alat rumah tangga, himpunan peralatan
elektronik, dan sebagainya. Bahasa Pascal juga melengkapi tipe data dengan tipe Set.

8.1. Pendefinisian Tipe Set


Mendefinisikan tipe Set, seperti biasa dilakukan pada bagian deklarasi, hanya bila diperlukan
dapat didefinisikan terlebih dahulu tipe dasarnya, atau

base type yang sesuai dengan

keperluan, dengan sintaks sebagai berikut :


Pendefinisian Tipe Dasar
Type <tipe dasar> = (objek1, objek2,. . .,objekN); {tipe enumerated}
atau
<tipe dasar> = objek_awal..objek_akhir; {tipe subrange}
Pendefinisian Tipe Set
Type <identifier set> = set of <tipe dasar> ;
Contoh :

Type

warna = (ungu,biru,hijau,kuning,jingga,merah);
set_warna = set of warna;

Bila tipe dasar yang digunakan, merupakan tipe yang sudah baku, maka tipe tersebut dapat
langsung digunakan, seperti dalam contoh berikut :
Type

huruf_kapital = set of 'A'..'Z';


angka = set of 0..9;

Kemudian satu atau beberapa variabel dapat dideklarasikan dengan menggunakan tipe set
diatas :
Var

X : angka;
Y : huruf_kapital;
Z : set_warna;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

117

8.2. Membangun Set


Set dapat dibangun dengan ekspresi yang berada diantara tanda kurung persegi, set kosong
dinyatakan dengan pasangan kurung persegi tanpa ekspresi didalamnya.
Contoh :

X := [] ; variabel set dimulai dengan set kosong;


X := [1];
X := X + [ 7 , 8 , 9 ];

maka isi dari variabel X adalah : himpunan dari angka-angka [1,7,8,9].


Y := [B];
Y := Y + [A, C,F];
Isi dari variabel Y adalah : himpunan dari huruf-huruf [A,B,C,F];.
Dengan cara yang sama variabel Z dapat diisi dan dioperasikan.
Perlu diperhatikan disini bahwa urutan dari nilai-nilai yang berada di suatu variabel tidak
menjadi suatu yang berarti, dua variabel set disebut sama bila masing-masing mempunyai
anggota yang sama, artinya :
['A','B','C'] = ['B','C','A'] = ['C','A','B']
atau [Hijau,Merah,Jingga] = [Jingga,Hijau,Merah]
Pada contoh diatas, suatu elemen dapat dimasukan kedalam variabel set X dengan statemen
assignmen dan operator +, dengan cara yang serupa suatu elemen dapat diambil dari
variabel X dengan operator -, sebagai contoh :
X := X - [8];

anggota himpunan X menjadi : [ 1, 7 , 9 ]

Kedua operator + dan - , dalam TURBO Pascal Versi 7.0 dapat digantikan dengan procedure
Include dan Exclude.
Contoh :

Include(X, 8); sama dengan statemen

X := X + [8];

Exclude(X,7); sama dengan statemen

X := X - [7];

UNIVERSITAS BINA NUSANTARA

118

Logika-Algoritma

8.3. Operator Tipe Set


Ada tiga macam operator yang dapat mengoperasikan variabel tipe set, mereka adalah :
Operator Gabungan (Union) dengan simbol : +
Operator Irisan (Intersection) dengan simbol : *
Operator Selisih (Difference) dengan simbol : -

A+B

A*B

A-B

Gambar 8.1 Diagram Ven Gabungan, Irisan dan Selisih

Operator

+ dan - telah disinggung dalam contoh konstruksi set diatas, sekarang akan

dijelaskan lebih rinci tentang ketiga operator tersebut dengan menggunakan contoh program
berikut :
Type Nama= (Ana,Ani,Budi,Badu,Cintami,Cipluk,Dadang,Dodi,Erna,Erni);
Set_Nama = Set of Nama;
Var

P,Q,R,S,T: Set_Nama;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

119

Begin
{1}

P := [Ana,..,Erni];

{2}

Q := [Ana,Ani,Cintami,Cipluk,Erna,Erni];

{3}

R := P - Q;

{4}

S := R + [Ani,Cipluk];

{5}

T := Q * R ;

{6}

T := Q * S ;

{7}

R := R + [Dodi];

{8}

Q := Q - [Budi,Badu];

End.
Pada baris pertama :
P = [Ana,Ani,Budi,Badu,Cintami,Cipluk,Dadang,Dodi,Erna,Erni].
Pada baris ketiga :
R := P - Q, maka R = [Budi,Badu,Dadang,Dodi]
Pada baris keempat :
S = [Budi,Badu,Dadang,Dodi,Ani,Cipluk]
Pada baris kelima :
T := Q * R, disini T = [] , set kosong, karena tidak ada irisan antara set Q dan set R.
Pada baris keenam :
T := Q * S, disini T = [Ani,Cipluk].
Pada baris ketujuh :
Anggota set R tidak berubah, karena Dodi telah menjadi anggota set R, sehingga
operator + tidak berpengaruh disini.
Pada baris ke delapan :
operator - tidak berpengaruh, karena Budi dan Badu tidak ada dalam keanggotaan
set Q.

8.4. Operator Pembanding


Telah dikatakan diatas, bahwa dua set dikatakan sama bila jumlah anggota dan nilai nilainya
sama, untuk mengetahui apakah dua set sama, digunakan operator pembanding kesamaan.
Operator pembanding tidak hanya menguji kesamaan tapi juga hal lain yang diperlukan
dalam mengolah data tipe set, berikut adalah tabel dari operator pembanding.

UNIVERSITAS BINA NUSANTARA

120

Logika-Algoritma
Tabel 8.1 Operator Pembanding Set
Operator

Contoh :

Operasi

Tipe Hasil

Uji Kesamaan

Boolean

<>

Uji Ketidaksamaan

Boolean

<=

Uji Ketermuatan

Boolean

>=

Uji Ketermuatan

Boolean

Q = R menghasilkan nilai false, karena Q tidak sama dengan R


Q <> R menghasilkan nilai true, karena Q tidak sama dengan R
T <= Q menghasilkan nilai true, karena R termuat di S
P >= R menghasilkan nilai true, karena P memuat R
Sedangkan T+[Budi] <= Q menghasilkan nilai false !

Seperti tampak pada contoh, operator diatas digunakan untuk membandingkan antara satu
set dengan set yang lain, ada satu operator yang sering disalah artikan, yaitu operator uji
keanggotaan, disini tidak membandingkan set dengan set, tetapi menguji apakah suatu
elemen menjadi anggota suatu set, operator tersebut adalah : IN, dan operator inilah yang
paling banyak digunakan.
Contoh

Badu IN P

menghasilkan nilai true

karena Badu anggota P


Ani IN R

menghasilkan nilai false

karena Ani bukan anggota R

8. 5. Contoh Penggunaan Set


Contoh 8.1 Perjalanan Pedagang
Algoritma Perjalanan Pedagang telah dibahas pada bab 1, kita tulis kembali algoritma
tersebut :

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

121

Algoritma Perjalanan Pedagang:


1. Pilih kota awal
2. Pilih kota tujuan selanjutnya, yaitu jalur termurah
3. Ulangi langkah ke 2 sehingga seluruh kota dikunjungi
dan tidak ada kota yang dikunjungi lebih dari sekali.
4. Kembali ke kota awal.
5. Selesai

A
E

Gambar 8. 2. Jalur Antar Kota A-B-C-D-E


Algoritma tersebut akan dilaksanakan dengan menulis program. Data yang terlibat dalam
pemrograman ini adalah :
1. Data ongkos perjalanan dari satu kota ke kota lain
2. Data kota yang telah dan belum dikunjungi
Ongkos perjalanan merupakan tabel, oleh karena itu dengan mudah disimpan dalam struktur
array. Sedangkan data mengenai kota yang telah dan belum dikunjungi, senantiasa berubah
selama program berjalan mengikuti jalur yang dipilih, sesuai dengan algoritma. Untuk akan
digunakan struktur set dengan strategi sebagai berikut :
-

Pada keadaan mula set Kota harus kosong, menyatakan bahwa belum ada kota
yag dikunjungi.

Pada kunjungan kota pertama, maka kota pertama dimasukan kedalam set,
sehingga pada kunjungan berikutnya, tinggal menguji apakah suatu kota telah
berada didalam set Kota, bila ya, berarti kota tersebut telah dikunjungi dan harus
mencari kota lain yang tidak berada didalam set Kota.

Demikian seterusnya, sehingga pada akhirnya pedagang kembali ke kota awal.

UNIVERSITAS BINA NUSANTARA

122

Logika-Algoritma

Dalam pelaksaan ini ongkos untuk setiap jalur bersifat simetris, yaitu ongkos jalur A-B sama
dengan ongkos jalur B-A.
Program Perjalanan_Salesman;
Uses crt;
Type SET_Kota = set of 1..5;
AR2I = array [1..5,1..5] of integer;
Var

jalur : AR2I;
kota : SET_kota;
awal,ahir,kota_awal,ongkos, I : integer;

Procedure Isi_Matrik_Ongkos(var jalur : AR2I);


Var I,J : integer;
Begin
for I := 1 to 5 do
for J := 1 to 5 do
begin
if I = J then jalur[I,J] := 0 else
begin
write(' Biaya dari jalur ',I,'-',J,' = ');
if ((I=2)and(J<2)) or ((I=3)and(J<3)) or
((I=4)and(J<4)) or ((I=5)and(J<5))
then begin
jalur[I,J] := jalur[J,I];
writeln(jalur[I,J])
end else readln(jalur[I,J]);
end;
end;
End;
Procedure initialisasi( var kota : SET_kota;var awal,ongkos: integer);
Begin
write('Kota Awal (1,2,3,4 atau 5) ? '); readln(awal);
kota := [awal]; ongkos := 0;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

123

Procedure Cari_Jalur(jalur : AR2I; var kota : SET1; var awal,ongkos: integer);


Var kota_berikutnya,min,tujuan : integer;
Begin
min := maxint;
for kota_berikutnya := 1 to 5 do
begin
if not(kota_berikutnya IN kota)
then begin
if jalur[awal,kota_berikutnya] < min
then begin
min := jalur[awal,kota_berikutnya];
tujuan := kota_berikutnya;
end;
end;
end;
ongkos := ongkos + min;
writeln('Jalur dipilih : ',awal,'-',tujuan,' dengan ongkos = ',min);
kota := kota + [tujuan]; awal := tujuan;
End;
BEGIN
Isi_matrik_ongkos(jalur);
Initialisasi(kota,awal,ongkos);
Kota_awal := awal;
Writeln('Perjalanan dimulai dari : ',kota_awal);
For I := 1 to 4 do cari_jalur(jalur,kota,awal,ongkos);
Ahir := awal;
Write('Jalur terakhir : ',ahir,'-',kota_awal);
Writeln(' dengan ongkos = ',jalur[ahir,kota_awal]);
Ongkos := ongkos + jalur[ahir,kota_awal];
Writeln('Ongkos total = ',ongkos);
END.
Contoh 8.2 Minimum Spanning Tree
Algoritma Prim adalah salah satu algoritma untuk menyelesaikan masalah 'Minimum
spanning trees', yaitu permasalahan untuk mendapatkan pola jaringan antar tempat,
sedemikian sehingga sehingga didapat jalur-jalur dengan ongkos minimum.

UNIVERSITAS BINA NUSANTARA

124

Logika-Algoritma

Contoh permasalahan misalnya dalam pemasangan jaringan telepon atau jaringan komputer,
dimana panjang kabel penghubung merupakan biaya yang perlu diperhitungkan.
Dalam persoalan ini biasanya dipilih titik awal, dari titik ini akan ditentukan jalur-jalur ke titik
lainnya dengan ongkos minimum dan tentunya dengan jalur yang sesedikit mungkin.
Contoh :

Gambar 8.3. Jaringan yang menghubungkan antar tempat

Gambar 8.4. Beberapa kemungkinan Spanning Trees

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

125

Algoritma 8.1 Prim untuk menyelesaikan 'Minimum Spanning Trees'


1. Set F : Diisi semua titk/tempat
Set T : Kosong
2. Pilih kota awal yang mempunyai jalur termurah diantara
anggota set F, pindahkan kota awal dari set F ke set T.
3. Cari jalur termurah dari kota-kota anggota set T ke kota-kota
anggota set F, pindahkan kota terpilih dari set F ke set T.
4. Ulangi 3 hingga set F kosong.
Biasanya jalur diberi angka yang menunjukan ongkos untuk jalur tersebut, berikut ini adalah
contoh yang akan digunakan untuk menjelaskan algoritma Prim.

16

11
21

19

14

33

16

10

Gambar 8.5. Jaringan antar tempat dengan label ongkos.

T = { } , kosong

F = {1,2,3,4,5,6}

node awal = 2,

pindahkan 2

T = {2}

F = {1,3,4,5,6}

jalur min

= 2-3,

pindahkan 3

T = {2,3}

F = {1,4,5,6}

jalur min

= 2-4,

pindahkan 4

T = {2,3,4}

F = {1,5,6}

jalur min

= 2-6,

pindahkan 6

T = {2,3,4,6}

F = {1,5}

jalur min

= 2-1,

pindahkan 1

T = {2,3,4,6,1}

F = {5}

jalur min

= 4-5,

pindahkan 5

T = {2,3,4,6,1,5}

F={}

selesai

UNIVERSITAS BINA NUSANTARA

126

Logika-Algoritma

Hasil dari algoritma Prim untuk contoh jaringan gambar 8.5 adalah :

16

6
5

2
6

11

18

Gambar 8.6. Minimum Spanning Tree hasil Algoritma Prim

Dengan total bentangan jalur = 16 + 5 + 6 + 11 + 18 = 56


Dalam pelaksanaan, harus dibuat matriks ongkos antar titik / tempat, bila diantara titik tidak
ada jalur, maka ongkos = ~ atau tak berhingga.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

127

Soal-soal
1. Jelaskan apa yang dimaksud dengan tipe dasar (base type) didalam tipe set
2. Perhatikan definisi dan deklarasi berikut :
Type

S25 = Set of 1..25;

Const S : S25 = [1..25];


Var

X,Y,Z : S25;

kemudian dimisalkan :
X := [1..15];
Y := [9..20];
a. Variabel mana yang mewakili set semesta.
b. Tunjukkan bahwa : X -Y = X * (S - Y)
c. Buat program, dengan variabel-variabel diatas untuk menunjukkan
operasi :
- Irisan

: Z := X * Y;

- Gabungan

: Z := X + Y;

- Selisih : Z := X - Y;
Untuk setiap operasi, isi variabel Z harus bisa ditayangakan di layar monitor.
3. Konstruksi :
If (Jawab = 'Y') or (Jawab = 'y') Then .......
dapat digantikan dengan menggunakan set ['Y','y'], bagaimana cara
menggunakan set tersebut.
4. Buat program untuk melaksanakan algoritma Prim, dengan jaringan antar titik / tempat
yang ditunjukkan pada gambar 8.5.

UNIVERSITAS BINA NUSANTARA

128

Logika-Algoritma

9. REKURSI
Rekursi - diambil dari istilah asing recursion - yang artinya mendefinisikan suatu objek
dengan objek itu sendiri. Contoh fungsi matematika yang bersifat rekursif adalah : Factorial.
Factorial(n) atau n! didefinisikan sebagai :
n! = 1, bila n = 0
n! = n * (n - 1)!, untuk n > 0
Jadi

4! = 4 * 3! ; Perhitungan 4! ditunda hingga perhitungan 3! diselesaikan


3! = 3 * 2! ; Perhitungan 3! ditunda hingga perhitungan 2! diselesaikan
2! = 2 * 1! ; Perhitungan 2! ditunda hingga perhitungan 1! diselesaikan
1! = 1 * 0! ; Perhitungan 1! ditunda hingga perhitungan 0! diselesaikan
0! = 1.

bila ditelusur mundur (backtracking) maka 4! = 4 * 3 * 2 * 1 = 24


Hal lain yang bersifat rekursif adalah : definisi tentang struktur pohon biner atau binary tree
structure, yaitu :
1. Suatu pohon biner dapat berupa pohon kosong.
2. Bila pohon tidak kosong maka ia mempunyai cabang kiri (sub pohon kiri)
dan cabang kanan (sub pohon kanan) yang juga dapat bersifat seperti
definisi no. 1 diatas

Gambar 9.1 Pohon Biner

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

129

Keuntungan dari definisi rekursif, adalah ia dapat mendefinisikan sesuatu yang berulang
dengan pernyataan yang terbatas, seperti contoh pohon biner, bila pohon tidak kosong maka
ia akan terus berulang (dalam hal ini bercabang terus), sampai sub pohon kiri dan atau sub
pohon kanan merupakan pohon kosong (tidak bercabang).
Bahasa Pascal melengkapi kemampuannya dengan procedure dan function rekursif, yaitu
suatu deklarasi modul yang didalamnya berisi statemen pemanggilan terhadap dirinya
sendiri. Bila suatu permasalahan bersifat rekursif seperti contoh : factorial, maka program
akan tampak lebih alami. Meskipun demikian, verifikasi hasil pengolahan / perhitungan akan
lebih sulit dilakukan, dibandingkan dengan program non-rekursif.
Procedure atau function yang bersifat rekursif seperti telah disinggung diatas, adalah modul
dapat memanggil dirinya sendiri. Karena rekursi pada dasarnya merupakan pemanggilan
yang berulang maka perlu ada suatu cara untuk menghentikan pengulangan seperti pada
program pengulangan yang biasa (iteratif).

9.1. Modul Rekursif


Contoh berikut adalah persoalan yang dapat diselesaikan baik secara rekursif maupun
secara biasa (kedua cara sering disebut: rekursif dan iteratif),adalah suatu persoalan yang
sangat sederhana yaitu membuat program yang dapat membalik urutan huruf-huruf yang
dimasukkan sebelumnya, contoh :
Masukan kata/kalimat

: 'ARABIKA'

Keluaran harus tertulis : 'AKIBARA'


Penyelesaian secara iteratif dilakukan dengan algoritma sebagai berikut :
Algoritma 9.1 Tulis Mundur
1. Masukkan huruf dari papan tombol
2. Simpan huruf kedalam array
3. Ulangi 1 dan 2 hingga kalimat selesai (tanda '.')
4. Ambil huruf dari array, tetapi dengan urutan terbalik
5. Tampilkan huruf di layar monitor.

UNIVERSITAS BINA NUSANTARA

130

Logika-Algoritma

Program selengkapnya adalah :


Program Tulis_Mundur_Iteratif;
Type AH80 = array [1..80] of char;
Var A : AH80; N : integer;
Procedure Baca_Kalimat(Var X:AH80, var Y:integer);
Begin
Y := 1; read(X[Y]);
while X[Y] <> ' .' do
begin
Y := Y + 1; read(X[Y]);
end;
End;
Procedure Tulis_Kalimat(X:AH80; Y:integer);
Var I:integer;
Begin
For I := Y downto 1 do write(X[I]);
End;
Begin
Baca_Kalimat(A,N);
Tulis_Kalimat(A,N);
End.
Kemudian dengan algoritma rekursif, program menjadi :
Program Tulis_Mundur_Rekursif;
Procedure Mundur;
Var C:char;
Begin
read(C); if C <> '.' then mundur;
write(C);
End;
Begin
Mundur;
End.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

131

Walaupun program yang ditulis dengan cara rekursif jauh lebih pendek, tetapi apa yang
dihasilkan sama sekali tidak berbeda, berarti efisien ditinjau dari sudut penulisan kode
program, tetapi bila diteliti mekanisme pemanggilan rekursif, ternyata program rekursif
memerlukan banyak memori, karena setiap pemanggilan rekursif, diperlukan sejumlah byte
memori untuk menyimpan informasi dari procedure/function yang ditunda penyelesaiannya.

9.2. Mekanisme Pemanggilan Modul Secara Rekursif


Bilamana suatu program

dijalankan maka akan disediakan suatu catatan yang disebut

catatan aktif atau activation record , blok yang pertama kali masuk catatan adalah blok
program utama, kemudian modul yang dipanggil dari program utama dan seterusnya, bila
suatu modul meyelesaikan tugasnya maka catatan tersebut dihapus dari catatan aktip,
bila modul memanggil modul lain maka catatan tersebut terus menumpuk keatas Catatan
tersebut diantaranya memuat : alamat blok, variabel-variabel lokal, dan sebagainya.

Procedure Mundur ;
Var C : Char ;
Begin
Read(C);
If C <> .
Then Mundur ;
Write(C) ;
End ;
Tumpukan
Variabel C
Pada
Activation
Record
Stack

Gambar 9.2. Mekanisme Pemanggilan Procedure secara Rekursif

UNIVERSITAS BINA NUSANTARA

132

Logika-Algoritma

Untuk menjelaskan mekanisme pemanggilan secara rekursif ini, diambil contoh procedure
Mundur, karena sangat sederhana, yaitu hanya mempunyai satu variabel, yaitu variabel C.
Pada pemanggilan Procedure Mundur (PM) , untuk pertama kali,
C B, karena B <> ., maka terjadi pemanggilan kembali PM.
Pada pemanggilan Procedure Mundur (PM) , yang kedua kali,
C B, karena B <> ., maka terjadi pemanggilan kembali PM.
Pada pemanggilan Procedure Mundur (PM) , yang ketiga kali,
C M, karena M <> ., maka terjadi pemanggilan kembali PM.
Pada pemanggilan Procedure Mundur (PM) , untuk pertama kali,
C ., sekarang . <> ., oleh karena itu perintah Write(C) dilaksanakan.
Pelaksanaan perintah Write(C) mengikuti informasi pada Activation Record Stack , yaitu
dimulai dari tumpukan paling atas, sehingga akan ditulis secara berturut-turut : Write(C) = . ,
Write(C) = M, Write(C) = B , Write(C) = B. Sehingga akan tercetak dilayar monitor : . MBB
.
Kembali pada contoh fungsi rekursif yaitu faktorial(n) atau n!, maka dengan function rekursif,
proses perhitungan faktorial(n) kelihatan lebih alami dibanding dengan function yang
menggunakan cara iteratif.
Cara Rekursif : function fact(n:integer):integer;
begin
if n <= 1
then fact := 1
else fact := n * fact(n-1);
end;
Cara Iteratif : function fact(n:integer):integer;
var p,q:integer;
begin
if n <= 1
then fact :=1
else begin
p := 1;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

133
for q := 2 to n do
p := p * q;
fact := p;
end;

Pada function fact-iteratif, diperlukan 2 (dua) variabel lokal, yaitu p untuk menampung hasil
perkalian sementara dan q sebagai variabel pengendali loop. Sedangkan didalam function
fact-rekursif, perkalian n * fact(n-1) sementara ditunda hingga n =1, hal ini dapat terjadi
karena pengendali loop rekursif adalah n, setiap pemanggilan, n = n 1, sehingga akhirnya
n = 1 dan pemanggilan secara rekursif berhenti, kemudian terjadi telusur mundur atau
backtracking untuk melaksanakan perkalian n * fact(n-1) yang tertunda tadi.
Selain boros dalam penggunaan memori, ada permasalahan yang bila dilaksanakan secara
rekursif akan terjadi redundancy yaitu pengulangan pekerjaan yang sebetulnya tidak perlu
dilakukan, tetapi tetap dilakukan karena sesungguhnya pada program rekursif, pengulangan
tidak sepenuhnya dikendalikan oleh pemrogram.

9.3 Redundancy dalam Rekursi


Contoh klasik untuk menunjukkan redundancy dalam program rekursif adalah mencari
bilangan Fibonacci, yaitu untuk menyelesaikan persoalan berikut :
Seekor betina dari sepasang kelinci, setiap bulan melahirkan sepasang kelinci (jantan
dan betina). Dua bulan kemudian betina dari pasangan yang dilahirkan tadi melahirkan
lagi pasangan baru. Kelahiran ini tentunya berulang terus dengan pola yang sama .
Hitung berapa jumlah kelinci setelah jangka waktu tertentu, dengan asumsi bahwa
tidak ada kelinci yang mati.
Fibonacci merumuskan berkembang-biaknya kelinci tersebut dengan bilangan Fibonacci
yang bersifat rekursif :
Fib(n) = n, bila n = 0 atau n = 1
Fib(n) = Fib(n-2) + fib(n-1), bila n
Secara rekursif, dapat langsung ditulis dalam function sebagai berikut :

UNIVERSITAS BINA NUSANTARA

134

Logika-Algoritma
function fib(n:integer):integer;
begin
if n = 0 then fib := 0 else
if n = 1 then fib := 1 else
fib := fib(n-2) + fib(n-1);
end;

Fib(4)

Fib(3)

Fib(2)

Fib(1)

Fib(2)

Fib(1)

Fib(1)

Fib(0)

Fib(0)

Gambar 9.3 Skema Pemanggilan Fib(4)


Terlihat pada gambar diatas, bahwa Fib(2) dipanggil sebanyak dua kali, dan akan terbukti
bahwa makin besar n, makin besar juga redundancy yang terjadi. Untuk menghindari hal ini,
dapat dibuat function dengan cara iteratif
function fib(n:integer):integer;
var i,x,y : integer;
begin
i := 1; x := 1; y := 1;
while i <= n do
begin
i := i + 1; x := x + y; y := x - y;
end;
fib := y;
end;
tetapi, seperti terlihat dari program diatas, agak sulit untuk memahami fungsi bilangan
Fibonacci yang dilaksanakan dengan cara iteratif ini.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

135

9.4. Contoh Penggunaan Rekursif


Contoh 9.1 Menara Hanoi
Sebagai pelengkap akan diberikan program untuk menyelesaikan persoalan Menara Hanoi,
dimana algoritmanya telah dibahas pada bab 1 (Algoritma 1.5) dengan sedikit penyesuaian ,
yaitu pilar kiri, tengah dan kanan masing masing disebut A,B dan C.
Program Menara_Hanoi;
Var n:integer;
Procedure Menara(n:integer; awal,ahir,antara:char);
Begin
if n = 1
then writeln('Pindahkan 1 dari ',awal,' ke ',ahir)
else begin
menara(n-1,awal,antara,ahir);
writeln('Pindahkan ',n,' dari ',awal,' ke ',ahir);
menara(n-1,antara,ahir,awal);
end;
End;
BEGIN
Clrscr;
Write('Banyak Piringan ? ');readln(n);
Menara(n,'A','C','B');
END.

Contoh 9.2 Problema 8-Ratu


Problema 8-Ratu adalah problema kombinatorial, dimana terdapat papan catur ukuran 8 x 8
dan terdapat 8 ratu untuk ditempatkan dipapan tersebut. Persyaratan yang harus dipenuhi
adalah tidak terjadi penempatan ratu pada :
1. baris yang sama
2. kolom yang sama
3. satu garis diagonal

UNIVERSITAS BINA NUSANTARA

136

Logika-Algoritma

1
2
3
4
5
6
7
8
Gambar 9.4. Salah satu penempatan 8 ratu yang benar
Algoritma untuk menyelesaikan suatu persoalan, tidak selalu harus dengan suatu aturan yang
tetap, tetapi dapat dilakukan dengan cara coba-coba atau trial and error (t&r). Pola t&r yang
akan dibahas disini ialah menganalisis permasalahan sehingga diperoleh semua cara atau
alternatif penyelesaian yang memenuhi syarat atau kendala yang ada. Algoritma ini berusaha
untuk mengembangkan sempalan penyelesaian menuju penyelesaian akhir, bila dijumpai
pada suatu tahap ternyata diperoleh jalan buntu atau tidak memenuhi persyaratan
penyelesaian, maka ia akan balik menelusur mundur atau backtrack, dan mencoba alternatif
lain.
Persoalan 8-ratu dapat diselesaikan dengan algoritma Backtracking, dan pelaksanaannya
menggunakan mekanisme rekursif, karena dengan mekanisme rekursif ini proses telusur
munduh atau backtracking dapat dilakukan dengan sendirinya. Untuk memudahkan
penjelasan tentang algoritma Backtracking ini, persoalan 8-ratu kita sederhanakan menjadi 4ratu.

Gambar 9.5. Penempatan ratu-1 dan ratu-2

1
2

2
3

Gambar 9.6. Penempatan ratu-1, ratu-2 dan ratu-3

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

137

1
2

1
2

3
4

Gambar 9.7 Penempatan ratu-1, ratu-2, ratu-3 dan ratu-4


Pada percobaan yang pertama, ratu-1 ditempatkan di [1,1], maka sesuai persyaratan yang
harus dipenuhi, ratu-2 menempati posisi [2,3], kemudian diketahui ada masalah dengan
penempatan ratu-3, yaitu semua posisi di baris 3 tidak ada yang memenuhi syarat. Proses ini
ditunjukkan dengan gambar 9.5.
Karena penempatan ratu-3 terhenti, dilakukan telusur mundur (backtrack) satu tingkat keatas,
yaitu mencoba menempatkan ratu-2 diposisi [2,3], dengan perubahan ini, ternyata
memberikan hasil bagi penempatan ratu-3 di posisi [3,2] seperti tampak pada gambar 9.6 .
Walaupun demikian, pada penempatan ratu-4 timbul masalah lagi, yaitu tidak tempat yang
memenuhi syarat bagi ratu-4. Algoritma ini memerintahkan kita untuk mundur satu tingkat,
meninjau ratu-3, yang ternyata tidak ada pilihan lagi, oleh karena itu naik lagi satu tingkat
untuk meninjau posisi ratu-2, dan sekali lagi tidak menemukan pilihan lain, akhirnya naik satu
tingkat ke ratu-1, disini, masih ada posisi lain bagi ratu-1 yaitu di [1,2]. Setelah penempatan
ratu-1 diubah, kemudian ratu-2 dipasang di [1,4], selanjutnya ratu-3 di [3,1] dan akhirnya kita
berhasil menempatkan ratu-4 diposisi [1,3]. Persoalan 4-ratu berhasil dipecahkan, gambar
9.7. menunjukan proses ini.
Berikut adalah program yang melaksanakan algoritma Backtrack untuk 8-Ratu.
Program Queen;
Uses CRT,PRINTER;
Type Papan8x8 = 0..8;
Var Col

: Array[1..8] of Papan8x8;

Colfree : Array[1..8] of Boolean;


Upfree : Array[2..16] of Boolean;
Downfree: Array[-7..7] of Boolean;
Row
X

: Papan8x8;
: Integer;

Counter1: Word;
Counter2: Word;

UNIVERSITAS BINA NUSANTARA

138

Logika-Algoritma
Procedure WriteBoard;
Var I : Byte;
Begin
For I := 1 to 8 Do Write(LST,Col[I],' '); Writeln(LST);
End;
Procedure AddQueen;
Var C : Papan8x8;
Begin
Inc(Row);
For C := 1 to 8 Do
If Colfree[C] AND Upfree[Row+C] AND Downfree[Row-C] Then
Begin
Col[Row] := C;
Colfree[C] := False;
Upfree[Row+C] := False;
Downfree[Row-C] := False;
If Row = 8
Then Begin Inc(Counter2); WriteBoard End
Else Begin Inc(Counter1); AddQueen End;
{SekarangTelusur mundur dengan menghapus ratu}
Colfree[C] := True;
Upfree[Row+C] := True;
Downfree[Row-C] := True;
End;
Dec(Row);
End;
BEGIN
ClrScr;
Row := 0; Counter1 := 0; Counter2 := 0;
For X := 1 to 8 Do Colfree[X] := True;
For X := 2 to 16 Do Upfree[X] := True;
For X := -7 to 7 Do Downfree[X] := True;
AddQueen;
Writeln(LST,Counter1);
Writeln(LST,Counter2);
END.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

139

Soal-soal
1. Bila a dan b adalah bilangan non-negatip, maka perkalian a * b dapat
didefinisikan secara rekursif :
a * b = a, bila b = 1, dan a * b = a * (b-1) + a bila b > 1
Buat program dengan function rekursif untuk melaksanakan perkalian diatas.
2. Misalkan kita buat notasi untuk menghitung bunga simpanan sebagai berikut :
Untuk setiap n 0 , An adalah menyatakan sejumlah uang disuatu rekening bank setelah
n tahun, dengan saldo awal a dan bunga setahun adalah b. Maka :
A0 = a

dan

An+1 = An + b.An

Buat function rekursif untuk perhitungan bunga diatas.


3.

Tambahkan statemen didalam didalam procedure menara, sehingga dapat diketahui


berapa kali terjadi perpindahan piringan untuk n piringan.

4. Apa fungsi counter 1 dan counter 2 pada program Queen diatas.


5. Tuliskan hasil dari program-program rekursif berikut ini :
Program Rekursif;
Procedure Putar(N:Integer);
Var X:Integer;
Begin
If (N mod 2) = 0
Then X := 0 Else X := N;
If N <> 10 then Putar(N+1);
If X <> 0 Then Writeln(X);
End;
Begin
Putar(0);
End.

6. Apa yang terjadi bila pada Procedure Putar(N:Integer), pemanggilan rekursif


Putar(N+1) diganti dengan Putar(N);

UNIVERSITAS BINA NUSANTARA

140

Logika-Algoritma

10. PENGURUTAN DAN PENCARIAN


Dalam kehidupan sehari-hari seringkali dihadapkan pada persoalan pencarian data, seperti
mencari nomor telepon, mencari nomor rumah, mencari suatu kata dalam kamus, dan
sebagainya. Bila diperhatikan, data yang kita cari, apakah itu nomor telepon, nomor rumah
atau kata-kata dalam kamus, semuanya telah terurut. Dapat dibayangkan apabila kita
mencari data, dimana data tidak terurut, maka akan sulit mencarinya. Kehidupan kita
dipermudah karena pada umumnya data sudah diurutkan oleh yang berwenang. Pengurutan
data atau dalam istilah asing disebut sorting, dengan demikian tidak dapat dipisahkan dari
proses pencarian atau searching, karena seperti disebut diatas, data yang telah terurut akan
memudahkan pencarian.

10.1. Pengurutan (sorting)


Algoritma pengurutan telah banyak dibuat oleh para pakar ilmu komputer, masing-masing
algoritma mempunyai keunggulan dan kelemahan masing-masing, lebih dari itu, struktur data
memainkan peranan penting dalam proses pengurutan data. Pengurutan dapat dibagi dalam
dua bagian yaitu pengurutan sederhana, dan pengurutan tingkat lanjut, pada pengurutan
sederhana dapat dijumpai algoritma : Pemilihan (Selection), Pertukaran (Exchange) dan
Penyisipan (Insertion). Sedangkan pada tingkat lanjut akan dibahas algoritma : QuickSort dan
Merge. Pada pengurutan sederhana dan QuickSort data harus berada dalam struktur Array,
kecuali Insertion akan lebih baik unjuk kerjanya bila data berada dalam struktur simpulberantai atau linked-list sedangkan pada pengurutan Merge, data berada dalam struktur
sequential (simpul-berantai atau file).
Pengurutan sesuai dengan urutan data dapat juga dibagi menjadi dua bagian: pengurutan
membesar, yaitu dari data dengan nilai terkecil menuju data dengan nilai terbesar, atau
ascending , dan pengurutan mengecil , yaitu sebaliknya dari ascending, dalam istilah asing
disebut descending.
10.1.1. Algoritma Pemilihan (Selection)
Pada dasarnya algoritma Pemilihan untuk pengurutan ascending adalah memilih data terkecil
dari daftar, kemudian tukarkan tempat data tersebut dengan data pada posisi pertama dari
daftar, kemudian pemilihan diulang, tetapi kali ini dimulai dari posisi kedua, dan bila
ditemukan data ditukarkan ke posisi kedua, demikian seterusnya dilakukan pemilihan untuk
posisi ketiga, keempat, ke-n hingga seluruh daftar diselesaikan.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

141

Algoritma 10.1. Pemilihan (Selection)


1 For I := 1 to N - 1 { N = banyaknya elemen dalam daftar} do
For J := I to N do
Pilih data terkecil, kemudian tukar tempat dengan
data pada posisi I.
2. Selesai.

[1]

519

69

69

69

69

[2]

419

419

127

127

127

[3]

127

127

419

381

381

[4]

69

519

519

519

419

[5]

381

381

381

419

519

Gambar 10.1 Pola Pergerakan Elemen Algoritma Pemilihan.


Pola tersebut dapat dirangkum sebagai berikut :

Putaran

Data Terkecil Ditukar dengan data posisi

Pertama

69

Pertama, yaitu data 519

Kedua

127

Kedua,

yaitu data 419

Ketiga

381

Ketiga,

yaitu data 419

Keempat

419

Keempat, yaitu data 519

Program Sorting_Pemilihan;
Type ARR = Array[1..5] of Integer;
Const D : ARR = (516,419,127,69,381);
Var I : Integer;

UNIVERSITAS BINA NUSANTARA

142

Logika-Algoritma
Procedure Pilih_Data_Terkecil(X:ARR; A,B:Integer; Var C : Integer);
Var Min,I : Integer;
Begin
Min := Maxint;
For I := A to B do
If X[I] < Min then
Begin
Min := X[I]; C := I;
End
End;
Procedure Tukar(Var X,Y:Integer);
Var Z : Integer;
Begin
Z := X; X := Y; Y := Z;
End;
Procedure Pemilihan(Var A:ARR; N:Integer);
Var I,J,Min : Integer;
Begin
For I := 1 to N-1 do
Begin
Pilih_Data_Terkecil(A, I,N,Min);
Tukar(A[I],A[Min]);
End;
End;
Begin
For I := 1 to 5 do write(D[I],' '); Writeln;
Pemilihan(D,5);
For I := 1 to 5 do write(D[I],' '); Writeln;
End.

10.1.2. Algoritma Pertukaran (Exchange)


Pola pergerakan elemen dalam algoritma Pertukaran,

dapat dilihat dari gambar berikut.

Pertukaran terjadi diantara elemen yang berdekatan, mulai dari bawah hingga paling atas.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

143

519

519

519

519

69

419

419

419

69

519

127

127

69

419

419

69

69

127

127

127

381

381

381

381

381

Gambar 10.2.a. Pola Pergerakan Elemen Algoritma Pertukaran ( Putaran Pertama)


Data yang berada di posisi n dibandingkan dengan data yang berada di posisi n-1 bila Data[n]
< Data[n-1] maka Tukar(Data[n],Data[n-1]. Demikian seterusnya, Data[n-1] dibandingkan
dengan Data[n-2], bila Data[n-1] < Data[n-2] maka Tukar(Data[n-1],Data[n-2]. Proses ini
diteruskan sehingga akhirnya dibandingkan antara Data[2] dengan Data[1], bila Data[2] <
Data[1] maka Tukar(Data[2],Data[1]). Putaran pertama telah selesai, Data[1] pasti akan berisi
data dengan nilai terkecil, dikatakan Data[1] sudah dalam posisi stabil. Sehingga pada
putaran kedua, akhir dari pertukaran tidak lagi melibatkan Data[1], dengan demikian
pembandingan dan pertukaran (bila ada) hanya sampai pada Data[2]. Akhir dari putaran
kedua ini akan menghasilkan Data[2] mencapai posisi stabil. Demikian seterusnya hingga
putaran ke (n-1), Data[n-1] akan mecapai posisi stabil, dan seluruh Array sudah dalam
keadaan terurut.

69

69

69

69

519

519

519

127

419

419

127

519

127

127

419

419

381

381

381

381

Gambar 10.2.b. Pola Pergerakan Elemen Algoritma Pertukaran (Putaran Kedua)

UNIVERSITAS BINA NUSANTARA

144

Logika-Algoritma

69

69

69

127

127

127

519

519

381

419

381

519

381

419

419

Gambar 10.2.c Pergerakan Elemen Algoritma Pertukaran (Putaran Ketiga)

69

69

127

127

381

381

519

419

419

519

Gambar 10.2.d Pergerakan Elemen Algoritma Pertukaran (Putaran Keempat; terakhir)

Bila kita lihat pola pergerakan elemen data terkecil dari bawah ke atas pada setiap putaran,
maka algoritma ini sering disebut algoritma Bubble, yaitu gelembung, yang bergerak dari
dasar tangki ke permukaan air.
Algoritma 10.2 Pertukaran (Exchange)
For I := 2 to N do
For J := N downto I do
If A[J-1] > A[J] then Tukar(A[J-1],A[J]);
Procedure Bubble diatas mempunyai kelemahan, yaitu ia tidak melihat keadaan apakah data
telah terurut atau belum, artinya apapun keadaan urutan data, procedure ini selalu melakukan

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

145

pembandingan yang sebetulnya tidak perlu. Untuk memperbaiki kesalahan prosedure


tersebut, akan digunakan tanda bahwa data telah terurut. Coba perhatikan data berikut :
23

33

47

66

69

79

Pada putaran pertama, jelas tidak terjadi pertukaran, karena data telah terurut, tetapi pada
putaran kedua, dan seterusnya, procedure Bubble tetap melakukan pembandingan,
meskipun pada putaran pertama telah terbukti bahwa data terurut. Untuk itu perlu diberi tanda
bahwa apabila dalam suatu putaran tidak terjadi pertukaran, maka data dinyatakan telah
terurut dan harus ada tanda atau flag, misalnya digunakan variabel boolean seperti pada
procedure Bubble_Flag berikut ini.

Procedure Bubble_Flag(Var A:ARR; N:Integer);


Var I,J : Integer;
Urut : Boolean;
Begin
Urut := False; I := 2
While (I < N) and (not Urut) do
Begin
Urut := True;
For J := N downto I do
If A[J-1] > A[J] then
Begin
Tukar(A[J-1],A[J]);
Urut := False;
End;
I := I + 1;
End;
End;
Dengan adanya variabel boolean Urut, maka pembandingan yang tidak perlu akan
terhindarkan. Hal ini dengan mudah dilakukan dengan melihat apakah ada pertukaran data
dalam suatu putaran, walaupun hanya terjadi satu pertukaran, variabel Urut akan bernilai
false, bila Urut = true berarti data telah terurut.

UNIVERSITAS BINA NUSANTARA

146

Logika-Algoritma

10.1.3. Algoritma Penyisipan (Insertion)


Algoritma Penyisipan (Insertion), mengingatkan pada pengurutan kartu Bridge yang telah
berada ditangan. Dimulai dari kartu kedua paling kiri, diuji apakah ia sudah pada tempatnya,
yaitu melihat apakah kartu-kartu disebelah kiri tidak ada yang lebih besar, bila belum pada
tempatnya maka sisipkan kartu tersebut pada posisi yang seharusnya, Proses ini dilanjutkan
dengan kartu ketiga hingga kartu ketigabelas.
Algoritma 10.3 Pengurutan Penyisipan (Insertion)
1. For I := 2 to N do
Bila data diposisi I belum pada tempatnya, maka cari posisi yang tepat kemudian
sisipkan data tersebut pada posisinya.
2. Selesai.
Dengan gambar pola pergerakan elemen berikut ini, algoritma Penyisipan diatas akan lebih
mudah dipahami.

519

419

127

69

69

419

519

419

127

127

127

127

519

419

381

69

69

69

519

419

381

381

381

381

519

Gambar 10.3.1. Pola Pergerakan Elemen Algoritma Penyisipan


Proses pengurutan menurut algoritma Penyisipan :
Data pada posisi kedua yaitu 419, yang ternyata belum pada tempatnya karena diatasnya
masih ada data yang lebih besar, oleh karena itu harus dicari posisi yang benar, yaitu di

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

147

posisi 1, maka data yang berada diposisi pertama, yaitu data 519 digeser kebawah, dan
tempat tersebut diisi oleh 419.
Data pada posisi ketiga yaitu 127, juga belum pada posisinya, tempatnya adalah diposisi
1, untuk itu data yang berada diposisi 1dan 2 harus digeser kebawah. Tempat di posisi 1
diisi oleh 127.
Data di posisi keempat yaitu 69, masih belum pada tempatnya, posisi yang benar adalah
di 1, maka data yang berada diposisi 1,2 dan 3 harus digeser, masing-masing ke 2, 3
dan 4.
Data kelima 381 belum pada posisinya, posisi yang harus ditempati adalah posisi 3,
maka semua data yang berada diposisi 3 dan 4 harus digeser kebawah untuk memberi
tempat bagi data 381.
Dengan menggunakan algoritma diatas kemudian dapat ditulis program Sorting Penyisipan
seperti berikut :
Program Sorting_Penyisipan;
Type ARR = Array[1..5] of Integer;
Const D : ARR = (516,419,127,69,381);
Var I : Integer;
Procedure Geser(Var A:ARR; B,C:integer);
Var I : Integer;
Begin
For I := C downto B do A[I+1] := A[I];
End;
Procedure Cari_Posisi(A:ARR; B:Integer; Var C:Integer);
Var I : Integer;
Begin
C := B;
Repeat I := I + 1 Until A[B] <= A[I];
C := I;
End;

UNIVERSITAS BINA NUSANTARA

148

Logika-Algoritma
Procedure Penyisipan(Var A:ARR; N:Integer);
Var I,J,K : Integer;
Begin
For I := 2 to N do
Begin
K := A[I];
Cari_Posisi(A,I,J);
Geser (A,J,I);
A[J] := K;
End;
End;
Begin
For I := 1 to 5 do write(D[I],' ');
Writeln;
Penyisipan(D,5);
For I := 1 to 5 do write(D[I],' ');
Writeln;
End.

Masalah utama pada pengurutan Insertion ini adalah adanya pergeseran beberapa data
untuk memberikan tempat bagi data yang harus menempati posisi yang benar (relatif,
sebelum semua data diuji). Pergeseran ini akan sangat memakan waktu bila data yang harus
disortir sangat besar, untuk menyelesaikan masalah ini digunakan linked-list (bab 11).

10. 1.4. Algoritma Quicksort


Quicksort merupakan salah satu algoritma pengurutan yang secara rekursif membagi dua
daftar (tidak harus sama panjang), untuk kemudian dibagi dua lagi, demikian seterusnya
sehingga semua data terurut (divide & conquer).
Sebagai pemisah -untuk membagi dua- dipilih suatu data pemisah atau partisi (partition)
sehingga data yang berada disebelah kiri pemisah semuanya harus bernilai lebih kecil dari
nilai data partisi, sedangkan data yang berada di sebelah kanan partisi harus mempunyai nilai
lebih besar. Kemudian data sebelah kiri dan sebelah kanan dilakukan proses seperti diatas,
secara rekursif.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

149

Algoritma 10.4 Pengurutan Quicksort


Procedure QuickSort(Kiri,Kanan:Integer);
Begin
If Kiri < Kanan
Then Begin
Atur elemen-elemen :
R[Kiri], ... ,R[Kanan] sehingga menghasilkan urutan baru sebagai
berikut :
R[Kiri],...,R[J-1] < R[J] < R[J+1],...,R[Kanan] ;
QuickSort(Kiri, J-1);
QuickSort(J+1, Kanan);
End;
End;
Dari algoritma diatas, terlihat bahwa data R[J] berlaku sebagai pemisah atau partisi. Seperti
biasa algoritma ini akan lebih mudah dipahami dengan melihat pola pergerakan elemen.
Kemudian dari gambar pola pergerakan yang akan ditampilkan, akan tampak bahwa data
yang berada di posisi paling kiri akan menjadi data partisi. Oleh karena itu, kita sebut sebagai
Partisi Kiri. Data yang akan diurutkan : 13 19 16 12 15 18 11 17 14 , telah berada didalam
array A, mulai dari A[1] hingga A[9] .

A[L] = A[1]
13
A[1]

A[R] =A[9]
19
A[2]

16
A[3]

12
A[4]

15
A[5]

18
A[6]

j=2

11
A[7]

17
A[8]

14
A[9]

k=7

Gambar 10.4.a. Gerakan j Mencari Nilai A[1] dan k Mencari Nilai A[1] (Pertama)
Gambar diatas menunjukkan bagaimana j bergerak dari kiri ke arah kanan mencari nilai yang
lebih besar atau sama dengan nilai pada A[1], dan k bergerak dari kanan ke arah kiri mencari
nilai yang lebih kecil atau sama dengan nilai pada A[1]. Variabel j berhenti di posisi A[2],
karena A[2] > A[1], sedangkan k berhenti di A[7] karena A[7] < A[1]. Posisi j dan k belum
bersilangan ditunjukkan dengan keadaan

j < k.

Bila

j dan k belum bersilangan maka

tukarkan isi A[j] dengan isi A[k] yaitu A[2] dengan A[7].

UNIVERSITAS BINA NUSANTARA

150

Logika-Algoritma

13
A[1]

11
A[2]

16
A[3]

12
A[4]

J=3

k=4

15
A[5]

18
A[6]

19
A[7]

17
A[8]

14
A[9]

Gambar 10.4.b. Gerakan j Mencari Nilai A[1] dan k Mencari Nilai A[1] (Kedua)
Variabel j berhenti di posisi A[3], karena A[4] > A[1], sedangkan k berhenti di A[4] karena A[4]
< A[1]. Posisi j dan k belum bersilangan ditunjukkan dengan keadaan j < k. Bila j dan k
belum bersilangan maka tukarkan isi A[j] dengan isi A[k] yaitu A[3] dengan A[4].

13
A[1]

11
A[2]

12
A[3]

16
A[4]

15
A[5]

18
A[6]

19
A[7]

17
A[8]

14
A[9]

j=4
k=3
Gambar 10.4.c. Poisi j dan k Bersilangan, Pertukaran A[L] dengan A[k].
Variabel j berhenti di posisi A[4], karena A[4] > A[1], sedangkan k berhenti di A[3] karena A[3]
< A[1]. Posisi j dan k bersilangan ditunjukkan dengan keadaan j > k. Bila j dan k bersilangan
maka tukarkan isi A[L] dengan isi A[k] yaitu A[1] dengan A[3].

12
A[1]

11
A[2]

13
A[3]

16
A[4]

15
A[5]

18
A[6]

19
A[7]

17
A[8]

14
A[9]

Gambar 13.4.d. Terjadinya Partisi Pertama


Posisi data 13 di A[3], sudah dalam posisi stabil atau tetap, karena semua data yang berada
di sebelah kiri mempunyai nilai yang lebih kecil, dan semua data yang berada di sebelah
kanan mempunyai nilai yang lebih besar. Terlihat bahwa A[L] pada akhirnya menjadi data
pemisah atau partisi. Dengan selesainya penempatan partisi pertama, proses pengurutan
dilanjutkan dengan menggarap data yang berada di sebelah kiri partisi dengan cara yang
sama seperti diatas (lihat gambar 10.5.).

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma
A[L]

A[R]

12
A[1]

11
A[2]

151

13
A[3]

16
A[4]

15
A[5]

18
A[6]

19
A[7]

17
A[8]

14
A[9]

Gambar 10.5. Perubahan A[L] dan A[R]


Secara rekursif, data yang berada disebelah kiri pemisah akan digarap seperti proses diatas
dengan A[L] = A[1] dan A[R] = A[2]. Bila data sebelah kiri telah diselesaikan maka giliran data
sebelah kanan digarap dengan posisi A[L] = A[4] dan A[R] = A[9]. Demikian seterusnya
sehingga seluruh data terurut.
Procedure QuickSort(L,R:integer);
Var j,k:integer;
Begin
If L < R Then
Begin
j := L ; k := R + 1;
Repeat
repeat j := j +1 until A[j] >= A[L];
repeat k := k -1 until A[k] <= A[L];
if j < k then tukar(A[j],A[k]);
Until j > k;
Tukar(A[L],A[k]);
QuickSort(L,k-1);
QuickSort(k+1,R);
End;
End;
Algoritma QuickSort mempunyai beberapa versi, yang satu dengan lainnya berbeda dalam
hal menentukan data pemisah, karena untuk keadaan tertentu pemilihan pemisah menjadi
sangat penting. Pada versi diatas, dimana pemisah diambil dari A[L], akan mempunyai
kelemahan bila data sebelumnya telah terurut. Versi lain menentukan bahwa pemisah diambil
dari data tengah, yaitu :
P = A[(L+R) div 2];
Versi ini dilaksanakan dengan procedure berikut :

UNIVERSITAS BINA NUSANTARA

152

Logika-Algoritma
Procedure QuickSort2(L,R: Integer);
Var j,k,p: integer;
Begin
j := L; k := R; p := A[(L+R) DIV 2];
Repeat
While A[j] < p do j := j + 1;
While p < A[k] do k := k - 1;
If j <= k then
Begin
Tukar(A[j],A[k]);
j := j + 1; k := k - 1;
End;
Until j > k;
If L < k then QuickSort2(L,k);
If j < R then QuickSort2(j,R);
End;

10.1.5. Algoritma MergeSort


Sampai saat ini, teknik pengurutan data didasarkan pada pengurutan data di memori, dimana
array digunakan untuk menyimpan data. Bila data tidak seluruhnya tertampung di memori,
misalnya berada didalam file maka, algoritma MergeSort dapat membantu memecahkan
permasalahan ini. Proses pengurutan tidak terjadi di memori primer, tetapi dilakukan pada
memori sekunder atau disk-file, hal ini dilakukan bila transfer data dari file ke memori
menyebabkan komputer kehabisan memori. Cara ini mengikuti proses sequential, yaitu data
diproses secara berurutan, oleh karena itu, algoritma MergeSort dapat dilakukan juga pada
struktur linked-list, seperti halnya algoritma Insertion.
Perhatikan dua urutan data berikut dimana akan terjadi Natural Merge antara L1 dan L2.
L1 : 09 14 16 18 24 30
L2 : 10 12 19 40 52 77
Menggabungkan atau merging antara L1 dan L2 akan menghasilkan L3 dengan urutan
L3 : 09 10 12 14 16 18 19 24 30 40 52 77

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

153

Ide penggabungan dua daftar yang telah terurut, digunakan untuk mengurut suatu daftar
yang sama sekali belum terurut, dengan catatan bahwa urutan yang akan dicapai adalah
urutan ascending. Kemudian akan didefinisikan apa yang disebut : Run.
Run adalah bagian dari daftar dimana data telah terurut (sebagian).
Contoh : N : 34 36 23 12 16 18 24 10 11 45 32 38 20 27
Daftar N mengandung 6 Run, yaitu : Run1, Run2, Run3, Run4, Run5 dan Run6
Ke-enam Run ini didistribusikan ke dalam dua daftar baru P dan Q, secara bersilangan :
P : Run1 Run3 Run5 = 34 36 12 16 18 24
Q: Run2 Run4 Run6 = 23 10 11 45

32 38

20 27

Kemudian lakukan merge untuk setiap run didalam daftar P dan Q, yaitu : Run1-Run2, Run3Run4 dan Run5-Run6, hasilnya adalah daftar baru R.
R : 23 34 36 10 11 12 16 18 24 45 20 27 32 38
Daftar R ternyata memiliki 3 Run, R1, R2 dan R3
R1 : 23 34 36,

R2 : 10 11 12 16 18 24 45 dan

R3 : 20 27 32 38
Secara rekursif diulang pendistribusian secara menyilang,
P : Run1 Run3 = 23 34 36

20 27 32 38

Q : Run2 = 10 11 12 16 18 24 45
Lakukan Merge Run1-Run2, Run3 sebagai ekor
R : 10 11 12 16 18 23 24 34 36 45

20 27 32 38

Daftar R sekarang memiliki 2 Run, Run1 dan Run2


Run1 : 10 11 12 16 18 23 24 34 36 45
Run2 : 20 27 32 38
Bila kedua Run1 dan R2 didistribusikan pada P dan Q, maka P = Run1 dan Q = Run2.

UNIVERSITAS BINA NUSANTARA

154

Logika-Algoritma

Proses merge pada saat ini akan serupa dengan merge dua daftar yang telah terurut seperti
pada contoh pertama tadi diatas L1 dan L2. dengan kata lain, proses distribusi dan merge
akan selalu memperkecil jumlah run, tetapi memperpanjang run, hingga akhirnya dicapai
hanya dua run, untuk digabung, sehingga terjadi pengurutan total.
R : 10 11 12 16 18 20 23 24 27 32 34 36 38 45

10.2. Perbandingan Kecepatan


Sebagai penutup dari pembahasan tentang pengurutan, akan dibandingkan kecepatan
masing-masing teknik pengurutan yang telah dibicarakan selama ini -kecuali Mergesort- ,
termasuk Pemilihan (Insertion) yang dilaksanakan pada struktur linked-list, yang diberi nama
Insertion 2.
Perbandingan dilakukan untuk mengurut 1000 data integer, pada tiga keadaan, yaitu :
Acak
Urut (Ascending)
Urut Terbalik (Descending)
Tabel 10.1 Perbandingan Kecepatan Pengurutan
Algoritma

Data Acak

Data Terurut

Data Terurut Balik

Selection

2.14

2.16

2.42

Bubble 1

5.32

2.38

8.26

Bubble 2

5.44

8.43

Insertion 1

2.17

1.83

2.47

Insertion 2

0.83

1.54

0.06

Quicksort 1

0.06

1.37

1.21

Quicksort 2

0.09

0.06

Keterangan :
Bubble 1 , Bubble tanpa flag urut
Bubble 2 , Bubble dengan flag urut
Insertion 1, Pengurutan Insertion pada struktur data Array
Insertion 2, Pengurutan Insertion pada struktur data Linked-List

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

155

QuickSort 1, Quicksort Partisi Kiri


QuickSort 2, Quicksort Partisi Tengah
Data pengukuran dilakukan pada PC AT386 / 33., waktu diambil dengan procedure GetTime,
satuan pengukuran adalah sekon.

10.3. Pencarian(Searching)
Pencarian data dilakukan terhadap suatu tabel atau file, pada kesempatan ini didefinisikan
record sebagai bagian atau elemen dari tabel atau file tadi. Berkaitan dengan record, adalah
key atau kunci, yang digunakan untuk membedakan satu record dengan record lainnya
dengan demikian kunci harus bersifat unik. Kunci seperti disebut kunci primer artinya tidak
boleh ada kunci yang sama dalam satu tabel atau file karena dengan kunci tersebut dilakukan
pencarian dalam tabel atau file yang terdiri dari sejumlah record.
Suatu tabel mahasiswa, mempunyai record dengan struktur field sebagai berikut
(Nama, NIM, Jenis-Kelamin, Tempat/Tanggal Lahir dan Alamat)
diantara field-field yang dapat digunakan sebagai kunci primer adalah NIM, karena NIM pada
suatu perguruan tinggi pasti unik. Nama dan alamat bisa digunakan sebagai kunci tetapi
karena dapat terjadi nama dan alamat yang sama, maka kunci tersebut bersifat kunci
sekunder. Mengingat kunci yang akan digunakan, maka tabel diurutkan berdasarkan kunci
tersebut, dapat terjadi satu tabel mempunyai kunci lebih dari satu atau multiple-keys.
Dalam bentuk yang sederhana kunci merupakan bagian dari record itu sendiri, kunci seperti
itu disebut kunci dalam atau dalam istilah asing disebut internal-key atau embedded-key.
Pada keadaan yang lebih rumit ada tabel lain yang berisi kunci sebagai penunjuk terhadap
record, kunci seperti ini disebut kunci luar atau external-key dan biasanya berada pada tabel
indeks atau file indeks.
Ada beberapa macam teknik pencarian, diantaranya adalah :
Pencarian berurut atau sequential search.

Teknik ini merupakan teknik yang

paling sederhana, dimana pencarian dapat dilakukan pada tabel dalam struktur
array atau linked-list.
Pencarian Biner atau binary search Teknik ini merupakan teknik pencarian yang
efisien, tetapi tabel harus sebelumnya terurut, dan menggunakan struktur array.

UNIVERSITAS BINA NUSANTARA

156

Logika-Algoritma
Pencarian Interpolasi atau interpolation search. Serupa dengan pencarian biner,
tetapi dengan sedikit perhitungan interpolasi, seperti halnya pada pencarian
biner, teknik ini hanya dapat dilakukan pada tabel dengan struktur array dan
telah terurut.

10.3.1. Pencarian Berurut


Pencarian dengan cara berurut dapat dilakukan pada segala tabel, misalnya digunakan kunci
luar, dimana k adalah array untuk sebanyak n kunci, dan d adalah array untuk data dalam hal
ini record sedemikian rupa sehingga k[i] adalah kunci untuk record d[i], Diperlukan dua
variabel masing-masing untuk mengembalikan indeks i, dan untuk kunci itu sendiri, variabel
tersebut katakanlah : Indeks dan Kunci.
Algoritma 10.5 Pencarian Berurut
1. Untuk setiap k[i], yang berada : 1, uji apakah k[i] = Kunci
2. Bila k[i] = Kunci maka Indeks = I. Selesai
4. Bila k[i] <> Kunci, lanjutkan penelusuran hingga i = n
5. Bila i = n dan tidak ada k[i] = Kunci,

maka Indeks = 0

6. Selesai.
Algoritma pencarian berurut ini, dapat bersifat exhaustive, artinya seluruh tabel harus
ditelusuri sebelum menyatakan bahwa record d[i] tidak ada dalam tabel, bila record yang
dicari berada diawal tabel maka pencarian akan sangat cepat, sebaliknya bila record yang
dicari berada diakhir tabel, maka pencarian menjadi sangat melelahkan.

10.3.2. Pencarian Biner


Algoritma 10.6 Pencarian Biner
1. Kiri = 1 dan Kanan = n
2. Tengah = (Kiri + Kanan) div 2
3. Bila Kunci = k[Tengah], maka Indeks = Tengah. Selesai
4. Bila Kunci < k[Tengah], maka Kanan = Tengah -1. Ulangi dari langkah 2
5. Bila Kunci > k[Tengah], maka Kiri = Tengah + 1. Ulangi dari langkah 2.
6. Bila Kiri > Kanan dan Tidak ada Kunci = k[Tengah] maka Indeks = 0,
berarti data yang dicari tidak ditemukan.
7. Selesai.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

157

Program lengkap untuk pencarian biner :


Type Kunci = Integer;
AK = Array[1..N] of Kunci;
Var K : AK;
Procedure Cari(A:AK;X,N:integer; Var Indeks:Integer);
Var Kiri,Kanan,Tengah : Integer; Ketemu : Boolean;
Begin
Kiri := 1; Kanan := N; Ketemu := False;
Repeat
Tengah := (Kiri + Kanan) div 2;
If X = A[Tengah]
then begin
Indeks := Tengah;
Ketemu := True;
end
else If X < A[Tengah]
then Kanan := Tengah - 1 else Kiri := Tengah + 1;
Until Ketemu or (Kiri > Kanan);
If Not Ketemu then Indeks := 0;
End;

Contoh 10.7 Ilustrasi Pola Pencarian Biner


Kunci yang digunakan adalah NIM dan yang dicari dari tabel 10.2 adalah :
NIM = 112, yaitu Ursula
Proses pencarian dengan algoritma Biner :
Tengah = (14 + 1) div 2 = 7
ternyata data di k[7] lebih besar dari kunci , yiatu 178 > 112, maka
Tengah = (7-1 + 1) div 2 = 3
k[3] = 112 = kunci,
record ditemukan pada indeks = 3.

UNIVERSITAS BINA NUSANTARA

158

Logika-Algoritma

Tabel 10.2. Record Mahasiswa


Indeks

Nama

NIM

Ahmad

34

Zamzami

65

Ursula

112

Hamdan

116

Budiman

124

Rahayu

176

Usman

178

Fifi

187

Alex

190

10

Lukman

208

11

Widodo

214

12

Tiur

268

13

Halim

333

14

Rumokoy

424

10.3.3. Pencarian Interpolasi


Perhatikan orang yang sedang mencari suatu kata didalam kamus, seseorang yang telah
biasa menggunakan kamus tidak akan mencari kata dengan cara pencarian biner, yaitu
membuka tengah-tengah buku kamus dan seterusnya, tetapi ia akan memperkirakan dimana
letak kata tersebut, misalnya kata 'Trouble', pasti tidak akan berada ditengah tetapi akan lebih
dekat ke akhir, kurang lebih 80% hingga 90% dari jumlah halaman. Dengan memperkirakan
berapa prosen posisi record dari rentang yang ada, diharapkan pencarian bisa lebih cepat,
itulah dasar dari teknik pencarian secara interpolasi (linier).
Meskipun pencarian secara interpolasi tampak menarik, tetapi ada tambahan pekerjaan atau
overhead yang harus dilakukan, diantaranya adalah :

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

159

Rentang nilai data harus diketahui


Hubungan antara indeks dengan kunci sedapat mungkin linier
Perhitungan Interpolasi
Sebagai contoh suatu tabel berisi 100 record, nilai paling rendah = 220 sedangkan nilai
tertinggi = 980, sedangkan data yang dicari adalah 743, maka perkiraan posisi dalam tabel
adalah :

743 220
x100 = 0,69
980 220
maka posisi = 0.69 x 100 = 69
merupakan posisi yang pertama kali diuji apakah kunci(743) = k[69].
Rumus umum :

P=

Kunci k[min]
x100
k[max] k[min]

Bila kunci tidak sama dengan k[69], maka ada dua kemungkinan yaitu kunci lebih besar atau
lebih kecil dari k[69], dengan cara yang sama tetapi dengan batas-batas yang berbeda maka
perhitungan interpolasi dilakukan lagi.
Bila kunci > k[69] maka : k[min] = k[69+1] , k[max] = tetap
Bila kunci < k[69] maka : k[min] = tetap, k[max] = k[69-1]
Posisi = P x (max - min)
Karena pada umumnya batas-batas nilai data terendah dan tertinggi tidak diketahui, sehingga
pencarian interpolasi jarang dilaksanakan dalam bentuk procedure, selain itu tidak ada
jaminan bahwa hubungan antara indeks dengan kunci bersifat linier, oleh karena itu
pencarian biner sudah dianggap cukup memadai.

UNIVERSITAS BINA NUSANTARA

160

Logika-Algoritma

Soal-soal
1. Lakukan pengurutan data untuk list :
235 204 928 482 231 145 659 379 122 131 475 544 992 309 771
gunakan algoritma : Pemilihan, Penyisipan, Pertukaran, Quicksort dan MergeSort
2. Jelaskan kenapa waktu pengurutan pada algoritma Insertion (struktur array), untuk data
yang terurut balik (descending) lebih lama dari waktu diperlukan untuk mengurut data
terurut (ascending) . Tetapi justru pada algoritma Insertion (dengan struktur linked-list)
keadaan diatas menjadi terbalik, yaitu lebih cepat.
3. Dari data berikut ini, field mana yang tepat digunakan sebagai kunci :
Type Pas_rec = record
nama : string[30];
alamat : string[35];
umur : 1..150;
case opname:boolean of
true : (ruang:string[5];
diet : gula,garam,normal));
false : (periksa_ulang : string[8]);
end;
4. Berikan contoh dalam kehidupan sehari-hari dimana pencarian untuk data yang telah
terurut, tidak digunakan pencarian biner, melainkan secara sequential.
5. Buat program untuk melaksanakan pencarian interpolasi.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

161

11. POINTER
Pointer adalah tipe data yang istimewa didalam bahasa Pascal, dikatakan demikian karena ia
berbeda dengan tipe-tipe data yang lain, dimana bila suatu variabel dideklarasikan untuk tipe
data pointer, maka variabel tersebut hanya akan dapat diisi data alamat, yaitu alamat yang
menunjuk ke suatu lokasi dimana data yang sebenarnya akan dioperasikan. Jadi pemakaian
data melalui tipe pointer tampak agak berbelit. Deklarasian tipe pointer harus disertai dengan
tipe data dari data yang akan ditempatkan pada lokasi yang ditunjuk oleh alamat yang berada
didalam variabel pointer.

11.1. Pendeklarasian Tipe Pointer


Sintaks deklarasi tipe data pointer :
Var <Identifier Variabel> : ^ <Tipe Data>;
Contoh Deklarasi Tipe Pointer Integer,Char dan Real :
Var X : ^Integer;
P : ^Char;
Q : ^Real;
Contoh Deklarasi Tipe Pointer Record:
Type Rec = Record
A : String;
B : Integer;
C : Boolean;
End;
Var R : ^Rec;
Sekarang perhatikan dua deklarasi yang serupa :
Var X : ^Integer;
Y : Integer;
variabel X dideklarasikan sebagai tipe pointer yang akan menunjuk ke suatu lokasi dimana
data tipe integer dapat dimasukan, sedangkan variabel Y dideklarasikan sebagai tipe integer,
dimana data tipe integer dapat segera dimasukan ke variabel Y tersebut. Lokasi yang ditunjuk
oleh variabel pointer terlebih dahulu harus diciptakan dengan perintah tertentu, yang akan
segera dijelaskan pada pembahasan berikut.
UNIVERSITAS BINA NUSANTARA

162

Logika-Algoritma

11.2. Alokasi Memori Dinamis


Kita ambil contoh deklarasi variabel x sebagai tipe pointer :
Var X : ^Integer;
maka dapat kita bayangkan suatu keadaan sebagai berikut :

Nil

Gambar 11.1. Deklarasi Variabel Pointer X


Isi variabel pointer X berupa alamat, ketika dideklarasikan alamat = Nil. Variabel X baru
dapat digunakan untuk menyimpan data yang sesungguhnya, setelah ada perintah New.
Sintaks New adalah :
New(<Variabel Pointer>);
dengan mengambil contoh deklarasi diatas, maka dengan statemen :
New(X);
akan diciptakan suatu lokasi di memori - kita tidak perlu tahu dimana tempatnya - yang
disediakan untuk data tipe integer, dengan demikian lokasi tersebut berukuran dua byte.
X
2 byte
Gambar 11.2. Lokasi yang diciptakan oleh New(X)
Alamat lokasi menjadi urusan kompiler Pascal, kita tidak perlu tahu tentang hal itu, maka
untuk mengisi data ke alamat tersebut, perintah pengisian harus melalui variable pointer yaitu
dengan statemen :
X^ := 12;
statemen tersebut dibaca :
'serahkan data integer 12 ke suatu lokasi yang alamatnya ditunjuk oleh
data pointer yang berada di variabel X'.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

163

Bandingkan dengan assignmen berikut, dimana Y adalah variabel integer.


Y := 27;
statemen diatas dibaca :
'serahkan data integer 27 ke suatu lokasi memori yang beridentitas Y'.
Dua contoh statemen diatas yaitu X^ := 12 dan Y := 27 dapat digambarkan sebagai berikut :

X
Y

12
27

Gambar 11.3. Perbedaan Assignment terhadap X^ dan Y


Operasi-operasi lainnya dapat dilakukan terhadap lokasi yang baru diciptakan dengan
New(X) tadi, seperti :

pembacaan dari papan tombol


Readln(X^);

penulisan ke layar monitor dan printer :


Writeln(X^); dan Writeln(LST, X^);

bahkan suatu operasi aritmatika dapat dilaksanakan :


Y := 5 * X^;
X^ := Y div 8;

Bila suatu lokasi dapat diciptakan dengan procedure New, maka tentu ada procedure lain
yang bertindak sebaliknya, yaitu melenyapkan lokasi tersebut. Pascal melengkapi operasi
dealokasi memori dengan procedure Dispose, yaitu untuk melenyapkan suatu lokasi di
memori yang sebelumnya telah diciptakan oleh procedure New, sintaks procedure tersebut
adalah :
Dispose(<Variabel Pointer>);
Contoh :
Dispose(X);

UNIVERSITAS BINA NUSANTARA

164

Logika-Algoritma

Artinya : lenyapkan lokasi yang ditunjuk oleh alamat yang ada di variabel pointer X.

Dispose(X);

Gambar 11.4. Melenyapkan lokasi oleh Dispose(X)


Dengan demikian suatu daerah di memori dapat diciptakan dan dimusnahkan ketika program
sedang berjalan, proses inilah yang dimaksud dengan alokasi / dealokasi memori secara
dinamis. Tetapi perhatikan isi variabel X, lokasi yang dituju sudah lenyap, berarti isi variabel X
yang berupa alamat akan menunjuk ke lokasi yang tidak ada, akibatnya program akan
kehilangan arah atau hang. Jadi, apabila suatu variabel pointer dioperasikan dengan
procedure dispose, maka kepada variabel tersebut harus diberikan nilai nil, yaitu standar
Pascal untuk mengikat variabel pointer, sehingga isi variabel pointer tersebut tidak
menggantung (dangling pointer). Oleh sebab itu, perintah dispose(X); harus segera diikuti
dengan perintah X := nil;
X

Dispose(X); X := Nil

Nil

Gambar 11.5. Mengikat X ke Nil, setelah Dispose(X)


Dengan contoh program berikut dapat diikuti bagaimana isi pointer berubah dari sejak
deklarasi hingga perintah dispose.
Program TestIsiPointer;
Uses CRT;
Type TPointer = ^Integer;
Var P:TPointer; Hasil:String;
Procedure TestPointer(P:TPointer;Var Hasil:String);
Begin;
If P = Nil
Then Hasil := 'Isi P = Nil' Else Hasil := 'Isi P <> Nil';
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

165

Begin
ClrSCr;
TestPointer(P,Hasil); Writeln(Hasil);
New(P);
TestPointer(P,Hasil); Writeln(Hasil);
Dispose(P);
TestPointer(P,Hasil); Writeln(Hasil);
P := Nil;
TestPointer(P,Hasil); Writeln(Hasil);
Write(Tekan Sembarang Tombol ; Readln;
End.
Setelah program dijalankan akan tampak tayangan sebagai berikut :
Isi P = Nil
Isi P <> Nil
Isi P <> Nil
Isi P = Nil
Tekan Sembarang Tombol
Baris pertama P = Nil karena, variabel P baru dideklarasikan, pada baris kedua P <> Nil
karena dengan perintah New(P), maka P diisi alamat dari lokasi yang baru diciptakan, alamat
tersebut yang pasti bukan Nil. Baris ketiga menunjukkan bahwa dengan perintah dispose(P)
tidak berarti P dengan sendirinya diset kembali ke Nil. Dengan perintah P := Nil, variabel P
diset kembali ke alamat Nil.
Meskipun kita tidak perlu tahu alamat suatu variabel baik variabel biasa maupun variabel
pointer, tetapi bila alamat suatu variabel ingin kita ketahui, TURBO Pascal menyediakan
function Seg(X) dan Ofs(X) untuk mendapatkan alamat dalam format segmen:ofset dari X.
Pad program diatas, dapat kita tambahkan perintah Seg(P^) dan Ofs(P^) untuk keperluan
tersebut diatas, penambahan dilakukan di procedure TestPointer.

Program Test_Isi_dan_Alamat_Pointer;
Uses CRT;
Type TPointer = ^Integer;
Var P:TPointer; Hasil:String;

UNIVERSITAS BINA NUSANTARA

166

Logika-Algoritma
Procedure TestPointer(P:TPointer;Var Hasil:String);
Begin;
If P = Nil
Then Hasil := 'Isi P = Nil' Else Hasil := 'Isi P <> Nil';
Write(Isi P berupa alamat [segmen:ofset] = , Seg(P^),:,Ofs(P^), );
End;
Begin
ClrSCr;
TestPointer(P,Hasil); Writeln(Hasil);
New(P); TestPointer(P,Hasil); Writeln(Hasil);
Dispose(P); TestPointer(P,Hasil); Writeln(Hasil);
P := Nil; TestPointer(P,Hasil); Writeln(Hasil);
Write(Tekan Sembarang Tombol ; Readln;
End.

Bila program dijalankan akan tampak tayangan sebagai berikut :


Isi P berupa alamat [segmen:ofset] = 0:0 Isi P = Nil
Isi P berupa alamat [segmen:ofset] = 27050:0 Isi P <> Nil
Isi P berupa alamat [segmen:ofset] = 27050:0 Isi P <> Nil
Isi P berupa alamat [segmen:ofset] = 0:0 Isi P = Nil
Tekan Sembarang Tombol
Catatan : Alamat 0:0 atau lengkapnya 00000:00000 adalah alamat yang sudah pasti dari Nil,
sedangkan alamat 27050:0 atau lengkapnya 27050:00000 merupakan alamat dari lokasi baru
yang diciptakan oleh perintah New(P), tergantung dari keadaan komputer yang bersangkutan,
alamat tersebut dapat berbeda dari apa yang tampak disini.

11.3. Pengertian Segmen Data dan Heap


Suatu program yang dijalankan pada DOS pada dasarnya terbagi dalam tiga segmen yaitu :

Segmen Kode Program

Segmen Data

Segmen Stack

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

167

Pembagian segmen bagi pemrogram tingkat tinggi seperti Pascal, bersifat transparan (ada
tapi tidak terlihat) , artinya pemrogram tidak perlu mengetahui hal ikhwal segmentasi tersebut.
Tetapi pembahasan heap ini ada kaitan dengan pemahaman segmen khususnya segmen
data, yaitu semua variabel yang dideklarasikan sebagai global berada didalam segmen data,
dimana segmen tersebut terbatas untuk maksimum 64 kB atau 65.535 byte, dilain pihak
suatu lokasi yang diciptakan dengan procedure new diambil dari struktur Heap yang
jumlahnya tidak terikat oleh batas 64 kB,

tetapi meliputi seluruh memori yang tersedia,

kecuali memori yang sedang digunakan oleh program dan sistem operasi (DOS).

Segmen Data

Heap

X
X = Variable Pointer

Lokasi diciptakan oleh


Perintah NEW(X)

Gambar 11.6. Segmen Data dan Heap

11.4. Simpul-berantai (Linked-list)


Pada contoh-contoh penggunaan variabel tipe pointer , kita belum melihat adanya kekuatan
tipe pointer sebagai pengalokasian memori dinamis yang sesungguhnya. Karena apabila tipe
pointer ini hanya digunakan untuk sekedar mengisi suatu lokasi memori, akan terasa proses
nya terlalu panjang. Untuk itu coba perhatikan deklarasi beberapa variabel dan pendefinisian
tipe data berikut ini :
Type

PSimpul = ^Simpul;
Simpul = Record
Data : String;
Next : PSimpul;
End;

Var L1,L2,L3 : PSIMPUL;

UNIVERSITAS BINA NUSANTARA

168

Logika-Algoritma

Pada struktur record Simpul, filed Next dideklarasikan sebagai PSimpul, yaitu tipe pointer,
maka field ini disiapkan sebagai penyambung antara satu simpul dengan simpul lainnya.
Lihat statemen statemen berikut :
New(L1);

L1^.Data := 'VINI' ;

New(L2);

L2^.Data := 'VIDI ;

New(L3);

L3^.Data := 'VICI' ;

hingga disini dapat digambarkan :

L1

VINI

NIL

L2

VIDI

NIL

L3

VICI

NIL

Gambar 11.7. Simpul-simpul Sebelum Digabung


kemudian program dilanjutkan dengan statemen :
L1^.Next := L2;
L2^.Next := L3;
kini terjadi hubungan antar simpul sebagai berikut :

L1

VINI

L2

VIDI

L3

VICI

NIL

Gambar 11.8. Simpul-simpul Setelah Digabung

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

169

11.4.1. Pembuatan Simpul-Berantai


Meskipun simpul-berantai telah terbentuk, tetapi cara penggabungan seperti diatas sungguh
tidak praktis, bayangkan bila ada 100 (seratus) simpul, berapa panjang program yang harus
ditulis untuk bisa menggabungkan simpul-simpul tersebut. Untuk itu akan dibuat suatu cara
penggabungan yang lebih sistematis, yaitu penggabungan arah depan dan penggabungan
arah belakang.

11.4.1.1. Simpul Berantai, Gabung Depan


Teknik gabung depan merupakan cara yang paling sederhana, karena tidak memerlukan
variabel pointer tambahan sebagai pointer pembantu.
Type

PSimpul = ^Simpul;
Simpul = Record
Data : String;
Next : PSimpul;
End;

Var K:PSimpul; Jawab : Char;


Procedure Gabung_Depan(Var K : PSimpul);
Var Temp : PSimpul; D : String[10];
Begin
Write('Masukan String : '); Readln(D);
New(Temp);
Temp^.Data := D;
Temp^.Next := K;
K := Temp;
End;
Procedure Tampil(L:PSIMPUL);
Begin
While L <> NIL do
Begin
Write(L^.Data, ,);

L := L^.Next;

End
End;

UNIVERSITAS BINA NUSANTARA

170

Logika-Algoritma
Begin
Repeat
Gabung_Depan(L);
Write('Teruskan [Y/T] ? '); Readln(Jawab);
Until Upcase(Jawab) = 'T';
Tampil(L);
End.

Bila program dijalankan maka akan terlihat dialog berikut beserta hasilnya :
Masukan String : Dijamin
Teruskan [Y/T] ? Y
Masukan String : Tidak
Teruskan [Y/T] ? Y
Masukan String : Luntur
Teruskan [Y/T] ? T
Luntur Tidak Dijamin
Simpul berantai yang dihasilkan adalah :

Luntur

Tidak

Dijamin

Nil

Gambar 11.5 Hasil Proses Gabung Depan

11.4.1.2. Simpul Berantai, Gabung Belakang


Ternyata procedure Gabung Depan menghasilkan urutan simpul yang terbalik dengan urutan
pada waktu masuk. Pada contoh ini akan ditunjukkan bagaimana menggabungkan simpul
dari arah belakang, cara seperti ini membutuhkan satu pointer tambahan untuk mengarahkan
simpul baru selalu ke bagian belakang, pointer ini dinyatakan dengan variabel E (Ekor).
Type

PSimpul = ^Simpul;
Simpul = Record
Data : String;
Next : PSimpul;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

171

Var K, E : PSimpul; Jawab : Char;


Procedure Gabung_Belakang(Var K:PSimpul);
Vat Temp : PSimpul;
Begin
New(Temp);
Write('Masukan String : '); Readln(Temp^.Data);
Temp^.Next := Nil;
If K = Nil
Then K := Temp
Else

E^.Next := Temp

E := Temp;
End;
Procedure Tampil(L:PSimpul);
Begin
While L <> NIL do
Begin
Write(L^.Data, );
L := L^.Next;
End
End;
Begin
Write('Teruskan [Y/T] ? '); Readln(Jawab);
While Upcase(Jawab) = 'Y' do
Begin
Gabung_Belakang(K);
Write('Teruskan [Y/T] ? ');
End;
Tampil(K);
End.
Setelah program dijalankan, tampak dialog berikut beserta hasilnya.
Teruskan [Y/T] ? Y
Masukan String : Dijamin
Teruskan [Y/T] ? Y
Masukan String : Tidak
UNIVERSITAS BINA NUSANTARA

172

Logika-Algoritma
Teruskan [Y/T] ? Y
Masukan String : Luntur
Teruskan [Y/T] ? T
Dijamin Tidak Luntur

Data yang dimasukan adalah seperti contoh sebelumnya yaitu : Dijamin, Tidak, Luntur .
E

Dijamin

Tidak

Luntur

Nil

Gambar 11.6 Hasil Proses Gabung Belakang


Simpul berantai dapat dilenyapkan secara total dengan procedure rekursif :
Procedure Lenyap_List(Var L:PSIMPUL);
Begin
If L^.Next <> NIL then Lenyap_List(L^.Next);
Dispose(L);
End;
atau dengan bantuan pointer Cursor (C).

Dijamin

Tidak

Luntur

Nil

Gambar 11.7.a. Keadaan Awal

Dijamin

Tidak

Luntur

Gambar 11.7.b. Pointer K Digeser Kebelakang Satu Langkah

UNIVERSITAS BINA NUSANTARA

Nil

Logika-Algoritma

173

Dijamin

Tidak

Luntur

Nil

Gambar 11.7.c. Penghapusan Simpul Pertama; Dispose(C)

Tidak

Luntur

Nil

Gambar 11.7.d. Pengalihan Pointer C; C := K


Bila gambar 11.7.b s/d 11.7.c diulang hingga K = Nil, maka seluruh simpul akan terhapus.
Procedure Hapus_List(Var K:PSimpul);
Var C : Psimpul;
Begin
C := K;
While K <> Nil Do
Begin
K := K^.Next; Dispose(C); C := K;
End;
End;

11.4.2. Penyisipan dan Penghapusan Simpul


Kekuatan struktur Simpul-berantai dibandingkan dengan struktur array adalah pada efisiensi
penyisipan simpul baru dan penghapusan simpul lama, terutama bila proses tadi dilakukan
ditengah-tengah rantai atau lebih buruk lagi bila akan disisipkan diawal rantai. Bayangkan
suatu daftar disimpan dalam struktur array, misalnya telah ada 100 simpul dalam daftar
tersebut, kemudian simpul baru akan disimpan pada posisi ke 20, maka seluruh simpul mulai
posisi 20 hingga posisi 100 harus digeser satu langkah untuk memberi tempat pada simpul
baru, demikian juga peristiwa yang sama akan terjadi pada proses penghapusan simpul.

UNIVERSITAS BINA NUSANTARA

174

Logika-Algoritma

Penghapusan suatu simpul memerlukan dua pointer pembantu yaitu P1 dan P2, dan 3 (tiga)
tahap penyelesaian.
Tahap pertama menggeser P2 kearah simpul yang akan dihapus, yaitu C dan menempatkan
P1 dibelakang P2.
P1
K

P2
B

Nil

Gambar 11.8.a. Penempatan Pointer P1 dan P2


Tahap kedua, mengubah arah pointer B dari penunjukan ke C menjadi penunjukan ke D.
P1
A

P2
B

Nil

Gambar 11.8.b. Perubahan Pointer Simpul B

P1

P2

Gambar 11.8.c Penghapusan Simpul C


Ketiga tahap diatas, dapat dilaksanakan dengan procedure Hapus.
Procedure Hapus(K:Psimpul; Target:String);
Var P1,P2:PSimpul;
Begin
P1 := K; P2 := K;
While P2^.Data <> Target Do P2 := P2^Next;
While P1^.Next <> P2 Do P1 := P1^.Next;
P1^.Next := P2^.Next;
Dispose(P2);
End;

UNIVERSITAS BINA NUSANTARA

Nil

Logika-Algoritma

175

Dari gambar 11.8.(a,b,c), tampak jelas bahwa proses penghapusan simpul pada Simpulberantai dengan mudah dilaksanakan hanya dengan mengalihkan pointer-pointer yang
bersangkutan, dengan demikian tidak ada pergeseran elemen seperti halnya pada struktur
array. Penghapusan simpul depan dan belakang, prosesnya lebih sederhana.
Procedure Hapus_Depan(Var K:PSimpul);
Var P:Psimpul;
Begin
P := K ; K := K^.Next;
Dispose(P);
End;
Procedure Hapus_Belakang(K:Psimpul; var E:PSimpul):
Var P:PSimpul;
Begin
P := K;
While P^.Next <> E Do P := P^.Next;
Dispose(E); E:= P;
End;
Seperti halnya pada proses penghapusan suatu simpul, maka didalam proses penyisipan
simpul baru, juga dikenal tiga keadaan :

Gabung Depan

Sisip Tengah

Gabung Belakang

Gabung Depan dan Gabung Belakang, sudah dibahas pada 11.4.1. Untuk Sisip Tengah,
perlu ada kesepakatan (konvensi) apakah simpul baru akan ditempatkan pada posisi :
1. Setelah Simpul Target
2. Sebelum Simpul Target
Pada umumnya orang memakai pilihan pertama, yaitu menyisipkan simpul baru setelah
simpul target. Perlu diperhatikan, bila target adalah simpul depan, maka dilakukan proses
Gabung Depan, bila target adalah simpul belakang maka dilakukan Gabung Belakang.
Proses penyisipan memerlukan 4 (empat) tahap. Untuk keperluan penyisipan ini, kita
gunakan simpul-berantai seperti gambar 11.8.c. (setelah simpul C dihapus).

UNIVERSITAS BINA NUSANTARA

176

Logika-Algoritma

Temp

Nil

Nil

Gambar 11.9.a. Membuat Simpul Baru H

Temp

Gambar 11.9.b. Menggeser Pointer P ke Simpul D (Target)

Temp

Nil

Nil

Gambar 11.9.c. Mengubah Pointer Pointer H ke Simpul E

Temp

P
Gambar 11.9.d. Mengubah Pointer D ke Simpul H

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

177

Keempat tahap diatas gambar 11.9.(a,b,c,d) dapat ditulis dalam bentuk procedure Sisip.
Procedure Sisip(DataBaru,Target:String; K:PSimpul);
Var Temp,K:PSimpul;
Begin
New(Temp);
Temp^.Data := DataBaru;
P := K;
While P^.Data <> Target Do P := P^.Next;
Temp^.Next := P^.Next;
P^.Next := Temp;
End;

11.5. Penggunaan Simpul-Berantai


11.5.1. Representasi Polinom

Simpul-berantai dapat digunakan untuk representasi suatu polinom, misalkan :


8.X3 - 5.X2 + 12.X - 9
dapat dituliskan dalam suatu simpul berantai dengan definisi simpul :
Type PSimpul = ^Simpul;
Simpul = Record
Koef : Real; {Koefisien}
Power : Integer; {Pangkat dari X}
Next : Psimpul;
End;
Var K : PSimpul;

-5

12

-9

Gambar 11.10. Representasi Polinom 8.X3 - 5.X2 + 12.X - 9

UNIVERSITAS BINA NUSANTARA

178

Logika-Algoritma

Operasi yang bisa dilakukan terhadap polinom, cukup banyak, dalam contoh ini kita ambil
operasi turunan (derivative). Turunan dari :
8.X3 - 5.X2 + 12.X - 9

24

adalah

24.X2 -10.X + 12

-10

12

Gambar 11.11. Representasi Turunan 8.X3 - 5.X2 + 12.X - 9

Contoh 11.1. Operasi Derivative Polinom


Program RepresentasiPolinom;
Uses CRT;
Type PSimpul = ^Simpul;
Simpul = Record
Koef : Integer;
Pang : Integer;
Next : Psimpul;
End;
Const P = #94;{Karakter '^' sebagai tanda pangkat}
Var K,E : PSimpul;

Jawab : Char;

Procedure CreateList(Var K,E:Psimpul);


Var Temp:Psimpul;
Begin
New(Temp);
Write('Koefisien : '); Readln(Temp^.Koef);
Write('Pangkat : '); Readln(Temp^.Pang);
Temp^.Next := Nil;
If K = Nil
Then K := Temp
Else E^.Next := Temp;
E := Temp;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

179

Procedure Derivative(K:Psimpul);
Begin
While K <> Nil Do
Begin
K^.Koef := K^.Koef * K^.Pang;
K^.Pang := K^.Pang - 1;
K := K^.Next;
End;
End;
Procedure Tampil(K:PSimpul);
Begin
While K <> Nil Do
Begin
Write(Abs(K^.Koef),'.X',P,K^.Pang);
If (K^.Next <> Nil) and (K^.Next^.Koef > 0)
Then Write(' + ')
Else If (K^.Next <> Nil) Then Write(' - ');
K := K^.Next;
End;
Writeln;
End;
BEGIN
ClrScr;
K := Nil;
Repeat
CreateList(K,E);
Write('Masih ada term [Y/T] : '); Readln(Jawab);
Until UpCase(Jawab) = 'T';
Writeln;
Writeln('Polinom Asal : '); Tampil(K);
Derivative(K);
Writeln;
Writeln('Hasil Penurunan : '); Tampil(K);
ReadLn;
END.

UNIVERSITAS BINA NUSANTARA

180

Logika-Algoritma

Ketika program dijalankan, tampak dialog dan hasilnya :


Koefisien : 14
Pangkat : 3
Masih ada term [Y/T] : y
Koefisien : -4
Pangkat : 2
Masih ada term [Y/T] : y
Koefisien : 6
Pangkat : 1
Masih ada term [Y/T] : t
Polinom Asal :
14.X^3 - 4.X^2 + 6.X^1
Hasil Penurunan :
42.X^2 - 8.X^1 + 6.X^0

11.5.2. Pengurutan Insertion dengan Simpul-berantai


Kelemahan dari Pengurutan Insertion terletak pada proses penggeseran elemen untuk
memberi tempat pada elemen yang akan menempati posisinya (lihat algoritma pada 10.1.3).
Hal ini mengarah ke penggunaan struktur simpul-berantai pada Insertion-Sort untuk
menggantikan struktur array yang mempunyai masalah besar pada proses penyisipan dan
penghapusan.
Dalam struktur ini digunakan pointer tambahan yaitu pointer P1 untuk menunjuk elemen
dalam simpul-berantai yang akan diproses, kemudian pointer P2 untuk menunjuk elemen
yang posisinya akan digeser oleh elemen yang ditunjuk pointer P1.

Elemen yang akan

digeser tersebut adalah elemen yang nilainya lebih besar dari nilai elemen P1.

Pada

algoritma Insertion ini, proses dimulai dari elemen nomor dua (simpul kedua dari depan).
Simpul-berantai direpresentasikan dengan :
Type

PSimpul = ^Simpul;
Simpul = Record
Data : Integer;
Next : PSimpul;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

181

Dengan representasi tersebut diatas maka dapat disusun algoritma pengurutan

simpul

sebagai berikut :
Algoritma 11.1. Pengurutan Penyisipan(Insertion) dengan Simpul-berantai
1. Ciptakan simpul baru dengan pointer T, sebagai tempat transit
2.

Salin P1^.Data ke T^.Data

3. Cari posisi dimana Simpul.Data > T^.Data, pencarian dimulai dari simpul pertama
hingga simpul satu langkah sebelum P1. Gunakan pointer P2 untuk mencari dan
menunjuk ke simpul tersebut.
4. Sisipkan simpul T pada posisi yang ditunjuk oleh pointer P2
5.

Hapus simpul yang ditunjukan oleh pointer P1.

6. Geser pointer P1 sehingga menunjuk simpul berikutnya dalam simpul-berantai K


7.

Ulangi langkah 1 - 6, hingga pointer P1 menemukan ujung rantai.

Appendix D memuat program lengkap untuk menguji unjuk kerja Insertion Sort dengan
struktur simpul-berantai.. Pada pengujian tersebut digunakan jumlah data yang sama dengan
pengujian yang hasilnya ditabelkan pada tabel 10.1. yaitu 1000 data dengan formasi : data
acak, data terurut dan data terurut balik. Hasil tersebut, ditulis kembali :
Data acak memerlukan waktu pengurutan : 0.83 sekon
Data Terurut memerlukan waktu : 1.54 sekon
Data Terurut Balik memerlukan waktu : 0.06 sekon
Pada algoritma ini terlihat bahwa proses cari posisi pada langkah 3 yang sifatnya sequential
sangat berpengaruh dibanding dengan langkah 4 dan 5 yaitu sisip dan hapus simpul, karena
dalam struktur simpul-berantai, proses hapus dan sisip

dilakukan sangat cepat. Hal ini

sangat bertolak belakang dengan struktur array dimana proses sisip dapat menjadi sangat
lamban bila harus berurusan dengan jumlah data yang sangat besar. Dengan demikian dapat
dimengerti pada data dengan format terurut, waktu pengurutan lebih lambat dari data acak,
karena setiap pencarian posisi selalu berakhir diposisi satu langkah sebelum P1, sedangkan
pada data terurut balik, didapat hasil paling cepat, karena setiap pencarian akan berakhir di
posisi simpul pertama.

UNIVERSITAS BINA NUSANTARA

182

Logika-Algoritma

11.6 Simpul-berantai Ganda


Simpul-berantai yang telah dibahas sejauh ini hanya memiliki satu pointer yang berfungsi
untuk menggandengkan satu simpul dengan simpul berikutnya. Dengan hanya satu pointer,
maka kursor hanya dapat bergerak dalam satu arah, yaitu dari awal hingga ke ujung ( kepala
hingga ekor). Pada beberapa penggunaan, misalnya pada text editor, diperlukan gerakan
kursor dalam dua arah. Simpul-berantai ganda dapat memenuhi keperluan tersebut dengan
menambahkan satu pointer yaitu untuk menunjuk ke node sebelumnya.

Kepala

Ekor

TK

Gambar 11.12. Simpul-berantai Ganda


Operasi-operasi dasar yang akan dilakukan pada simpul-berantai ganda ini adalah :
- Initialisasi (Create)
- Sisip (Insert)
- Hapus (Delete)
Simpul-Berantai Ganda direpresentasikan dengan deklarasi sebagai berikut:
Type

Tipe_Data = String;
PSimpul = ^Node;
Node = Record
Data

: Tipe_Data;

Maju

: PSimpul;

Mundur : PSimpul;
End;
Var Kepala,Ekor,Kursor : PSimpul;
UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

183

11.6.1. Initialisasi
Simpul-berantai dimulai dengan membuat simpul dummy, yang berfungsi sebagai akhir dari
simpul-berantai, kurang lebih serupa dengan tanda EOF (End Of File) pada struktur File.
Keuntungan menggunakan simpul dummy adalah adanya kepastian bahwa kursor mencapai
ujung simpul-berantai.
Procedure Initialisasi;
Var P:PSimpul;
Begin
New(P);
P^.Data := ' '; {misalkan tipe data Data adalah string}
Kepala := P; Ekor := P; Kursor := P;
P^.Maju := P ; P^.Mundur := P;
End;

Kepala

Nil

Ekor

Kursor

Gambar 11.13. Initialisasi Simpul-berantai Ganda

11.6.2. Penyisipan
Penyisipan simpul baru dapat terjadi pada posisi : depan, tengah atau belakang. Namun
demikian pada penyisipan pertama kali, ketika masih kosong, penyisipan selalu dilakukan
dibagian depan.
Procedure Gabung_Depan(Var P:PSIMPUL);
Begin
Kepala := P; Kepala^.Mundur := P; Kepala^.Maju := Kursor;
Kursor^.Mundur := P; Kursor := Kepala; {perbaharui posisi kursor simpul baru}
End;

UNIVERSITAS BINA NUSANTARA

184

Logika-Algoritma

Variabel P adalah variabel pointer yang menunjuk ke simpul baru yang akan digabungkan di
posisi pertama. Variabel P ini ditransfer dari Procedure Create_Data, melalui Procedure
Sisip.
Create_Data(P) Sisip(P) Gabung_Depan/Tengah/Belakang
Procedure Gabung_Belakang(Var P:PSIMPUL);
Begin
Kursor := Kursor^.Mundur; Kursor^.Maju := P;
P^.Maju := Ekor; P^.Mundur := Kursor;
Ekor^.Mundur := P;
Kursor := P; {reset posisi kursor}
End;
Procedure Gabung_Tengah(Var P:PSIMPUL);
Begin
P^.Mundur := Kursor^.Mundur;
Kursor^.Mundur^.Maju := P;
P^.Maju := Kursor;
Kursor^.Mundur := P;
Kursor := P; {reset posisi kursor}
End;
Procedure Sisip(Var P:PSIMPUL);
Begin
If Kursor = Kepala Then Gabung_Depan(P)
Else If Kursor = Ekor Then Gabung_Belakang(P)
Else Gabung_Tengah(P);
End;
Procedure Create_Data(Var P:PSIMPUL);
Begin
New(P); Readln(P^.Data);
Sisip(P);
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

185

11.6.3 Penghapusan
Berbeda dengan operasi penyisipan dimana terdapat tiga macam penyisipan, maka pada
operasi penghapusan hanya dikenal dua macam yaitu hapus depan dan hapus tengah,
hapus belakang tidak pernah dilakukan karena pointer ekor selalu menunjuk ke simpul
'dummy' , karena node tersebut digunakan sebagai tanda akhir dari list, maka simpul tersebut
tidak boleh dihapus.
Procedure Hapus_Depan;
Begin
Kepala := Kepala^.Maju;
Kepala^.Mundur := Kepala;
Dispose(Kursor);
Kursor := Kepala; {reset posisi kursor}
End;
Procedure Hapus_Tengah;
Var B:PSIMPUL; {pointer bantu}
Begin
B := Kursor;
Kursor^.Mundur^.Maju := B^.Maju;
Kursor^.Maju^.Mundur := B^.Mundur;
Kursor := Kursor^.Maju; {reset posisi kursor}
Dispose(B);
End;
Procedure Hapus;
Begin
If Kursor <> Ekor Then
Begin
If Kursor = Kepala
Then

Hapus_Depan

Else Hapus_Tengah
End
End;

UNIVERSITAS BINA NUSANTARA

186

Logika-Algoritma

11.6.4 Penggunaan Simpul-berantai Ganda


Simpul-berantai ganda digunakan pada paket program pengolah kata (word processor atau
text editor) dimana baris merupakan field-data dan pointer maju menunjuk ke baris berikut,
sedangkan pointer mundur menunjuk ke baris sebelumnya. Dengan menggunakan struktur
simpul-berantai ganda, maka penyisipan atau penghapusan satu atau beberapa baris dapat
dilakukan dengan mudah dan cepat, dibandingkan dengan bila menggunakan struktur array.

Kepala

Text : Baris Pertama

Text : Baris Kedua

Kursor

Text : Baris Ketiga

Text : Baris Terakhir - 1

Ekor

Text : Baris Terakhir

Gambar 11.13. Model Simpul-berantai Ganda Untuk Pengolah Kata

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

187

Soal-soal
1. Bila diketahui :
Var PR : ^Real;
PR : ^String;
Berapa besar memory (dalam byte) yang dialokasikan dengan New(PR) dan New(PS) ?
2. Simpul-berantai tunggal pada dasarnya dapat dihapus dengan perintah yang sangat
sederhana yaitu : L := Nil; , tetapi ada kelemahan dengan menghapus seperti cara ini.
Jelaskan kelemahan tersebut.
3. Simpul-berantai melingkar adalah simpul-berantai dimana pointer pada simpul terakhir
menunjuk ke simpul pertama. Buat program untuk membuat simpul-berantai tersebut.
4. Buat program Josephus, yaitu permainan yang menggunakan simpul-berantai melingkar
dimana dalam rantai tersebut ada n prajurit, dari n prajurit kita ambil 1 orang sebagai kurir
untuk menembus pertahanan musuh yang sudah mengepung n-prajurit tadi. Cara
pemilihan adalah sebagai berikut :
a. Tentukan suatu bilangan, misalkan b = 3.
b.

Hitung dari awal simpul, sebanyak b, maka simpul yang ke 3 dihapus dari lingkaran.

c.

Lanjutkan dari simpul berikutnya, hitung kembali sebanyak b, dan simpul yang ditunjuk harus dihapus. Ulangi terus hingga akhirnya tinggal satu simpul.

5. Buat program untuk melaksanakan Algoritma 11.1 Pengurutan Penyisipan dengan Simpul
berantai.

UNIVERSITAS BINA NUSANTARA

188

Logika-Algoritma

12. FILE
Telah dibahas bagaimana membaca data dari papan tombol, kemudian mengolah data
tersebut, dan hasilnya ditampilkan di layar monitor atau dicetak di kertas printer. Seringkali
timbul masalah dimana satu set data yang sama harus diolah-ulang atau diolah dengan
operasi yang berbeda, hal ini tentunya akan sangat menyulitkan karena setiap kali akan
melakukan pengolahan data, maka data tersebut harus dimasukan melalui papan tombol.
Masalah ini dapat dihindari dengan menyimpan data dalam file, sehingga pada saat
diperlukan data dapat dibaca dari file, demikian juga data hasil pengolahan, dapat disimpan
ke dalam file.

File
Text
Block

Gambar 12.1 Perangkat Komputer Pribadi dan Printer

File yang dimaksud dalam hal ini adalah disk-file yaitu file yang disimpan dalam floppy disk
atau dalam harddisk. Keuntungan penyimpanan data dalam file adalah, setiap saat dapat
dipergunakan, tidak seperti halnya data yang berada di memori yang lenyap seketika
komputer dimatikan (volatile). Lebih dari itu, kapasitas penyimpanan data dalam file jauh lebih
besar dibanding dengan kapasitas penyimpanan data di dalam memori.
File didalam Pascal, merupakan tipe data terstruktur seperti array dan record,

dengan

demikian tipe file mempunyai seperangkat operator untuk mengoperasikan variabel yang
dideklarasikan sebagai tipe file. TURBO Pascal mengenal tiga jenis tipe file :
File Bertipe (Typed File)
File Text (Text File)
File Tidak Bertipe (Untyped File)

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

189

12.1 File Bertipe


File bertipe adalah file dimana seluruh komponen mempunyai tipe data yang sama, apakah
itu berupa tipe data sederhana atau terstruktur. Karena seluruh komponen mempunyai tipe
yang sama, berarti ukuran komponen seragam maka posisi suatu komponen didalam file
akan dengan mudah dihitung dan kemudian dicapai secara langsung tanpa harus dimulai dari
komponen awal. Pencapaian seperti ini disebut random access, seperti pencapaian elemen
dalam struktur array.
Urutan pengoperasian file adalah :
1. Mendeklarasikan variabel file
2. Memberikan nama file, sesuai aturan DOS.
3. Membuka file
4. Mengambil data dari file ke memori atau menyimpan data dari memori ke file
6. Menutup file

12.1.1 Pendeklarasian Tipe File


Pendeklarasian varaiabel untuk file bertipe mengikuti sintaks berikut :
Var <Variabel File> : File of <Tipe Data> ;
atau dengan mendefinisikan dahulu suatu identifier tipe file :
Type <Identifier Tipe File> = File of <Tipe Data> ;
Var <Variabel File> : <Identifier Tipe File> ;
Misalkan akan dibuat suatu file untuk menyimpan 1000 data bertipe integer, maka lakukan
pendeklarasian variabel untuk tipe file of integer dan jangan lupa variabel untuk data itu
sendiri.
Type

FI : File of Integer;

Var

X : Integer;
F : FI;

UNIVERSITAS BINA NUSANTARA

190

Logika-Algoritma

12.1.2. Memberikan Nama File


File harus mempunyai nama yang sesuai dengan aturan DOS, yaitu :
8 (delapan) karakter ditambah 3 (tiga) karakter sebagai extention
Contoh :

Bilangan.Dta atau Nilai.Dat

Nama file dengan extention dipisahkan oleh tanda titik, disini berlaku aturan identifier Pascal
yaitu huruf kecil dan huruf besar (kapital) dianggap sama, sedangkan extention sifatnya
pilihan atau optional , bila extention diitulis, ia dapat digunakan sebagai pengenal file,
misalnya pada contoh diatas digunakan kata Dta sebagai tanda pengenal bahwa file
Bilangan, isinya adalah data atau dapat digunakan kata Dat untuk maksud yang sama.
Memberikan nama file ke variabel file, dengan procedure Assign, yaitu :
Assign(<Variabel File>,<Nama File>);
Bila sintaks tersebut digunakan untuk contoh variabel file yang telah dideklarasikan diatas
maka didapatkan :
Assign(F,'Bilangan.Dta');
F terlebih dahulu harus dideklare sebagai Variable File, seperti yang telah dilakukan pada
12.1.1 Lebih jauh dari itu, pada nama file dapat diikutkan : drive dan subdirectory dimana file
akan disimpan, misalkan file data akan disimpan didrive B, subdirectory FileData :
Assign(F,'B:\FileData\Bilangan.Dta');
Bila suatu nama file telah diberikan kepada variabel file, maka untuk selanjutnya program
akan berurusan dengan variabel file tersebut.

12.1.3. Membuka File


Ada dua cara membuka file yaitu membuka (dalam hal ini membuat) file yang baru dan
membuka file lama. Membuka file baru dilakukan dengan procedure Rewrite, dengan sintaks
umum :
Rewrite(<Variabel File>);
bila diterapkan pada contoh diatas, ditulis : Rewrite(F);

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

191

Bila suatu file dibuka dengan perintah Rewrite, dan ternyata file tersebut sebelumnya telah
ada, maka file yang telah ada tersebut akan ditangani sebagai file baru, artinya semua data
yang ada padanya akan dihapus, untuk dimulai sebagai file kosong.
Membuka file lama dilaksanakan dengan procedure Reset, dengan sintaks umum :
Reset(<Variabel File>);
Untuk contoh variabel file diatas, dapat ditulis : Reset(F);
Bila file yang dibuka ternyata tidak ada atau salah drive/subdirectory, maka Pascal akan
memberikan kabar kesalahan atau error message :
File not Found,
untuk menghindari berhentinya program secara tidak normal, atau memberi kesempatan
pada operator untuk memberikan nama file atau drive/subdirectory yang benar, maka ada
baiknya menggunakan compiler directive untuk Input/Output yaitu dengan menuliskan {$I-}
dan{$I+} masing-masing berfungsi untuk menon-aktifkan dan mengaktifkan pengecekan
operasi Input/Output termasuk operasi file, default adalah {$I+}. Bila {$I-} ditulis sebelum
perintah Reset, maka kesalahan akibat tidak adanya file yang akan dibuka, tidak
menyebabkan program berhenti, tetapi akan memberikan berita kesalahan lewat function
standar IOResult yang mengembalikan nilai 0, bila tidak terjadi kesalahan, selain nilai 0
berarti terjadi kesalahan, nilai-nilai yang lainnya dapat dilihat pada buku manual TURBO
Pascal Programmers's Reference.
Contoh : Assisgn(F,'B:\Bilangan.Dta);
{$I-} Reset(F); {$I+}
If IOResult <> 0 Then writeln('File tidak ditemukan');
Setelah berita ini, terserah pemrogram apakah akan meminta operator untuk memasukan
kembali nama file atau keluar secara normal, yang jelas berhentinya program secara tidak
wajar (hang) dapat dihindari.

12.1.4. Pointer File


Pascal menyediakan pointer untuk menjejaki posisi komponen dalam file, secara singkat
disebut pointer-file. Pada saat file dibuka, apakah file tersebut berupa file lama atau file baru,
posisi pointer-file berada pada posisi awal yaitu posisi 0. Untuk mengetahui posisi file-pointer
dapat digunakan function FilePos, dengan sintaks :

UNIVERSITAS BINA NUSANTARA

192

Logika-Algoritma
FilePos(<Variabel File>);

Bila function ini digunakan pada file yang baru dibuka :


Reset(F); P := FilePos(F);
Variabel P akan mempunyai nilai = 0, karena posisi pointer-file pada saat file dibuka, selalu
berada pada posisi 0 atau posisi awal.

12.1.5. Menyimpan Data ke File


Data disimpan kedalam file dengan perintah atau procedure Write, dengan sintaks :
Write(<Variabel File>, <Ekspresi>);
Contoh menyimpan 1000 bilangan acak integer , dimana variabel file dan variabel untuk data
telah dideklarasikan diatas :
Procedure Simpan_Data;
Var I : Integer;
Begin
Assign(F,'B:\Bilangan.Dta');
Rewrite(F);
Randomize;
For I := 1 to 1000 do
Write(FI,1 + Random(1000));
Close(F);
End;
Pada saat file dibuka posisi pointer-file berada pada posisi 0, kemudian setiap perintah write
akan menggeser pointer-file satu langkah maju, sehingga penulisan data dari variabel X ke
file dilakukan secara berurutan.

12.1.6. Menutup File


Setelah seluruh data dimasukan kedalam file, file harus ditutup dengan perintah
Close(<Variabel File>) atau dalam contoh ini Close(F). Dengan perintah Close, maka pada
ujung file akan ditambahkan tanda akhir file atau End of File disingkat EOF.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

193

12.1.7. Mengambil Data dari File


Data dari file dibaca dengan perintah read, dengan sintaks :
Read(<Variabel File>, <Variabel>);
disini, pemrogram harus mendeklarasikan variabel dengan tipe data yang sama dengan tipe
data elemen yang hendak dibaca, dalam contoh, yang akan kita baca adalah file of integer,
berarti tipe elemen didalam file adalah integer, maka harus dideklarasikan suatu variabel
dengan tipe integer.
Karena perintah read, adalah membaca dari file yang telah ada, maka perintah untuk
membuka file adalah perintah Reset(<Variabel File>). Seperti halnya pada perintah write,
maka pada perintah read juga menyebabkan file-pointer bergerak maju selangkah sehingga
bila perintah read terus dilakukan, akhirnya suatu waktu file-pointer akan sampai pada tanda
EOF.

Oleh karena itu ada dua cara pembacaan data dari file, dilihat dari pembacaan

berulang hingga semua elemen dibaca, yaitu dengan loop for-do bila jumlah elemen didalam
file telah diberitahukan sebelumnya, atau dengan menggunakan batas EOF, bila jumlah
elemen didalam file belum diketahui. Setelah selesai pembacaan, maka file harus ditutup
dengan perintah Close.
Contoh dengan For-Do
Procedure Ambil_Data(Var X:Arr100);
Var I , X : Integer;
Begin
Assign(F,'B:\Bilangan.Dta');
Reset(F);
For I := 1 to 1000 do Read(FI, X[I]);
Close(F);
End;
Contoh dengan bantuan tanda EOF
Procedure Ambil_Data(Var X:Arr100);
Var I , X : Integer;
Begin
Assign(F,'B:\Bilangan.Dta');
Reset(F);
I := 0;

UNIVERSITAS BINA NUSANTARA

194

Logika-Algoritma
While NOT EOF(FI) Do
Begin
Inc(I);

Read(FI, X[I]);

End;
Close(F);
End;

Definisi Tipe File


dan
Deklarasi Variabel File

Assignment Nama File


ke
Variable File

Buka File Baru


Dengan ReWrite

Buka File Lama


Dengan ReSet

Write

Read atau Write

Tutup File
Dengan Close
Gambar 12.2. Skema Penggunaan File Bertipe
12.1.8. Memindahkan File Pointer Secara Acak
Sementara ini kesan terhadap file bertipe, ialah mekanisme penyimpanan data bersifat
sequential, artinya data harus dimasukkan secara berurutan, seperti pada contoh diatas. Hal
ini benar untuk file baru, menambah data hanya terjadi secara bersambung, tidak dapat
ditempatkan ditengah file. Tetapi bila file telah diisi dengan beberapa komponen maka
pointer-file dapat digerakan secara bebas mulai dari awal file hingga ujung file atau hingga

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

195

tanda EOF dicapai. Cara untuk memindahkan pointer file adalah dengan perintah atau
procedure Seek, dengan sintaks :
Seek(<Variabel File>, N);
dengan N = Posisi didalam file yang hendak dicapai.
Seek(F,432);
akan menempatkan pointer-file keposisi 432+1 = 433, karena posisi pertama adalah 0.
Sedangkan perintah :
Seek(F,FileSize(F));
akan menempatkan pointer-file di ujung file, karena function FileSize akan mengembalikan
nilai berupa banyaknya komponen dalam file tersebut. Untuk contoh file Bilangan.Dta dengan
variabel file F, maka perintah diatas akan sama dengan :
Seek(F,1000);
karena file berisi 1000 bilangan acak, atau ada 1000 komponen didalam file.
Pada posisi dimana pointer-file berada, disitu dapat dilakukan perintah read atau write.
Dengan demikian suatu komponen dapat diperbaharui atau updated dengan urutan sebagai
berikut :
1. Dapatkan posisi komponen yang hendak diperbaharui
2. Pindahkan pointer-file ke posisi tersebut
3. Gunakan perintah write untuk memperbaharui data.

12.1.9. Menyimpan Tabel


Tabel merupakan struktur gabungan antara array dengan record dalam bentuk array of
record, contoh yang diberikan disini adalah seperti ditunjukkan pada gambar 7.2 yang ada
dihalaman 110, yaitu Array of Record Pegawai.
Deklarasi Array of Record Pegawai, dapat kita tuliskan kembali sebagai berikut :
Type
Arr_Rec = Array[1..9] of Rec_Pers;

UNIVERSITAS BINA NUSANTARA

196

Logika-Algoritma
Sampai disini kita dihadapkan pada dua pilihan, yaitu :
1. Menyimpan seluruh tabel sekaligus, dengan mendeklarasikan tipe file sebagai
File of Arr_Rec.
2.

Menyimpan tabel dalam satuan record, dengan mendeklarasikan tipe file sebagai
File of Rec_Pers.

Cara pertama lebih sederhana, karena hanya ada satu elemen didalam file, tetapi kita tidak
dapat mengambil elemen secara record per record. Oleh karena itu, umumnya digunakan
cara yang kedua.
Var FP : File of Rec_Pers; AP : Arr_Rec;
Menyimpan data dilakukan dengan langkah sebagai berikut :
1.

Baca data dari papan tombol ke memori, dilakukan field demi field dan record
demi record, variabel memori yang dipakai adalah tipe array of record, AP.

2. Simpan data dari AP ke file FP


Procedure Baca_Data(Var AP:ARRP);
Var I : 1..9;
Begin
For I := 1 to 9 Do
With AP[I] Do
Begin
Write('Nama

: '); Readln(Nama);

Write('Umur

: '); Readln(Umur);

Write('Jabatan

: '); Readln(Jabatan);

Write('Gaji

: '); Readln(Gaji);

Write('Status

: '); Readln(Status);

End;
End;
Data sekarang telah berada di variabel memori AP, tugas selanjutnya memindahkan dari
variable memori AP ke variabel file FP.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

197

Procedure Simpan_Data(AP:ARRP; NF:String);


Var I : 1..9;
Begin
Assign(FP, NF); {variabel NF berisi nama file}
Rewrite(FP);
For I := 1 to 9 Do Write(FP,AP[I]);
Close(FP);
End;
Mengambil data dari file dilakukan dengan procedure berikut :
Procedure Ambil_Data(AP:ARRP; NF:String);
Var I : 1..9;
Begin
Assign(FP, NF); {variabel NF berisi nama file}
Reset(FP);
For I := 1 to 9 Do Read(FP,AP[I]);
Close(FP);
End;
kemudian bila data ingin ditampilkan dilayar monitor, kita buat procedure Tampil
Procedure Tampil(AP:ARRP);
Var I : 1..9;
Begin
For I := 1 to 9 Do
With AP[I] Do
Writeln(Nama, Umur:2, Jabatan, Gaji:6:2, Status);
End;

12.2. File Text


Komponen yang mendasari file text adalah karakter, karakter membentuk baris, kemudian
baris membentuk file. Setiap baris ditutup oleh tanda EOLN (End of Line), dan file diakhiri
dengan tanda EOF (End of File), bila suatu baris dianggap kosong maka hanya ada tanda
EOLN disana.

UNIVERSITAS BINA NUSANTARA

198

Logika-Algoritma

Baris 1 : =========================<EOLN>
Baris 2 : ===========<EOLN>
Baris 3 : ======================<EOLN>
Baris 4 : <EOLN>
Baris 5 : <EOLN>
Baris 6 : =============================<EOLN>
Baris 7 : ===============<EOLN>
Gambar 12.3 Struktur File Text

12.2.1 Deklarasian File Text


Variable file text dideklarasikan dengan sintaks :
Var <Variabel File> : Text;
Contoh : Var Fin, Fout : Text;
Karena komponen file text adalah karakter-karakter yang membentuk suatu baris, maka
variabel yang digunakan untuk menampung data dimemori dideklarasikan sebagai tipe string.
Dengan

demikian

variabel

yang

diasosiasikan

dengan

file

text,

adalah

tipe

array[1..maksimum_baris] of string atau variabel string, contoh :


Var Data : Array[1..9] of String[80]; atau D:String[120];

12.2.2 Membuka File Text


Membuka file text, seperti halnya pada file bertipe harus didahului dengan pemberian nama
file lewat procedure Assign. kemudian membuka file text, dengan dua cara, yaitu membuka
file baru dan membuka file lama.
Membuka file baru dilakukan dengan menggunakan procedure :
Rewrite(<Variabel File>);
contoh : Rewrite(Fout);

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

199

Selanjutnya, pada file Fout hanya diijinkan menulis dengan perintah write dan/atau writeln
secara berurutan. karena panjang baris dapat berbeda antara satu baris dengan baris
lainnya, maka pencapaian komponen dalam file text harus dilakukan secara berurutan, lebih
jauh lagi operasi input dan output tidak dapat dilakukan secara bersamaan dalam satu file.
Membuka file lama dilakukan dengan procedure :
Reset(<Variabel File>);
contoh: Reset(Fin);
selanjutnya, hanya operasi input, yaitu read dan/atau readln yang diijinkan pada file Fin.

12.2.3. Perintah Write dan Writeln


Bila suatu file text dibuka dengan procedure Rewrite, maka operasi yang diijinkan adalah
operasi write atau writeln. Bila pada file bertipe hanya dikenal procedure write, pada file text,
procedure writeln dapat digunakan,

dengan pengertian bahwa setelah perintah writeln

dilaksanakan akan ada tanda EOLN, artinya penulisan satu baris diselesaikan, kemudian
perintah write atau writeln berikutnya akan menyebabkan penulisan pada baris berikut.
Format penulisan seperti telah dijelaskan pada pasal 4.3.1, juga berlaku disini.
Keuntungan dari file text, adalah adanya konversi otomatis dari tipe numerik ke tipe string
atau sebaliknya. Bila suatu variabel dideklarasikan sebagai tipe integer atau real, kemudian
data dalam variabel tersebut disimpan pada file text, maka TURBO Pascal melakukan
konversi dari numerik ke string secara otomatis , contoh :
Contoh : Penyimpanan Data Bilangan Integer ke File Text.
Program Konversi_Integer2String;
Var X : Integer;
F : Text;
Begin
Assign(F,'TEST-01.TXT');
Rewrite(F);
X := 10; Writeln(F,X);
Close(F);
End.

UNIVERSITAS BINA NUSANTARA

200

Logika-Algoritma

Contoh Penyimpanan Data Bilangan Real ke File Text


Program Konversi_Real2String;
Var X : Real;
F : Text;
Begin
Assign(F,'TEST-02.TXT');
Rewrite(F);
X := 17.845; Writeln(F,X:6:3);
Close(F);
End.
Karena data yang disimpan adalah bilangan Real, jangan lupa format penulisan bilangan
Real, sehingga bila file text tersebut dibaca dari prompt DOS, dengan perintah type, isi file
akan mudah dibaca. Bila penulisan tidak diformat, maka akan terbaca : 1.7845000000E+01.

12.2.4. Perintah Read dan Readln


Perintah Read dan Readln hanya dapat dilakukan pada file text yang dibuka dengan
procedure Reset. Perintah Readln digunakan untuk membaca seluruh baris sekaligus,
sedangkan perintah Read membaca dalam basis karakter, bila suatu variabel dideklarasikan
dengan char, misalnya :
Var P : Char;
maka akan dibaca satu karakter setiap dilaksanakan perintah Read(F,P), tetapi untuk
deklarasi :
Var Q : String[3];
maka setiap perintah Read(F,Q) akan membaca 3 karakter.
Seperti halnya pada perintah write/writeln, pada perintah read/readln juga dapat terjadi
konversi otomatis dari tipe string ke tipe numerik, tergantung dari apakah suatu variabel
dideklarasikan sebagai integer atau real, maka konversi akan otomatis menukar tipe string
yang dibaca dari file, untuk ditempatkan sebagai integer atau real pada variabel tersebut. Bila
ternyata yang dibaca bukan angka-angka(numeric string) maka akan diberikan error
message.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

201

12.2.5. Studi Kasus File Text


Pada file text, dengan nama file 'Berita.Txt' terdapat beberapa paragraf. Text terdiri dari 14
baris termasuk baris kosong sebagai pemisah paragraf, kemudian setiap baris tidak lebih dari
80 huruf.
Contoh text :
PEMERINTAH TIDAK AKAN MENDIKTE RAPIM PDI
Pemerintah tidak akan mendikte rapat pimpinan PDI dalam menghasilkan,
keputusan-keputusan, semua keputusan yang diambil sepenuhnya merupakan,
wewenang PDI, kata Mendagri Rudini.
Rudini mengungkapkan jaminan itu ketika ia memberikan sambutan pada
pembukaan Rapim PDI yang berlangsung di Kopo, Cisarua Bogor kemarin.
Rapim yang diikuti semua DPD PDI se Indonesia itu berlangsung dua hari
dengan acara menetapkan calon presiden dan calon wakil presiden untuk
dibawa ke Sidang Umum MPR Maret mendatang.
Sumber : Surat Kabar Harian Media Indonesia, tanggal 12-Januari-1993
<EOL>
Akan dibuat program yang mampu :
1.

Membaca file text tersebut, kemudian menampilkan dilayar monitor

2. Menghitung berapa banyak huruf 'A' atau 'a' sampai dengan 'Z' atau 'z'

yang

digunakan dalam text, dan hitung jumlah huruf keseluruhan (total huruf).
3.

Membuat laporan berapa banyak penggunaan huruf -huruf tersebut, disajikan


dalam format berikut, untuk disimpan sebagai file text :
Huruf

Jumlah Huruf

Prosentase dari Total Huruf.

================================================
A/a

hhh

pp%

B/b

hhh

pp%

hhh

pp%

Z/z

===============================================
Total Huruf : ................

UNIVERSITAS BINA NUSANTARA

202

Logika-Algoritma

Penyelesaian dibagi dalam beberapa tahap :


Tahap 1 : Merancang Struktur Data
Dari penjelasan soal diatas, jelas bahwa text terdiri dari 14 baris , dan setiap baris tidak lebih
dari 80 huruf, maka disiapkan variabel dengan tipe array of string untuk menampung text
tersebut dimemori, dengan deklarasi :
Type St80 = String[80];
AS = Array[1..14] of St80;
Kemudian definisikan array untuk menampung jumlah huruf ,setiap karakter dari 'a' hingga 'z'
yaitu dan prosentase penggunaan huruf terhadap total huruf:
Type REC_HURUF = Record
Jumlah : Integer;
Prosen : Real;
End;
AH = Array['a'..'z'] of Rec_Huruf;
Var

Baris

: AS;

Huruf

: AH;

Total

: Integer;

Tahap 2 : Pendeklarasian tipe File Text


Pendeklarasian tipe file text tidak dilakukan sebagai variabel global, tetapi akan
dideklarasikan sebagai variabel lokal pada procedure Baca_File.
Procedure Baca_File(Var Baris:AS);
Var Fin : Text;
I : Integer;
Begin
Assign(Fin,'Berita.Txt');
Reset(Fin);
For I := 1 to 14 do Readln(Fin,Baris[I]);
Close(FIN);
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

203

Tahap 3 : Menampilan Isi File ke Layar Monitor


Karena isi file text telah dipindahkan ke memori yaitu ke variabel Baris pada tahap 2 diatas,
maka selanjutnya program hanya akan berhubungan dengan variabel Baris. Untuk mencetak
data ke Printer, gunakan procedure yang serupa dengan hanya menambahkan argumen LST
pada procedure Writeln.
Procedure Tampilkan_Text(Baris:AS);
Var I : Integer;
Begin
ClrScr;
For I := 1 to 14 do Writeln(Baris[I]);
End;
Tahap 4: Mengitung Jumlah Huruf
Procedure Hitung_Huruf(Baris:AS;Var Huruf:AH; Var Total:Integer);
Var X, Y : Integer;
H

: 'a'..'z';

: Char;

Begin
Total := 0;
For H := 'a' to 'z' do Huruf[H].Jumlah := 0;
For Y := 1 to 15 do
For X := 1 to Length(Baris[Y]) do
For H := 'a' to 'z' do
Begin
C := Baris[Y][X];
If (C = H) or (C = Upcase(H)) then
Begin
Huruf[H].Jumlah := Huruf[H].Jumlah + 1;
Total := Total + 1;
End;
End;
For H := 'a' to 'z' do Huruf[H].Prosen := (Huruf[H].Jumlah / Total)*100;
End;

UNIVERSITAS BINA NUSANTARA

204

Logika-Algoritma

Tahap 5 : Menyampaikan Hasil Sebagai Tayangan di Layar / Print / File.


Data hasil perhitungan, berupa jumlah huruf 'A' atau 'a' sampai 'Z' atau 'z' dan prosentase
huruf-huruf tersebut terhadap total huruf, telah berada pada variabel Huruf yang bertipe array
of rec_huruf. Dengan demikian data yang akan disimpan ke file Laporan.Txt atau dicetak ke
Printer atau ditayang di layar monitor, akan diambil dari variabel tersebut.
Procedure Laporan(Huruf:AH);
Var H : 'a'..'z'; Fout : Text; Jawab : Char;
Begin
Writeln; Write('Tulis Hasil ke [S]creen,[P]rinter,[F]ile ? ');
Readln(Jawab);
Case UpCase(Jawab) of
'S' : AssignCrt(FOut);
'P' : Assign(FOut,'PRN');
'F' : Assign(FOut,'B:\LAPORAN.TXT');
End;
Rewrite(Fout);
For H := 'a' to 'z' do
Begin
Write(Fout,Upcase(H),':',H,' = ',Huruf[H].Jumlah:3);
Write(Fout,Huruf[H].Prosen:10:2,' %');
Writeln(Fout);
End;
Writeln(Fout,'Total Huruf = ',Total:4);
Close(Fout);
End;
Program Utama :
BEGIN
ClrScr;
Baca_File(Baris);
Tampilkan_Text(Baris);
Hitung_Huruf(Baris,Huruf,Total);
Laporan(Huruf);
Write('Tekan Tombol ! '); Readln;
END.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

205

Bila program dijalankan, dapat terlihat hasilnya di layar monitor sebagai berikut :
PEMERINTAH TIDAK AKAN MENDIKTE RAPIM PDI
Pemerintah tidak akan mendikte rapat pimpinan PDI dalam menghasilkan,
keputusan-keputusan, semua keputusan yang diambil sepenuhnya merupakan,
wewenang PDI, kata Mendagri Rudini.
Rudini mengungkapkan jaminan itu ketika ia memberikan sambutan pada
pembukaan Rapim PDI yang berlangsung di Kopo, Cisarua Bogor kemarin.
Rapim yang diikuti semua DPD PDI se Indonesia itu berlangsung dua hari
dengan acara menetapkan calon presiden dan calon wakil presiden untuk
dibawa ke Sidang Umum MPR Maret mendatang.
Sumber : Surat Kabar Harian Media Indonesia, tanggal 12-Januari-1993
Tulis Hasil ke [S]creen,[P]rinter,[F]ile ? S
A:a
B:b
C:c
D:d
E:e
F:f
G:g
H:h
I:i
J:j
K:k
L:l
M:m
N:n
O:o
P:p
Q:q
R:r
S:s
T:t
U:u
V:v
W:w
X:x
Y:y
Z:z

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

85
12
16
36
60
13
18
10
59
5
26
15
35
62
19
32
0
38
32
33
28
0
10
0
7
0

13.06
1.84
2.46
5.53
9.22
2.00
2.76
1.54
9.06
0.77
3.99
2.30
5.38
9.52
2.92
4.92
0.00
5.84
4.92
5.07
4.30
0.00
1.54
0.00
1.08
0.00

Total Huruf

%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%

651

Tekan Tombol ! _
Program berakhir

UNIVERSITAS BINA NUSANTARA

206

Logika-Algoritma

12.3. File Tidak Bertipe


Jenis file yang terakhir ini merupakan operasi Input/Output pada tingkat rendah atau low-level
I/O operation yang terutama dimaksudkan untuk pencapaian langsung (direct access) kepada
file disk dengan menggunakan record ukuran 128 byte (default) atau didefinisikan pada
procedure Reset atau Rewrite, seperti pada contoh nanti. Deklarasi file tidak bertipe,
mengikuti sintaks :
Var <Variabel File> : File;

12.3.1 Perintah BlockRead dan BlockWrite


Perintah Read dan Write yang biasa digunakan pada file bertipe maupun file text, disini
digantikan dengan perintah BlokRead dan BlokWrite, yang mempunyai sintaks :
BlokRead(<Variabel File>,<V>,<R>,<Result>);
BlokWrite(<Variabel File>,<V>,<R>,<Result>);
dengan : Variabel File = Identifier Variabel File untuk file tidak bertipe
V = Variabel tipe apapun
R = Ekspresi Integer yang menentukan banyaknya record yang akan ditransfer
antara file disk dengan variabel. Misalnya : R = 200, maka bila Ukuran
record = 128, diperlukan bufer 200 x 128 byte, untuk menampung data
transfer.
Result = Mengembalikan banyaknya record yang sesungguhnya ditransfer.
Transfer data dimulai dari byte pertama yang berada pada variabel V, pemrogram harus
dapat menjamin bahwa variabel V cukup mempunyai ruangan untuk menampung
keseluruhan transfer data. Pemanggilan terhadap BlockRead atau BlockWrite akan
menggerakkan pointer file sebanyak R Record. Suatu file yang akan dioperasikan oleh
BlockRead atau BlockWrite, seperti biasa harus dipersiapkan dengan memberikan nama file
lewat procedure Assign dan dibuka dengan procedure Rewrite atau Reset. Khusus untuk file
tidak bertipe ada parameter tambahan yang dapat disertakan sebagai argumen pada
procedure Rewrite dan Reset, yaitu ukuran record atau record-size yang bila tidak ditentukan
terjadi default 128 byte, Function EOF dapat digunakan pada file tidak bertipe, demikian juga
function function FilePos, FileSize dan procedure Seek dengan satuan komponen record
ukuran 128 byte atau seperti ditentukan dalam procedure Rewrite dan/atau Reset.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

207

Reset(<VariabelFile>,<Ukuran Record>);
Rewrite(<Variabel File>,<Ukuran Record>);
bila ukuran record tidak dicantumkan maka, default adalah 128 byte.
Dalam operasi input-output terhadap file tidak bertipe, data ditransfer langsung antara file
disk dengan variabel di memori, dengan demikian menghemat memori yang biasanya
digunakan oleh file bertipe untuk buffer sector.
Contoh berikut akan menunjukkan penggunaan file tidak bertipe dalam penyalinan suatu file
ke file yang lain(diambil dari TURBO Pascal Programmers's Reference V 7.0).
Program Copy_File;
Var

FileAsal, FileTujuan : File;


NumRead, NumWritten : Word;
Buf : Array[1..2048] of Char;

Begin
Assign(FAsal, ParamStr(1));
Reset(FAsal,1);
Assign(FTujuan, ParamStr(2));
Rewrite(FTujuan,1);
Writeln('Sedang menyalin ',FileSize(FAsal),' bytes ');
Repeat
BlockRead(FAsal,Buf,SizeOf(Buf),NumRead);
BlockWrite(FTujuan,Buf,NumRead,NumWritten);
Until (NumRead=0) or (NumWritten <> NumRead);
Close(FAsal);
Close(FTujuan);
End.

Ukuran record ditentukan pada procedure Reset dan Rewrite yaitu 1 byte, ukuran satu byte
adalah ukuran yang paling aman untuk menyesuaikan dengan ukuran file yang akan
ditransfer, karena tidak mungkin ada pecahan record dari ukuran 1 byte. NumRead = 0
digunakan untuk menyatakan bahwa transfer telah selesai , karena bila tidak ada lagi record
yang dibaca dari FAsal, maka banyak record yang ditransfer = 0.

UNIVERSITAS BINA NUSANTARA

208

Logika-Algoritma

12.3.2. Parameter String pada Command Line


Penggunaan function ParamStr adalah untuk mentransfer parameter yang diperlukan oleh
suatu file EXE atau COM, misalkan program Copy_FIle diatas di compile menjadi :
Salin.Exe, maka perintah pada command line :
Salin B;\TEST.DTA A:\TEST.DTA
ParamStr(1) = 'B:\TEST.DTA' dan ParamStr(2) = 'A:\TEST.DTA'

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

209

Soal-soal
1. Dimisalkan didalam file 'LIGA.DAT' terdapat 8 (delapan) record data hasil
Kompetisi pertandingan liga sepakbola di Jakarta. Record-record
didalam file tersebut adalah :
Field Nama-Kota, tipe data String[15]
Field Main, tipe data Integer
Field Menang, tipe data Integer
Field Seri, tipe data Integer
Field Kalah, tipe data Integer
Field Nilai, tipe data Integer.
Buat program lengkap sehingga dapat :
a.Membaca data dari file tersebut, kemudian ditampilkan di layar monitor
dan mencetak ke printer dengan format sebagai berikut :
Kota

Main

Menang Seri Kalah Nilai

======================================
-----------------

---

----

----

----

----

-----------------

---

----

----

----

----

---

----

----

----

----

.
.
-----------------

======================================
b. Menghitung nilai dengan aturan sebagai berikut :
Nilai Menang = 3, Nilai Seri = 1, Nilai Kalah = 0
c. Mengurutkan daftar diatas, secara descending, berdasar nilai yang
dihitung pada point 2. Kemudian membagi dua daftar hasil pengurutan
tadi menjadi :
Daftar Papan Atas yang terdiri dari 5 besar, dan daftar Degradasi, yang
memuat 3 kesebelasan terbawah.

UNIVERSITAS BINA NUSANTARA

210

Logika-Algoritma

d. Menyimpan daftar Papan Atas ke file 'UTAMA.LIG'


Menyimpan daftarDegradasi ke file 'DEGRAD.LIG'
e. Mencetak daftar Papan Atas dan Degradasi ke printer dengan format
seperti diatas.
2. Buat program yang dapat mengacak suatu file text (batasi ukuran text
sehingga tidak lebih dari 30 baris). kemudian simpan di file-text.
Kemudian baca file yang telah diacak tadi dan dengan menggunakan
password, text dikembalikan ke bentuk semula sehingga dapat dibaca
dengan jelas.
3. Apabila kita tidak tahu berapa jumlah elemen (record) didalam suatu file
bertipe, kita dapat membaca data dengan patokan tanda EOF, jelaskan
cara lain yang memungkinkan kita membaca file tersebut.
4. Kita hanya bisa menambah data ke file text pada posisi akhir file, perintah
apa yang harus kita berikan ? .
5. Jelaskan apa yang dimaksud dengan :
End of Line
End of File
File Buffer
Append
Assign

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

211

13. STUDI KASUS


Studi kasus ini akan berisi 5 (lima) contoh permasalahan yang berbeda, diharapkan dapat
memenuhi atau mewakili berbagai contoh persoalan dibidang studi komputer akuntansi,
teknik komputer , teknik informatika dan manajemen informatika.

13.1 Perhitungan Pajak Penghasilan (PPh) Perorangan


Dengan berlakunya Undang-undang Nomor 6 Tahun 1983 tentang Ketentuan Umum dan
Tata Cara Perpajakan sebagaimana telah diubah dengan Undang-undang Nomor 9 Tahun
1994 (selanjutnya disebut UU KUP) dan Undang-undang Nomor 7 Tahun 1983 tentang Pajak
Penghasilan sebagaimana telah diubah terakhir dengan Undang-undang Nomor 10 tahun
1994 (selanjutnya disebut UU PPh), sistem pemungutan pajak di Indonesia, Khususnya Pajak
Penghasilan (PPh), berdasarkan sistem self-assessment.

Dalam sistem tersebut,

masyarakat diberi kepercayaan dan tanggung jawab untuk menghitung, memperhitungkan,


membayar dan melaporkan sendiri besarnya pajak yang harus dibayar.
Dalam studi kasus ini akan diuraikan algoritma pehitungan PPh untuk

Orang pribadi

berdasarkan Buku Petunjuk Pengisian Surat Pemberitahuan (SPT) Tahunan Pajak


Penghasilan Wajib Pajak Orang Pribadi yang diterbitkan oleh Ditjen Pajak, Departemen
Keuangan Republik Indonesia, Tahun 1996. Untuk menyederhanakan perhitungan, dalam
algoritma ini diasumsikan bahwa pajak yang diperhitungkan hanya bersumber dari wajib
pajak itu sendiri, tidak digabungkan dengan penghasilan istri/suami wajib pajak. Selain itu,
sumber penghasilan hanya didasarkan pada penghasilan yang berhubungan dengan
pekerjaan, tidak ditambah dengan usaha bebas lainnya baik didalam negeri maupun diluar
negeri, yang umumnya diasumsikan sudah dihitung PPh, sehingga perhitungan ini dianggap
final.
Algoritma 13.1 Perhitungan PPh Orang pribadi
1. Hitung Penghasilan Bruto , berdasar formulir 1770-I Bagian B Nomor 1
2. Hitung Pengurangan, berdasar formulir 1770-I Bagian B Nomor 2
3. Hitung Penghasilan Netto, yaitu Perhitungan 1 dikurangi Perhitungan 2
4. Hitung Penghasilan Tidak Kena Pajak, berdasarkan ketentuan yang terdapat
pada 13.1.4, halaman 213 buku ini.
5. Hitung Penghasilan Kena Pajak , yaitu Perhitungan 3 dikurangi Perhitungan 4
6. Hitung PPh terutang, berdasarkan Buku Petunjuk, hal. 42.

UNIVERSITAS BINA NUSANTARA

212

Logika-Algoritma
7. Hitung Nilai Pemotongan PPh Oleh Pihak Lain dan PPh Yang Ditanggung Oleh
Pemerintah, berdasar formulir 1770-II Bagian A.
8. Hitung PPh Yang Harus Dibayar, yaitu Perhitungan 6 dikurangi Perhitungan 7.
9. Selesai.

13.1.1. Uraian Komponen-komponen Pajak


13.1.1.1. Penghasilan Bruto.
Penghasilan Bruto, terdiri dari beberapa komponen, seperti :
a. Gaji, Uang Pensiun, THT
b. Tunjangan PPh
c.

Tunjangan Lainnya, Uang Lembur dan sebagainya.

d. Honorarium, Imbalan lain sejenisnya.


e. Premi Asuransi Yang Dibayar Pemberi Kerja.
f.

Penerimaan Dalam Bentuk Natura.

g. Tantiem, Bonus, Gratifikasi, Jasa Produkasi, THR.


Gaji biasanya terdiri dari komponen keluarga, seperti istri dan anak-anak, dalam contoh
program nanti akan diambil perhitungan tunjangan istri dan anak, sebagai berikut :
-

Tunjangan Istri = 10% x Gaji Pokok

Tunjangan Anak = 2% x Gaji Pokok x Jumlah Anak; maksimum 3 anak.

Karena PPh ini diperhitungkan untuk jangka satu tahun, tidak tertutup kemungkinan pada
jangka satu tahun tersebut terjadi perubahan penerimaan, maka perhitungan Penghasilan
Bruto harus mengakomodasi terjadinya perubahan penerimaan dalam jangka satu tahun.
Dalam hal ini diasumsikan tidak lebih dari tiga kali, atau terdapat paling banyak tiga daftar gaji
yang berbeda.

13.1.1.2. Pengurangan
Komponen pengurangan adalah :
a. Biaya Jabatan
b. Biaya Pensiun
c.

Iuran Pensiun dan Iuran THT

Iuran Pensiun dihitung dari :


10% x (GajiPokok + Tunjangan Istri + Tunjangan Anak)

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

213

Biaya Jabatan diperhitungkan sebesar 5% dari Penghasilan Bruto, dengan setinggi-tingginya


Rp 648.000,-, sedangkan Biaya Pensiun diperhitungkan sebesar 5% dari Penghasilan Bruto,
dengan setinggi-tingginya Rp. 216.000,-

13.1.1.3. Penghasilan Neto


Dihitung dari hasil pengurangan Penghasilan Bruto dengan nilai Pengurangan.

13.1.1.4. Penghasilan Tidak Kena Pajak.


Ketentuan besarnya Penghasilan Tidak Kena Pajak (PTKP), adalah :
a.

Untuk Wajib Pajak, Rp. 1.728.000,-

b.

Tambahan sebesar Rp. 864.000,- untuk Wajib Pajak yang kawin

c.

Tambahan sebesar Rp. 864.000,- untuk setiap anggota keluarga yang menjadi
tanggungan Wajib Pajak, yaitu anak kandung, anak angkat, dengan jumlah
tanggungan sebanyak-banyaknya 3 (tiga) orang.

Contoh:
Seorang Wajib Pajak kawin dengan 4 (empat) anak., perhitungan PTKP :
1. Wajib Pajak

Rp. 1.728.000,-

2. Kawin

Rp.

3. Tiga Anak

Rp. 2.592.000,-

Jumlah PTKP

Rp. 5.184.000,-

864.000,-

Seorang Wajib Pajak duda dengan 2 (dua) anak., perhitungan PTKP :


1. Wajib Pajak

Rp. 1.728.000,-

2. Dua Anak

Rp. 1.728.000,-

Jumlah PTKP

Rp. 3.456.000,-

13.1.1.5. Penghasilan Kena Pajak.


Dihitung dari hasil pengurangan Penghasilan Neto dengan Penghasilan Tidak Kena Pajak.

UNIVERSITAS BINA NUSANTARA

214

Logika-Algoritma

13.1.1.6. PPh Terutang.


Berdasarkan perhitungan sistem berlapis, PPh Terutang dihitung dengan aturan :
Penghasilan Kena Pajak

Tarif

0 sampai dengan 25.000.000,-

10%

25.000.000,- s/d 50.000.000,-

15%

Diatas 50.000.000,-

30%

Contoh:
Penghasilan Kena Pajak (PKP) seorang Wajib Pajak adalah Rp. 52.000.000,10% x 25.000.000,-

= Rp. 2.500.000,-

15% x 25.000.000,-

= Rp. 3.750.000,-

30% x 2.000.000,-

= Rp.

Jumlah PPh Terutang

600.000,-

Rp. 6.850.000,-

Penghasilan Kena Pajak (PKP) seorang Wajib Pajak adalah Rp. 35.000.000,10% x 25.000.000,-

= Rp. 2.500.000,-

15% x 10.000.000,-

= Rp. 1.500.000,-

Jumlah PPh Terutang

Rp. 4.000.000,-

Penghasilan Kena Pajak (PKP) seorang Wajib Pajak adalah Rp. 17.000.000,Jumlah PPh Terutang :
10% x 17.000.000,-

= Rp. 1.700.000,-

13.1.1.7. PPh Yang Dibayar Oleh Pihak Lain dan Dibayar Oleh Pemerintah
Berdasarkan Formulir 1770-II Bagian A. didapat dari kolom yang bersesuaian.

13.1.1.8. PPh Yang Dibayar Oleh Pihak Lain dan Dibayar Oleh Pemerintah
Dihitung dari hasil pengurangan PPh Terutang dengan PPh Yang Dibayar Pihak Lain dan
Yang Dibayar Oleh Pemerintah.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

215

13.1.2. Penulisan Program.


Berdasarkan uraian diatas, dapat kita tulis program Pascal dengan terlebih dahulu dibuat
definisi konstanta, tipe data dan deklarasi variabel yang diperlukan.

13.1.2.1. Struktur Data


TWajibPajak = Record
Nama : String;
NPWP : String;
Kawin : Char;
Anak : 0..3;
End;
WP : TWajibPajak;
WP merupakan variabel tipe record yang digunakan untuk menampung data pribadi Wajib
Pajak, seperti Nama, NPWP, Status Perkawinan, Jumlah Anak. Field Kawin diberi tipe data
Char, karena masukan data cukup dengan Y (Ya) atau T (Tidak)., field Anak diberi tipe
data Sub-range 0..3 untuk membatasi jumlah anak hingga 3 jiwa.
TDaftarGaji = Record;
N : 1..3; {Jumlah Daftar Gaji}
Jangka : Array[1..3] of Byte; {Jangka Waktu setiap Daftar Gaji}
End;
DG : TDaftarGaji;
TGaji = Record
Pokok : Real;
Tunjangan : Real;
TunjPPh : Real;
End;
TGajiBruto = Array [1..3] of TGaji;
GB : TGajiBruto
Variabel GB dimaksudkan untuk menampung masukan data dari daftar gaji, data yang perlu
dimasukan adalah Gaji Pokok, Tunjangan, TunjanganPPh. Dari data Gaji Pokok dapat
dihitung Tunjangan Istri, Tunjangan Anak dan Iuran Pensiun. Variable GB merupakan tipe
data array of record, dengan range 1..3, maksudnya untuk mengakomodasi bila ada daftar

UNIVERSITAS BINA NUSANTARA

216

Logika-Algoritma

gaji lebih dari 1(satu) , dengan maksimum 3(tiga) daftar gaji. Data daftar gajin ini ditampung
dalam variabel DG, yang direpresentasikan dengan field N, dan digunakan juga field Jangka
untuk menampung data jangka waktu (dalam bilangan bulan) untuk setiap daftar gaji yang
dilampirkan, lihat contoh di 13.1.3.
TDaftarHonor = Record;
N : 0..3; {Jumlah Daftar Honor}
Jangka : Array[1..3] of Byte; {Jangka Waktu setiap Daftar Honor}
End;
THonor = Array [1..3] of Real;
HR : THonor;
DH : TDaftarHonor;
TPenghasilanBruto = Record
Gaji : Real
TunjPPh : Real;
Tunjangan : Real;
Honor : Real;
Total : Real;
End;
PB : TPenghasilanBruto;
Penghasilan Bruto diwakili oleh variabel PB yang bertipe record, field Gaji menampung hasil
penjumlahan GajiPokok + Tunjangan Istri + Tunjangan Anak, rumus perhitungan adalah :
Tunjangan Istri = 10% * Gaji Pokok * Bilangan Bulan
Tunjangan Anak = 2% * Jumlah Anak * Gaji Pokok * Bilangan Bulan
Bila n daftar gaji, maka Tunjangan Istri * n, demikian pula untuk Tunjangan Anak. Honor
diperoleh dari daftar honor, yang biasanya melampiri daftar gaji. Sedangkan Penghasilan
Bruto Total didapat dari perjumlahan Gaji, TunjPPh, Tunjangan dan Honor.
TPengurangan = Record
BiayaJabatan : Real;
BiayaPensiun : Real;
IuranPensiun : Real;
Total : Real;
End;
PR : TPengurangan;
Biaya Jabatan dihitung dari 5% x Gaji Total, sedangkan Iuran Pensiun = 10% x Gaji. Jumlah
Biaya Jabatan, Biaya Pensiun dan Iuran Pensiun berada dalam field Total.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

217

Const
PTKPWajibPajak = 1728000;
PTKPKawin = 864000;
PTKPAnak = 864000;
Var
Neto,PKP,PTKP : Real;
PPhTerutang,PphDibayar,PPhHarusDibayar : Real;
PTKPWajibPajak adalah konstanta untuk Penghasilan Tidak Kena Pajak dari Wajib Pajak itu
sendiri, sedangkan PTKPKawin adalah Penghasilan Tidak Kena Pajak untuk Wajib Pajak
yang kawin dan PTKPAnak adalah Penghasilan Tidak Kena Pajak untuk Wajib Pajak yang
mempunyai anak atau memungut anak. Variabel Neto untuk menampung nilai Neto yang
merupakan hasil penguranganPenghasilan Bruto Total dengan Pengurangan Total, variabel
PTKP menampung nilai Penghasilan Tidak Kena Pajak, sedangkan variabel PKP digunakan
untuk nilai Penghasilan Kena Pajak, PKP = Neto PTKP.

13.1.2.2. Masukan Data


Data masukan yang diperlukan adalah :
Data Pribadi :
-

Nama Wajib Pajak dan NPWP

Status Perkawinan

Jumlah Anak.

Data Gaji dan Honor yang diambil dari Daftar Gaji dan Daftar Honor
-

Gaji Pokok

Tunjangan PPh

Tunjangan

Honor

Procedure DataWajibPajak(Var WP:TwajibPajak);


Var Jawab : Char;
Begin
Write(Nama Wajib Pajak : ); Readln(WP.Nama);
Write(NPWP : ); Readln(WP.NPWP);
Write(Kawin [Y/T] : ); Readln(WP.Kawin);
Write(Jumlah Anak : ); Readln(WP.Anak);
End;

UNIVERSITAS BINA NUSANTARA

218

Logika-Algoritma
Procedure DataDaftarGaji(Var DG : TDaftarGaji);
Var I : Byte;
Begin
Write(Jumlah Daftar Gaji [1..3] : ); Readln(DG.N);
For I := 1 to DG.N Do
Begin Write(I, Jangka Waktu [1 .. 12 Bulan ] : ); Readln(DG.Jangka[I]) End;
End;
Procedure DataDaftarHonor(Var DH : TDaftarHonor);
Var I : Byte;
Begin
Write(Jumlah Daftar Honor [0..3] : ); Readln(DH.N);
For I := 1 to DH.N Do
Begin Write(I, Jangka Waktu [1 .. 12 Bulan ] : ); Readln(DH.Jangka[I]) End;
End;
Procedure DataGajiBruto(DG:TDaftarGaji; Var GB:TGajiBruto);
Var I : Byte;
Begin
For I := 1 to DG.N Do
Begin
Write(I, Gaji Pokok : ); Readln(GB[I].Pokok);
Write(I, Tunjangan : ); Readln(GB[I].Tunjangan);
Write(I, Tunjangan PPh : ); Readln(GB[I].TunjPPh);
End;
End;
Procedure DataHonorarium(DH:TDaftarHonor; Var HR:THonor);
Var I : Byte;
Begin
For I := 1 to DH.N Do
Begin Write(I, Honor : ); Readln(HR[I]) End;
End

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

219

13.1.2.3. Perhitungan Gaji Bruto


Komponen Gaji Terdiri dari :
-

Gaji Pokok

Tunjangan Istri = 0.1 x Gaji Pokok

Tunjangan Anak = 0.02 x Gaji Pokok x Jumlah Anak.


Jumlah Anak maksimum = 3

Penghasilan Bruto Total merupakan penjumlahan dari :


-

Gaji

Tunjangan PPh yang dibayar oleh Pemberi Kerja / Pemerintah

Tunjangan (Jabatan dan/atau Fungsional)

Honorarium

Procedure HitungBruto(DG:TDaftarGaji; GB:TGajiBruto;


WP:TWajibPajak; Var PB:TPenghasilanBruto);
Var GajiTotal : Array[1..3] of Real;
K,A : Byte;
Begin
If UpCase(WP.Kawin) = Y
Then K := 1
Else K := 0;
A := WP.Anak;
PB.Gaji := 0;
PB.TunjPPh := 0;
PB.Tunjangan := 0;
For I := 1 to DG.N Do
Begin
GajiTotal[I] := GB[I].Pokok + K*0.1*GB[I].Pokok + A*0.02*GB[I].Pokok;
PB.Gaji := PB.Gaji + GajiTotal[I] * DG[I].Jangka;
PB.TunjPPh := PB.TunjPPh + GB[I].TunjPPh * DG[I].Jangka;
PB.Tunjangan := PB.Tunjangan + GB[I].Tunjangan * DG[I].Jangka;
End;
End;

UNIVERSITAS BINA NUSANTARA

220

Logika-Algoritma
Procedure HitungTotalBruto(DH:TDaftarHonor; HR:THonor;
Var PB:TPenghasilanBruto);
Var I : Byte;
Begin
PB.Honor := 0;
For I := 1 to DH.N Do PB.Honor := PB.Honor + HR[I]*DH[I].Jangka;
PB.Total := PB.Gaji + PB.TunjPPh + PB.Tunjangan + PB.Honor;
End;

13.1.2.4. Perhitungan Pemotongan


Komponen Pemotongan :
-

Biaya Jabatan = 0.05 * Total Penghasilan Bruto

Iuran Pensiun = 0.1 * Gaji Bruto

Procedure HitungPemotongan(PenghasilanBruto:TPenghasilanBruto;
Var Pemotongan:TPemotongan);
Var I : Byte;
Begin
With Pemotongan Do
Begin
BiayaJabatan := 0.05 * PenghasilanBruto.Total;
If BiayaJabatan > 648000 Then BiayaJabatan := 648000;
BiayaPensiun := 0;
IuranPensiun := 0.1 * PenghasilanBruto.Gaji;
Total := BiayaJabatan + BiayaPensiun + IuranPensiun;
End;
End;

13.1.2.5. Perhitungan Neto


Procedure HitungNeto(PenghasilanBruto:TPenghasilanBruto;
Pemotongan:Tpemotongan; Var Neto:Real);
Begin
Neto := PenghasilanBruto.Total Pemotongan.Total;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

221

13.1.2.6. Perhitungan Penghasilan Tidak Kena Pajak (PTKP)


Procedure HitungPTKP(WP:TWajibPajak; Var PTKP:Real);
Begin
PTKP := PTKPWajibPajak;
If UpCase(WP.Kawin) = Y then PTKP := PTKP + PTKPKawin;
PTKP := PTKP + PTKPAnak * WP.Anak;
End;

13.1.2.7. Perhitungan Penghasilan Kena Pajak (PKP)


Procedure HitungPKP(PTKP,Neto:Real; Var PKP:Real);
Begin
PKP := Neto PTKP; If PKP < 0 Then PKP := 0;
End;

13.1.2.8. Perhitungan PPh Terutang


Procedure HitungPPhTerutang(PKP:Real; Var PPhTerutang:Real);
Var Pendapatan : LongInt;
Begin
Pendapatan := Int(PKP);
Case Pendapatan of
0..25000000 : PPhTerutang := 0.1 * PKP;
25000000..50000000 : PPhTerutang := 0.1 * 25000000 + 0.15 (PKP-25000000);
Else PPhTerutang := 0.1 * 25000000 + 0.15 * 25000000 +
0.3 * (PKP-50000000);
End;
End;

13.1.2.9. Perhitungan PPh Yang harus Dibayar


Procedure PphHarusDibayar(PPhTerutang:Real; PB:TpenghasilanBruto;
Var PPhHarusDibayar : Real);
Begin
PPhHarus Dibayar := PPhTerutang PB.TunjPPh;
End;

UNIVERSITAS BINA NUSANTARA

222

Logika-Algoritma

13.1.2.10. Formulir Laporan


Procedure FormWajibPajak(WP:TWajibPajak);
Begin
Writeln(0. Identitas Wajib Pajak);
Writeln(

a. Nama Lengkap

: ,WP.Nama);

Writeln(

a. N P W P

: ,WP.NPWP);

End;
Procedure Form1770IB(PB:TPenghasilanBruto);
Begin
Writeln(1. Penghasilan Bruto);
Writeln(

a. Gaji

: ,PB.Gaji:10:2);

Writeln(

b. Tunjangan PPh

: ,PB.TunjPPh:10:2);

Writeln(

c. Tunjangan

: ,PB.Tunjangan:10:2);

Writeln(

d. Honorarium

: ,PB.Honor:10:2);

Writeln(

Jumlah ( a s/d d )

: ,PB.Total:10:2);

End;
Procedure Form1770IC(PR:Tpengurangan);
Begin
Writeln(2. Pengurangan);
Writeln(

a. Biaya Jabatan

: ,PR.BiayaJabatan:10:2);

Writeln(

b. Biaya Pensiun

: ,PR.BiayaPensiun:10:2);

Writeln(

c. Iuran Pensiun

: ,PR.IuranPensiun:10:2);

Writeln(

Jumlah ( a s/d c )

: ,PR.Total:10:2);

End;
Procedure Form1770(Neto,PTKP,PKP,PPhTerutang,PPhDibayar:Real;
PB:TPenghasilanBruto);
Begin
Writeln(I. Penghasilan Neto);
Writeln(

2. Sehubungan Dengan Pekerjaan

: ,Neto:10:2);

Writeln(

5. Jumlah Penghasilan Neto

: ,Neto:10:2);

Writeln(J Penghasilan Kena Pajak);


Writeln(

7. Jumlah Penghasilan Neto

: ,Neto:10:2);

Writeln(

8. Penghasilan Tidak Kena Pajak

: ,PTKP:10:2);

Writeln(

5. Penghasilan Kena Pajak

: ,PKP:10:2);

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

223

Writeln(K PPh Terutang);


Writeln(

10. PPh Terutang

: ,PPhTerutang:10:2);

Writeln(L Kredit Pajak);


Writeln(

13. PPh Yg Dipotong Pihak Lain

: ,PB.TunjPPh:10:2);

Writeln(

15. PPh Yg Dibayar

: ,PPhDibayar:10:2);

End;

13.1.2.11. Program Utama


Didalam Program Utama ini procedure-procedure dikendalikan, procedure-procedure yang
menampilkan hasil dalam bentuk formulir dikendalikan dengan pengulangan repeat-until.
Var F : Text; Selesai : Boolean;
Procedure ScreenOrPrint;
Begin
YouAreTired := False;
Write('Print,Screen,Exit [P/S/E] ? '); Readln(Q);
Case UpCase(Q) of
P' : Assign(F,'PRN');
'S' : AssignCrt(F);
'E' : Selesai := True;
End;
End;
BEGIN
ClrScr;
DataWajibPajak(WP);
DataDaftarGaji(DG);
DataDaftarHonor(DH);
DataGajiBruto(DG,GB);
DataHonorarium(DH,HR);
HitungBruto(DG,GB,WP,PB);
HitungTotalBruto(DH,HR,PB);
HitungPemotongan(PB,PR);
HitungNeto(PB,PR,Neto);
HitungPTKP(WP,PTKP);
HitungPKP(PTKP,Neto,PKP);
HitungPPhTerutang(PKP,PPhTerutang);

UNIVERSITAS BINA NUSANTARA

224

Logika-Algoritma
HitungPPhHarusDibayar(PPhTerutang,PB,PPhHarusDibayar);
Repeat
ScreenOrPrint;
ReWrite(F);
FormWajibPajak(WP);
Form1770IB(PB);
Form1770IC(PR);
Form1770(Neto,PTKP,PKP,PPhTerutang,PPhDibayar,PB);
Close(F);
Until YouAreTired;
END.

13.1.3. Contoh Pemakaian


Misalkan kita mempunyai Daftar Gaji Tuan Fulan yang terdiri dari dua daftar gaji :
Daftar Pertama
Nama : Drs. Fulan, MBA.
Jabatan : Kepala Sub-bagian Umum
Banyaknya keluarga 5 (lima) , 1(satu) Istri dengan 3 (tiga) Anak mempunyai
Penghasilan setiap bulannya untuk bulan Januari s/d Maret 1977 sebagai berikut :
1. Gaji Pokok

Rp. 443.100,-

2. Tunjangan Istri

Rp. 44.310,-

3. Tunjangan Anak 3(tiga) jiwa

Rp

4. Tunjangan Jabatan/Fungsional

Rp. 290.000,-

5. Tunjangan PPh

Rp. 35.479,-

26.586,-

Jumlah Penghasilan Gaji Kotor :

Rp. 839.475,-

Potongan-potongan
1. Iuran Pensiun

Rp. 51.400,-

2. Pajak Penghasilan

Rp. 35.479,-

Jumlah Potongan-potongan :

Rp. 86.879,-

Jumlah Penerimaan Gaji Bersih :

Rp. 752.596,-

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

225

Daftar Kedua
Nama : Drs. Fulan, MBA.
Jabatan : Kepala Sub-bagian Umum
Banyaknya keluarga 5 (lima) , 1(satu) Istri dengan 3 (tiga) Anak mempunyai
Penghasilan setiap bulannya untuk bulan April s/d Desember 1977 sebagai berikut :
1. Gaji Pokok

Rp. 465.300,-

2. Tunjangan Istri

Rp. 46.530,-

3. Tunjangan Anak 3(tiga) jiwa

Rp

4. Tunjangan Jabatan/Fungsional

Rp. 385.000,-

5. Tunjangan PPh

Rp. 59.034,-

27.918,-

Jumlah Penghasilan Gaji Kotor :

Rp. 983.782,-

Potongan-potongan
1. Iuran Pensiun

Rp. 53.975,-

2. Pajak Penghasilan

Rp. 59.034,-

Jumlah Potongan-potongan :

Rp. 113.009,-

Jumlah Penerimaan Gaji Bersih :

Rp. 870.773,-

Dari data yang tercantum diatas, yang perlu dimasukan adalah :


a. Gaji Pokok.
Tunjangan Istri dan Anak-anak dihitung didalam program.
Iuran Pensiun juga dihitung didalam program
b. Tunjangan Jabatan/Fungsional
c.

Pajak Penghasilan

Apabila program dijalankan, akan tampak dilayar, dialog sebagai berikut (string yang diberi
garis bawah adalah masukan oleh operator) :
Nama : Drs. Fulan, MBA.
NPWP : 1.222.333.4.555
Kawin [Y/T] : Y
Jumlah Anak : 3
Jumlah Daftar Gaji [1..3] : 2
1 Jangka Waktu [1..12 Bulan] : 3
2 Jangka Waktu [1..12 Bulan] : 9
Jumlah Daftar Honor : 0

UNIVERSITAS BINA NUSANTARA

226

Logika-Algoritma
Gaji Pokok 1 : 443100
Tunjangan 1 : 290000
Tunj. PPh 1 :

35479

Gaji Pokok 2 : 465300


Tunjangan 2 : 385000
Tunj. PPh 2 :

59034

Setelah data terakhir masuk, program akan segera mengolah data sesuai dengan algoritma
diatas, dan hasilnya tampak dalam bentuk form laporan seperti berikut :
0. Identitas Wajib Pajak
a. Nama Lengkap

: Drs. Fulan, MBA.

b. N P W P

: 1.222.333.4.555

Formulir 1770-I Bagian A :


1. Penghasilan Bruto
a. Gaji

6399720.00

b. Tunjangan PPh :

637743.00

c. Tunjangan

4335000.00

d. Honorarium

0.00

Jumlah ( a s/d d) : 11372463.00


2. Pengurangan
a. Biaya Jabatan

568623.15

b. Biaya Pensiun

0.00

c. Iuran Pensiun

639972.00

Jumlah (a s/d c) :

1208595.15

Formulir 1770
I.

J.

K.

Penghasilan Neto
2. Sehubungan Dengan Pekerjaan

10163867.85

5. Jumlah Penghasilan Neto

10163867.85

7. Jumlah Penghasilan Neto

10163867.85

8. Penghasilan Tidak Kena Pajak

5184000.00

9. Penghasilan Kena Pajak

4979867.85

497986.79

13. PPh Yang Dipotong Oleh Pihak Lain

637743.00

15. PPh Yang Dibayar

0.00

Penghasilan Kena Pajak

PPh Terutang
10. PPh Terutang

L.

Kredit Pajak

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

227

13.2. Konversi Angka Romawi ke Latin


Angka Romawi masih sering sering kita jumpai dalam kegiatan sehari-hari, misalnya angka
jarum jam, terutama jam yang klasik, masih menggunakan angka Romawi, yaitu : XII, III, VI
dan IX. Kemudian penulisan abad, misal abad ke 20 ditulis XX dan abad ke 21 ditulis XXI, tak
ketinggalan dokter juga menggunakan angka Romawi dalam menulis resep, yaitu jumlah obat
yang harus dibeli.

13.2.1. Permasalahan
Membaca angka Romawi, tidaklah mudah mengingat sistem penulisan yang jauh berbeda
dengan sistem penulisan angka Latin yang sebetulnya diambil dari cara penulisan angka
Arab. Meskipun angka Latin dan Romawi mempunyai dasar (radix) yang sama, yaitu 10,
tetapi cara atau sistem penulisan angka Romawi berbeda jauh dengan angka Latin. Untuk
itulah dibuat suatu program yang dapat mengkonversi bilangan Romawi ke bilangan Latin.
Angka-angka dalam Romawi menggunakan huruf-huruf :
I

melambangkan angka : 1

melambangkan angka : 5

melambangkan angka : 10

melambangkan angka : 50

melambangkan angka : 100

melambangkan angka : 500

melambangkan angka : 1000

Ketentuan penulisan :
1. Angka-angka I, X dan C dapat digunakan maksimal tiga kali berturut-turut, nilainya
merupakan kelipatan dari banyaknya angka Romawi tersebut.
Contoh :

III : diperbolehkan, nilai = 3 * 1 = 3


IIII : tidak diperbolehkan
XX : diperbolehkan, nilai = 2 * 10 = 20
CCC : diperbolehkan, nilai = 3 * 100 = 300

Angka Romawi M, dapat ditulis beberapa kali, tidak terbatas.


Contoh :

MMMM, mempunyai nilai = 4 * 1000 = 4000

UNIVERSITAS BINA NUSANTARA

228

Logika-Algoritma

2. Angka-angka Romawi V, L dan D hanya digunakan satu kali.


3. Angka-angka I, X, dan C dapat digunakan untuk menambah, jika angka yang lebih besar
berada didepan angka yang lebih kecil.
Contoh : VII merupakan gabungan angka Romawi V dengan angka Romawi II,
nilai angka Romawi VII adalah 5 + 2 = 7
XXI, merupakan gabungan angka Romawi XX dengan angka Romawi I,
nilai angka Romawi XXI adalah 20 + 1 = 21
Angka kecil yang berada langsung dibelakang angka yang lebih besar, jumlahnya tidak
lebih dari tiga (melanggar aturan No.1).
Contoh : VIIII, tidak diperbolehkan, karena nilai 9 ditulis : IX
XXIIII, tidak diperbolehkan, karena nilai 24 ditulis : XXIV
4. Angka-angka I, X, dan C dapat digunakan untuk mengurangi jika angka yang lebih kecil
berada didepan angka yang lebih besar.
Contoh : IV merupakan gabungan angka Romawi I dengan angka Romawi V,
maka nilai angka Romawi IV adalah 5 - 1 = 4
CM = 1000 - 100 = 900
IC = 100 - 1 = 99
Angka kecil yang berada langsung didepan angka yang lebih besar, jumlahnya tidak lebih
dari satu.
Contoh : IIV, tidak diperbolehkan, karena nilai 3 ditulis : III
IIIX, tidak diperbolehkan, karena nilai 7 ditulis : VII
5. Kombinasi aturan 4 dan 5 menghasilkan angka Romawi yang lebih kompleks.
Contoh : XXXIX, merupakan gabungan : XXX , I dan X .
Dibaca XXX I dan X atau XXX dan IX ?
yang benar adalah XXX dan IX, jadi = 30 + 9 = 39, karena bila dibaca XXXI
dan X, berarti nilai XXXI = 31, dan sudah final, X berikutnya diabaikan.
Maka bila penulisan sudah sedemikian kompleks, kita menganalisis gabungan angka
Romawi sebagai gabungan beberapa suku-angka Romawi.
Contoh : LXXXIV terdiri dari tiga suku-angka : L, XXX dan IV, yang kesemuanya
memenuhi ketentuan diatas. Nilai angka tersebut : 50 + 30 + 4 = 84.
MCMXCIX terdiri dari empat suku-angka : M, CM, XC dan IX, yang mempunyai
nilai : 1000 + 900 + 90 + 9 = 1999.
Dengan demikian, pembagian suku-suku angka Romawi tetap menggunakan asas,
ribuan, ratusan, puluhan dan satuan, karena sistem ini menggunakan dasar (radix)10.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

229

13.2.2. Algoritma Konversi Angka Romawi ke Angka Latin.


Algoritma 13.2. Konversi Angka Romawi ke Angka Latin
1. Masukan angka Romawi
2. Proses Validasi angka Romawi, meliputi :
-

Pemeriksaan angka Romawi yang berlaku yaitu : I, V, X, L, C, D, M.

Pemeriksaan penggunaan angka I, X dan C maksimal tiga kali.

Pemeriksaan penggunaan angka V, L, dan D, maksimal satu kali.

Pemeriksaan urutan penulisan, yaitu : bila dari kiri ke kanan terdapat angka
kecil mendahului angka yang lebih besar maka angka besar harus
merupakan kelipatan 5 atau 10 dari bilangan yang lebih kecil tadi.

Pemeriksaan urutan penulisan, yaitu : bila dari kiri ke kanan terdapat angka
kecil mendahului angka yang lebih besar maka jumlah angka kecil tadi tidak
lebih dari satu.

Pemeriksaan urutan penulisan, yaitu : bila dari kiri ke kanan terdapat angka
besar mendahului angka yang lebih kecil maka jumlah angka kecil tadi tidak
lebih dari tiga.

3. Proses Konversi, meliputi :


-

Proses angka Romawi dari kiri ke kanan.

Bila angka Romawi <> angka Romawi berikutnya, konversi angka Romawi
ke angka Latin.

Bila angka Romawi = angka Romawi berikutnya, maka jumlah angka Romawi
yang sama akan dikonversikan menjadi satu angka Latin.

Bila angka Romawi < angka Romawi berikutnya, angka Romawi yang lebih
besar dikurangi oleh angka Romawi yang lebih kecil, kemudian hasilnya
sebagai angka Latin.

Bila angka Romawi > angka Romawi berikutnya, angka Romawi yang lebih
besar ditambah oleh angka Romawi yang lebih kecil, kemudian hasilnya
sebagai angka Latin.

Jumlahkan semua hasil konversi sehingga didapat kesatuan angka Latin.

13.2.3. Program Konversi Angka Romawi ke Angka Latin


Program ROMAWI2LATIN;
Uses CRT;
Const Set_Romawi = [ I, V, X, L, C, D, M ];

UNIVERSITAS BINA NUSANTARA

230

Logika-Algoritma
Procedure Judul_Program;
Begin
ClrScr;
Writeln('Program Konversi Angka Romawi ke Angka Latin');
Writeln('============================================');
Writeln;
End;
Function Nilai(X:Char):Integer;
Begin
Case X of
'I' : Nilai := 1;
'V' : Nilai := 5;
'X' : Nilai := 10;
'L' : Nilai := 50;
'C' : Nilai := 100;
'D' : Nilai := 500;
'M' : Nilai := 1000;
End;
End;
Procedure Test_Err01(StrRomawi:String;Var Valid:Boolean);
{Validasi Angka Romawi : I, V, X, L, C, D, M}
Var I, Limit : Integer;
Begin
Valid := True; Limit := Length(StrRomawi);
For I := 1 to Limit Do
If Not (StrRomawi[I] In SetRomawi) Then Valid := False;
If Not Valid Then Writeln('Ada Angka Tak Dikenal');
End;
Procedure Test_Err02(StrRomawi:String;Var Valid:Boolean);
{Validasi I, X, C, maks 3 angka berurutan}
Var I,K,Limit:Integer;
Begin
Valid := True; Limit := Length(StrRomawi);
K := 1;
For I := 1 to Limit Do

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

231

Begin
If (I > 1) And (StrRomawi[I] In ['I','X','C']) Then
Begin
If StrRomawi[I] = StrRomawi[I-1] Then Inc(K) Else K := 0;
If K > 3 Then Valid := False;
End;
End;
If Not Valid Then Writeln('I/X/C muncul berturut-turut > 3');
End;
Procedure Test_Err03(StrRomawi:String;Var Valid:Boolean);
{Validasi V,L,D maks 1}
Var I,Limit:Integer;
Begin
Valid := True; Limit := Length(StrRomawi);
For I := 1 to Limit Do
Begin
If (I > 1) And (StrRomawi[I] In ['V','L','D']) Then
Begin
If StrRomawi[I] = StrRomawi[I-1] Then Valid := False;
End;
End;
If Not Valid Then Writeln('V/L/D muncul > 1');
End;
Procedure Test_Err04(StrRomawi:String;Var Valid:Boolean);
{Validasi I, X, C, mengawali maks 1 kali }
Var I,J,K,Limit:Integer;
Begin
Valid := True ; Limit := Length(StrRomawi);
K := 1;
For I := 1 to Limit Do
Begin
If (I > 1) And (StrRomawi[I] In ['I','X','C']) Then
Begin
If StrRomawi[I] = StrRomawi[I-1] Then Inc(K) Else K := 0;
End;
If (Nilai(StrRomawi[I]) > Nilai(StrRomawi[I-1]))

UNIVERSITAS BINA NUSANTARA

232

Logika-Algoritma
And (K > 1) Then Valid := False;
End;
If Not Valid Then Writeln('Awalan I/X/C > 1');
End;
Procedure Masukan(Var StrRomawi:String);
Begin
Write('Angka Romawi : '); Readln(StrRomawi);
End;
Procedure Konversi(StrRomawi:String; Var Latin:Integer);
Var I,Limit:Integer;
Begin
Latin := 0; Limit := Length(StrRomawi);
For I := 1 to Limit Do
Begin
If I = Limit
Then Latin := Latin + Nilai(StrRomawi[I])
Else If Nilai(StrRomawi[I]) >= Nilai(StrRomawi[I+1])
Then Latin := Latin + Nilai(StrRomawi[I])
Else Latin := Latin - Nilai(StrRomawi[I])
End;
End;
Var

StrRomawi : String;
Jawab:Char; Valid:Boolean;
Latin : Integer;

BEGIN
Judul_Program;
Repeat
Masukan(StrRomawi);
Test_Err01(StrRomawi,Valid);
If Valid Then Test_Err02(StrRomawi,Valid);
If Valid Then Test_Err03(StrRomawi,Valid);
If Valid Then Test_Err04(StrRomawi,Valid);
If Valid Then

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

233

Begin
Writeln('Angka Romawi Benar');
Konversi(StrRomawi,Latin);
Writeln('Angka Latin : ',Latin);
End;
Write('Ulangi [Y/T] ? '); ReadLn(Jawab);
Until UpCase(Jawab) = 'T';
END.
Hasil dari menjalankan program diatas :
Angka Romawi : MCMXCIX
Angka Romawi Benar
Angka Latin

: 1999

Ulangi [Y/T] ? y
Angka Romawi : IIX
Awalan I/X/C > 1
Ulangi [Y/T] ? y
Angka Romawi : XLIV
Angka Romawi Benar
Angka Latin

: 44

Ulangi [Y/T] ? y
Angka Romawi : CLXXiV
Angka Romawi Benar
Angka Latin

: 174

Ulangi [Y/T] ? y
Angka Romawi : XXVIIII
I/X/C muncul berturut-turut > 3
Ulangi [Y/T] ? y
Angka Romawi : CCXCIII
Angka Romawi Benar
Angka Latin

: 293

Ulangi [Y/T] ? y
Angka Romawi : XXIN
Ada Angka Tak Dikenal
Ulangi [Y/T] ? T

UNIVERSITAS BINA NUSANTARA

234

Logika-Algoritma

13.3. Menggambar Citra dengan Chain-Code.


Citra yang direpresentasikan dengan chain-code adalah jenis citra yang diwakili oleh batas
luar (boundary), karena ada jenis lain dari citra yang diwakili oleh bidang (region). Ada
keuntungan dan kerugian dari representasi citra dengan dua cara tersebut, pembahasan
tersebut diluar jangkauan buku ini, disini hanya akan dibahas bagaimana membuat citra
dengan chain-code dan operasi-operasi apa saja yang dapat dilakukan pada citra tersebut.
Tujuan dari studi kasus ini, selain menunjukkan beberapa algoritma yang cukup menarik
untuk dibahas, juga untuk menunjukkan pemakaian simpul-berantai (linked-list).

13.3.1. Chain-code.
Chain-code atau kadang-kadang disebut juga dengan crack-code, ada suatu kode yang
serupa dengan arah mata-angin, hanya saja arah tersebut tidak dinyatakan dengan Utara,
Timur, Selatan dan Barat, melainkan dengan kode angka, yaitu : 0, 1, 2, 3, 4, 5, 6 dan 7.

Gambar 13.1. Chain-Code


Dengan menggunakan kode arah seperti telihat diatas, maka kode :
000111111222222333333000
sudah mewakili suatu chain-code yang membentuk citra segi-empat. Kode arah tersebut
dapat disimpan dalam bentuk simpul-berantai, yang telah dipelajari pada bab 11. Simpulberantai yang digunakan tidak harus simpul ganda (doubly linked-list) tetapi cukup dengan
simpul tunggal.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

235

13.3.2. Operasi-operasi yang dapat dilakukan pada Chain-code.


Setelah citra digambar dengan Chain-code, maka terhadap citra tersebut dapat dilakukan
operasi-operasi sebagai berikut :
a. Pergeseran (shifting)
b. Pembesaran (zooming)
c.

Perhitungan geometris :
-

Perhitungan Keliling.

Perhitungan Panjang dan Lebar

Perhitungan Luas.

Pergeseran dengan mudah dilakukan, yaitu dengan menggeser koordinat titik awal,
sedangan pembesaran dilakukan dengan mengalikan jumlah kode masing-masing arah
dengan faktor pembesaran yang diinginkan. Contoh misalkan citra segi-empat yang kita buat
dengan chain-code :

0 0 0 1 1 1 2 2 2 3 3 3 diperbesar dengan faktor 2, maka kode yang

baru adalah : 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3. Perhitungan keliling dengan


mudah dilakukan yaitu dengan menghitung jumlah kode secara keseluruhan. Satuan
geometrik yang didapat adalah relaitf, yaitu dengan ukuran pixel, bila satu kode mewakili satu
pixel. Adapun perhitungan skala berikutnya, tergantung dari bagaimana dan dari mana citra
tersebut dibentuk. Algoritma yang lebih rumit diperlukan untuk perhitungan geometris lainnya
yaitu untuk menghitung : Tinggi, Lebar dan Luas (Freeman,1980).

13.3.2.1. Perhitungan Tinggi dan Lebar.


Misalkan kita punya citra dengan bentuk sebagai berikut :

Tinggi

Titik Awal
Lebar
Gambar 13.2. Citra dengan kode : 0 0 1 1 2 2 0 2 2 4 4 2 2 3 3 4 6 6 6 6 6 0 6 4 6 6 6 6.

UNIVERSITAS BINA NUSANTARA

236

Logika-Algoritma

Sekarang kita buat notasi sebagai berikut :


A = a1 + a2 + a3 + . . . + an
n
A = C aI , dibaca sebagai : Chain ai dari i= 1 sampai i = n
i =1
Untuk bisa menghitung geometris, ai dipecah menjadi dua komponen vertikal dan horizontal,
komponen vertikal disebut aiy dan komponen horizontal disebut aix.
Tabel 13.1. Komponen X-Y Chain-code
ai

aix

aiy

-1

-1

-1

-1

-1

-1

Untuk menghitung Lebar dan Tinggi, Chain-code dilacak dari titik awak hingga akhir, dengan
melakukan perhitungan kumulatif pada setiap kode. Perhitungan kumulatif, adalah sebagai
berikut :
i

Wi = ajx .(1a)
j =1

Hi = ajy .(1a)
j =1

Lebar = Wi(max) - Wi(min) .(2a)


Tinggi = Hi(max) - Hi(min)
dengan :

....(2b)

i = 0, 1, 2, 3, . . . , n (banyaknya kode didalam Chain-code)


W0 = 0 dan H0 = 0.

sekarang kita gunakan rumus : 1a, 1b, 2a dan 2b. dan nilai pada Tabel 13.1. untuk menyusun
algoritma Perhitungan Lebar dan Tinggi.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

237

Algoritma 13.3. Perhitungan Lebar dari Gambar yang dibentuk dengan Chain-Code.
1. W0 0
2. i 1 , kode pertama Chain-code
3. Bila ai = 0 , maka aix 0
Bila ai = 1 , maka aix 1
Bila ai = 2 , maka aix 1
Bila ai = 3 , maka aix 1
Bila ai = 4 , maka aix 0
Bila ai = 5 , maka aix -1
Bila ai = 6 , maka aix -1
Bila ai = 7 , maka aix -1
4. Wi W(i-1) + aix
5. Ulangi 3 dan 4 untuk i i + 1 hingga i = n, kode terakhir Chain-code.
6. Cari Wi(max) dan Wi(min) maka Lebar Wi(max) - Wi(min).
Dengan mengambil contoh citra gambar 13.2. dengan kode :
0 0 1 1 2 2 0 2 2 4 4 2 2 3 3 4 6 6 6 6 6 0 6 4 6 6 6 : (ada 28 kode : a1 a28)
Perhitungan Lebar :
W0 = 0
W1 = W0 + a1x = 0 + 0 = 0

W2 = W1 + a2x = 0 + 0 = 0

W3 = W2 + a3x = 0 + 1 = 1

W4 = W3 + a4x = 1 + 1 = 2

W5 = W4 + a5x = 2 + 1 = 3

W6 = W5 + a6x = 3 + 1 = 4

W7 = W6 + a7x = 4 + 0 = 4

W8 = W7 + a8x = 4 + 1 = 5

W9 = W8 + a9x = 5 + 1 = 6

W10 = W9 + a10x = 6 + 0 = 6

W11 = W10 + a11x = 6 + 0 = 6

W12 = W11 + a12x = 6 + 1 = 7

W13 = W12 + a13x = 7 + 1 = 8

W14 = W13 + a14x = 8 + 1 = 9

W15 = W14 + a15x = 9 + 1 = 10

W16 = W15 + a16x = 10 + 0 = 10

W17 = W16 + a17x = 10 - 1 = 9

W18 = W17 + a18x = 9 -1 = 8

W19 = W18 + a19x = 8 -1 = 7

W20 = W19 + a20x = 7 - 1 = 6

W21 = W20 + a21x = 6 - 1 = 5

W22 = W21 + a22x = 5 + 0 = 5

W23 = W22 + a23x = 5 - 1 = 4

W24 = W23 + a24x = 4 + 0 = 4

W25 = W24 + a25x = 4 - 1 = 3

W26 = W25 + a26x = 3 - 1 = 2

W27 = W26 + a27x = 2 - 1 = 1

W28 = W27 + a28x = 1 - 1 = 0

Wi(max) = 10

Wi(min) = 0

Lebar = 10 - 0 = 10

UNIVERSITAS BINA NUSANTARA

238

Logika-Algoritma
Algoritma 13.4. Perhitungan Tinggi dari Gambar yang dibentuk dengan Chain-Code.
1. H0 0
2. i 1 , kode pertama Chain-code
3. Bila ai = 0 , maka aiy 1
Bila ai = 1 , maka aiy 1
Bila ai = 2 , maka aiy 0
Bila ai = 3 , maka aiy -1
Bila ai = 4 , maka aiy -1
Bila ai = 5 , maka aiy -1
Bila ai = 6 , maka aiy 0
Bila ai = 7 , maka aiy 1
4. Hi H(I-1) + aiy
5. Ulangi 3 dan 4 untuk i i + 1 hingga I = n, kode terakhir Chain-code.
6. Cari Hi(max) dan Hi(min), maka Tinggi Hi(max) - Hi(min).

Dengan mengambil contoh citra gambar 13.2. dengan kode :


0 0 1 1 2 2 0 2 2 4 4 2 2 3 3 4 6 6 6 6 6 0 6 4 6 6 6 6 : (ada 28 kode : a1 a28)
Perhitungan Tinggi :
H0 = 0
H1 = H0 + a1y = 0 + 1 = 1

H2 = H1 + a2y = 1 + 1 = 2

H3 = H2 + a3y = 2 + 1 = 3

H4 = H3 + a4y = 3 + 1 = 4

H5 = H4 + a5y = 4 + 0 = 4

H6 = H5 + a6y = 4 + 0 = 4

H7 = H6 + a7y = 4 + 1 = 5

H8 = H7 + a8y = 5 + 0 = 5

H9 = H8 + a9y = 5 + 0 = 5

H10 = H9 + a10y = 5 - 1 = 4

H11 = H10 + a11y= 4 - 1 = 3

H12 = H11 + a12y = 3 + 0 = 3

H13 = H12 + a13y = 3 + 0 = 3

H14 = H13 + a14y = 3 - 1 = 2

H15 = H14 + a15y = 2 - 1 = 1

H16 = H15 + a16y = 1 - 1 = 0

H17 = H16 + a17y = 0 + 0 = 0

H18 = H17 + a18y = 0 + 0 = 0

H19 = H18 + a19y = 0 + 0 = 0

H20 = H19 + a20y = 0 + 0 = 0

H21 = H20 + a21y = 0 + 0 = 0

H22 = H21 + a22y = 0 + 1 = 1

H23 = H22 + a23y = 1 + 0 = 1

H24 = H23 + a24y = 1 - 1 = 0

H25 = H24 + a25y = 0 + 0 = 0

H26 = H25 + a26y = 0 + 0 = 0

H27 = H26 + a27y = 0 + 0 = 0

H28 = H27 + a28y = 0 + 0 = 0

Hi(max) = 5

Hi(min) = 0

Tinggi = 5 - 0 = 5

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

239

13.3.2.2. Perhitungan Luas.


Untuk menghitung Luas area, perhatikan contoh gambar berikut :

a4

a7

a1

a10
Gambar 13.3. Chain-code : 0 2 0 2 4 2 4 6 4 6 0 6
Ai = aix (Y(i-1) + 0.5 * aiy) (3)
Y(i-1) = Y(i-2) + a(I-1)y ..(4)
n

Luas = Ai (5)
i =1

Algoritma 13.5. Perhitungan Luas dari Gambar yang dibentuk dengan Chain-Code.
1. Luas 0
2. Y0 0
3. i 1 , kode pertama Chain-code
4. Bila ai = 0 , maka aix 0

dan aiy 1

Bila ai = 1 , maka aix 1

dan aiy 0

Bila ai = 2 , maka aix 0

dan aiy -1

Bila ai = 3 , maka aix -1 dan aiy 0


5. Y(i-1) Y(i-2) + a(I-1)y
6. Ai aix (Y(i-1) + 0.5 * aiy)
7. Luas Luas + Ai
8. Ulangi 4, 5, 6 dan 7 untuk i i + 1 hingga i = n, kode terakhir Chain-code.
Dengan mengambil contoh citra gambar 13.3. dengan kode :
0 2 0 2 4 2 4 6 4 6 0 6: (ada 12 kode : a1 a12)

UNIVERSITAS BINA NUSANTARA

240

Logika-Algoritma

Perhitungan Luas :
Y0 = 0

A1 = a1x(Y0 + 0.5 * a1y) = 0(0 + 0.5 * 1) = 0

Y1 = Y0 + a1y = 0 + 1 = 1

A2 = a2x(Y1 + 0.5 * a2y) = 1(1 + 0.5 * 0) = 1

Y2 = Y1 + a2y = 1 + 0 = 1

A3 = a3x(Y2 + 0.5 * a3y) = 0(1 + 0.5 * 1) = 0

Y3 = Y2 + a3y = 1 + 1 = 2

A4 = a4x(Y3 + 0.5 * a4y) = 1(2 + 0.5 * 0) = 2

Y4 = Y3 + a4y = 2 + 0 = 2

A5 = a5x(Y4 + 0.5 * a5y) = 0(2 + 0.5 * -1) = 0

Y5 = Y4 + a5y = 2 - 1 = 1

A6 = a6x(Y5 + 0.5 * a6y) = 1(1 + 0.5 * 0) = 1

Y6 = Y5 + a6y = 1 + 0 = 1

A7 = a7x(Y6 + 0.5 * a7y) = 0(1 + 0.5 * -1) = 0

Y7 = Y6 + a7y = 1 - 1 = 0

A8 = a8x(Y7 + 0.5 * a8y) = -1(0 + 0.5 * 0) = 0

Y8 = Y7 + a8y = 0 + 0 = 0

A9 = a9x(Y8 + 0.5 * a9y) = 0(0 + 0.5 * -1) = 0

Y9 = Y8 + a9y = 0 - 1 = -1

A10 = a10x(Y9 + 0.5 * a10y) = -1(-1 + 0.5 * 0) = 1

Y10 = Y9 + a10y = -1 + 0 = -1

A11 = a11x(Y10 + 0.5 * a11y) = 0(-1 + 0.5 * 0) = 0

Y11 = Y10 + a11y = -1 + 1 = 0 A12 = a12x(Y11 + 0.5 * a12y) = -1(0 + 0.5 * 0) = 0


Luas = A1 + A2 + A3 + A4 + + A10 + A11 + A12 = 5

13.3.3.

Program Chain-code.

Program Chain-code dilaksanakan dengan menggunakan Delphi-3 yang dapat dijalankan


pada lingkungan Windows-95. Penggunaan Delphi sangat membantu dalam memperbaiki
tampilan program supaya tampak lebih profesional, selain itu pembuatan program jauh lebih
cepat, karena beberapa komponen standar Windows telah disediakan oleh Delphi.
Listing program yang ditampilkan disini berupa Unit ChnCode, sebagai unit utama.
unit Chncode;
interface
uses
SysUtils, WinTypes, WinProcs,
Messages, Classes, Graphics,
Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus,
ComCtrls;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

241

type
TForm1 = class(TForm)
Bevel1: TBevel;
Image1: TImage;
StatusBar1: TStatusBar;
MainMenu: TMainMenu;
File: TMenuItem;
New: TMenuItem; Open: TMenuItem; Save: TMenuItem;
Clear: TMenuItem; Redraw: TMenuItem; Exit: TMenuItem;
OperasiGeometris: TMenuItem;
Keliling: TMenuItem; Lebar: TMenuItem; Tinggi: TMenuItem; Luas: TMenuItem;
Transformasi: TMenuItem;
Translasi: TMenuItem; RotasiKanan: TMenuItem; RotasiKiri: TMenuItem;
Perbesaran2X: TMenuItem; Perbesaran3x: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Help1: TMenuItem;
HowTo1: TMenuItem;
About1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState;
X,Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Exit1Click(Sender: TObject);
procedure Clear1Click(Sender: TObject);
procedure Keliling1Click(Sender: TObject);
procedure Lebar1Click(Sender: TObject);
procedure Tinggi1Click(Sender: TObject);
procedure Luas1Click(Sender: TObject);
procedure New1Click(Sender: TObject);
procedure Redraw1Click(Sender: TObject);
procedure Save1Click(Sender: TObject);
procedure Open1Click(Sender: TObject);

UNIVERSITAS BINA NUSANTARA

242

Logika-Algoritma
private
{ Private declarations }
public
Drawing,StartDraw : Boolean;
end;
type pcc = ^cc;
cc = record
kode : byte;
next : pcc;
end;
var
Form1: TForm1;
Head, Tail : pcc;
XOld,YOld, B : Integer;
implementation
uses JudulGambar;
{$R *.DFM}
procedure CreateChain(D:Byte);
var Temp:pcc;
begin
New(Temp); Inc(B);
Temp^.Kode := D;
Temp^.Next := Nil;
if Head = Nil
then begin
Head := Temp;
Tail := Head;
end
else begin
Tail^.Next := Temp;
Tail := Temp;
end;
end;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

243

procedure ClearChain;
var P:pcc;
begin
while Head <> Nil Do
begin
P := Head;
Head := Head^.Next;
Dispose(P);
end;
B := 0;
end;
procedure TForm1.Clear1Click(Sender: TObject);
var I:Integer;
begin
Image1.Canvas.Pen.Color := ClWhite;
for I := 5 to 390 do
begin
Image1.Canvas.MoveTo(I,5);
Image1.Canvas.LineTo(I,215);
end;
Image1.Canvas.Pen.Color := ClBlack;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Head := Nil ; Tail := Nil; B := 0;
end;
procedure TForm1.New1Click(Sender: TObject);
var I : Integer;
begin
Image1.Canvas.Pen.Color := ClBlack;
Image1.Canvas. Rectangle(0,0,397,221);
FormJudul.Show;
StartDraw := True;
Clear1Click(Sender);

UNIVERSITAS BINA NUSANTARA

244

Logika-Algoritma
for I := 1 to 9 do if (I mod 2) = 1 then StatusBar1.Panels[I].Text := '';
StatusBar1.Panels[8].Text := '';
if Head <> Nil then ClearChain;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := True;
Image1.Canvas.MoveTo(X, Y);
XOld := X; YOld := Y;
StatusBar1.Panels[1].Text := IntToStr(X);
StatusBar1.Panels[3].Text := IntToStr(Y);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var D:Byte;
begin
D := 0;
if (X=XOld) and (Y<YOld) then D := 0 else
if (X>XOld) and (Y<YOld) then D := 1 else
if (X>XOld) and (Y=YOld) then D := 2 else
if (X>XOld) and (Y>YOld) then D := 3 else
if (X=XOld) and (Y>YOld) then D := 4 else
if (X<XOld) and (Y>YOld) then D := 5 else
if (X<XOld) and (Y=YOld) then D := 6 else
if (Y<YOld) and (Y<YOld) then D := 7;
if Drawing and StartDraw then
begin
Image1.Canvas.LineTo(X, Y);
CreateChain(D);
XOld := X; YOld := Y;
StatusBar1.Panels[5].Text := IntToStr(X);
StatusBar1.Panels[7].Text := IntToStr(Y);
end;
end;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

245

procedure DrawChain(XP,YP:Integer);
var P:pcc;
begin
P := Head;
with Form1.Image1.Canvas do
while P <> Nil Do
begin
case P^.Kode of
0 : begin Dec(YP);LineTo(XP,YP) end;
1 : begin Inc(XP);Dec(YP);LineTo(XP,YP) end;
2 : begin Inc(XP);LineTo(XP,YP) end;
3 : begin Inc(XP);Inc(YP);LineTo(XP,YP) end;
4 : begin Inc(YP);LineTo(XP,YP) end;
5 : begin Dec(XP);Inc(YP);LineTo(XP,YP) end;
6 : begin Dec(XP);LineTo(XP,YP) end;
7 : begin Dec(XP);Dec(YP);LineTo(XP,YP) end;
end;
P := P^.Next;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := False; StartDraw := False;
end;
procedure TForm1.Redraw1Click(Sender: TObject);
var XP,YP:Integer;
begin
XP := StrToInt(StatusBar1.Panels[1].Text);
YP := StrToInt(StatusBar1.Panels[3].Text);
Image1.Canvas.MoveTo(XP,YP);
DrawChain(XP,YP);
end;

UNIVERSITAS BINA NUSANTARA

246

Logika-Algoritma
procedure TForm1.Keliling1Click(Sender: TObject);
var P:pcc;
begin
StatusBar1.Panels[8].Text := 'Keliling : ';
StatusBar1.Panels[9].Text := IntToStr(B);
end;
function Ax(D:Integer):Integer;
begin
case D of
0 : Ax := 0;
1 : Ax := 1;
2 : Ax := 1;
3 : Ax := 1;
4 : Ax := 0;
5 : Ax := -1;
6 : Ax := -1;
7 : Ax := -1;
end;
end;
function Ay(D:Integer):Integer;
begin
case D of
0 : Ay := 1;
1 : Ay := 1;
2 : Ay := 0;
3 : Ay := -1;
4 : Ay := -1;
5 : Ay := -1;
6 : Ay := 0;
7 : Ay := 1;
end;
end;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

247

procedure TForm1.Lebar1Click(Sender: TObject);


var P : pcc; Wtot,Wmin,Wmax : Integer;
begin
StatusBar1.Panels[8].Text := 'Lebar : ';
Wtot := 0; Wmin := 0; Wmax := 0;
P := Head;
while P <> Nil do
begin
Wtot := Wtot + Ax(P^.Kode);
If (Wtot < Wmin) then Wmin := Wtot;
If (Wtot > Wmax) then Wmax := Wtot;
P := P^.Next;
end;
StatusBar1.Panels[9].Text := IntToStr(Wmax-Wmin);
end;
procedure TForm1.Tinggi1Click(Sender: TObject);
var P : pcc; Htot,Hmin,Hmax : Integer;
begin
StatusBar1.Panels[8].Text := 'Tinggi : ';
Htot := 0; Hmin := 0; Hmax := 0;
P := Head;
while P <> Nil do
begin
Htot := Htot + Ay(P^.Kode);
If (Htot < Hmin) then Hmin := Htot;
If (Htot > Hmax) then Hmax := Htot;
P := P^.Next;
end;
StatusBar1.Panels[9].Text := IntToStr(Hmax-Hmin);
end;
procedure TForm1.Luas1Click(Sender: TObject);
var P:pcc; direction,y:Integer; Area:Real; StrArea:String; Ytot:Integer;
begin
StatusBar1.Panels[8].Text := 'Luas : ';
Area := 0; Ytot := 0;
P := Head;

UNIVERSITAS BINA NUSANTARA

248

Logika-Algoritma
while P <> Nil do
begin
Area := Area + Ax(P^.Kode)*(Ytot + 0.5*Ay(P^.Kode));
Ytot := Ytot + Ay(P^.Kode);
P := P^.Next;
end;
Str(Area:8:1,StrArea); StatusBar1.Panels[9].Text := StrArea;
end;
procedure TForm1.Save1Click(Sender: TObject);
var FT : TextFile; P : pcc;
begin
SaveDialog1.Execute;
AssignFile(FT,SaveDialog1.FileName);
ReWrite(FT);
Writeln(FT,StatusBar1.Panels[10].Text);
Writeln(FT,StatusBar1.Panels[1].Text);
Writeln(FT,StatusBar1.Panels[3].Text);
P := Head;
while P <> Nil do
begin
Writeln(FT,P^.Kode); P := P^.Next;
end;
CloseFile(FT);
end;
procedure TForm1.Open1Click(Sender: TObject);
var FT : TextFile; D:Integer;
XP,YP:Integer; Judul : String;
begin
OpenDialog1.Execute;
AssignFile(FT,OpenDialog1.FileName);
ReSet(FT);
Readln(FT,Judul);
Readln(FT,XP);
Readln(FT,YP);
while NOT(EOF(FT)) do
begin

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

249

Readln(FT,D);
CreateChain(D);
end;
CloseFile(FT);
StatusBar1.Panels[1].Text := IntToStr(XP);
StatusBar1.Panels[3].Text := IntToStr(YP);
StatusBar1.Panels[10].Text := Judul;
Image1.Canvas.MoveTo(XP,YP);
Image1.Canvas.Pen.Color := ClBlack;
DrawChain(XP,YP);
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
end.
Menjalankan program Chain-code pada lingkungan Windows-95, adalah dengan meng-klik
icon/text CainCode di folder Program. Untuk memulai gambar baru, maka klik File, sehingga
tampak gambar seperti berikut :

Gambar 13.4. Tampilan Awal Program ChainCode

UNIVERSITAS BINA NUSANTARA

250

Logika-Algoritma

Setelah klik New, kita diminta untuk memasukan Judul Gambar.

Gambar 13.5. Masukkan Judul Gambar


Klik Tombol OK, kemudian mulai menggambar dengan menggerakkan mouse ke posisi awal,
dalam contoh ini X = 144 dan Y = 123 , kemudian tekan tombol mouse kiri, gerakan mouse
sesuai gambar yang diinginkan. Hasilnya adalah seperti gambar dibawah ini.

Gambar 13.6. Hasil Menggambar Citra dengan Menggerakan Mouse

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

251

Setelah citra selesai digambar, maka berbagai operasi geometris seperti menghitung keliling,
lebar, tinggi dan luas citra dapat dengan mudah dilakukan. Pada gambar berikut ini diberikan
contoh hasil perhitungan luas.

Gambar 13.7. Hasil Perhitungan Luas.


Operasi File berikutnya terhadap citra tersebut adalah Save, yaitu untuk menyimpan
informasi citra berupa :
-

Judul Gambar

Posisi awal (x,y)

Data Chain-code

Bila suatu Chain-code telah berhasil disimpan, maka untuk mengambil gambar tersebut,
gunakan File-Open, masukan nama file, maka segera akan tampil gambar yang diinginkan,
beserta tampilan Judul Gambar dan posisi awal Chain-code. Setelah itu operasi-operasi
lainnya seperti perhitungan geometris dapat dilaksanakan seperti biasanya.
Operasi Transformasi seperti :
-

Translasi (Shift)

Pembesaran (Zoom)

Rotasi

belum dilaksanakan dalam program ini, akan dibuat sebagai latihan.

UNIVERSITAS BINA NUSANTARA

252
13.4.

Logika-Algoritma
Pengukuran Daya AC dengan Tiga Voltmeter.

Mengukur daya yang dipakai oleh beban, biasanya dilakukan dengan memasang wattmeter
atau gabungan volmeter dengan amperemeter. Tetapi bila peralatan tersebut tidak tersedia,
kita masih bisa mengukur daya dengan menggunakan tiga voltmeter dan satu resistor.

13.4.1. Rangkaian Pengukuran

Rsh

V1

V2

V3

Rb

Gambar 13.8. Sistem Pengukuran Daya AC dengan Tiga Voltmeter.


Voltmeter 1 digunakan untuk mengukur tegangan sumber (jala-jala), voltemeter 2 digunakan
untuk mengukur arus yang mengalir kepada beban, melalui tegangan jatuh di Rsh (R-Shunt),
sedangkan voltmeter 3 digunakan untuk mengukur tegangan pada beban. Dari gambar
rangkaian diatas kita dapat melakukan perhitungan daya dengan menggunakan penjumlahan
vektor, dimana V1 merupakan resultante dari penjumlahan vektor V2 dengan V3.

Dari

analisis vektor yang dibuat nanti, akan didapat pula nilai cos dari beban yang digunakan.
Syarat dari ketiga voltmeter adalah, harus mempunyai tahanan dalam yang cukup tinggi,
sehingga tidak memberikan kontribusi kesalahan pengukuran akibat pembebanan oleh
voltmeter itu sendiri.

13.4.2. Pengembangan Model


Dengan menggunakan analisa vektor, kita dapat membuat model pengukuran dan dengan
demikian dapat dikembangkan untuk membuat algoritma perhitungan daya dengan masukan
nilai : V1, V2, V3 dan Rsh.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

253

V3

V1

V3.Sin

V2 = I. Rsh

V3 . Cos

Gambar 13.9. Diagram Vektor Pengukuran Daya dengan Tiga Voltmeter


V12 = V32 .sin2 + ( V3.cos + V2 )2
= V32 .sin2 + V32.cos2 + 2.V2 . V3.cos + V22
= V32 (sin2 + cos2 ) + 2.V2 . V3.cos + V22
= V32 + 2.V2 . V3.cos + V22
maka :
2.V2 . V3.cos = ( V12 - V22 - V32 )
V2 . V3.cos = ( V12 - V22 - V32 ) / 2 (1)
sementara itu :
P = V3.I.cos
= V3.V2/Rsh.cos
= (V3.V2.cos ) / Rsh ...(2)
substitusi (1) ke (2) menghasilkan :
P = ( V12 - V22 - V32 ) / 2.Rsh (3)
Cos = ( P.Rsh ) / (V3.V2 ) .(4)
Jadi, bila kita sudah mendapatkan hasil pengukuran : V1, V2 dan V3 maka daya yang
dipakai oleh beban dapat dihitung dari persamaan (3) dan cos dihitung dengan
persamaan (4).

UNIVERSITAS BINA NUSANTARA

254

Logika-Algoritma

13.4.3. Analisis Kesalahan Pengukuran


Berdasarkan gambar 13.8, kita dengan mudah dapat menganalisis kesalahan pengukuran,
yaitu dengan melihat kesalahan pengukuran V2 yang diakibatkan oleh nilai Rsh. Bila nilai Rsh
terlalu kecil maka pengukuran V2 menjadi sangat kecil, sebaliknya bila nilai Rsh terlalu besar
relatif terhadap Rb maka arus I yang mengalir menjadi terhambat oleh adanya Rsh, sehingga
tidak mencerminkan arus beban yang sebenarnya.
Untuk mendapatkan kesalahan pengukuran maksimum 1 %, maka nilai Rsh harus lebih kecil
dari 0.01 Rb . Jadi untuk tegangan V1 (jala-jala) = 220 Volt dan beban maksimum 1000 VA
(cos = 1), maka nilai Rsh 0.01 x 48.4 Ohm = 0.484 Ohm atau 0.5 Ohm. Dengan nilai
Rsh sebesar ini, maka penunjukan V2 cukup memadai yaitu 4.5 A x 0.5 Ohm = 2.25 Volt.

13.4.4. Algoritma Perhitungan Daya


Algoritma 13.6. Perhitungan Daya dengan Pengukuran Tiga Voltmeter.
1. V1 Hasil pengukuran tegangan jala-jala
2. V2 Hasil pengukuran tegangan Rsh
3. V3 Hasil pengukuran tegangan beban
4. Rsh Nilai tahanan yang dipasang paralel dengan Volmeter 2 dan terpasang
seri dengan beban
5. P ( V12 - V22 - V32 ) / 2.Rsh
6. Cos ( P.Rsh ) / (V3.V2 )

13.4.5. Program Perhitungan Daya dengan Metoda Tiga Voltmeter


Program TriVoltmeter;
Uses CRT;
Const Rsh : Real = 0.5;
Type TNilai = Record
V1, V2, V3:Real;
P, Cos_Phi:Real;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

255

Var Nilai : TNilai; Jawab : Char;


Procedure Masukan_Data(Var Nilai:TNilai);
Begin
Write('Hasil Pengukuran Voltmeter 1 : '); Readln(Nilai.V1);
Write('Hasil Pengukuran Voltmeter 2 : '); Readln(Nilai.V2);
Write('Hasil Pengukuran Voltmeter 3 : '); Readln(Nilai.V3);
End;
Procedure Hitung_Daya(Var Nilai:TNilai);
Begin
Nilai.P := (SQR(Nilai.V1) -SQR(Nilai.V2) - SQR(Nilai.V3)) / (2*Rsh);
End;
Procedure Hitung_Cos_Phi(Var Nilai:TNilai);
Begin
Nilai.Cos_Phi := (Nilai.P * Rsh) / (Nilai.V2 * Nilai.V3);
End;
BEGIN
ClrScr;
Repeat
Masukan_Data(Nilai);
Hitung_Daya(Nilai);
Hitung_Cos_Phi(Nilai);
Writeln('Daya = ',Nilai.P:6:2,' Watt');
Writeln('Cos Phi = ',Nilai.Cos_Phi:6:2);
Write('Teruskan [Y/T] ? '); Readln(Jawab);
Until UpCase(Jawab) = 'T';
END.
Berikut adalah hasil dari perhitungan daya dan cos dengan menggunakan program diatas :
Hasil Pengukuran Voltmeter 1 : 220.0
Hasil Pengukuran Voltmeter 2 : 1.64
Hasil Pengukuran Voltmeter 3 : 218.68
Daya = 576.37
Cos Phi = 0.80
Teruskan [Y/T] ? T

UNIVERSITAS BINA NUSANTARA

256

Logika-Algoritma

13.5. Penyunting Teks (Text Editor) Sederhana.


Pada studi kasus yang terakhir ini, akan ditunjukkan bagaimana memanfaatkan Simpulberantai Ganda dalam pembuatan penyunting teks yang sederhana, penyunting ini dapat
digunakan untuk menyunting file text sederhana seperti autoexec.bat atau config.sys.
Dikatakan sederhana karena penyunting ini baru mampu mengolah teks dalam satuan baris
(line editor), sementara tingkat penyunting kata (word editor) baru sampai taraf menghapus
huruf/kata atau menyisipkan huruf/kata, belum mampu memindahkan kata/huruf dari satu
tempat ke tempat lain (cut-copy and paste). Walaupun demikian kegunaan dari penyunting
ini sudah cukup memadai untuk keperluan tersebut diatas. Tujuan yang lebih penting adalah
penyempurnaan program aplikasi ini selanjutnya, sebagai latihan ataupun tugas proyek bagi
mahasiswa.

13.5.1. Komponen Dasar Penyunting Teks dan Operasi Karakter


Komponen yang paling dasar dari suatu penyunting teks adalah karakter. Kemudian karakterkarakter membentuk string yang merepresentasikan suatu baris, dan akhirnya baris-baris
membentuk teks. Supaya uraian algoritma nanti bisa lebih jelas, maka perlu dibuat notasi
sebagai berikut :
Baris(Teks) adalah String yang berada di posisi baris sekarang
Awal(Teks) adalah posisi karakter pertama yang ada di Baris(Teks)
Akhir(Teks) adalah posisi karakter terakhir yang ada di Baris(Teks)
Tengah(Teks) adalah poisisi karakter diantara Awal(Teks) dan Akhir(Teks)
Panjang(Teks) adalah banyaknya karakter di Baris(Teks)
Naskah(Teks) terdiri baris-baris teks.
Kursor-X adalah kursor yang dapat digerakan sepanjang Baris(Teks)
Kursor-Y adalah kursor yang dapat digerakan sepanjang Naskah(Teks)
Operasi-operasi yang dapat dilakukan terhadap suatu baris adalah :
1.

Menambah karakter di sepanjang Baris(Teks)

2. Menghapus karakter di sepanjang Baris(Teks)


2.a. Menghapus karakter di Awal(Teks) atau di Tengah(Teks)
2.b. Menghapus karakter di Akhir(Teks)
3. Menghapus Mundur Karakter (Backspace) di sepanjang Baris(Teks)
3.a. Menghapus karakter di posisi Tengah(Teks) atau Akhir(Teks)
3.b. Menghapus karakter di posisi Awal(Teks)

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

257

Posisi dimana operasi-operasi tersebut diatas dilaksanakan, ditandai dengan Kursor-X yang
dapat digerakan sepanjang Baris(Teks).
Algoritma 13.7. Menambah/Menyisipkan Karakter.
1. C Karakter baru
2. X Posisi Kursor-X saat ini : Awal(Teks) X Akhir(Teks) + 1
3. Tambahkan C ke Baris(Teks) diposisi X
4. Tulis karakter-karakter di Baris(Teks) mulai dari posisi X hingga Akhir(Teks) :
5. Geser posisi X satu langkah kebelakang, X X + 1
Menghapus karakter sedikit lebih rumit dari menambah/menyisipkan karakter, karena ada
dua kasus disini :
1. Menghapus karakter di Awal(Teks) atau Tengah(Teks)
2. Menghapus karakter di Akhir(Teks)
Algoritma 13.8a. Menghapus Karakter (Kasus Pertama).
1. X Posisi Kursor-X saat ini : 1 X Panjang(Teks) + 1Hapus karakter di
Baris(Teks) yang ditunjuk oleh X
2. Tulis karakter-karakter di Baris(Teks) mulai dari posisi X hingga Akhir(Teks)
3. Hapus karakter di posisi Akhir(Teks) + 1, yaitu sisa karakter lama.
Kasus algoritma kedua, perlu tambahan langkah yaitu : Bila Baris(Teks) bukan baris terakhir
dari Naskah(Teks) maka pindahkan Baris(Teks+1) ke Baris(Teks) di posisi Akhir(Teks),
kemudian mengeser semua baris dibawah Baris(Teks+1) kearah atas.
Algoritma 13.8b. Menghapus Karakter (Kasus Kedua).
1. X Posisi Kursor-X saat ini : X = Akhir(Teks) + 1
2. Y Posisi Kursor-Y saat ini
3. Bila Y = Jumlah Baris, Selesai.
4. Bila Y < Jumlah Baris lakukan langkah 4, 5, 6, 7 dan 8.
5. P Baris(Teks+1)
6. Tambahkan P ke Baris(Teks) : Baris(Teks) Baris(Teks) + P
7. Tulis karakter-karakter di Baris(Teks) mulai dari posisi X hingga Akhir(Teks)
8. Geser semua baris dibawah Baris(Teks + 2) kearah atas
9. Hapus baris terakhir

UNIVERSITAS BINA NUSANTARA

258

Logika-Algoritma

Ilustrasi Algoritma 13.8.b. :


Teks Baris Pertama
Teks ini berada di Baris Kedua_
Baris Ketiga
Baris Keempat, sebagai baris terakhir
Tombol Delete digunakan untuk menghapus karakter. Bila kursor pada posisi seperti diatas,
maka menekan tombol Delete menyebabkan keadaan Naskah(Teks) menjadi :
Teks Baris Pertama
Teks ini berada di Baris KeduaBaris Ketiga_
Baris Keempat, sebagai baris terakhir
Algoritma 13.9a. Menghapus Mundur Karakter (Kasus Peratama).
1. X Posisi Kursor
2. Geser Posisi X satu langkah kedepan, X := X - 1
3. Hapus Karakter di Baris(Teks) yang ditunjuk oleh X
4. Tulis karakter-karakter di Baris(Teks) mulai dari posisi X hingga Akhir(Teks)
5. Hapus karakter di posisi Akhir(Teks) + 1, yaitu sisa karakter lama
Algoritma 13.9b. Menghapus Mundur Karakter (Kasus Kedua).
1. X Posisi Kursor, X berada di Awal(Teks)
2. P Baris(Teks)
3. Tambahkan P ke Baris(Teks-1) : Baris(Teks-1) Baris(Teks-1) + P
4. Tulis karakter-karakter di Baris(Teks-1) mulai dari posisi X hingga Akhir(Teks-1)
5. Geser semua baris dibawah Baris(Teks) kearah atas
6. Hapus baris terakhir
Ilustrasi Algoritma 13.9.b. :
Teks Baris Pertama
Teks ini berada di Baris Kedua
Tombol Backspace digunakan untuk menghapus mundur karakter. Bila kursor pada posisi
seperti diatas, maka menekan tombol Backspace menyebabkan keadaan Naskah(Teks)
menjadi :
Teks Baris PertamaTeks ini berada di Baris Kedua_

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

259

13.5.2. Operasi-operasi Baris


Seperti diuraikan diatas, baris dibentuk oleh karakter-karakter dan pada tingkat berikutnya
baris membentuk naskah teks. Operasi-operasi pada baris adalah :
1. Menambah baris
1.a. Menambah baris, dengan posisi X di Akhir(Teks)
1.b. Menambah baris, dengan posisi X di Awal(Teks) atau Tengah(Teks)
2. Menghapus baris
3. Menggulung layar (Scrolling), bila Jumlah Baris melebihi Ukuran Window.
Algoritma 13.10a. Menambah Baris (Kasus Pertama)
1. Y Kursor
2. X Posisi Kursos X , X = Akhir(Teks) + 1
3. Geser Y kebawah, Y Y + 1
4. Buat baris baru, Baris(Teks) dengan Panjang(Teks) = 0
5. Geser baris-baris dibawah Baris(Teks), bila ada, kearah bawah
6. Naikan angka Jumlah Baris, JumlahBaris JumlahBaris +
Algoritma 13.10b. Menambah Baris (Kasus Kedua)
1. Y Posisi Kursor-Y, sebarang posisi
2. X Posisi Kursos X , Awal(Teks) X Akhir(Teks)
3. P Karakter-karakter di Baris(Teks), mulai dari posisi X hingga Akhir(Teks)
4. Y Y + 1
5. Buat baris baru, Baris(Teks) P
6. Tulis Baris(Teks)
7. Geser baris-baris dibawah Baris(Teks) kearah bawah
8. Naikan angka Jumlah Baris, JumlahBaris JumlahBaris + 1
Ilustrasi Algoritma 13.10.b. :
Teks Baris Pertama
Teks ini berada di Baris Kedua
Baris Ketiga
Baris Keempat, sebagai baris terakhir
Tombol Enter digunakan untuk membuat baris baru. Bila kursor pada posisi seperti diatas,
maka menekan tombol Enter menyebabkan keadaan Naskah(Teks) menjadi :

UNIVERSITAS BINA NUSANTARA

260

Logika-Algoritma
Teks Baris Pertama
Teks ini berada di
Baris Kedua_
Baris Ketiga
Baris Keempat, sebagai baris terakhir
Algoritma 13.11. Menghapus Baris
1. Y Posisi Kursor-Y, sebarang posisi
2. X Posisi Kursor X, sebarang posisi
3. Hapus Baris(Teks)
2. Geser baris-baris dibawah Baris(Teks) ke arah atas
3. Bila Akhir Teks > Tinggi Jendela maka Gulung Layar
4. Turunkan angka Jumlah Baris, JumlahBaris JumlahBaris - 1

Untuk memahami operasi Menggulung Layar, perlu digambarkan suatu daerah dimana teks
dioperasikan, yang kita sebut Jendela (Window).

Prompt Nama File

No.Baris : Jumlah

Daerah Penyunting Teks


80 karakter
21 baris

Menu Perintah (Command Line)


Gambar 13.10. Pembagian Daerah Kerja Teks dan Menu Perintah.
Bila banyaknya baris didalam teks melebihi batas daerah kerja, yaitu 21 baris maka harus
ada mekanisme tampilan sedemikian sehingga baris-baris yang akan disajikan masuk
kedalam Jendela. Mekanisme tersebut adalah mekanisme menggulung layar atau scrolling.
Jumlah baris pada suatu layar adalah 25, tetapi karena dua baris digunakan untuk Menu
Perintah dan dua baris digunakan untuk Prompt Nama File yang tidak boleh terganggu oleh
operasi teks, maka daerah kerja teks tinggal 21 baris. Untuk melaksanakan scrolling , pada

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

261

Penulisan program nanti akan digunakan fungsi interupt BIOS 10H, yaitu fungsi 06H, untuk
Scroll window contents up dan fungsi 07H, untuk Scroll window contents down. Batas
scrolling adalah dari posisi X1,Y1[0,2] hingga X2,Y2 [79,22. Koordinat layar BIOS adalah [0,0]
untuk kiri atas dan [79,24] untuk kanan bawah, bandingkan dengan koordinat layar TURBOPascal : [1,1] untuk kiri atas dan [80,25] untuk kanan bawah. Dengan demikian batas-batas :
X1,Y1[0,2] hingga X2,Y2 [80,22] dari BIOS akan sama dengan batas-batas : X1,Y1[1,3]
hingga X2,Y2 [79,23] dari TURBO-Pascal, yaitu daerah kerja teks.

13.5.3. Operasi Naskah


Operasi-operasi naskah adalah :
1. Menyimpan naskah (Save) dalam bentuk file text
2. Mengambil naskah (Load) dari file text
3. Mencetak naskah ke Printer.
Ketiga operasi tersebut tidak perlu diuraikan lagi karena untuk menympan dan mengambil
naskah dalam bentuk file text telah dibahas secara rinci pada Bab 12.2, sedangkan mencetak
naskah dibahas pada Bab 3.5.

13.5.4. Program Penyunting Teks Sederhana.


Model Simpul-berantai Ganda yang digunakan pada Initialisasi adalah :

Kepala

Baris
Ekor

Naik

Turun

Baris baru dalam keadaan kosong

Naik

Turun

=== Akhir Naskah ===

Nil
Gambar 13.11. Model Simpul-berantai pada Penyunting Teks.

UNIVERSITAS BINA NUSANTARA

262

Logika-Algoritma

Setelah initialisasi, pemakai dapat mengisi baris pertama maksimal sebanyak 80 karakter, N
menunjukkan jumlah karakter pada Baris. Kemudian pemakai dapat membuat baris baru
dengan menyisipkan simpul diantara baris pertama dengan Ekor, pointer Baris pindah ke
baris baru, demikian seterusnya sehingga diperoleh suatu naskah lengkap.
Program PenyuntingTeksSederhana;
Uses DOS,CRT,PRINTER;
{Unit DOS diperlukan karena ada operasi terhadap register-register,
yaitu pada Procedure Scroll }
Const
PromptPos = 13;

{Posisi X, tampilan Prompt Nama File}

NumeriPos = 74;

{Posisi X, tampilan Angka No. Baris dan Jumlah Baris}

MenuFKPos = 17;

{Posisi X, tampilan Menu Tombol F1 s/d F5}

Type
Str80 = String[80]; {Teks}
Str50 = String[50]; {Nama File}
PSimpul = ^Simpul;
Simpul = Record
Teks: Str80;
N : Word;
Turun,Naik : PSimpul;
End;
Mode = (Tarik,Tekan);
Var
Kepala,Ekor,Baris : PSimpul;
Selesai : Boolean;
X : 0..81;

{Posisi Kursor Horizontal : 1..80}

Y : 2..24;

{Posisi Kursor Vertikal : 3..23}

B : Word;

{Jumlah Baris didalam Naskah}

NB: Word;

{Nomor Baris didalam Naskah}

F : Text;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

263

Procedure Sisip(S:Str80);
Var P:PSimpul;
Procedure GabungDepan(Var P:PSimpul);
Begin
Kepala := P;
Kepala^.Naik := P;
Kepala^.Turun := Baris;
Baris^.Naik := P;
Baris := P;
End;
Procedure GabungTengah(Var P:PSimpul);
Begin
P^.Turun := Baris^.Turun;
Baris^.Turun^.Naik := P;
P^.Naik := Baris;
Baris^.Turun := P;
Baris := P;
End;
Procedure GabungBelakang(Var P:PSimpul);
Begin
Baris := Baris^.Naik;
Baris^.Turun := P;
P^.Turun := Ekor;
P^.Naik := Baris;
Ekor^.Naik := P;
Baris := P;
End;
Begin
New(P); P^.Teks := S; P^.N := Length(S);
If Baris = Kepala
Then GabungDepan(P)
Else If Baris = Ekor
Then GabungBelakang(P) Else GabungTengah(P);
X := 1; Inc(Y); GotoXY(X,Y);
End;

UNIVERSITAS BINA NUSANTARA

264

Logika-Algoritma
Procedure HapusSimpul(Var P:PSimpul);
Procedure HapusSimpulAwal(Var P:PSimpul);
Begin
Kepala := P^.Turun;
P^.Turun^.Naik := Kepala;
Dispose(P);
P := Kepala;
Dec(Y); GotoXY(X,Y);
End;
Procedure HapusSimpulTengah(Var P:PSimpul);
Var Q:PSimpul;
Begin
Q := P^.Naik;
Q^.Turun := P^.Turun;
P^.Turun^.Naik := Q;
Dispose(P);
P := Q;
Dec(Y); GotoXY(X,Y);
End;
Begin
If P = Kepala
Then HapusSimpulAwal(P) Else HapusSimpulTengah(P);
Dec(B);
End; {Procedure HapusSimpul}
Procedure BuangSimpul(Var Kepala:PSimpul);
Var Sampah:PSimpul;
Begin
While Kepala <> Ekor Do
Begin
Sampah := Kepala;
Kepala := Kepala^.Turun;
Dispose(Sampah);
End;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

265

Procedure Scroll(D:Mode;Y1:Byte);
Var Reg:Registers;
Begin
Case D Of
Tarik : Reg.AH := 6;
Tekan : Reg.AH := 7;
End;
Reg.AL := 1; Reg.CL := 0; Reg.CH := Y1-1;
Reg.BH := 7; Reg.DL := 79; Reg.DH := 22;
Intr($10,Reg);
End;
Procedure DisplayPosisi(NB,B:Word);
Var OldX,OldY:Byte;
Begin
OldX := WhereX; OldY := WhereY;
GotoXY(NumeriPos,1); Write(NB:3,':',B:3); GotoXY(OldX,OldY);
End;
Procedure Initialisasi;
Var P:PSimpul; S:Str80;
Begin
New(P);
{Tanda Akhir Naskah ini tidak tampak dilayar}
P^.Teks := '=== Akhir Naskah ===';
Kepala := P; Ekor := Kepala; Baris := Kepala;
Baris^.N := Length(Baris^.Teks);
P^.Turun := Kepala; P^.Naik := Kepala;
{Buat baris baru dalam keadaan kosong}
S := ''; Sisip(S);
X := 1; Y := 3; GotoXY(X,Y);
NB := 1; B := 1; DisplayPosisi(NB,B);
End;
Procedure KursorAwal;
Begin
X := 1; GotoXY(X,Y);
End;

UNIVERSITAS BINA NUSANTARA

266

Logika-Algoritma
Procedure KursorAkhir;
Begin
X := Length(Baris^.Teks) + 1; GotoXY(X,Y);
End;
Procedure KursorTeksAwal;
Var I:Byte;
Begin
If Y = 3 Then Exit;
Repeat Baris := Baris^.Naik; Dec(Y) Until Y = 3;
X := 1; GotoXY(X,Y);
End;
Procedure KursorTeksAkhir;
Var I:Byte;
Begin
If (Baris^.Turun = Ekor) OR (Y=23) Then Exit;
Repeat Baris := Baris^.Turun; Inc(Y) Until (Baris^.Turun = Ekor) OR (Y = 23);
X := 1; GotoXY(X,Y);
End;
Procedure KursorKiri;
Begin
If X > 1 Then Begin Dec(X); GotoXY(X,Y) End;
End;
Procedure KursorKanan;
Var Batas:Byte;
Begin
If X < (Baris^.N + 1) Then Begin Inc(X); GotoXY(X,Y) End;
End;
Procedure Tulis(Baris:PSimpul;X:Byte);
Var I:Byte;
Begin
For I := X to Baris^.N Do Write(F,Baris^.Teks[I]);
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

267

Procedure KursorNaik;
Begin
If Baris = Kepala Then Exit;
Baris := Baris^.Naik; Dec(Y);
If Y < 3
Then Begin
Y := 3;
Scroll(Tekan,Y);
GotoXY(1,Y); Tulis(Baris,1);
End;
If X > Baris^.N+1 Then X := Baris^.N+1;
GotoXY(X,Y);
Dec(NB);
End;
Procedure KursorTurun;
Begin
If Baris^.Turun = Ekor Then Exit;
Baris := Baris^.Turun; Inc(Y);
If Y > 23
Then Begin
Y := 23;
Scroll(Tarik,3);
GotoXY(1,Y); Tulis(Baris,1);
End;
If X > Baris^.N+1 Then X := Baris^.N+1;
GotoXY(X,Y);
Inc(NB);
End;
Procedure TambahKarakter(C:Char);
Begin
Insert(C,Baris^.Teks,X); Inc(Baris^.N);
Tulis(Baris,X); Inc(X); GotoXY(X,Y);
End;

UNIVERSITAS BINA NUSANTARA

268

Logika-Algoritma
Procedure BarisBerikut;
Var Pindahan : Str80; L:Integer;
Begin
L := Baris^.N - X + 1;
Pindahan:= Copy(Baris^.Teks,X,L);
Delete(Baris^.Teks,X,L); ClrEol;
Baris^.N := Length(Baris^.Teks);
If Baris^.Turun = Ekor
Then Begin
Baris := Baris^.Turun;
Sisip(Pindahan);
If Y > 23 {Posisi Baris Melewati Batas Bawah}
Then Begin
Y := 23;
GotoXY(1,3); Scroll(Tarik,3);
End;
Tulis(Baris,X);
GotoXY(X,Y);
End
Else Begin
Scroll(Tekan,Y+1);
Sisip(Pindahan); Tulis(Baris,X); GotoXY(X,Y);
End;
Inc(B); Inc(NB);
End;
Procedure HapusKarakterAkhir;
Var I:Byte; P:PSimpul; Pindahan:Str80;
Begin
If Baris^.Turun <> Ekor Then
Begin
Pindahan := Baris^.Turun^.Teks;
Baris^.Teks := Baris^.Teks + Pindahan;
Baris^.N := Baris^.N + Baris^.Turun^.N;
KursorTurun; HapusSimpul(Baris);
Scroll(Tarik,Y);
GotoXY(1,Y); ClrEol; Tulis(Baris,1);
KursorAkhir;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

269

{Mengisi baris terakhir yang kosong, karena Scroll(Tarik)}


P := Baris; I := Y;
Repeat
P := P^.Turun; Inc(I);
Until (P^.Turun = Ekor) OR (I = 23);
If I = 23 Then Begin GotoXY(1,23);Tulis(P,1) End;
GotoXY(X,Y);
Dec(NB);
End;
End;
Procedure HapusKarakter;
Var I:Byte; Pindahan:String;
Begin
If X <= Baris^.N
Then Begin
Delete(Baris^.Teks,X,1); Dec(Baris^.N); ClrEol;
Tulis(Baris,X); GotoXY(X,Y);
End Else HapusKarakterAkhir;
End;
Procedure HapusMundur;
Var I:Byte;
Begin
If X > 1
Then Begin
Dec(X); Delete(Baris^.Teks,X,1); Dec(Baris^.N);
GotoXY(X,Y); ClrEol;
Tulis(Baris,X); GotoXY(X,Y);
End
Else If Y > 3
Then Begin
KursorNaik; KursorAkhir;
HapusKarakterAkhir;
End;
End;

UNIVERSITAS BINA NUSANTARA

270

Logika-Algoritma
Procedure HapusTeks;
Var I:Byte;
Begin
GotoXY(PromptPos,1);Write(' ':30);
BuangSimpul(Kepala);
For I := 3 to 23 Do Scroll(Tekan,I);
Initialisasi;
End;
Procedure Simpan;
Var FText : Text; P:PSimpul;
NamaFile:Str50;
Begin
If (Baris = Kepala) AND (B = 1) Then Exit;
P := Kepala;
GotoXY(PromptPos,1); Readln(NamaFile);
Assign(FText,NamaFile);
ReWrite(FText);
While P <> Ekor Do
Begin
Writeln(FText,P^.Teks); P := P^.Turun;
End;
Close(FText);
End;
Procedure Ambil;
Var FText : Text; S:Str80; NamaFile:Str50;
Begin
HapusSimpul(Baris);
GotoXY(PromptPos,1); Readln(NamaFile);
Assign(FText,NamaFile);
ReSet(FText);
B := 0;
While NOT(EOF(FText)) Do
Begin
Readln(FTExt,S); Sisip(S);
If B < 21

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

271

Then Begin
GotoXY(1,Y); Write(F,Baris^.Teks);
End;
Inc(B); If B > 0 Then Baris := Ekor;
End;
Close(FText);
Baris := Kepala;
X := 1; Y := 3; GotoXY(X,Y);
End;
Procedure Cetak;
Var P:PSimpul;
Begin
P := Kepala;
While P <> Ekor Do
Begin
Writeln(LST,P^.Teks); P := P^.Turun;
End;
End;
Procedure OlahTombol;
Var C:Char;
Begin
C := Readkey;
If C = #0 {Extended-Keys} Then
Begin
C := Readkey; {Read for the second}
Case Ord(C) Of
72 : KursorNaik;

80 : KursorTurun;

75 : KursorKiri;

77 : KursorKanan;

73 : KursorTeksAwal;

81 : KursorTeksAkhir;

71 : KursorAwal;

79 : KursorAkhir;

83 : HapusKarakter;
59 : Ambil;

60 : Simpan;

61 : Cetak;

62 : HapusTeks;

63 : Selesai := True;
End;

UNIVERSITAS BINA NUSANTARA

272

Logika-Algoritma
End Else Case Ord(C) Of
13 : BarisBerikut;
8 : HapusMundur;
Else TambahKarakter(C);
End;
DisplayPosisi(NB,B);
End;
Procedure BukaLayar;
Var I:Byte;
Begin
ClrScr;
GotoXY(1,1);Write(F,'File Name : ');
GotoXY(1,2); For I:=1 to 80 Do Write(F,#196);
GotoXY(1,24); For I:=1 to 80 Do Write(F,#196);
GotoXY(MenuFKPos,25);
Write(F,'F1:Load F2:Save F3:Print F4:Clear F5:Quit');
End;
Procedure TutupLayar;
Var I : Byte;
Begin
GotoXY(1,1);
For I := 1 to 25 Do
Begin Delay(50); Insline End;
End;
{PROGRAM UTAMA}
BEGIN
AssignCRT(F);
ReWrite(F);
BukaLayar;
Initialisasi;
Repeat OlahTombol Until Selesai;
Close(F);
TutupLayar;
END.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

273

Bila program diatas dijalankan, akan tampak keadaan layar seperti pada gambar 13.11.
Dalam keadaan seperti ini, pemakai dapat langsung mengetik naskah yang diinginkan atau
mengambil file teks dari floppy-disk atau hard-disk untuk disunting.
Tombol-tombol yang digunakan adalah :
a. Tombol panah Kiri,Kanan,Atas dan Bawah untuk menggerakan kursor satu
langkah ke arah tersebut (satu karakter ke kiri atau ke kanan, satu baris ke atas
atau ke bawah) .
b. Tombol Page-Up dan Page-Down untuk menggerakan kursor langsung ke baris
paling atas dan paling bawah yang tampak dilayar.
c.

Tombol Home dan End untuk menggerakan kursor langsung ke awal baris teks
dan ke akhir baris teks.

d. Tombol Del untuk menghapus karakter pada posisi kursor dan tombol Backspace
untuk menghapus mundur karakter yang ada di belakang kursor.
Nama File :

1: 1

F1 : Load

F2 : Save F3 : Print

F4 : Clear

F5 : Quit

Gambar 13.11. Keadaan Awal Layar Penyunting Teks


Angka 1 : 1 di kanan atas menunjukan Nomor Baris dan Jumlah Baris yang ada didalam
naskah. Kemudian menu yang berada dibaris paling bawah adalah masing-masing : F1 untuk
mengambil teks dari file, F2 untuk menyimpan teks ke file, F3 untuk mencetak teks ke printer,
F4 untuk menghapus seluruh teks dilayar dan dimemori, dan terakhir F5 untuk keluar dari
program. Bila F1 atau F2 ditekan, kursor akan pindah ke posisi dibelakang Nama File dan
pemakai diminta untuk memasukan nama file.

UNIVERSITAS BINA NUSANTARA

274

Logika-Algoritma

Soal-soal
1.

Pada perhitungan PPh Perorangan diatas, dilakukan suatu penyederhanaan persoalan,


yaitu penghasilan tambahan istri/suami tidak dimasukan dalam perhitungan ini. Perbaiki
algoritma diatas sehingga dapat menghitung besarnya PPh setelah memasukan
penghasilan istri/suami.

2.

Pada algoritma Konversi Angka Romawi ke Angka Latin, ada satu validasi yang tidak
termasuk didalamnya, yaitu bila angka kecil mengawali angka besar maka angka besar
harus merupakan kelipatan 5 atau 10 dari angka kecil tersebut. Sehingga penulisan IL
untuk menyatakan nilai 49 tidak sah karena angka besar (L) kelipatan 50 dari angka
kecil (I). Nilai tersebut dinyatakan dengan XLIX. Untuk itu buat validasi untuk keperluan
ini.

3.

Buat algoritma untuk Konversi Angka Latin ke Angka Romawi.

4.

Apa keuntungan menggunakan Chain-code untuk representasi citra ?

5.

Apakah Rotasi 450 dan 900 dapat dilakukan pada suatu citra yang dibuat dengan
Chain-code ?

6.

Representasi citra dengan Chain-code dapat digunakan untuk melihat kesamaan antara
dua citra (pattern matching). Buat algoritma untuk menilai kesamaan dua citra.

7.

Pada sistem Pengukuran Daya dengan Metoda Tiga Voltmeter, yang diketahui adalah
hasil pengukuran oleh Voltmeter 1, 2 dan 3. Bila yang diketahui adalah besarnya daya
dan nilai cos suatu beban, misalnya diketahui beban standar 200 Watt dengan cos =
0.8, kita ingin menguji ketelitian sistem pengukuran, yaitu berapa penunjukan Voltmeter
2 dan Voltmeter 3, bila diberikan tegangan jala-jala 220 Volt (Voltmeter 1). Buat model
persamaan dan kemudian tulis algoritma untuk melakukan perhitungan tersebut.

8.

Tambahkan pada program Penyunting Teks Sederhana, fasilitas Mouse dengan menggunakan Unit Mouse yang ada di appendix E.

9.

Tambahkan fasilitas cut-copy and paste pada program Penyunting Teks Sederhana.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

275

Daftar Pustaka
-

(1992), TURBO Pascal for Dos Version 7.0: Programmers's Reference, Borland.

(1992), TURBO Pascal for Dos Version 7.0: Language Guide, Borland.

(1996), Buku Petunjuk Pengisian SPT Tahunan PPh Wajib Pajak Orang Pribadi, Dirjen
Pajak , Departemen Keuangan RI.

Aho, A.V. et. al. (1983), Data Structure and Algorithms, Addison Wesley.
Arifin, E.Z & Tasai, S.A.(1995) Cermat Berbahasa Indonesia Untuk Perguruan Tinggi,
Akademika Pressindo.
Baase,Sara (1983), Computer Algorithms : Introduction to Design and Analysis, AddisonWesley.
Berger, Marc (1986) Computer Graphics with Pascal, The Benjamin/Cummings Publishing
Company, Inc.
CCITT (1983), Introduction to CHILL The CCITT High Level Language, ITU.
Cherry,G.W.(1982), Pascal Programming Structures for Motorola Microprocessor, Reston
Publishing Company , A Prentice-Hall Company.
Downes, V.A. & Goldsack (1982), Programming Embedded Systems With Ada, Prentice Hall.
Duncan,Ray (1986), Advanced MSDOS; The Microsoft guide for Assembly Language
Microsoft Press
Denning, Peter J. et. al. (1978), Machines, Languages, and Computation Prentice Hall, Inc.
Freeman,Herbert. (1969), A Review of Relevant Problems in the Processing of Line-Drawing
Data. in Automatic Interpretation and Classification of Images,
Academic Press, Inc.
Ghezzi, C & Jazayeri,M (1982), Programming Language Concepts, John Wiley & Sons.
Gottfried,B.S. (1985), Programming with Pascal, McGraw-Hill.
Horowitz, E. & Sahni, S. (1978) Fundamentals of Computer Algorithms, Computer Science
Press.
Lafore, R. (1984), Assembly Language Primer for the IBM PC&XT, The Waite Group.
Lapedes, Daniel N. (1976), Dictionary of Scientific and Technical Terms, McGraw-Hill.
Savitch, W.J. (1987), Pascal, An Introduction to the Art and Science of Programming,
The Benjamin/Cumming.
Smedema,CH et.al.(1983), The Programming Languages: Pascal-Modula-CHILL- Ada,
Prentice-Hall.
Stivison, Douglas S. (1987), Turbo Pascal Library , Sybex.

UNIVERSITAS BINA NUSANTARA

276

Logika-Algoritma

Daftar Pustaka (Lanjutan)


Stubbs,D.F. & Webre, N.W. (1985), Data Structures with Abstract Data Types and Pascal,
Brooks/Cole.
Sujana & Osamu ( ), Pengukuran dan Alat Ukur Listrik , Pradnya Paramitha.
Tenenbaum,A.M.& Augenstein,M.J.(1986), Data Structure Using Pascal, Prentice-Hall
Tucker, Allen B. (1986), Programming Languages , McGraw-Hill.
Wirth, Niklaus (1976) , Algorithms + Data Structures = Programs, Prentice-Hall.

--------------------------- ooooo -----------------------------

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

APPENDIX A

277

KATA TERLINDUNG (RESERVED WORDS)

Pascal Standar :
And

Array

Begin

Case

Const

Div

Do

Downto

Else

End

File

For

Function

Goto

If

In

Label

Mod

Nil

Not

Of

Or

Packed

Procedure

Program

Record

Repeat

Set

Then

To

Type

Until

Var

While

With

dilanjutkan ..

UNIVERSITAS BINA NUSANTARA

278

Logika-Algoritma

KATA TERLINDUNG (Lanjutan)


TURBO Pascal
And

Array

Asm

Begin

Case

Const

Constructor

Destructor

Div

Do

Downto

Else

End

File

For

Function

Goto

If

Implementation In

Inherited

Inline

Interface

Label

Mod

Nil

Not

Object

Of

Or

Packed

Procedure

Program

Record

Repeat

Set

Shl

Shr

String

Then

To

Type

Unit

Until

Uses

Var

While

With

Xor
Dikutip dari :
TURBO Pascal v. 7.0, 'Programmer's Reference, Borland International Inc.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

279

APPENDIX B TABEL ASCII


Des

Char

Des

NULL

18

36

54

72

19

!!

37

55

73

20

38

&

56

74

21

39

57

75

22

40

58

76

23

41

59

77

24

42

60

<

78

25

43

61

79

26

44

62

>

80

27

45

63

81

10

28

46

64

82

2
3
4

Char

Des

Char

Des

Char

Des

Char

29

47

65

83

12

30

48

66

84

13

31

t
u

49

67

85

14

32

BLANK

50

68

86

15

33

51

69

87

11

16

34

52

70

88

17

35

53

71

89

Keterangan : Dec = Decimal, Char = Character

dilanjutkan ..

UNIVERSITAS BINA NUSANTARA

280

Logika-Algoritma

TABEL ASCII (Lanjutan)

Des

Char

Des

Char

Des

Char

Des

Char

Des

Char

90

108

126

144

162

91

109

127

145

163

92

110

128

146

164

93

111

129

147

165

94

112

130

148

166

95

113

131

149

167

96

114

132

150

168

97

115

133

151

169

98

116

134

152

170

99

117

135

153

171

100

118

136

154

172

101

119

137

155

173

102

120

138

156

174

103

121

139

157

175

104

122

140

158

176

105

123

141

159

177

106

124

142

160

178

107

125

143

161

179

dilanjutkan ..

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

281

TABEL ASCII (Lanjutan)

Des

Char

Des

Char

Des

Char

Des

Char

Des

180

198

216

234

252

181

199

217

235

253

182

200

218

236

254

183

201

219

237

255

184

202

220

238

185

203

221

239

186

204

222

240

187

205

223

241

188

206

224

242

189

207

225

243

190

208

226

244

191

209

227

245

192

210

228

246

193

211

229

247

194

212

230

248

195

213

231

249

196

214

232

250

197

215

233

251

UNIVERSITAS BINA NUSANTARA

Char

BLANK

282

Logika-Algoritma

APPENDIX C KODE TOMBOL 'EXTENDED'


Kode Kedua

Artinya

NUL (Karakter NULL)

15

Shift Tab

16-25

Alt-Q/W/E/R/T/Y/U/I/O/P

30-38

Alt-A/S/D/F/G/H/I/J/K/L

44-50

Alt-Z/X/C/V/B/N/M

59-68

F1 s/d F10

71

Home

72/75/77/80

Panah Atas/Kiri/Kanan/Bawah

73/81

Page Up/Down

79

End

82

Insert

83

Delete

84-93

F11 s/d F20 (Shift-F1 s/d Shift-F10)

94-103

F21 s/d F30 (Ctrl-F1 s/d Ctrl-F10)

104-113

F31 s/d F40 (Alt-F1 s/d Alt-F10)

114

Ctrl-PrintScreen

115

Ctrl-Panah Kiri

116

Ctrl-Panah Kanan

117

Ctrl-End

118

Ctrl-Page Down

119

Ctrl-Home

120-131

Alt-1/2/3/4/5/6/7/8/9/0/-/=

132

Ctrl-Page Up

133

F11

134

F12

135

Shift-F11

136

Shift-F12

137

Ctrl-F11

138

Ctrl-F12

139

Alt-F11

140

Alt-F12

Dikutip dari : TURBO Pascal Ver. 7.0 'Programmer's Guide' , Borland International Inc.

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

283

Kode Tombol 'Extended' (Lanjutan)


Contoh Penggunaan Kode Tombol Extended
Procedure Proses_Tombol;
Begin
Tombol := ReadKey;
If Tombol = #0 { Tombol 'Extended' }
Then Begin
Tombol := ReadKey { Baca Kode Kedua }
Case Ord(Tombol) of
72 : Kursor_Atas;
75 : Kursor_Kiri;
77 : Kursor_Kanan;
80 : Kursor_Bawah;
59 : Sisip_Baris;
60 : Hapus_Baris;
End;
End Else { Bukan Tombol 'Extended' }
Begin
Case Ord(Tombol) of
13 : Baris_Baru { Tombol 'Enter' }
27 : Selesai

{ Tombol 'Esc' }

End;
End;
End;

UNIVERSITAS BINA NUSANTARA

284

Logika-Algoritma

APPENDIX D PROGRAM UJI PENGURUTAN


Listing Program
Uses CRT,DOS;
Type

ARR = Array[1..1000] of Integer;


PSIMPUL = ^Node;
NODE = Record
Data : Integer;
Next : PSIMPUL;
End;

Var D,DR,DS,DSR : ARR;

L,LR,LS,LSR : PSIMPUL;

Jawab1, Jawab2 : Char; H,M,S,SS : Word;


ST,ET : Real; I : Integer;
Procedure BuatData(Var X:ARR);
Var I:Integer;
Begin
Randomize;
For I := 1 to 1000 Do X[I] := 1+Random(10000);
End;
Function ElapsedTime(StartTime,EndTime:Real):Real;
Begin
ElapsedTime := (EndTime - StartTime)/100;
End;
Procedure Cari_Min(X:ARR; A,B:Integer; Var C : Integer);
Var Min,I : Integer;
Begin
Min := Maxint;
For I := A to B do
If X[I] <= Min then
Begin
Min := X[I]; C := I;
End
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

285

Procedure Tukar(Var X,Y:Integer);


Var Z : Integer;
Begin
Z := X; X := Y; Y := Z;
End;
Procedure Selection(Var A:ARR; N:Integer);
Var I,J,Min : Integer;
Begin
For I := 1 to N-1 do
Begin
Cari_Min(A,I,N,Min);
Tukar(A[I],A[Min]);
End;
End;
Procedure Bubble(Var A:ARR; N:Integer);
Var I,J : Integer;
Begin
For I := 2 to N do
For J := N downto I do if A[J-1] > A[J] then Tukar(A[J-1],A[J]);
End;
Procedure Bubble_Flag(Var A:ARR; N:Integer);
Var I,J : Integer; Urut : Boolean;
Begin
Urut := False; I := 2;
While (I < N) and (not Urut) do
Begin
Urut := True;
For J := N downto I do
If A[J-1] > A[J] then
Begin
Tukar(A[J-1],A[J]); Urut := False;
End;
I := I + 1;
End;
End;

UNIVERSITAS BINA NUSANTARA

286

Logika-Algoritma
Procedure Geser(Var A:ARR; B,C:integer);
Var I : Integer;
Begin
For I := C downto B Do A[I+1] := A[I]
End;
Procedure Cari_Posisi(A:ARR; B:Integer; Var C:Integer);
Var I : Integer;
Begin
C := B; I := 0;
Repeat I := I + 1 Until A[B] <= A[I];
C := I
End;
Procedure Insertion(Var A:ARR; N:Integer);
Var I,J,K : Integer;
Begin
For I := 2 to N do
Begin
K := A[I];
Cari_Posisi(A,I,J); Geser(A,J,I-1);
A[J] := K;
End;
End;
Procedure Create_List(Var L:PSIMPUL; D:Integer);
Var T:PSIMPUL;
Begin
New(T);
T^.Data := D;
T^.Next := L;
L := T;
End;
Procedure Cari_Posisi_Node(D:Integer; X:PSimpul; Var K1,K2:PSIMPUL);
Begin
K2 := X;
While D > K2^.Data Do

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

287

Begin
K1 := K2;

K2 := K2^.Next;

End;
End;
Procedure Sisipkan(D:Integer; Var X:PSIMPUL; K1,K2:PSIMPUL);
Var C,T:PSIMPUL;
Begin
New(T);
T^.Data := D;
If K2 = X
Then Begin T^.Next := X; X := T End
Else Begin T^.Next := K2; K1^.Next := T End;
End;
Procedure HapusNode(X:PSIMPUL; Var CP1,CP2:PSIMPUL);
Begin
CP1^.Next := CP2^.Next;
Dispose(CP2);
CP2 := CP1^.Next;
End;
Procedure Insertion_List(Var X:PSIMPUL);
Var CP1,CP2 : PSIMPUL;
K1,K2 : PSIMPUL;
D:Integer;
Begin
CP1 := X;

{Menunjuk Node Pertama}

CP2 := X^.Next; {Menunjuk Node Kedua}


While CP2 <> Nil do
Begin
Cari_Posisi_Node(CP2^.Data,X,K1,K2);
If K2 <> CP2
Then Begin
Sisipkan(CP2^.Data,X,K1,K2);
HapusNode(X,CP1,CP2);
End

UNIVERSITAS BINA NUSANTARA

288

Logika-Algoritma
Else Begin
CP1 := CP2;
CP2 := CP2^.Next;
End;
End;
End;
Procedure List2Array(X:PSIMPUL;Var D:ARR);
Var I:Integer;
Begin
I := 1;
While X <> Nil do
Begin
D[I] := X^.Data;
X := X^.Next;
I := I + 1;
End;
End;
Procedure QuickSort(L,R:integer);
Var j,k:integer;
Begin
If L < R then
Begin
j := L ; k := R + 1;
Repeat
repeat j := j+1 until D[j] >= D[L];
repeat k := k-1 until D[k] <= D[L];
if j < k then Tukar(D[j],D[k]);
Until j > k;
Tukar(D[L],D[k]);
QuickSort(L,k-1);
QuickSort(k+1,R);
End;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

289

Procedure QuickSort2(L,R: Integer);


Var j,k,p: integer;
Begin
j := L; k := R; p := D[(L+R) DIV 2];
Repeat
While D[j] < p do j := j + 1;
While p < D[k] do k := k - 1;
If j <= k then
Begin
Tukar(D[j],D[k]);
j := j + 1; k := k - 1;
End;
Until j > k;
If L < k then QuickSort2(L,k);
If j < R then QuickSort2(j,R);
End;
Procedure Display(A:ARR);
Var I:Integer;
Begin
Writeln;
For I := 1 to 11 do write(A[I]:4,' ');writeln;
For I := 245 to 255 do write(A[I]:4,' ');writeln;
For I := 495 to 505 do write(A[I]:4,' ');writeln;
For I := 745 to 755 do write(A[I]:4,' ');writeln;
For I := 990 to 1000 do write(A[I]:4,' ');writeln;
Writeln;
End;
Procedure Menu1(Var J:Char);
Begin
Writeln('A: Data Acak');
Writeln('U: Data Terurut');
Writeln('B: Data Terurut Balik');
Writeln;
Write('Pilihan ? '); J := ReadKey;
End;

UNIVERSITAS BINA NUSANTARA

290

Logika-Algoritma
Procedure Menu2(Var J:Char);
Begin
Writeln('S: Selection Sort');
Writeln('B: Bubble Sort 1');
Writeln('F: Bubble Sort 2');
Writeln('I: Insertion Sort 1');
Writeln('L: Insertion Sort 2');
Writeln('Q: Quick Sort 1');
Writeln('U: Quick Sort 2');
Writeln;
Write('Pilihan ? '); J := ReadKey;
End;
BEGIN
Clrscr;
BuatData(D); {Siapkan Data dalam struktur Array dan Linked-List}
DR := D; {Data Acak}
For I := 1000 downto 1 do Create_List(LR,DR[I]);
QuickSort2(1,1000);
DS := D; {Data Terurut}
For I := 1000 downto 1 do Create_List(LS,DS[I]);
For I := 1 to 1000 do DSR[I] := DS[1001-I];
For I := 1000 downto 1 do Create_List(LSR,DSR[I]);
Repeat
Menu1(Jawab1);
Case UpCase(Jawab1) of
'A' : Begin D := DR; L := LR End;
'U' : Begin D := DS; L := LS End;
'B' : Begin D := DSR; L := LSR End;
End;
Display(D); {Display Data Sebelum Pengurutan}
Menu2(Jawab2);
GetTime(H,M,S,SS); {Waktu Awal Pengurutan}
ST := ((18000*H)*2)+(6000*M)+(100*S)+SS;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

291

Case Upcase(Jawab2) of
'S' : Begin
Writeln('S: Selection Sort'); Selection(D,1000);
End;
'B' : Begin
Writeln('B: Bubble Sort'); Bubble(D,1000);
End;
'F' : Begin
Writeln('F: Bubble Sort - Flag'); Bubble_Flag(D,1000);
End;
'I' : Begin
Writeln('I: Insertion Sort'); Insertion(D,1000);
End;
'L' : Begin
Writeln('L: Insertion Sort - Linked List'); Insertion_List(L);
End;
'Q' : Begin
Writeln('Q: Quick Sort'); QuickSort(1,1000);
End;
'U' : Begin
Writeln('U: Quick Sort - Partisi Tengah'); QuickSort2(1,1000);
End
Else Writeln('Tidak Ada Pilihan !!!!!!');
End;
GetTime(H,M,S,SS);
{Waktu Akhir Pengurutan}
ET := ((18000*H)*2)+(6000*M)+(100*S)+SS;
If UpCase(Jawab2) = 'L'
Then List2Array(L,D);
Display(D); {Display Data setelah Pengurutan}
Writeln('Waktu Pengurutan : ',ElapsedTime(ST,ET):3:2,' Sekon');
Write('Lanjutkan [Y/T] ? '); Jawab1 := ReadKey;
Clrscr;
Until Upcase(Jawab1)='T';
END.

UNIVERSITAS BINA NUSANTARA

292

Logika-Algoritma

APPENDIX E UNIT MOUSE


Listing Unit Mouse
(Untuk digunakan pada Program Penyunting Teks Sederhana).
Unit Mouse;
Interface
Uses DOS, CRT;
Function Moused(var x:byte):boolean;
{Digunakan untuk mendeteksi apakah mouse dan mouse driver sudah terpasang}
Procedure SetCursorMouse;
{Bila mouse dan driver mouse sudah terpasang maka kursor dapat diset,
jadi setelah mouse terdeteksi maka lakukan SetCursorMouse}
Procedure CursorMouse(x:stat);
{Procedure untuk menampilkan dan menghilangkan kursor}
Procedure SetMouse_xy(x,y:byte);
{Procedure untuk menggerakan kursor ke posisi (x,y)}
Procedure GetMouse_xyk(var x,y,k:byte);
{Bila tombol kiri mouse ditekan, maka k = 1, bila tidak ditekan k = 0,
dalam keadaan tombol ditekan, posisi perintah yang ditandai dengan kursor
akan dilaksanakan. Biasanya posisi perintah tidak hanya satu karakter, misal:
F1:Load, akan merupakan daerah yang terdiri 7 karakter, mouse akan mendeteksi
daerah tersebut }

Implementation
Function Moused(var x:byte):boolean;
Var reg:registers;
Begin
reg.ax := 0; intr($33,reg);
moused := not(reg.ax=0);
x := reg.bx;
End;

UNIVERSITAS BINA NUSANTARA

Logika-Algoritma

293

Procedure SetCursorMouse;
Var reg:registers;
Begin
reg.ax:=10;

reg.bx:=0;

reg.cx:=$00ff; reg.dx:=$3000;
intr($33,reg);
End;
Procedure CursorMouse(x:stat);
Var reg:registers;
Begin
if x[1]=6 then reg.ax := 1 {on}

else reg.ax := 2; {off}

intr($33,reg);
End;
Procedure SetMouse_xy(x,y:byte);
Var reg:registers;
Begin
reg.ax := 4;
reg.cx := (x-1)*8; reg.dx := (y-1)*8;
intr($33,reg);
End;
Procedure GetMouse_xyk(var x,y,k:byte);
Var reg:registers;
Begin
reg.ax := 3; intr($33,reg);
x := (reg.cx div 8)+1; y := (reg.dx div 8)+1;
{tombol kiri ditekan}
if (reg.bx and 1)=1 then k := 1 else
{tombol tengah ditekan}
if (reg.bx and 2)=2 then k := 2 else
{tombol kanan ditekan}
if (reg.bx and 4)=4 then k := 3 else
k := 0;
End;
End.

UNIVERSITAS BINA NUSANTARA

Anda mungkin juga menyukai