1. Pendahuluan.
1
Latihan-latihan :
Var
nil : array[1..3] of integer;
Begin
nil[1] := 105;
nil[2] := 202;
nil[3] := 727;
writeln (nil[1]);
writeln (nil[2]);
writeln (nil[3]);
End.
Var
nama : array[1..3] of string;
Begin
nama[1] := ‘BUDI’;
nama[2] := ‘IWAN’;
nama[3] := ‘TUTY’;
writeln (‘Nama 1 : ’,nama[1]);
writeln (‘Nama 2 : ’,nama[2]);
writeln (‘Nama 3 : ’,nama[3]);
End.
Const awal = 1;
akhir = 5;
Var
nim : array[awal..akhir] of string;
nama : array[awal..akhir] of string;
n : integer;
Begin
Writeln (‘Isi NIM dan Nama dengan Array’);
For n := 1 to 5 do
Begin
Write (‘NIM - ’,n,’ : ‘); readln(nim[n]);
Write (‘Nama - ’,n,’ : ‘); readln(nama[n]);
Writeln;
End;
Writeln;
Writeln (‘Hasil dari inputan adalah :’);
For n := 1 to 5 do
Begin
Writeln (‘NIM - ’,n,’ : ‘,nim[n]);
Writeln (‘Nama - ’,n,’ : ‘,nama[n]);
Writeln;
End;
End.
2
Var nilai : array[1..5] of integer;
Jm, rata : real;
Begin
Writeln (‘Menghitung rata-rata 5 buah nilai’);
Write (‘nilai1 = ‘); readln(nilai[1]);
Write (‘nilai2 = ‘); readln(nilai[2]);
Write (‘nilai3 = ‘); readln(nilai[3]);
Write (‘nilai4 = ‘); readln(nilai[4]);
Write (‘nilai5 = ‘); readln(nilai[5]);
Jm := nilai[1]+nilai[2]+nilai[3]+nilai[4]+nilai[5];
Rata := jm / 5;
Writeln;
Writeln (‘Jumlah = ‘,jm:9:2);
Writeln (‘Rata-rata = ‘,rata:9:2);
End.
For i := 1 to 3 do
Begin
For j := 1 to 3 do
Dim2[i,j] := 4 * i – j;
End;
For i := 1 to 3 do
Begin
For j := 1 to 3 do
Begin
For k := 1 to 3 do
Dim3[i,j,k] := j * k – i;
End;
End;
{cetak elemen array}
for i := 1 to 3 do
Begin
Writeln;
Writeln (‘1 dimensi[‘,i,’] = ’,dim1[i]);
For j := 1 to 3 do
Begin
Writeln (‘2 dimensi[‘,i,’,’,j,’] = ’,dim2[I,j]);
For k := 1 to 3 do
Writeln (‘3 dimensi[‘,i,’,’,j,’,’,k,’]=’,dim2[i,j,k]);
End;
End; End.
3
B. SET
Set adalah kumpulan objek yang mempunyai tipe data sama dalam urutan
yang tidak diperhatikan. Setiap elemen dalam set disebut dengan anggota atau
elemen set. Tipe data dari anggota set dapat berupa nilai skalar atau himpunan
bagian dari tipe data lain yang ada dalam pascal.
Bentuk umum dari deklarasi set adalah :
Type pengenal = set of tipe;
Keterangan : pengenal : nama variabel atau nama type.
tipe : type data buatan sendiri maupun bawaan pascal.
Pendeklarasian set tidak hanya dapat dilakukan pada Type saja tapi
terkadang juga di deklarasikan pada bagian var (deklarasi variabel).
Contoh :
Type hari = (‘senin’,’selasa’,’rabu’,’kamis’,’jumat’,
’sabtu’,’minggu’);
HariDlmMgg = set of hari;
Bilangan = set of 1..10;
Karakter = set of char;
Setiap tipe yang dideklarasikan di bagian type, untuk dapat digunakan di
dalam program harus di deklarasikan di bagian variabel (var) yang mengarah ke
nama tipe yang telah dibentuk.
Contoh :
Var namahari : HariDlmMgg;
Angka : Bilangan;
Huruf : Karakter;
Type
Tvokal = set of char;
Var
Vokal : Tvokal;
Kar : char;
Begin
Vokal := [‘A’,’I’,’U’,’E’,’O’];
Write (‘Ketik sebuah karakter dan tekan Enter: ‘);
Readln (Kar);
If Kar in Vokal then
Writeln (‘Huruf Vokal’)
Else
Writeln (‘Huruf Konsonan’);
End.
4
type hari=(senin,selasa,rabu,kamis,jumat,sabtu,minggu);
namahari = set of hari;
var harian,harikerja,harilibur : namahari;
nhari : array[hari] of string;
i : hari;
Begin
nhari[senin] := 'senin';
nhari[selasa] := 'selasa';
nhari[rabu] := 'rabu';
nhari[kamis] := 'kamis';
nhari[jumat] := 'jumat';
nhari[sabtu] := 'sabtu';
nhari[minggu] := 'minggu';
harian :=[senin,selasa,rabu,kamis,jumat,sabtu,minggu];
harikerja := [senin,selasa,rabu,kamis];
harilibur := harian - harikerja;
writeln ('NAMA HARI KERJA');
for i := senin to minggu do
begin
if i in harikerja then
write (nhari[i],' - ');
end;
writeln; writeln;
writeln ('NAMA HARI LIBUR');
for i := senin to minggu do
begin
if i in harilibur then
write (nhari[i],' - ' );
end;
End.
5
BAB II
RECORD dan ITERASI
A. RECORD
With nama_var do
Begin
var1 := . . . .
Cara kedua
var2 := . . . .
varn := . . . .
End;
End.
Latihan :
7
B. ITERASI
For namavar := a to z do
Repeat
. . . .
until namavar > z;
Latihan :
var n : integer;
k : string;
begin
k := '';
for n := 1 to 10 do
begin
k := k + '*';
writeln (k);
end;
end.
8
var n : word;
begin
clrscr;
write ('Bil. int. positif untuk dicari
faktorialnya : ');
readln (n);
writeln;
writeln ('faktorial dari ',n,' adalah
',faktorial(n));
end.
9
BAB III
REKURSI
Rekursi adalah sebuah proses yang bisa memanggil diri sendiri. Dalam
rekursi sebenarnya terkandung pengertian prosedur atau fungsi. Perbedaannya
adalah bahwa rekursi bisa memanggil dirinya sendiri, tetapi prosedur atau fungsi
harus dipanggil lewat pemanggil prosedur atau fungsi.
10
var kalimat : string;
procedure karakter(kal : string);
var n : integer;
begin
n := length(kal);
writeln (kal[n]);
if n >= 1 then
begin
karakter(copy(kal,1,n-1));
end;
end;
begin
clrscr;
writeln ('Pembalik Kalimat Secara Vertikal');
writeln ('Masukkan Kalimat : ');
readln (kalimat);
karakter(kalimat);
readln;
end.
11
BAB IV
STACK (TUMPUKAN)
F atas
E
D
C
B
A
A menambah
C
A B C D E F
D
F menghapus
atas
menambah menghapus
12
Dari gambar diatas menunjukkan pengertian bahwa kotak yang terakhir
dimasukkan bukan berarti memiliki posisi paling atas, tapi lebih ditekankan pada
kotak yang paling dekat pada pintu masuk.
Dengan memperhatikan ilustrasi-ilustrasi yang disebutkan maka kita bisa
melihat bahwa tumpukan merupakan suatu senarai (list) yang mempunyai
pengertian “masuk terakhir keluar pertama” (Last In First Out - LIFO).
Operasi Push
Sekarang kita akan menyusun sebuah prosedur untuk operasi push.
Dengan menyajikan tumpukan seperti diatas, maka operasi push dengan mudah
kita implementasikan sebagai berikut :
Procedure PUSH (var T : Tumpukan; X : integer);
Begin
T.Atas := T.Atas + 1;
T.Isi[T.Atas] ;= x;
End;
13
Operasi Pop
Operasi Pop adalah operasi untuk menghapus elemen yang terletak pada
posisi paling atas dari sebuah tumpukan. Sama halnya dengan operasi push, maka
dengan deklarasi tumpukan seperti diatas, prosedur untuk operasi pop bisa dengan
mudah kita implementasikan sebagai berikut :
Procedure POP (var T : tumpukan);
Begin
T.Atas := T.Atas – 1;
End;
Prosedur diatas juga masih sangat sempurna, dan belum dapat digunakan
untuk operasi pop, namun sudah mencakup pengertian dari pop. Hal yang terjadi
bila kita menggunakan prosedur diatas adalah bila data dalam larik sudah kosong,
karena adalah hal yang tidak mungkin melakukan operasi pop bila data sudah
kosong. Maka perlu ada tambahan pada procedure untuk mengecek keberadaan
data dalam antrian, jika data masih ada maka dapat dilakukan operasi pop, namun
bila sebaliknya akan ditolak.
Penambahan dari prosedur pop adalah :
Procedure POP (var T : Tumpukan);
Begin
If T.Atas = 0 then
Writeln (‘TUMPUKAN SUDAH KOSONG’)
Else
T.Atas := T.Atas – 1;
End;
14
Contoh Pemakaian Tumpukan Dalam Program
Untuk lebih memahami operasi yang terjadi pada tumpukan, berikut
disajikan contoh program yang menggunakan metode tumpukan untuk membalik
kalimat. Dalam hal ini yang dibalik adalah seluruh kalimat dan bukan perkata.
program Balik_Kalimat;
uses wincrt;
const Elemen = 255; Batas maximum
type s255 = string[Elemen]; karakter.
tumpukan = record
isi : s255;
atas : 0..Elemen;
end;
var t : tumpukan; Nama tumpukan
i : integer; pencacah
kalimat : s255; Kalimat yang dibalik
procedure awalan (var t : tumpukan);
begin Inisialisasi
t.atas := 0; tumpukan
end;
{ Program Utama }
Begin
clrscr;
awalan(t);
writeln ('Tumpukan untuk membalik kalimat');
writeln ('*******************************');
writeln;
write (‘Ketik kalimat : '); readln (kalimat); Kalimat yang akan
clrscr; dibalik
writeln ('Kalimat asli : ',kalimat);
writeln;
writeln ('Setelah operasi push dan pop');
15
program Balik_Kalimat;
uses wincrt;
Batas maximum
const Elemen = 255;
karakter.
type s255 = string[Elemen];
tumpukan = record
isi : s255;
atas : 0..Elemen;
end;
var t : tumpukan; Nama tumpukan
i : integer; pencacah
kalimat : s255; Kalimat yang dibalik
{ Program Utama }
Begin
clrscr;
awalan(t);
writeln ('Tumpukan untuk membalik kalimat');
writeln ('*******************************'); Kalimat yang akan
writeln; dibalik
write (‘Ketik kalimat : '); readln (kalimat);
clrscr;
writeln ('Kalimat asli : ',kalimat);
writeln;
writeln ('Setelah operasi push dan pop'); Mempush kalimat ke dalam
tumpukan
for i := 1 to length(kalimat) do
push(t, kalimat[i]); Mempop isi tumpukan
sehingga terlihat
for i := 1 to length(kalimat) do kalimat yg terbalik
write (pop(t));
readln;
End.
16
iduB
iduB Budi
i
iB
Penjelasan : Misalkan kalimat yang diinput adalah Budi, maka urutan karakter
yang di push (dimasukkan) adalah B – u – d – i , maka
tampak di gambar ilustrasi, B berada pada paling bawah dan i
berada paling atas. Sehingga pada saat ingin melakukan proses pop
(mengeluarkan) maka urutan karakter yang dikeluarkan adalah
karakter i – d – u – B.
17
BAB V
POINTER
A 1000 B 5
5
1000
a. b.
18
nilai ini bukan data yang sesungguhnya, tetapi lokasi yang menyimpan data
sesungguhnya berada. Jadi dalam hal ini nilai data yang sesungguhnya tersimpan
berada pada lokasi 5 didalam memori.
Dari ilustrasi diatas bisa dilihat bahwa nilai variabel dinamis akan
digunakan untuk menunjuk kelokasi lain yang berisi data sesungguhnya yang
akan diproses. Karena alasan inilah variabel dinamis lebih dikenal dengan sebutan
pointer yang artinya kira-kira menunjuk ke sesuatu. Dalam variabel dinamis nilai
data yang ditunjuk oleh suatu pointer biasanya disebut sebagai simpul/node.
Bentuk umum deklarasi pointer :
Untuk mengisi data kedalam pointer (yang memiliki tipe data record)
caranya sama dengan pemakaian record, hanya saja setelah nama variabel lebih
dulu diikuti dengan tanda ceret. Contoh :
Mhs1^.nama := ‘Alung’;
Mhs2.alamat := ‘Jln. BimaSakti’;
19
tidak digunakan, bagian bagian memori yang telah dialokasikan tersebut
dikembalikan (dealokasi) ke sistem untuk menghemat pemakaian memori.
Latihan :
type n = ^integer;
var k : n;
i : integer;
begin
i := 20;
clrscr;
writeln (k^);
new (k);
k^ := i;
writeln (k^);
readln;
end.
20
BAB VI
LINKED LIST ( SENARAI BERANTAI )
Salah satu struktur data dinamis yang paling sederhana adalah Senarai
Berantai (Linked List), atau senarai satu arah. Senarai Berantai sendiri punya
makna sebagai kumpulan komponen yang disusun secara berurutan dengan
menggunakan bantuan pointer. Komponen-komponen yang tersusun tersebut akan
disebut sebagai simpul, sehingga pada senarai akan terdapat banyak simpul, dan
tiap simpulnya dapat dibagi menjadi dua bagian. Bagian pertama dari simpul
disebut dengan medan informasi, yang berisi informasi/data yang fapat berupa
record yanag akan diolah. Sedangkan bagian yang kedua disebut sebagai medan
penyambung (link field), yang berisi alamat simpul berikutnya.
simpul
simpul^.medan_informasi simpul^.medan_penyambung
Medan Medan
informasi penyambung
A B C D E
21
juga terdapat 2 buah pointer awal dan akhir, kedua pointer ini berfungsi untuk
mempermudah dalam melakukan operasi pengolahan data pada senarai berantai,
seperti : pembacaan, pencarian, pengeditan, serta penghapusan data, pengertian
kedua pointer ini mungkin akan lebih jelas pada pembahasan selanjutnya.
Bentuk umum pendeklarasian single linked list :
nmrecord = record;
nmvar1 : tipe;
22
program SingleLinkedList;
uses wincrt;
type simpul = ^data;
data = record
nama : string[25]; Deklarasi simpul
kait : simpul;
end;
var awal,akhir,bantu : simpul;
ya : char;
begin
clrscr; Pembuatan nilai awal= nil, pada
awal := nil; saat program pertama dijalankan
ya := 'y';
while ya in ['y','Y'] do
begin
new (bantu);
write ('Masukkan Nama : ');
readln (bantu^.nama);
write ('Tambah data lagi [Y/N]: ?');
readln (ya);
writeln;
if awal = nil then
begin
bantu^.kait := nil; Proses 1:
awal := bantu; Proses yg dilakukan saat
akhir := bantu; penginputan data yang pertama
end
else
begin
akhir^.kait := bantu; Proses 2 :
bantu^.kait := nil; Proses penambahan data
akhir := bantu;
selanjutnya.
end;
end;
bantu := awal;
writeln (bantu^.nama);
while bantu^.kait <> nil do Proses 3 :
begin Proses untuk menampilkan data
bantu := bantu^.kait;
writeln (bantu^.nama);
end;
readln;
end.
a. b. c.
23
Tampak bahwa medan penyambung dari bantu (bantu^.kait) dibuat nilainya
nil karena data masih satu sehingga berperan sebagai awal dan akhir linked list.
Proses 2 : Proses untuk memberikan nilai pada akhir untuk menunjuk ke-
bantu yang baru saja diinputkan.
awal akhir bantu awal akhir bantu
a.
b.
awal akhir
Niliai nil
c.
Pada gambar a simpul bantu baru dibentuk. Gambar b menjelaskan akhir
akan menunjuk ke bantu yang baru. Gambar c menjelaskan peberian nilai nil
kepada bantu^.kait, karena bantu tersebut berada pada posisi terakhir.
Tampak pada gambar bahwa yang berpindah arah hanya akhir dan bukan awal,
hal ini menandakan bahwa penambahan dilakukan di belakang linked list. Perlu
diingat bahwa dalam linked list terdapat peraturan-peraturan sebagai berikut :
1. awal akan selalu menunjuk ke awal linked list, dan akhir akan selalu
menunjuk ke akhir linked list, sekalipun penambahan data dilakukan.
2. Setiap simpul yang terakhir dari linked list nilai dari medan penyambung
harus selalu bernilai nil.
Proses 3 : Pada proses ini bantu akan membaca simpul dan menampilkan hasilnya
dari awal sampai akhir linked list.
Operasi pada Senarai Berantai (Single Linked List)
1. Menambah simpul di belakang.
Untuk contoh dan ilustrasi menambah dibelakang sudah dijelaskan pada
contoh program Proses 2.
2. Menambah simpul di depan.
Ilustrasi :
Simpul baru
a.
bantu awal akhir
bantu^.kait := awal b.
awal akhir
awal := bantu
24
c.
Bentuk penulisan dalam bentuk program :
new(bantu);
bantu^.nama := ‘Alung’;
bantu^.kait := awal;
awal := bantu;
3. Menambah simpul di tengah.
Ilustrasi : awal akhir
a.
b.
bantu
bantu^.kait:= bantu2^.kait
tbanbantu2^.berikut
c.
25
4. Menghapus simpul di awal.
Ilustrasi :
bantu awal akhir
bantu := awal
a.
bantu awal akhir
awal := bantu^.kait b. :
Bentuk penulisan dalam bentuk program
bantu bantu := awalawal; akhir
awal := bantu^.kait;
dispose(bantu);
dispose(bantu)
c.
bantu2^.kait := bantu a.
b.
bantu2^.kait := bantu^.kait
c.
26
Bentuk penulisan dalam bentuk program :
While (bantu^.kait<>nil) or (bantu^.nama<>‘Budi’) do
bantu := bantu^.kait;
If (bantu <> nil) then
Begin
bantu2^.kait := bantu;
bantu2^.kait := bantu^.kait;
dispose(bantu);
End;
bantu := akhir
a.
akhir^.kait := bantu
awal akhir bantu
awal akhir
b. dispose(bantu)
c.
Bentuk penulisan dalam bentuk program : akhir^.kait := nil
bantu := akhir;
akhir^.kait := bantu;
dispose(bantu);
akhir^.kait := nil;
simpul^.belakang simpul^.depan
27
Contoh pendeklarasian Double Linked List :
Type simpul = ^data;
data = record
nama : string;
depan,belakang : simpul;
End;
Var awal,akhir,baru : simpul;
Tampak dari contoh pendeklarasian tersebut pada bagian record
terdapat dua buah variabel yang bertipe pointer (simpul) yaitu depan dan
belakang. Hal inilah yang mengakibatkan Senarai Berantai tersebut disebut
sebagai Double Linked List. Pada deklarasi di atas pointer blakang adalah
pointer untuk menunjuk ke simpul sebelumnya, atau simpul sebelah kiri, pointer
depan adalah pointer untuk menunjuk ke simpul sesudahnya atau simpul sebelah
kanan.
Operasi pada Senarai Berantai Ganda (Double Linked List). Simpul baru
1. Menambah Data
Ilustrasi :
A B C D
nil nil
a.
awal akhir baru
A B C D
nil
akhir^.depan:=baru;
baru^.belakang:=akhir
b.
akhir := baru;
awal akhir baru
A B C D
nil nil
baru^.belakang := nil
28
2. Membaca simpul/data
Karena memiliki pointer yang dapat menunjuk ke depan dan ke belakang,
operasi pembacaan data dilakukan dari kedua arah, yaitu dari depan dan
belakang.
Membaca dari belakang :
bantu awal akhir bantu
A B C D
nil nil
a.
Penulisan dalam bentuk program :
bantu := awal;
While bantu <> nil do
Begin
Writeln (‘nama : ‘,bantu^.nama);
bantu := bantu^.depan;
End;
Fungsi dari penulisan program ini adalah untuk menjalankan
pointer bantu dari awal hingga akhir list serta menampilkan isi dari
simpul yang dilewati.
A B C D
nil
Penulisan dalam bentuk program : nil
bantu := akhir;
While bantu <> nil do
a.
Begin
Writeln (‘nama : ‘,bantu^.nama);
bantu := bantu^.belakang;
End;
29
Contoh Program :
program doule_linked_list;
uses wincrt;
type simpul = ^data;
data = record Deklarasi simpul double linked
nama : string; list.
depan,belakang : simpul;
end;
var awal,akhir,bantu : simpul;
pil : char;
procedure buatlist (var bantu : simpul); Procedure untuk menambah
begin data
if awal = nil then
begin
awal := bantu; Penambahan data/simpul yang
awal^.depan := nil; pertama
awal^.belakang := nil;
akhir := awal;
end
else
begin
akhir^.depan := bantu;
bantu^.depan := nil; Penambahan data/simpul untuk ke-
bantu^.belakang := akhir; sekian kali.
akhir := bantu;
end;
end; Procedure untuk mencetak data dari awal
procedure cetakawal;
list.
var bantu : simpul;
begin
clrscr;
writeln ('Cetak Data Dari Awal');
bantu := awal;
while bantu <> nil do
begin Perintah untuk mencetak data
writeln ('Nama : ',bantu^.nama); dari awal.
bantu := bantu^.depan;
end;
readln;
end;
30
procedure cetakakhir; Procedure untuk mencetak data dari akhir
var bantu : simpul; list
begin
clrscr;
writeln ('Cetak Data Dari Akhir');
bantu := akhir;
while bantu <> nil do
begin Perintah untuk mencetak data
writeln ('Nama : ',bantu^.nama); dari akhir.
bantu := bantu^.belakang;
end;
readln;
end;
procedure hapuslist; Procedure untuk menghapus seluruh data
var bantu : simpul; dari awal.
begin
clrscr;
while awal <> nil do
begin Perintah untuk menghapus data dari awal
bantu := awal; list.
awal := awal^.depan;
dispose(bantu);
end;
writeln ('Data telah dihapus');
readln;
end;
Begin Awal program utama
awal := nil;
repeat
clrscr;
writeln ('Program Double Linked List');
writeln ('**************************');
writeln ('1. Tambah Data');
writeln ('2. Cetak Data Dari Awal');
writeln ('3. Cetak Data Dari Akhir');
writeln ('4. Hapus Seluruh Data');
writeln ('5. Keluar');
write ('Pilihan Anda [1/2/3/4/5] : ');
readln (pil);
case pil of
'1' : begin
clrscr;
new(bantu); Perintah untuk menambah
writeln ('Tambah Data'); data dan memanggil
write ('Masukkan Nama : '); procedure buatlist.
readln (bantu^.nama);
buatlist(bantu);
end;
'2' : cetakawal;
Pemanggilan procedure cetakawal
'3' : cetakakhir; Pemanggilan procedure cetakakhir
'4' : hapuslist; Pemanggilan procedure hapuslist
end;
until (pil >= '5');
readln;
End.
31
BAB VII
ANTRIAN (QUEUE)
Antrian adalah suatu kumpulan data yang mana penambahan elemen
hanya bisa dilakukan pada suatu ujung (belakang/rear), dan penghapusan
dilakukan lewat ujung lainnya (depan/front). Sebagai contoh dapat kita ibaratkan
dengan antrian membeli karcis di sebuah bioskop, para pengantri yang ingin
membeli karcis hanya masuk ke antrian melalui satu pintu saja, demikian bagi
yang telah selesai membeli karcis akan keluar melalui satu pintu/ujung yang lain.
Seperti pada Stack/Tumpukan yang mengenal istilah masuk terakhir
keluar pertama (LIFO – Last In First Out). Berbeda dengan Antrian yang
mengenal istilah masuk pertama keluar pertama (FIFO – Fisrt In First Out)
Ilustrasi Antrian :
depan
keluar A B C D E F masuk
belakang
Hal yang perlu diingat pada operasi Antrian adalah bahwa setiap
penambahan data akan selalu dilakukan dari belakang, dan
pengurangan/penghapusan data akan selalu dilakukan dari depan. Sehingga
berdasarkan gambar bila ingin menambahkan suatu data harus diletakkan pada
bagian sebelah kanan F, dan bila akan menghapus suatu data, maka akan
dilakukan pada bagian sebelah kiri, dalam hal ini A.
Antrian dapat disajikan dalam bentuk larik/array. Berikut contoh
pendeklarasian Antrian dengan array.
Type antri = array[1..100] of integer;
Var antrian : antri;
depan,belakang : integer;
Pada deklarasi diatas, elemen antrian dinyatakan dalam tipe integer.
Variabel depan menunjukkan posisi elemen pertama dalam larik, variabel
belakang menunjukkan posisi elemen terakhir dalam larik.
Dalam suatu permasalahan saat antrian sudah penuh, sementara kita masih
ingin terus menambahan data lagi, maka akan terjadi offerflow (kelbihan
kapasitas). Dengan mengabaikan akan terjadinya offerflow, maka penambahan
data pada antrian dalam bentuk programnnya adalah sebagai berikut :
Belakang := belakang + 1;
Antrian[belakang] := x; {x : variabel untuk mengisi antrian}
Ilustrasi : depan = 1
A.
1 2 3 4 5 6
belakang = 0
32
Program pada saat pertama kali dijalankan antrian masih dalam keadaan
kosong, sehingga depan bernilai 1 dan belakang bernilai 0.
depan = 1
B. A B C D
1 2 3 4 5 6
belakang = 4
Pada saat dilakukan penambahan data maka belakang akan dijumlahkan
dengan 1, kemudian antrian pada posisi belakang (antrian[belakang])
akan disi dengan elemen x.
Masih dengan mengabaikan akan terjadinya offerflow, untuk pengurangan
/ penghapusan pada antrian adalah sebagai berikut :
X := antrian[depan];
Depan := depan + 1;
depan = 3
C D E F
1 2 3 4 5 6
belakang = 6
Pada saat dilakukan pengurangan data maka x akan diisi nilainya dengan
kedudukan depan saat itu, kemudian depan dimajukan sebanyak 1 (depan +
1).
Dengan keadaan seperti diatas tentu saja dapat terjadi suatu keadaan
dimana penambahan elemen baru tidak dapat dilakukan, misalnya karena nilai
belakang sudah mencapai nilai maksimal akan tetapi antrian yang
sesungguhnya masih banyak yang kosong karena nilai depan lebih besar dari 1,
seperti pada gambar di atas.
Kemungkinan penyelesaian yang dapat dilakukan adalah dengan
menggeser elemen-elemen lain maju ke depan jika ada elemen yang keluar
(dihapus) seperti antrian manusia yang membeli karcis pada umumnya.
depan belakang depan belakang
C D E F C D E F
1 2 3 4 5 6 1 2 3 4 5 6
Akan tetapi hal ini akan sangat tidak efisien dilakukan pada elemn array, kalu
jumlah elemen array yang sedikit mungkin tidak terlalu jadi masalah, tetapi akan
jadi masalah bila elemen array-nya sampai sebanyak seratus bahkan ribuan
elemen, data akan dipindahkan satu-persatu sebanyak seribu elemen, hal ini akan
memperlambat kinerja komputer.
33
Cara yang paling baik untuk memecahkan masalah ini adalah dengan
menyimpan elemen larik seolah-olah larik berbentuk lingkaran.
depan C D belakang
X E
Elemen baru selalu dapat ditambahkan selama masih ada tempat kosong (terdapat
tempat kosong antara belakang dan depan).
Pada kenyataan yang sebenarnya larik tidak benar-benar memutar
melainkan masih seperti biasa yang memiliki ujung, namun perlakuannya di
dalam penulisan program dibuat seakan-akan melingkar/memutar.
Berikut adalah ilustrasi serta penulisan program untuk operasi pada antrian
yang dibuat seakan-akan memutar :
6 E belakang=6 Pada keadaan awal antrian disi dengan dua elemen :
belakang := 6;
5 D depan := 4;
depan=4
4 C
3
2
1
Hal berikut adalah proses penambahan elemen, karena
6 E masih ada tempat yang kosong (perlu diingat antrian
5 diperlakukan sebagai lingkaran).
D
4 C depan=4 if belakang = maximal then
belakang := 1
3 else
belakang := belakang + 1;
2
1 F belakang=1
6 E
Hal berikut menjelaskan proses penghapusan data,
5 D depan=5 selama masih data belum kosong :
4 X := antrian[depan];
If depan = maximal then
3 Depan := 1;
2 Else
Depan := depan + 1;
1 belakang=1
F
34
Contoh program :
program antrian_;
uses wincrt;
const maximum = 10;
type antri = array[1..maximum] of char; Pembuatan array untuk
var antrian : antri; antrian
depan,belakang,pilih : integer;
elemen : char;
function Kosong(Q : antri) : boolean; Function untuk mencek isi antrian
begin Jika depan = belakang, berarti
Kosong := (depan = belakang); antrian sedang kosong
end;
procedure tambah(var antrian : antri; x : char);
begin
if belakang = maximum then Jika belakang berada pada posisi antrian
belakang := 1 teratas, maka belakang dipindah ke 1
else Jika tidak berada diatas maka
belakang := belakang + 1; belakang dinaikkan 1
if not(Kosong(antrian)) then
Jika antrian tidak kosong maka, antrian
begin
antrian[belakang] := x; ditambah dengan nilai x pada posisi
belakang
write (x);
end
else
begin
write ('Antrian Sudah Penuh');
repeat
{ }
until keypressed;
belakang := belakang - 1;
if belakang = 0 then Pengembalian posisi belakang ke tempat
belakang := maximum; sebelumnya saat antrian sudah penuh dan
end; tidak dapat ditambah lagi.
end;
35
function Hapus(var antrian : antri) : char; Function untuk
begin menghapus elemen
if depan = maximum then
depan := 1 Untuk memindahkan depan ke 1 saat depan
else berada di posisi maximum.
begin
depan := depan + 1;
Hapus := antrian[depan]; Memindahkan depan sebanyak 1 elemen,
end; dan menghapus elemen.
end;
Begin Awal program utama
clrscr; Penempatan posisi depan dan belakang di posisi 0 saat awal
depan := 0;
program dimulai.
belakang := 0;
repeat
clrscr;
writeln ('Daftar Menu Pilihan');
writeln ('-------------------');
writeln ('1. Menambah Elemen');
writeln ('2. Menghapus Elemen');
writeln ('3. Selesai');
write ('Pilih Salah Satu : ');
readln (pilih);
case pilih of Pemanggilan procedure tambah
1 : begin saat menambah elemen
writeln ('Menambah Elemen');
writeln ('---------------');
write ('Isikan Elemennya : ');
readln (elemen);
tambah (antrian,elemen);
end;
2 : begin
if not(Kosong(antrian)) then
elemen := hapus(antrian) Pengecekan isi antrian saat akan
else menghapus elemen. Jika antrian
begin tidak kosong maka data akan
writeln ('Antrian Kosong'); dihapus, sebaliknya jika antrian
elemen := readkey; kosong akan ada pesan ‘Antrian
end; Kosong’.
end;
end;
until pilih = 3
End.
Program diatas tidak akan menampilkan data yang telah diinput, sehingga
untuk pengujiannya adalah dengan cara : Inputkanlah data sebanyak tiga kali
dengan memilih menu 1, kemudian hapuslah data tersebut dengan memilih menu
2 sebanyak tiga kali. Jika ada pesan : “Antrian Kosong”, berarti program anda
sudah benar. Hal ini disebabkan data yang kita masukkan sebanyak 3 buah, akan
dihapus dari antrian, sehingga pada penghapusan yang keempat ditampilkan
sebuah pesan.
36
Implementasi Antrian Dengan Pointer.
Kita telah mempelajari bagaimana membuat antrian dengan menggunakan
array. Dari pelajaran tersebut kita dapat mengetahui bahwa dengan menggunakan
array, antrian punya beberapa kekurangan antara lain : jumlah elemen antrian
sangat dibatasi oleh elemen array, sehingga tidak memungkinkan bila ingin
memproses data yang sangat banyak dan belum dapat di ketahui jumlah
maximalnya. Sehingga dalam hal ini diperlukan bantuan pointer untuk
menerapkan pembuatan antrian.
Dengan menggunakan pointer maka jumlah data yang dapat di inputkan ke
antrian bisa sangat banyak. Penerapan pointer dalam antrian hampir sama dengan
senarai berantai, sehingga bila anda sudah memahami senarai berantai maka tidak
sulit untuk memahami antrian dengan pointer.
Berikut implementasi antrian dengan pointer menggunakan ilustrasi :
1. Inisialisasi
kepala ekor
New(kepala);
kepala^.info := chr(0);
kepala^.kait := kepala;
ekor := kepala
baru^.kait := kepala
ekor^.kait := baru
kepala ekor
ekor := baru
37
3. Penghapusan di depan (Keluar dari antrian).
bantu := kepala
bantu kepala ekor
kepala := bantu^.kait
ekor^.kait := kepala
kepala ekor
dispose(bantu)
38
BAB VIII
SORT
Langkah 1 :
awal A B
Langkah 2 :
awal A B B
39
Langkah kedua adalah dengan menjalankan pointer B sampai ke ujung dari
senarai, dengan catatan setiap kali melewati sebuah simpul, nilainya akan
selalu dibandingkan dengan nilai yang ada pada pointer A, jika nilai B <
A, maka nilainya akan ditukar.
Langkah 3 :
awal A B
Langkah 4 :
awal A B B
40
Dari langkah-langkah tersebut diatas maka diperolehlah data yang sudah
diurutkan secara ascending. Untuk memperjelas pengertian tentang pengurutan
dengan Methode Gelembung (Buble Short), berikut contoh programnya :
program tes_sortir;
uses crt;
type simpul = ^data;
data = record
dt : char; Pendeklarasian simpul untuk senarai berantai
kait : simpul;
end;
var awal,A,B,baru,akhir,bantu : simpul;
huruf : string;
i : integer;
car : char;
begin
clrscr;
new(awal);
awal := nil;
write ('Inputkan karakter : ');
readln (huruf);
for i := 1 to length(huruf) do
begin
new(baru);
baru^.dt := huruf[i];
if awal = nil then
begin
baru^.kait := nil; Proses yang dilakukan untuk
awal := baru; memasukkan atau menambah data
akhir := awal; kedalam senarai berantai
end
else
begin
akhir^.kait := baru;
akhir := baru;
akhir^.kait := nil;
end;
end;
41
A := awal;
while not(A = nil) do
begin
B := A^.kait;
while not(B = nil) do
begin
if B^.dt < A^.dt then
begin Perintah yang dilakukan untuk mengurutkan
car := B^.dt; data yang terdapat di dalam senarai berantai
B^.dt := A^.dt; secara ascending.
A^.dt := car;
end;
B := B^.kait;
end;
A := A^.kait;
end;
writeln ('Hasil Pengurutan');
bantu := awal;
while not(bantu = nil) do
Perintah yang dilakukan untuk menampilkan
begin
data yang terdapat pada senarai berantai
writeln (bantu^.dt);
bantu := bantu^.kait; hasil sortiran/pengurutan.
end;
readln
end.
42