1. Pendahuluan.
1
Latihan-latihan :
Uses crt:
Var
nilai : 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
VarDim1
Var nilai : array[1..5]
: array[1..3] of integer;
of integer;
Jm , rata : real;
Dim2 : array[1..3,1..3] of integer;
Begin
Dim3 : array[1..3,1..3,1..3] of integer;
Writeln
i,j,k :(‘Menghitung
integer; rata-rata 5 buah nilai’);
Write (‘nilai1 = ‘); readln(nilai[1]);
Begin
Write
{input (‘nilai2
elemen = ‘); readln(nilai[2]);
array}
For i := 1 to 3 =
Write (‘nilai3 do‘); readln(nilai[3]);
Write (‘nilai4
Dim1[i] := 2 *=i‘);
– 1;readln(nilai[4]);
Write (‘nilai5 = ‘); readln(nilai[5]);
Jm i
For :=:=nilai[1]+nilai[2]+nilai[3]+nilai[4]+nilai[5];
1 to 3 do
Rata
Begin:= jm / 5;
Writeln;
For j := 1 to 3 do
Writeln (‘Jumlah
Dim2[i,j] = i
:= 4 * ‘,jm:9:2);
– j;
Writeln (‘Rata-rata = ‘,rata:9:2);
End;
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 setadalah :
Typepengenal = 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.
Soal :
1. Buatlah program menggunakan array untuk menginputkan data mahasiswa
seperti: Nama,NIM, dan nilai 3 matakuliah serta rata-rata dari nilai
matakuliah yang dimasukkan.
Contoh inputan :
Jumlah Mahasiswa : XX
Nama : XXXXXXXXXX
NIM : XXXXXXXX
Nilai MataKuliah :
Pengenalan TI : 99
Basis Data : 99
P. Internet : 99
5
Contoh keluaran:
NIM Nama Pengenalan TI Basis Data P. Internet Rata-rata
XXXXXXXX XXXXXXX 99 99 99 99,99
XXXXXXXX XXXXXXX 99 99 99 99,99
BAB II
RECORD dan ITERASI
A. RECORD
6
Begin
nama_var.var1 := . . . .
nama_var.var2 := . . . . Cara pertama
nama_var.varn := . . . .
With nama_var do
Begin
var1 := . . . . Cara kedua
var2 := . . . .
varn := . . . .
End;
End.
Latihan :
Uses wincrt;
Type data = record
No : integer;
Nama : string;
End;
Var datamhs : data;
Begin
Datamhs.no := 1;
Datamhs.nama := ‘Budi’;
7
type matkul = record
id : integer;
namamk : string;
end;
data = record
nim : string;
nama : string;
dtmk : matkul;
end;
var datamhs : array[1..20] of data;
n,i : integer;
Jwb : char;
begin
n := 0;
Jwb := 'Y';
writeln ('Inputkan data Mahasiswa');
writeln;
while Jwb = 'Y' do
begin
n := n + 1;
with datamhs[n] do
begin
writeln ('Data ke - ',n,' :');
write ('NIM : '); readln(nim);
write ('Nama : '); readln(nama);
write ('kode MK : '); readln(dtmk.id);
write ('Nama MK : '); readln(dtmk.namamk);
write ('Tambah lagi [Y/N] ? : '); readln (Jwb);
writeln;
end;
end;
clrscr;
writeln ('NIM','Nama Mhs':10,'Kode MK':10,'Nama MK':10);
for i := 1 to n do
begin
with datamhs[i] do
writeln (nim,nama:10,dtmk.id:10,dtmk.namamk:10);
end;
end.
8
B. ITERASI
For namavar := a to z do
Repeat
....
until namavar>z;
while namavar<= z do
Latihan :
var n : integer;
k : string;
begin
k := '';
for n := 1 to 10 do
begin
k := k + '*';
writeln (k);
end;
end.
9
var n : word;
begin
clrscr;
write ('Bil. int. positif untuk dicari
faktorialnya : ');
readln (n);
writeln;
writeln ('faktorial dari ',n,' adalah
',faktorial(n));
end.
Soal :
Hasil Output
N NIM Nama Nilai Angka Nilai Huruf
o
1 789456123 Tety Hendarto 25 C
2 456123789 Joko Bernardo 85 A
3 123456789 Budi Susanti 70 B
10
2. Buatlah program untuk mencari nilai dari x pangkat n ( xn) dengan
menggunakan teknik iterasi.
Contoh :
Nilai x : 2
Nilai n : 5
Hasil x pangkat n adalah : 32
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.
11
var input : integer;
function jumgenap (n : integer) : integer;
begin
if n < 2 then
jumgenap := 0 //pemberian nilai nol untuk n < 2
else if (n mod 2) = 0 then
jumgenap := n + jumgenap(n-1) //penjumlahan bil. genap
else
jumgenap := 0 + jumgenap(n-1); //penjumlahan bil. ganjil
end;
begin
clrscr;
writeln ('Program menjumlah bilangan genap');
write ('Batas nilai yang ingin dihitung : ');
readln (input);
writeln;
writeln ('Jumlah Bilangan Genap antara 0-',input,
' = ',jumgenap(input));
readln;
end.
12
function funkalimat (n : integer) : string;
var kal : string;
begin
kal := 'test ';
if n = 1 then Blok
funkalimat := kal program
else function
funkalimat := kal + funkalimat(n - 1);
end;
begin
writeln (funkalimat(10));
readln; Program
end. Utama
Soal :
B
u
d
i
Contoh Program :
Inputkan batas angka perkalian : 5
Hasil perkalian faktorial = 120
Karena faktorial 5 :
5! = 5 * 5 * 5 * 5 * 5 = 120
13
2 3 7 11 13 17 19
Jumlah : 72
BAB IV
STACK (TUMPUKAN)
Secara sederhana, tumpukan bisa diartikan sebagai suatu kumpulan data
yang seolah-olah ada data yang diletakkan diatas data yang lain. Satu hal yang
perlu dingat adalah bahwa kita bisa menambah data, dan mengambil (menghapus)
data lewat ujung yang sama, yang disebut sebagai ujung atas tumpukan (top of
stack).
Untuk menjelaskan pengertian diatas kita ambil contoh sebagai berikut.
Misalnya kita mempunyai dua buah kotak yang kita tumpukkan, sehingga kotak
kita letakkan diatas kotak yang lain. Jika kemudian tumpukan dua buah kotak itu
kita tambah dengan kotak ketiga, kempat, kelima dan seterusnya, maka akan kita
peroleh sebuah tumpukan kotak, yang terdiri dari N kotak.
F atas
E
D
C
B
A
A menambah
B
C
D
A B C
E
F D E F
menghapus
atas
menambah menghapus 14
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;
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);
15
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);
program Balik_Kalimat;
Begin
uses wincrt;
If T.Atas = 0 then
const Elemen = 255; Batas
Writeln
type s255 = string[Elemen]; (‘TUMPUKAN SUDAH KOSONG’) maximum
tumpukan Else= record karakter.
isi : s255; T.Atas := T.Atas – 1;
atasEnd;
: 0..Elemen;
end;
Contoh Pemakaian Tumpukan Dalam Program
var t : tumpukan; Nama tumpukan
i : integer; lebih memahami operasi yang terjadi padapencacah
Untuk tumpukan, berikut
disajikan
kalimatcontoh
: s255; program yang menggunakan metode tumpukan untuk
Kalimat yangmembalik
dibalik
kalimat. Dalam hal ini yang dibalik adalah seluruh kalimat dan bukan perkata.
procedure awalan (var t : tumpukan); Inisialisasi
begin tumpukan
t.atas := 0;
end;
{ 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; 16
End.
program Balik_Kalimat;
uses wincrt;
const Elemen = 255; Batas
type s255 = string[Elemen]; maximum
tumpukan = record karakter.
isi : s255;
atas : 0..Elemen;
end;
Nama tumpukan
var t : tumpukan;
i : integer; pencacah
kalimat : s255; Kalimat yang dibalik
{ Program Utama }
Begin
clrscr;
awalan(t);
writeln ('Tumpukan untuk membalik kalimat'); Kalimat yang akan
writeln ('*******************************'); dibalik
writeln;
write (‘Ketik kalimat : '); readln (kalimat);
clrscr;
writeln ('Kalimat asli : ',kalimat);
Mempush kalimat ke dalam
writeln;
tumpukan
writeln ('Setelah operasi push dan pop');
17
Karakter yang pertama di
pop (dikelurkan).
Ilustrasi cara kerja contoh program :
I
D
U
B
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
iberada paling atas. Sehingga pada saat ingin melakukan proses
pop (mengeluarkan) maka urutan karakter yang dikeluarkan adalah
karakter i – d – u – B.
Soal :
BAB V
POINTER
18
Nama variabel yang digunakan untuk mewakili suatu nilai data,
sebenarnya merupakan atau menunjukkan suatu lokasi tertentu didalam memori
komputer dimana data tersebut disimpan. Pada saat sebuah program dikopolasi,
kompiler akan memriksa bagian deklarasivariabeluntuk mengetahui nama-nama
variabel apa saja yang digunakan, sekaligus mengalokasikan atau menyediakan
tempat dalam pengingat untuk menyimpan nilai data tersebut. Dari sini kita bisa
melihat bahwa sebelum program dieksekusi (harap dibedakan antara kompilasi
dan eksekusi program), lokasi-lokasi data dalam pengingat sudah ditentukan dan
tidak bisa diubah selama program tersebut di eksekusi. Perubah-perubah yang
demikian ini dinamakan dengan perubah statis (static variabel).
Dari pengertian ini bisa kita perhatikan bahwa sesudah suatu lokasi
pengingat ditentukan untuk suatu nama variabel, maka dalam program tersebut
variabel yang dimaksud akan tetap menempati lokasi yang telah ditentukan dan
tidak mungkin berubah.. Dengan demikian dapat dikatakan bahwa banyaknya data
yang bisa diolah adalah terbatas. Sebagai contoh, misalnya kita mempunyai
variabel yang kita deklarasikan sebagai berikut :
Var kode : array[1..100] of integer;
Variabel kode diatas hanya mampu untuk menyimpan data sebanyak 100
buah data. Jika kita tetap akan menambah data pada variabel tersebut, eksekusi
program akan terhenti karena deklarasinya kurang. Sebaliknya jika ternyata data
yang disimpan sedikit jumlahnya, akan mengakibatkan pemborosan pemakaian
memori yang tidak perlu.
Untuk megatasi hal ini maka dibuatlah suatu variabel dinamis yang dapat
dialokasi dan didialokasikan sehingga jumlah penggunaan memori dapat sesuai
kebutuhan saat program dijalankan. Variabel dinamik (dynamic variabel) adalah
variabel yang dialokasikan hanya pada saat program dijalankan. Pada saat
dikompilasi, lokasi variabel ini belum ditentukan, kompiler hanya mencatat
bahwa ada variabel yang akan diperlakukan secara dinamis.
Pada variabel statis, isi memori pada lokasi tertentu adalah data
sesungguhnya yang akan diolah. Pada variabel dinamis, nilai variabel adalah
alamat lokasi yang menyimpan data sesungguhnya.
Untuk memperjelas pengertian tentang Pointer perhatikan ilustrasi berikut :
A 1000 B 5 5 1000
a. b.
19
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’;
Soal :
21
Nama : Rocky
Gaji : 20
Data ke – 2 :
NIP : 02351234
Nama : Rambo
Gaji : 15
Hasil Inputan :
NIP Nama Gaj
i
02051945 Rocky 20
02351234 Rambo 15
BAB VI
LINKED LIST ( SENARAI BERANTAI )
A. Single Linked .
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 dapat 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
informa penyambun
si g
22
Contoh dari senarai berantai dengan 5 simpul :
A B C D E
23
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 Proses 1:
bantu^.kait := nil; Proses yg dilakukan saat
awal := bantu; penginputan data yang pertama
akhir := bantu;
end
else
begin Proses 2 :
akhir^.kait := bantu; Proses penambahan data
bantu^.kait := nil; selanjutnya.
akhir := bantu;
end;
end;
bantu := awal; Proses 3 :
writeln (bantu^.nama); Proses untuk menampilkan data
while bantu^.kait <> nil do
begin
bantu := bantu^.kait;
writeln (bantu^.nama);
end;
readln;
end.
a. b. c. 24
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.
Simpul baru
a.
bantu awal akhir
bantu^.kait := awal b.
awal akhir
awal := bantu
25
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
awal := bantu^.kait b.
bantu awal akhir
26
c.
dispose(bantu)
Bentuk penulisan dalam bentuk program :
bantu := awal;
awal := bantu^.kait;
dispose(bantu);
bantu2^.kait := bantu a.
b.
bantu2^.kait := bantu^.kait
c.
27
Begin
bantu2^.kait := bantu;
bantu2^.kait := bantu^.kait;
dispose(bantu);
End;
bantu := akhir
6. Menghapus simpul di akhir.
Ilustrasi :
awal akhir bantu
a.
akhir^.kait := bantu
awal akhir bantu
b.
awal akhir
dispose(bantu)
c.
akhir^.kait := nil
simpul^.belakang simpul^.depan
28
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
Bentuk penulisan dalam bentuk program :
akhir^.depan := baru; baru^.belakang := nil
baru^.belakang := akhir; c.
baru^.depan := nil;
akhir := baru;
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 :
29
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.
program doule_linked_list;
uses wincrt; A B C D
nil
type simpul = ^data; nil
data = record Deklarasi simpul double linked
nama : string; list.
depan,belakang : simpul; a.
end;
Penulisan dalam
var awal,akhir,bantu bentuk program :
: simpul;
pil : char; bantu := akhir;
While
procedure buatlist bantu
(var bantu <> nil
: simpul); do Procedure untuk menambah
data
begin Begin
if awal = nil then Writeln (‘nama : ‘,bantu^.nama);
begin bantu := bantu^.belakang;
Penambahan data/simpul yang
awal := bantu; pertama
End;
awal^.depan := nil;
awal^.belakang := nil;
akhirPerintah-perintah
:= awal; di atas adalah untuk menjalankan pointer bantudari
end akhir hingga ke awal senarai, serta menampilkan isi dari variabel nama
else pada setiap simpul yang dilewatinya.
begin
akhir^.depan := bantu; Penambahan data/simpul untuk ke-
Contoh Program
bantu^.depan := :nil; sekian kali.
bantu^.belakang := akhir;
akhir := bantu;
end;
Procedure untuk mencetak data dari awal list.
end;
procedure cetakawal;
var bantu : simpul;
begin
clrscr;
writeln ('Cetak Data Dari Awal');
bantu := awal; Perintah untuk mencetak data
while bantu <> nil do dari awal.
begin
writeln ('Nama : ',bantu^.nama);
bantu := bantu^.depan; 30
end;
readln;
end;
procedure cetakakhir; Procedure untuk mencetak data dari akhir list
var bantu : simpul;
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 untuk menghapus seluruh data
procedure hapuslist;
dari awal.
var bantu : simpul;
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; Perintah untuk menambah
new(bantu); data dan memanggil
writeln ('Tambah Data'); procedure buatlist.
write ('Masukkan Nama : ');
readln (bantu^.nama);
buatlist(bantu);
end;
Pemanggilan procedure cetakawal
'2' : cetakawal; Pemanggilan procedure cetakakhir
'3' : cetakakhir; Pemanggilan procedure hapuslist
'4' : hapuslist;
end; 31
until (pil >= '5');
readln;
End.
Soal :
1. Buatlah program menggunakan methode Single Linked List untuk
menginputkan nama, seperti berikut berikut :
Menu :
1. Tambah Data
2. Hapus Data Depan
3. Hapus Data Belakang
4. Cetak Data
Pilh Menu [1/2/3/4] :
Menu 1 :
Inputkan Nama : Alung
32
Kembali ke menu.
Menu 2 :
Hapus Data Dari Depan List
Kembali ke menu.
Menu 3 :
Hapus Data Dari Belakang List
Kembali ke menu.
Menu 4 :
Nama – 1 : Alung
Nama – 2 : Dragon
Nama – 3 : Naga
Kembali ke menu.
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 masuk
Hal yang perlu diingat pada operasi Antrian adalah bahwa setiap
penambahan data akan selalu dilakukan dari belakang, dan
belakang
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;
33
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
1 2 3 4 5 6
A.
belakang = 0
Program pada saat pertama kali dijalankan antrian masih dalam keadaan
kosong, sehingga depan bernilai 1 dan belakang bernilai 0.
depan = 1
1 2 3 4 5 6
B.
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
1 2 3 4 5 6
belakang = 6
34
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
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.
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 :
belakang=6 Pada keadaan awal antrian disi dengan dua elemen :
belakang := 6;
depan := 4;
depan=4
belakang=1
X := antrian[depan];
If depan = maximal then
Depan := 1;
Else
Depan := depan + 1;
belakang=1
Contoh program :
program antrian_;
uses wincrt;
const maximum = 10;
type antri
function = array[1..maximum]
Hapus(var antrian : antri)of char;: char; Pembuatan array untuk
var antrian : antri;
begin antrian
ifdepan,belakang,pilih
depan = maximum then: integer;
elemen
depan := : char;
1
function
else Kosong(Q : antri) : boolean; Function untuk mencek isi antrian
begin
begin Jika depan = belakang, berarti
Kosong
depan:= :=(depan
depan += 1;
belakang); antrian sedang kosong
end;Hapus := antrian[depan];
procedure
end; tambah(var antrian : antri; x : char);
begin
end;
if belakang = maximum then
Begin Jika belakang berada pada posisi antrian
belakang := 1
clrscr; teratas, maka belakang dipindah ke 1
else := 0;
depan Jika tidak berada diatas maka
belakang
belakang :=:=0;belakang + 1; belakang dinaikkan 1
if not(Kosong(antrian)) then
repeat
begin Jika antrian tidak kosong maka, antrian
clrscr;
antrian[belakang]
writeln := x;
('Daftar Menu Pilihan'); ditambah dengan nilai x pada posisi
write (x);
writeln ('-------------------'); belakang
endwriteln ('1. Menambah Elemen');
else
writeln ('2. Menghapus Elemen');
begin
writeln ('3. Selesai');
('Antrian
write ('Pilih Sudah
Salah Penuh');
Satu : ');
repeat (pilih);
readln
{
case }
pilih of
until keypressed;
1 : begin
belakangwriteln
:= belakang - 1; Elemen');
('Menambah
if belakang Pengembalian posisi belakang ke tempat
= 0 ('---------------');
writeln then
belakang := ('Isikan
write maximum; Elemennya sebelumnya
: ');saat antrianFunction untuk dan
sudah penuh
end; readln (elemen); menghapus
tidak dapat ditambah lagi. elemen
end; tambah (antrian,elemen);
Untuk memindahkan depan ke 1 saat depan
end; berada di posisi maximum.
2 : begin
if not(Kosong(antrian)) then
elemen := hapus(antrian)
Memindahkan depan sebanyak 1 elemen,
else dan menghapus elemen.
begin
writeln ('Antrian Kosong');
elemen := readkey; Awal program utama
end;
end; Penempatan posisi depan dan belakang di posisi 0 saat awal
end; program dimulai. 36
until pilih = 3
End.
Pemanggilan procedure
tambah saat menambah elemen
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.
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 37
2. Penambahan di belakang (masuk ke dalam antrian).
kepala ekor baru
Penambahan antrian dengan
data baru
baru^.kait := kepala
ekor^.kait := baru
kepala ekor
ekor := baru
bantu := kepala
bantu kepala ekor
kepala := bantu^.kait
bantu kepala ekor
38
ekor^.kait := kepala
kepala ekor
dispose(bantu)
Soal :
BAB VIII
SORT
39
yang akan diurut, dan dari segi lama waktu yang dibutuhkan untuk mengurutkan
data.
Karena banyaknya methode yang dapat dilakukan untuk mengurutkan
data, maka untuk pembahasan ini kita hanya akan membahas pengurutan data
dengan Methode Gelembung (Buble Sort). Namun diharapkan setiap mahasiswa
juga mempelajari methode-methode lain.
Pada pembahasan Methode Gelembung, kita akan membahasnya pada
pengurutan data yang tersimpan pada senarai berantai (single linked list). Berikut
langkah-langkahnya, dengan data dianggap sudah diinputkan :
Langkah 1 :
awal A B
Langkah 2 :
awal A B B
Langkah 3 :
awal A B
Langkah 4 :
awal A B B
40
Langkah keempat adalah sama seperti langkah kedua dengan menjalankan
pointer B sampai ke simpul terakhir sambil membandingkan nilainya
dengan yang ada dipointer A.
Demikian seterusnya sampai pointer A sampai pada ujung senarai berantai
atau simpul terakhir.
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 hasil
writeln (bantu^.dt); sortiran/pengurutan.
bantu := bantu^.kait;
end;
readln
end.
Soal :
1. Buatlah program untuk mengurutkan data secara descending dengan
Methode Bubble Short, dengan memiliki menu-menu sebagai berikut :
Menu Pilihan :
1. Input Kalimat
2. shorting Kalimat
3. Keluar
Pilih Menu [1/2/3] :
Untuk menu 1 :
Inputkan kalimat : abcdefghij
Untuk menu 2 :
Hasil pengurutan descending : jihgfedcba
Untuk Menu 3 :
Keluar.
42
43