Algoritma
Penyusun
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
1.3
Contoh Permasalahan
1.4
Teknik-teknik Algoritma
8
13
18
2.1
2.2
2.3
18
20
22
2.3.1
Unsur-unsur Pemrograman
2.3.2
Pengertian Identifier
2.3.3
2.3.4
Tipe Data
2.3.5
Operator
30
2.3.6
Ekspresi
32
22
23
25
26
Statemen Assignment
3.2
Statemen Masukan
36
3.3
Statemen Keluaran
38
3.4
Format Penulisan
3.5
Keluaran ke Printer
3.6
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
Struktur Pemilihan
47
57
61
4.2.1
Konstruksi If-Then-Else
4.2.2
Konstruksi Case-Of
61
65
ii
Logika-Algoritma
70
5.1
Procedure
5.2
5.3
Transfer Parameter
5.4
Function
5.5
70
72
74
81
5.5.1
Procedure Standar
5.5.2
Function Standar
84
84
85
6. ARRAY
89
6.1
90
6.2
96
6.3
Pengolahan String
101
7. RECORD
107
7.1
7.2
Statemen With
111
7.3
Variant Record
112
107
8. SET
116
8.1
8.2
Membangun Set
8.3
8.4
Operator Pembanding
8.5
116
116
118
119
120
9. REKURSI
128
9.1
Modul Rekursif
9.2
9.3
9.4
129
131
133
135
Logika-Algoritma
iii
Pengurutan
140
140
140
142
148
10.1.5 Mergesort
152
146
10.2
10.3
Pencarian
154
155
156
156
158
11. POINTER
161
11.1
11.2
11.3
11.4
Simpul-Berantai (Linked-List)
161
162
166
167
169
Penggunaan Simpul-berantai
Simpul-berantai Ganda
11.6.1 Inisialisasi
11.6.2 Penyisipan
173
177
177
180
182
183
183
11.6.3 Penghapusan
185
iv
Logika-Algoritma
188
File Bertipe
189
189
190
190
191
192
192
193
File Text
195
197
198
198
199
200
194
201
206
206
208
211
215
224
13.2
13.2.1 Permasalahan
227
229
229
13.3.1 Chain-code
212
227
211
234
234
235
240
Logika-Algoritma
252
252
252
254
254
254
256
256
259
261
261
DAFTAR PUSTAKA
275
APPENDIX A
277
APPENDIX B
TABEL ASCII
279
APPENDIX C
282
APPENDIX D
284
APPENDIX E
292
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
95
98
104
146
149
156
156
181
211
229
237
238
239
254
257
259
260
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
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
: bernilai salah
: bernilai salah
: 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
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).
PQ
PQ
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),
Logika-Algoritma
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.
Logika-Algoritma
Mulai
Batasan
Masalah
Pengembangan
Model
Rancangan
Algoritma
Pemrograman
Koreksi
Algoritma
Pengujian dan
Analisis
Dokumentasi
Selesai
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.
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.
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.
Logika-Algoritma
Logika-Algoritma
= Jumlah pinjaman
i = bulan ke i, 1 i J
Mi = i 1
BF =
BT
J
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,-
Logika-Algoritma
11
1.2 m = 100%
0.2 m = 0%
0.2
LT
4 s/d 20 mA
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
h1 =
hmax hmin
xS1 + b (2)
S max S min
Logika-Algoritma
13
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
Working Backward
Dimulai dari target atau tujuan, kemudian mundur kebagian awal, bila langkah dapat
dibalik maka langkah-langkah dimulai lagi dari awal hingga selesai.
14
Logika-Algoritma
A
E
2.
3.
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
Meskipun demikian, jalur pertama tadi juga bukan yang termahal, karena jalur :
A-D-B-C-E-A
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.
16
Logika-Algoritma
3.
4.
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).
N1 25
setelah kedua bilangan dibangkitkan dan ditampilkan dilayar, maka giliran pemain untuk
menebak nilai rerata dari kedua bilangan tersebut,
nilai rerata dengan tepat. Setelah jawaban diketikan oleh pemain, kemudian komputer
mentayangkan hasil perhitungan tadi, sehingga pemain tahu seberapa tepat tebakannya tadi.
3
4.
18
Logika-Algoritma
telekomunikasi, bahasa tersebut kemudian dikenal sebagai CHILL (Ccitt HIgh Level
Language), dimana bagian sekuentialnya diambil dari bahasa Pascal.
Logika-Algoritma
19
digunakan dalam bahasa tersebut yang kemudian diberi nama Ada pada tahun 1982.
ALGOL 60
Pascal
Modula 2
CHILL
ADA
20
Logika-Algoritma
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}
{Deklarasi Variabel}
Begin
{Awal Program }
x := 20;
y := 30;
z := x + y;
End.
{Akhir Program}
{Judul Program}
Const Pi = 2.4.14;
{Deklarasi Konstanta}
{Deklarasi Variabel}
Luas : real;
Begin
{Awal Program}
Read(Jejari);
Luas := Pi * SQR(Jejari);
{Menghitung Luas}
End;
{Akhir Program}
22
Logika-Algoritma
Logika-Algoritma
23
Nama Program
Identifier harus dimulai oleh karakter huruf, yaitu : a ... z, atau A ... Z , atau karakter garis
bawah (underscore) yaitu : _
2.
Jumlah karakter yang digunakan tergantung dari versi Pascal, tetapi umumnya tidak lebih
dari 63 karakter, secara praktis angka ini sudah lebih dari cukup.
4.
5.
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 :
; ^
@ {
24
Logika-Algoritma
_B
B2
Sudut_A
LuasLingkaran
ABC3FG
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.
Logika-Algoritma
25
2.
26
Logika-Algoritma
2.
3.
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.
Logika-Algoritma
27
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;
28
Logika-Algoritma
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'
dalam
pengorganisasian
instruksi-instruksi,
khususnya
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.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
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
Logika-Algoritma
31
Operasi
Tipe Operand
not
Negasi
Boolean
Boolean
and
Logika And
Boolean
Boolean
or
Logika Or
Boolean
Boolean
xor
Logika Xor
Boolean
Boolean
Operasi
Sama Dengan
Tipe Operand
Sederhana,String
Boolean
Tidak Sama
Idem
Boolean
Dengan
<
Sederhana,String
Boolean
>
Idem
Boolean
<=
Idem
Boolean
Idem
Boolean
Sama Dengan
>=
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
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
Logika-Algoritma
33
k * Q adalah 100
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
Logika-Algoritma
35
3. MASUKAN - KELUARAN
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.
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.
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
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.
writeln('TEST');
Logika-Algoritma
39
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
penulisan, yang pertama untuk penulisan tipe integer dan string, yang kedua adalah untuk
penulisan tipe real.
Format penulisan untuk tipe integer dan string :
Logika-Algoritma
41
writeln(A : 5);
writeln(A*10 : 5);
40
writeln(A*100 : 5);
400
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 :
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
42
Logika-Algoritma
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
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.
Logika-Algoritma
43
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
Layar Moinitor
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.
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);
write('Panjang : ');
read(p);
gotoxy(30,11); write('Lebar
: '); read(l);
kll := 2 * (p + l );
{ menghitung keliling }
ls := p * l ;
{ menghitung 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.
Logika-Algoritma
45
{ membersihkan layar }
gotoxy(30,10);
write('Panjang : ');
read(p);
gotoxy(30,11); write('Lebar
: '); read(l);
kll := 2 * (p + l );
{ menghitung keliling }
ls := p * l ;
{ menghitung luas}
= ', ls : 8 : 2);
End.
46
Logika-Algoritma
Soal-soal :
1.
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.
dicetak di printer.
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.
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;
I := Nilai Awal
I := Nilai Akhir
?
Ya
Tidak
Do Statemen
I := I + 1
Keluar
Logika-Algoritma
49
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
Logika-Algoritma
51
Ordinal
Integer
Real
Char
Enumerated
Boolean
Sub-range
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
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';
Logika-Algoritma
53
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
====================================
54
Logika-Algoritma
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.
56
Logika-Algoritma
Logika-Algoritma
57
Tidak
True
?
Ya
Do Statemen
Keluar
58
Logika-Algoritma
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.
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.
2.
60
Logika-Algoritma
Pada contoh diatas, terlihat, bahwa sebelum memasuki konstruksi while-do, diberikan
pertanyaan
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
writeln;
[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 !
Logika-Algoritma
61
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
62
Logika-Algoritma
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
Bobot
Nilai Huruf
85 100
A : Sangat Baik
75 84
B : Baik
65 74
C : Cukup
50 64
D : Kurang
0 - 49
E : Gagal
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.
Logika-Algoritma
65
66
Logika-Algoritma
Begin
clrscr;
write('Teruskan (Y/T) ? '); readln(Jawab);
while upcase(Jawab) = 'Y' do
begin
write('Nilai Kehadiran
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.
Tarif
10%
15%
Diatas 50 Juta
30%
Misalkan Penghasilan Tidak Kena Pajak seorang Wajib Pajak adalah Rp. 57.000.000,-
Logika-Algoritma
67
= 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;
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.
Logika-Algoritma
69
1
232
34543
4567654
567898765
67890109876
7890123210987
890123454321098
90123456765432109
0123456789876543210
70
Logika-Algoritma
apabila beberapa instruksi untuk menyelesaikan satu atau beberapa tugas yang berkaitan
diorganisasikan dalam satu blok atau modul.
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.
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.
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
End;
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 }
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.
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
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.
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
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
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.
78
Logika-Algoritma
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 '+'.
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;
Procedure Tukar(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);
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,
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
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
82
Logika-Algoritma
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;
84
Logika-Algoritma
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
86
Logika-Algoritma
Abs(X) : menghasilkan nilai absolut dari x
Chr(X) : menghasilkan karakter dari tabel ASCII dengan no. urut 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;
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;
Logika-Algoritma
87
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.
Logika-Algoritma
89
6. ARRAY
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
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
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 ;
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
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]);
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
Logika-Algoritma
93
Input
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.
Peb
Mar
Apr
Mei
Jun
Jul
Ags
Sep
Okt
Nop
Des
171
179
154
108
93
62
15
63
75
86
117
143
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
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;
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.
Logika-Algoritma
97
A[Baris,Kolom]
A[Baris,Kolom]
1
2
3
Gambar 6.6 Struktur Array Dimensi Dua
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
Logika-Algoritma
99
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.
Logika-Algoritma
101
STR14 = string[14];
Var
S1
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
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];
C := S[6];
menghasilkan C = N .
S1
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
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]
maka variabel Er ( yang bertipe integer) akan bernilai 0, bila terjadi kesalahan konversi
variabel Er akan bernilai 1.
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.
P : Boolean;
A : Char;
Logika-Algoritma
105
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
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
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.
atau
108
Logika-Algoritma
Variabel Record
Variabel Field
X[I].F
X.F
Variabel Record
Berindeks
Field Designator
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
c2 + d2
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 :
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;
110
Logika-Algoritma
Var Personil : arr_rec; Indeks : Byte;
Umur
Jabatan
Gaji
Status
(ribuan)
Sumarno Prawiro
36
Kepala Seksi
2,000
K-3
Iwan Setiawan
33
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
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;
Logika-Algoritma
111
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;
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.
Logika-Algoritma
113
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.
114
Logika-Algoritma
Logika-Algoritma
115
Soal-soal
1.
Selesaikan program bilangan kompleks (halaman 107), untuk perhitungan kali dan bagi,
juga dilengkapi dengan program utama.
2.
3.
Jelaskan, apa yang dimaksud dengan tag filed, tipe data apa yang dapat digunakan
dalam tag field.
4.
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.
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.
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
Kemudian satu atau beberapa variabel dapat dideklarasikan dengan menggunakan tipe set
diatas :
Var
X : angka;
Y : huruf_kapital;
Z : set_warna;
Logika-Algoritma
117
Kedua operator + dan - , dalam TURBO Pascal Versi 7.0 dapat digantikan dengan procedure
Include dan Exclude.
Contoh :
X := X + [8];
X := X - [7];
118
Logika-Algoritma
A+B
A*B
A-B
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;
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.
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
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
Logika-Algoritma
121
A
E
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.
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;
Logika-Algoritma
123
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 :
Logika-Algoritma
125
16
11
21
19
14
33
16
10
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
126
Logika-Algoritma
Hasil dari algoritma Prim untuk contoh jaringan gambar 8.5 adalah :
16
6
5
2
6
11
18
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
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.
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
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).
: 'ARABIKA'
130
Logika-Algoritma
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.
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
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;
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.
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)
Logika-Algoritma
135
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.
1
2
2
3
Logika-Algoritma
137
1
2
1
2
3
4
: Array[1..8] of Papan8x8;
: Papan8x8;
: Integer;
Counter1: Word;
Counter2: Word;
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.
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
140
Logika-Algoritma
Logika-Algoritma
141
[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
Putaran
Pertama
69
Kedua
127
Kedua,
Ketiga
381
Ketiga,
Keempat
419
Program Sorting_Pemilihan;
Type ARR = Array[1..5] of Integer;
Const D : ARR = (516,419,127,69,381);
Var I : Integer;
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.
Pertukaran terjadi diantara elemen yang berdekatan, mulai dari bawah hingga paling atas.
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
69
69
69
69
519
519
519
127
419
419
127
519
127
127
419
419
381
381
381
381
144
Logika-Algoritma
69
69
69
127
127
127
519
519
381
419
381
519
381
419
419
69
69
127
127
381
381
519
419
419
519
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
Logika-Algoritma
145
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.
146
Logika-Algoritma
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
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;
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).
Logika-Algoritma
149
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
tukarkan isi A[j] dengan isi A[k] yaitu A[2] dengan A[7].
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]
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]
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;
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
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
Data Acak
Data Terurut
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
Logika-Algoritma
155
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.
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.
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.
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.
Logika-Algoritma
157
158
Logika-Algoritma
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
Logika-Algoritma
159
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.
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.
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.
162
Logika-Algoritma
Nil
Logika-Algoritma
163
X
Y
12
27
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);
164
Logika-Algoritma
Artinya : lenyapkan lokasi yang ditunjuk oleh alamat yang ada di variabel pointer X.
Dispose(X);
Dispose(X); X := Nil
Nil
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;
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.
Segmen Data
Segmen Stack
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,
kecuali memori yang sedang digunakan oleh program dan sistem operasi (DOS).
Segmen Data
Heap
X
X = Variable Pointer
PSimpul = ^Simpul;
Simpul = Record
Data : String;
Next : PSimpul;
End;
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' ;
L1
VINI
NIL
L2
VIDI
NIL
L3
VICI
NIL
L1
VINI
L2
VIDI
L3
VICI
NIL
Logika-Algoritma
169
PSimpul = ^Simpul;
Simpul = Record
Data : String;
Next : PSimpul;
End;
L := L^.Next;
End
End;
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
PSimpul = ^Simpul;
Simpul = Record
Data : String;
Next : PSimpul;
End;
Logika-Algoritma
171
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
Dijamin
Tidak
Luntur
Nil
Dijamin
Tidak
Luntur
Nil
Logika-Algoritma
173
Dijamin
Tidak
Luntur
Nil
Tidak
Luntur
Nil
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
P2
B
Nil
P1
P2
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).
176
Logika-Algoritma
Temp
Nil
Nil
Temp
Temp
Nil
Nil
Temp
P
Gambar 11.9.d. Mengubah Pointer D ke Simpul H
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;
-5
12
-9
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
Jawab : Char;
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.
180
Logika-Algoritma
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;
Logika-Algoritma
181
simpul
sebagai berikut :
Algoritma 11.1. Pengurutan Penyisipan(Insertion) dengan Simpul-berantai
1. Ciptakan simpul baru dengan pointer T, sebagai tempat transit
2.
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.
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
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.
182
Logika-Algoritma
Kepala
Ekor
TK
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
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;
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;
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;
186
Logika-Algoritma
Kepala
Kursor
Ekor
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.
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
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)
Logika-Algoritma
189
FI : File of Integer;
Var
X : Integer;
F : FI;
190
Logika-Algoritma
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.
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.
192
Logika-Algoritma
FilePos(<Variabel File>);
Logika-Algoritma
193
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;
194
Logika-Algoritma
While NOT EOF(FI) Do
Begin
Inc(I);
Read(FI, X[I]);
End;
Close(F);
End;
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
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.
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.
: '); 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.
Logika-Algoritma
197
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
demikian
variabel
yang
diasosiasikan
dengan
file
text,
adalah
tipe
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.
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.
200
Logika-Algoritma
Logika-Algoritma
201
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.
Jumlah Huruf
================================================
A/a
hhh
pp%
B/b
hhh
pp%
hhh
pp%
Z/z
===============================================
Total Huruf : ................
202
Logika-Algoritma
Baris
: AS;
Huruf
: AH;
Total
: Integer;
Logika-Algoritma
203
: '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;
204
Logika-Algoritma
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
206
Logika-Algoritma
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
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.
208
Logika-Algoritma
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
======================================
-----------------
---
----
----
----
----
-----------------
---
----
----
----
----
---
----
----
----
----
.
.
-----------------
======================================
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.
210
Logika-Algoritma
Logika-Algoritma
211
Orang pribadi
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.
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.
Logika-Algoritma
213
b.
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,-
Rp. 1.728.000,-
2. Dua Anak
Rp. 1.728.000,-
Jumlah PTKP
Rp. 3.456.000,-
214
Logika-Algoritma
Tarif
10%
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.
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,-
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.
Logika-Algoritma
215
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.
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.
Status Perkawinan
Jumlah Anak.
Data Gaji dan Honor yang diambil dari Daftar Gaji dan Daftar Honor
-
Gaji Pokok
Tunjangan PPh
Tunjangan
Honor
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
Logika-Algoritma
219
Gaji Pokok
Gaji
Honorarium
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;
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;
Logika-Algoritma
221
222
Logika-Algoritma
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(
: ,Neto:10:2);
Writeln(
: ,Neto:10:2);
: ,Neto:10:2);
Writeln(
: ,PTKP:10:2);
Writeln(
: ,PKP:10:2);
Logika-Algoritma
223
: ,PPhTerutang:10:2);
: ,PB.TunjPPh:10:2);
Writeln(
: ,PPhDibayar:10:2);
End;
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.
Rp. 443.100,-
2. Tunjangan Istri
Rp. 44.310,-
Rp
4. Tunjangan Jabatan/Fungsional
Rp. 290.000,-
5. Tunjangan PPh
Rp. 35.479,-
26.586,-
Rp. 839.475,-
Potongan-potongan
1. Iuran Pensiun
Rp. 51.400,-
2. Pajak Penghasilan
Rp. 35.479,-
Jumlah Potongan-potongan :
Rp. 86.879,-
Rp. 752.596,-
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,-
Rp
4. Tunjangan Jabatan/Fungsional
Rp. 385.000,-
5. Tunjangan PPh
Rp. 59.034,-
27.918,-
Rp. 983.782,-
Potongan-potongan
1. Iuran Pensiun
Rp. 53.975,-
2. Pajak Penghasilan
Rp. 59.034,-
Jumlah Potongan-potongan :
Rp. 113.009,-
Rp. 870.773,-
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
226
Logika-Algoritma
Gaji Pokok 1 : 443100
Tunjangan 1 : 290000
Tunj. PPh 1 :
35479
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
b. N P W P
: 1.222.333.4.555
6399720.00
b. Tunjangan PPh :
637743.00
c. Tunjangan
4335000.00
d. Honorarium
0.00
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
10163867.85
10163867.85
5184000.00
4979867.85
497986.79
637743.00
0.00
PPh Terutang
10. PPh Terutang
L.
Kredit Pajak
Logika-Algoritma
227
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
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 :
228
Logika-Algoritma
Logika-Algoritma
229
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.
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.
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
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]))
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
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
234
Logika-Algoritma
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.
Logika-Algoritma
235
Perhitungan geometris :
-
Perhitungan Keliling.
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 :
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.
236
Logika-Algoritma
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
....(2b)
sekarang kita gunakan rumus : 1a, 1b, 2a dan 2b. dan nilai pada Tabel 13.1. untuk menyusun
algoritma Perhitungan Lebar dan Tinggi.
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
Wi(max) = 10
Wi(min) = 0
Lebar = 10 - 0 = 10
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).
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
Hi(max) = 5
Hi(min) = 0
Tinggi = 5 - 0 = 5
Logika-Algoritma
239
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
dan aiy 0
dan aiy -1
240
Logika-Algoritma
Perhitungan Luas :
Y0 = 0
Y1 = Y0 + a1y = 0 + 1 = 1
Y2 = Y1 + a2y = 1 + 0 = 1
Y3 = Y2 + a3y = 1 + 1 = 2
Y4 = Y3 + a4y = 2 + 0 = 2
Y5 = Y4 + a5y = 2 - 1 = 1
Y6 = Y5 + a6y = 1 + 0 = 1
Y7 = Y6 + a7y = 1 - 1 = 0
Y8 = Y7 + a8y = 0 + 0 = 0
Y9 = Y8 + a9y = 0 - 1 = -1
Y10 = Y9 + a10y = -1 + 0 = -1
13.3.3.
Program Chain-code.
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);
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;
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);
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;
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;
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;
Logika-Algoritma
247
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
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 :
250
Logika-Algoritma
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.
Judul Gambar
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
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.
Rsh
V1
V2
V3
Rb
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.
Logika-Algoritma
253
V3
V1
V3.Sin
V2 = I. Rsh
V3 . Cos
254
Logika-Algoritma
Logika-Algoritma
255
256
Logika-Algoritma
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
258
Logika-Algoritma
Logika-Algoritma
259
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).
No.Baris : Jumlah
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.
Kepala
Baris
Ekor
Naik
Turun
Naik
Turun
Nil
Gambar 13.11. Model Simpul-berantai pada Penyunting Teks.
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;
NumeriPos = 74;
MenuFKPos = 17;
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;
Y : 2..24;
B : Word;
NB: Word;
F : Text;
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;
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;
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;
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;
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;
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;
Logika-Algoritma
269
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
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;
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.
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
274
Logika-Algoritma
Soal-soal
1.
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.
4.
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.
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.
276
Logika-Algoritma
Logika-Algoritma
APPENDIX A
277
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 ..
278
Logika-Algoritma
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.
Logika-Algoritma
279
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
dilanjutkan ..
280
Logika-Algoritma
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 ..
Logika-Algoritma
281
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
Char
BLANK
282
Logika-Algoritma
Artinya
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
94-103
104-113
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.
Logika-Algoritma
283
{ Tombol 'Esc' }
End;
End;
End;
284
Logika-Algoritma
L,LR,LS,LSR : PSIMPUL;
Logika-Algoritma
285
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
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;
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;
Logika-Algoritma
289
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;
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.
292
Logika-Algoritma
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;
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}
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.