BAB I 1.
Pendahuluan.
Strukt Struktur ur data data adalah adalah cara menyim menyimpan pan atau merepr merepresen esentas tasika ikan n data data di dalam dalam komp komput uter er agar agar bisa bisa dipa dipaka kaii secar secaraa efisi efisien en Seda Sedang ngka kan n data data adal adalah ah representasi dari fakta dunia nyata. Fakta atau keterangan tentang kenyataan yang disimpan, direkam atau direpresentasikan dalam bentuk tulisan, suara, gambar, sinyal atau symbol. Secara garis besar type data dapat dikategorikan menjadi : 1. Type Type data sederhana a. Type ype data data sederha sederhana na tungga tunggal, l, misaln misalnya ya Integer Integer,, real, real, boolea boolean n dan karakter b. Type Type data sederhana majemuk, misalnya String 2. Struktur ata, meliputi a. Struktur data sederhana, misalnya array dan record b. Struktur data majemuk, yang terdiri dari !inier : Stack, "ueue, serta !ist dan #ultilist $on !inier : %ohon &iner dan 'raph %ema %emaka kaia ian n stru strukt ktur ur data data yang yang tepa tepatt di dala dalam m pros proses es pemr pemrog ogra rama man n akan akan menghasilkan algoritma yang lebih jelas dan tepat, sehingga menjadikan program secara keseluruhan lebih efisien dan sederhana.Struktur data yang (standar( yang biasanyadigunakan dibidang informatika adalah : !ist linier )!inked !ist* dan +ariasinya #ultilist Stack )Tumpukan* )Tumpukan* "ueue )ntrian* Tree ) %ohon * 'raph ) 'raf *
2. ARRAY ARRAY dan SET A. ARRA ARRAY (LARIK (LARIK)) rray )!arik* adalah tipe terstruktur yang mempunyai komponen dalam jumlah yang tetap dan setiap komponen mempunyai tipe data yang sama. %osisi masing-masing dalam larik dinyatakan sebagai inde. &entuk umum dari deklarasi tipe larik adalah : var pengenal = array[tipe_index]of tipe;
/eterangan : pengenal : nama +ariabel. tipe_index : jumlah larik. tipe : tipe data. %ara arameter tipe_index mene menent ntuk ukan an bany banyak akny nyaa komp kompon onen en larik larik tersebut.%arameter ini boleh berupa sembarang tipe ordinal kecuali longint dan subjangkauan longint. 0ontoh : Var larik1 = array[ 1..5] of char; larik2 = array[ 1..5,1..5] of string; larik3 = array[ 1..5,1..5,1..5] of integer; ari contoh diatas ditampilkan beberapa cara pendeklarasian larik )array*. ariabel larik1 adalah larik dengan satu dimensi, larik2 adalah larik dengan dua dimensi atau dimensi banyak, demikian juga dengan larik3 .
1
!atihan-latihan :
Uses 5rt: Var ni%ai : array[1..3] of integer; Begin ni%[1] := 16; ni%[2] := 262; ni%[3] := 727; $rite%n &ni%[1](; $rite%n &ni%[2](; $rite%n &ni%[3](; )n*. Var nama
: array[1..3] of string;
Begin nama[1] nama[2] nama[3] $rite%n $rite%n $rite%n )n*.
:= ‘BUDI’; := ‘IW!’; := ‘"U"#’; &‘!ama 1 : ’'nama[1](; &‘!ama 2 : ’'nama[2](; &‘!ama 3 : ’'nama[3](;
+onst a$a% = 1; ,-ir = ; Var nim : array[a$a%..a,-ir] array[a$a%..a,-ir] of string; nama : array[a$a%..a,-ir] array[a$a%..a,-ir] of string; n : integer; Begin Write%n &‘Isi !I/ *an !ama *engan rray’(; 0or n := 1 to *o Begin Write &‘!I/ ’'n'’ : ‘(; rea*%n&nim[n](; rea*%n&nim[n](; Write &‘!ama ’'n'’ : ‘(; rea*%n&nama[n](; rea*%n&nama[n](; Write%n; )n*; Write%n; Write%n &‘asi% *ari in4tan a*a%a- :’(; 0or n := 1 to *o Begin Write%n &‘!I/ ’'n'’ : ‘'nim[n](; Write%n &‘!ama ’'n'’ : ‘'nama[n](; Write%n; )n*; )n*.
2
!atihan-latihan :
Uses 5rt: Var ni%ai : array[1..3] of integer; Begin ni%[1] := 16; ni%[2] := 262; ni%[3] := 727; $rite%n &ni%[1](; $rite%n &ni%[2](; $rite%n &ni%[3](; )n*. Var nama
: array[1..3] of string;
Begin nama[1] nama[2] nama[3] $rite%n $rite%n $rite%n )n*.
:= ‘BUDI’; := ‘IW!’; := ‘"U"#’; &‘!ama 1 : ’'nama[1](; &‘!ama 2 : ’'nama[2](; &‘!ama 3 : ’'nama[3](;
+onst a$a% = 1; ,-ir = ; Var nim : array[a$a%..a,-ir] array[a$a%..a,-ir] of string; nama : array[a$a%..a,-ir] array[a$a%..a,-ir] of string; n : integer; Begin Write%n &‘Isi !I/ *an !ama *engan rray’(; 0or n := 1 to *o Begin Write &‘!I/ ’'n'’ : ‘(; rea*%n&nim[n](; rea*%n&nim[n](; Write &‘!ama ’'n'’ : ‘(; rea*%n&nama[n](; rea*%n&nama[n](; Write%n; )n*; Write%n; Write%n &‘asi% *ari in4tan a*a%a- :’(; 0or n := 1 to *o Begin Write%n &‘!I/ ’'n'’ : ‘'nim[n](; Write%n &‘!ama ’'n'’ : ‘'nama[n](; Write%n; )n*; )n*.
2
VarDim1 ni%ai : array[1..] of integer; Var : array[1..3] of integer; 8m : ' array[1..3'1..3] rata : rea%; .3] of integer; Dim2 array[1..3'1. Begin Dim3 : array[1..3'1..3'1..3] array[1..3'1..3'1..3] of integer; Write%n ratarata 94a- ni%ai’(; i'', :&‘/eng-it4ng integer; Write &‘ni%ai1 = ‘(; rea*%n&ni%ai[1](; rea*%n&ni%ai[1](; Begin Write &‘ni%ai2 = ‘(; rea*%n&ni%ai[2](; rea*%n&ni%ai[2](; @in4t e%emen arrayA Write &‘ni%ai3 = ‘(; rea*%n&ni%ai[3](; rea*%n&ni%ai[3](; 0or i := 1 to 3 *o Write &‘ni%ai rea*%n&ni%ai[](; rea*%n&ni%ai[](; Dim1[i] := 2 =i‘(; C 1; Write &‘ni%ai = ‘(; rea*%n&ni%ai[](; rea*%n&ni%ai[](; 8m i :=:= ni%ai[1]ni%ai[2]ni%ai[3] ni%ai[1]ni%a ni%ai[]ni%ai[]; []; 0or 1 to 3 *o i[2]ni%ai[3]ni%ai[]ni%ai := m > ;
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. &entuk umum dari deklarasi setadalah : pengenal = set of tipe; pengenal Type
/eterangan : pengenal
tipe
: nama +ariabel atau nama type. : type data buatan sendiri maupun ba3aan pascal.
%endeklarasian set tidak hanya dapat dilakukan pada Type saja tapi terkadang juga di deklarasikan pada bagian var )deklarasi )deklarasi +ariabel*. 0ontoh : "ye -ari = &‘senin’'’se%asa’'’ra94’'’, &‘senin’'’se%asa’'’ra94’'’,amis’'’4mat’' amis’'’4mat’' ’sa9t4’'’mingg4’(; ariD%m/gg = set of -ari; Bi%angan = set of 1..16; ara,ter = set of 5-ar; Setiap tipe yang dideklarasikan di bagian type, untuk dapat digunakan di dalam program harus di deklarasikan di bagian +ariabel ) var* yang mengarah ke nama tipe yang telah dibentuk. 0ontoh : Var nama-ari : ariD%m/gg; ng,a : Bi%angan; 4r4f : ara,ter;
"ye "vo,a% = set of 5-ar; Var Vo,a% : "vo,a%; ar : 5-ar; Begin Vo,a% := [‘’'’I’'’U’'’)’'’E’]; [‘’'’I’'’U’'’)’'’E’]; Write &‘eti, se94a- ,ara,ter *an te,an )nter: ‘(;
4
tye -ari=&senin'se%asa'ra94',amis'4mat'sa9t4'mingg4(; nama-ari = set of -ari; var -arian'-ari,era'-ari%i94r : nama-ari; n-ari : array[-ari] of string; i : -ari; Begin n-ari[senin] := FseninF; n-ari[se%asa] := Fse%asaF; n-ari[ra94] := Fra94F; n-ari[,amis] := F,amisF; n-ari[4mat] := F4matF; n-ari[sa9t4] := Fsa9t4F; n-ari[mingg4] := Fmingg4F; -arian :=[senin'se%asa'ra94',amis'4mat'sa9t4'mingg4]; -ari,era := [senin'se%asa'ra94',amis]; -ari%i94r := -arian -ari,era; $rite%n &F!/
Soal :
1. &uatlah program menggunakan array untuk menginputkan data mahasis3a seperti: $ama,$I#, dan nilai matakuliah serta rata-rata dari nilai matakuliah yang dimasukkan. Contoh inputan : 5umlah #ahasis3a : 66 $ama : 6666666666 $I# : 66666666 $ilai #ata/uliah : %engenalan TI : 77 &asis ata
: 77
%. Internet
: 77
8
Contoh keluaran: %I& 66666666
%ama %engenalan TI &asis ata 6666666 77 77
66666666
6666666
77
77
%. Internet 77
Rata'rata 77,77
77
77,77
2. &uat %rogram menggunakan set untuk menghilangkan setiap huruf +okal pada suatu kalimat yang di inputkan. 0ontoh : #asukkan /alimat :Universitas Muhammadiyah Purwokerto
BAB II RE+,R- dan ITERASI A. RE+,R-
=ecord adalah kumpulan elemen-elemen dalam pascal dimana setiap elemen dapat memiliki tipe data yang saling berbeda. 0ara mengakses record mirip dengan cara mengakses array, perbedaannya adalah jika pada array untuk mengakses dengan cara menyebut nama array disertai dengan nomor indeks, maka pada record adalah dengan menyebut nama record disertai dengan nama field )elemen* yang akan diakses. &entuk umum pendeklarasian record : Type namarec 9 record ar1 : t!"e ar2 : t!"e arn : t!"e ;nd ar nama#$ar : namarec /eterangan : namare5 : nama record. var1'var2'varn : nama +ariable pada tye namaHvar : nama +ariable untuk tipe namare5. tie : tipe data. &entuk umum pemanggilan record :
>
&egin nama#$ar.+ar1 :9 . . . . nama#$ar.+ar2 :9 . . . . nama#$ar.+arn :9 . . . . ?ith nama#$ar do &egin +ar1 :9 . . . . +ar2 :9 . . . . +arn :9 . . . . ;nd ;nd.
0ara pertama
0ara kedua
Lat!han :
Uses $in5rt; "ye *ata = re5or* !o : integer; !ama : string; )n*; Var *atam-s : *ata; Begin Datam-s.no := 1; Datam-s.nama := ‘B4*i’; Write%n &‘!omor : ‘'*atam-s.no(; Write%n &‘!ama : ‘'*atam-s.nama(; )n*.
"ye *ata = re5or* !o : integer; !ama : string; )n*; Var *atam-s : *ata; Begin Wit- *atam-s *o Begin !o := 123; !ama := ‘B4*i Gagi’; Write%n &‘!omor : ‘'no(; Write%n &‘!ama : ‘'nama(; )n*; )n*.
@
type matkul 9 record id : integer namamk : string end data 9 record nim : string nama : string dtmk : matkul end +ar datamhs : arrayA1..2BC of data n,i : integer 53b : char begin n :9 B 53b :9 DED 3riteln )DInputkan data #ahasis3aD* 3riteln 3hile 53b 9 DED do begin n :9 n 1 3ith datamhsAnC do begin 3riteln )Data ke - D,n,D :D* 3rite )D$I# : D* readln)nim* 3rite )D$ama : D* readln)nama* 3rite )Dkode #/ : D* readln)dtmk.id* 3rite )D$ama #/ : D* readln)dtmk.namamk* 3rite )DTambah lagi AEG$C H : D* readln )53b* 3riteln end end clrscr 3riteln )D$I#D,D$ama #hsD:1B,D/ode #/D:1B,D$ama #/D:1B* for i :9 1 to n do begin 3ith datamhsAiC do 3riteln )nim,nama:1B,dtmk.id:1B,dtmk.namamk:1B* end end.
B. ITERASI
Iterasi merupakan proses pengulangan suatu statemen atau blok statemen sebanyak jumlah tertentu yang diberikan. alam pascal proses iterasi dapat dilakukan dengan memanfaatkan perintah for M do, repeat M until, 3hile M do. &entuk umum penulisan : For nama$ar :9 a to do =epeat . .. . until nama$arJ 3hile nama$arK9 do
/eterangan : namavar
a z
: nama +ariable. : nilai a3al perulangan. : nilai akhir tujuan perulangan.
Lat!han :
+ar n : integer k : string begin k :9 DD for n :9 1 to 1B do begin k :9 k DLD 3riteln )k* end end.
var n'i : integer; , : string; 9egin , := FF; i := ; $-i%e i = 1 *o 9egin for n := 1 to i *o $rite &,(; i := i 1; $rite%n; en*; rea*%n; en*.
7
var n : $or*; f4n5tion fa,toria%&n : $or*( : $or*; var i : integer; Ofa,toria% : $or*; 9egin Ofa,toria% := n; if n = 6 t-en fa,toria% := 1 e%se 9egin for i := n 1 *o$nto 1 *o Ofa,toria% := Ofa,toria% i; fa,toria% := Ofa,toria%; en*; en*; 9egin 5%rs5r; $rite &FBi%. int. ositif 4nt4, *i5ari fa,toria%nya : F(; rea*%n &n(; $rite%n; $rite%n &Ffa,toria% *ari F'n'F a*a%aF'fa,toria%&n((; en*. Soal :
1. &uatlah program untuk menginput data mahasis3a dengan menggunakan record. ata yang diinput adalah $im,$ama,$ilai ngka. Nntuk ketentuan $ilai !] N !
asi% E4t4t !i%ai ng,a
!i%ai 4r4f
"ety en*arto
2
+
J1237K?
8o,o Bernar*o
K
123J7K?
B4*i L4santi
76
B
!
!I/
!ama
o 1
7K?J123
2 3
1B
2. &uatlah program untuk mencari nilai dari pangkat n ) n* dengan menggunakan teknik iterasi. 0ontoh : !i%ai O : 2 !i%ai n : asi% O ang,at n a*a%a- : 32
BAB III REK0RSI
=ekursi adalah sebuah proses yang bisa memanggil diri sendiri. alam rekursi sebenarnya terkandung pengertian prosedur atau fungsi.%erbedaannya adalah bah3a rekursi bisa memanggil dirinya sendiri, tetapi prosedur atau fungsi harus dipanggil le3at pemanggil prosedur atau fungsi. alam prosedur atau fungsi, pemanggilan ke dirinya sendiri bisa berarti proses berulang yang tidak bisa diketahui kapan akan berakhir. alam pemakaian sehari-hari, rekursi merupakan teknik pemrograman yang berdayaguna untuk digunakan pada pekerjaan pemrograman dengan mengekspresikannya kedalam suku-suku dari program lain dengan menambahkan langkah-langkah sej enis. 0ontoh bentuk =ekursi : Function nama/unc )n : integer* : integer &egin $ama function If n 9 B then nama/unc :9 1 ;lse nama/unc :9 n L nama/unc)$ O 1* ;nd %emanggilan nama function di dalam tubuh sendiri. /arena function memanggil diri sendiri di dalam tubuh function mengakibatkan proses akan terus berulang sampai pernyataan yang ada didalam blok program itu sendiri terpenuhi.
11
var in4t : integer; f4n5tion 4mgena &n : integer( : integer; 9egin if n P 2 t-en 4mgena := 6 //pemberian nilai nol untuk n < 2 e%se if &n mo* 2( = 6 t-en 4mgena := n 4mgena&n1( //penjumlahan bil. genap e%se 4mgena := 6 4mgena&n1(; //penjumlahan bil. ganjil en*; 9egin 5%rs5r; $rite%n &FQrogram men4m%a- 9i%angan genaF(; $rite &FBatas ni%ai yang ingin *i-it4ng : F(; rea*%n &in4t(; $rite%n; $rite%n &F84m%a- Bi%angan Mena antara 6F'in4t' F = F'4mgena&in4t((; rea*%n; en*. var ,a%imat : string; ro5e*4re ,ara,ter&,a% : string(; var n : integer; 9egin n := %engt-&,a%(; $rite%n &,a%[n](; if n = 1 t-en 9egin ,ara,ter&5oy&,a%'1'n1((; en*; en*; 9egin 5%rs5r; $rite%n &FQem9a%i, a%imat Le5ara Verti,a%F(; $rite%n &F/as4,,an a%imat : F(; rea*%n &,a%imat(; ,ara,ter&,a%imat(; rea*%n; en*.
12
function funkalimat )n : integer* : string +ar kal : string begin kal :9 Dtest D if n 9 1 then funkalimat :9 kal else funkalimat :9 kal funkalimat)n - 1* end begin 3riteln )funkalimat)1B** readln end.
&lok program function
%rogram Ntama
Soal :
1. &uatlah program pengurut karakter secara +ertikal dengan menggunakan rekursi. 0ontoh : /as4,,an a%imat : Ini B4*i asi% : I n i
B 4 * i 2. &uatlah program perkalian faktorial dengan menggunakan rekursi. 6R = 1 =umus : //Untuk n > 0 nR = n O &n C 1(R 0ontoh %rogram : In4t,an 9atas ang,a er,a%ian : asi% er,a%ian fa,toria% = 126 Karena faktorial 5 : 5! 5 5 5 5 5 "#0 . &uatlah program penjumlah bilangan prima dimana batas angka yang ingin dijumlahkan diinputkan dari keyboard, dan menampilkan setiap angka bilangan prima yang akan dijumlah. 0ontoh : In4t,an 9atas 9i%angan rima : 26 asi% :
1
2 3 7 5umlah : @2
11
13
17
1?
BAB I STA+K (T0&P0KA%) 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 bah3a kita bisa menambah data, dan mengambil )menghapus* data le3at ujung yang sama, yang disebut sebagai ujung atas tumpukan )top of stack*. Nntuk menjelaskan pengertian diatas kita ambil contoh sebagai berikut. #isalnya kita mempunyai dua buah kotak yang kita tumpukkan, sehingga kotak kita letakkan diatas kotak yang lain. 5ika 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 $ kotak.
F ; 0 &
atas
Secara sederhana, sebuah tumpukan )stack* dapat digambarkan seperti diatas. ari gambar ini kita bisa mengatakan bah3a kotak & ada diatas kotak dan ada diba3ah kotak 0. ari gambar juga ditunjukkan bah3a dalam tumpukkan kita hanya bisa menambah atau mengambil sebuah kotak le3at satu ujung, yaitu ujung bagian atas. apat dilihat pula bah3a tumpukan merupakan kumpulan data yang sifatnya dinamis, artinya kita bisa menambah dan mengambil data darinya. %enggambaran tumpukan juga tidak harus seperti diatas. /ita bisa menggambarkan tumpukan dengan cara lain. & 0 & ; F
menambah
0
;
F
atas
menghapus
ari gambar diatas menunjukkan pengertian bah3a kotak yang terakhir dimasukkan bukan berarti memiliki posisi paling atas, tapi lebih ditekankan pada kotak yang paling dekat pada pintu masuk.
menambah
menghapus
14
engan memperhatikan ilustrasi-ilustrasi yang disebutkan maka kita bisa melihat bah3a tumpukan merupakan suatu senarai )list * yang mempunyai pengertian Pmasuk terakhir keluar pertamaQ ) $ast %n &irst 'ut ( $%&'*. ,"eras! Pada Tum"u*an da dua operasi dasar yang bisa kita lakukan pada sebuah tumpukan, yaitu operasi menambahkan data, atau mem push data, dan operasi menghapus data atau mem pop data. /arena ke dalam tumpukan kita bisa mempush data, maka tumpukan juga sering disebut dengan pushdown list , ,"eras! Push Sekarang kita akan menyusun sebuah prosedur untuk operasi push. engan menyajikan tumpukan seperti diatas, maka operasi push dengan mudah kita implementasikan sebagai berikut :
Qro5e*4re QUL &var " : "4m4,an; S : integer(; Begin ".tas := ".tas 1; ".Isi[".tas] ;= O; )n*; %rosedur diatas akan menyiapkan tempat untuk O yang akan dipush ke dalam tumpukan, yaitu dengan menambah nilai medan ".tas dengan 1 dan kemudian menyisipkan O ke dalam larik ".Isi, %rosedur diatas belum cukup sempurna untuk melakukan operasi push, karena bila data yang dimasukkan )".tas * sama dengan &atas maimum )/aO)%emen* dan kita akan mempush lagi maka akan terjadi overflow )melebihi batas maimum*. engan demikian perlu ada penambahan untuk mengatasi o+erflo3 tersebut, agar presedur selalu mengecek keadaan lokasi )".Isi* sebelum suatu data dipush, apakah /aO)%emen sudah tercapai atau belum, jika belum tercapai maka operasi push akan dilakukan, tetapi bila sudah mencapai /aO)%emen operasi push akan ditolak. &entuk perubahan prosedurnya adalah : Qrose*4re QUL &var " : "4m4,an; S : integer(; Begin If ".tas = /aO)%emen t-en Write%n &‘"U/QU! LUD Q)!U’( )%se Begin ".tas := ".tas 1; ".Isi[".tas] := S; )n*; )n*; ,"eras! Po" Rperasi %op 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 :
Qro5e*4re QEQ &var " : t4m4,an(;
18
Begin ".tas := ".tas C 1; )n*; %rosedur diatas juga masih sangat sempurna, dan belum dapat digunakan untuk operasi pop, namun sudah mencakup pengertian dari pop.
Inisialisasi tumpukan
%rosedure untuk memasukkan elemen ke dalam tumpukan
Fungsi untuk mengambil elemen dari tumpukan
/alimat yang akan dibalik
#empush kalimat ke dalam tumpukan #empop isi tumpukan sehingga terlihat kalimat yg terbalik
1>
program &alik/alimat uses 3incrt const ;lemen 9 288 type s288 9 stringA;lemenC tumpukan 9 record isi : s288 atas : B..;lemen end +ar t : tumpukan i : integer kalimat : s288
&atas maimum karakter.
$ama tumpukan pencacah /alimat yang dibalik
procedure a3alan )+ar t : tumpukan* begin t.atas :9 B end
Inisialisasi tumpukan
procedure push )+ar t : tumpukan : char* begin t.atas :9 t.atas 1 t.isiAt.atasC :9 end
%rosedure untuk memasukkan elemen ke dalam tumpukan
function pop )+ar t : tumpukan* : char begin pop :9 t.isiAt.atasC t.atas :9 t.atas - 1 end %rogram Ntama U &egin clrscr a3alan)t* 3riteln )DTumpukan untuk membalik kalimatD* 3riteln )DLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLD* 3riteln 3rite )V/etik kalimat : D* readln )kalimat* clrscr 3riteln )D/alimat asli : D,kalimat* 3riteln 3riteln )DSetelah operasi push dan popD* for i :9 1 to length)kalimat* do push)t, kalimatAiC* for i :9 1 to length)kalimat* do 3rite )pop)t** readln ;nd.
idu&
Fungsi untuk mengambil elemen dari tumpukan
/alimat yang akan dibalik
#empush kalimat ke dalam tumpukan
#empop isi tumpukan sehingga terlihat kalimat yg terbalik
/alimat yang di input
&udi
a%imat as%i : B4*i ! Lete%a- oerasi 4s- *an o &
i*4B /alimat hasil keluaran Eang terbalik
/arakter yang pertama di push )dumasukkan*.
1@ /arakter yang pertama di pop )dikelurkan*.
Ilustras! cara *era contoh "roram :
I D ! %enjelasan :
#isalkan kalimat yang diinput adalah !"di, maka urutan karakter yang di push )dimasukkan* adalah ! # " # d # i , maka tampak di gambar ilustrasi, ! berada pada paling ba3ah dan i berada paling atas. Sehingga pada saat ingin melakukan proses pop )mengeluarkan* maka urutan karakter yang dikeluarkan adalah karakter i # d # " # ! .
Soal :
1. &uatlah program dengan menggunakan metode Stack )Tumpukan* yang fungsinya bekerja untuk membalikkan kalimat perkata )bukan perkarakter*. 0ontoh /as4,,an se94a- ,a%imat : Ini $"mah !"di asi% Lta5, a*a%a- : !"di $"mah Ini
BAB P,I%TER
%emakaian array tidak selalu tepat untuk program-program terapan dikarenakan kebutuhan memory yang selalu bertambah selama program dijalankan. Nntuk megatasi hal ini diperlukan struktur data yang dapat mengalokasikan dan mendealokasi memori secara dinamis sesuai dengan kebutuhan program saat dijalankan.
1
$ama +ariabel yang digunakan untuk me3akili suatu nilai data, sebenarnya merupakan atau menunjukkan suatu lokasi tertentu didalam memori komputer dimana data tersebut disimpan. %ada saat sebuah program dikopolasi, kompiler akan memriksa bagian deklarasi+ariabeluntuk mengetahui nama-nama +ariabel apa saja yang digunakan, sekaligus mengalokasikan atau menyediakan tempat dalam pengingat untuk menyimpan nilai data tersebut. ari sini kita bisa melihat bah3a 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. %erubah-perubah yang demikian ini dinamakan dengan perubah statis ) stati) varia*el *. ari pengertian ini bisa kita perhatikan bah3a sesudah suatu lokasi pengingat ditentukan untuk suatu nama +ariabel, maka dalam program tersebut +ariabel yang dimaksud akan tetap menempati lokasi yang telah ditentukan dan tidak mungkin berubah.. engan demikian dapat dikatakan bah3a banyaknya data yang bisa diolah adalah terbatas. Sebagai contoh, misalnya kita mempunyai +ariabel yang kita deklarasikan sebagai berikut : Var ,o*e : array[1..166] of integer; ariabel kode diatas hanya mampu untuk menyimpan data sebanyak 1BB buah data. 5ika kita tetap akan menambah data pada +ariabel tersebut, eksekusi program akan terhenti karena deklarasinya kurang. Sebaliknya jika ternyata data yang disimpan sedikit jumlahnya, akan mengakibatkan pemborosan pemakaian memori yang tidak perlu. Nntuk megatasi hal ini maka dibuatlah suatu +ariabel dinamis yang dapat dialokasi dan didialokasikan sehingga jumlah penggunaan memori dapat sesuai kebutuhan saat program dijalankan. ariabel dinamik )dynami) varia*el * adalah +ariabel yang dialokasikan hanya pada saat program dijalankan. %ada saat dikompilasi, lokasi +ariabel ini belum ditentukan, kompiler hanya mencatat bah3a ada +ariabel yang akan diperlakukan secara dinamis. %ada +ariabel statis, isi memori pada lokasi tertentu adalah data sesungguhnya yang akan diolah. %ada +ariabel dinamis, nilai +ariabel adalah alamat lokasi yang menyimpan data sesungguhnya. Nntuk memperjelas pengertian tentang %ointer perhatikan ilustrasi berikut :
A
1BBB a.
B
3
8
1BBB
b.
%ada ilustrasi diatas terdapat 2 gambar a dan b. 'ambar a mengilustrasikan +ariabel % dengan cariabel statis. alam hal ini 1444 adalah nilai data yang sesungguhnya dan disimpan pada +ariabel % . Sedangkan pada gambar b mengilustrasikan +ariabel ! yang dinamis. $ilai +ariabel b dimisalkan adalah 3, nilai ini bukan data yang sesungguhnya, tetapi lokasi yang menyimpan data sesungguhnya berada. 5adi dalam hal ini nilai data yang sesungguhnya tersimpan berada pada lokasi 3 didalam memori. ari ilustrasi diatas bisa dilihat bah3a nilai +ariabel dinamis akan digunakan untuk menunjuk kelokasi lain yang berisi data sesungguhnya yang akan diproses. /arena alasan inilah +ariabel dinamis lebih dikenal dengan sebutan "o!nter yang artinya kira-kira menunjuk ke sesuatu. alam +ariabel dinamis nilai data yang ditunjuk oleh suatu pointer biasanya disebut sebagai s!m"ul5node .
17
&entuk umum deklarasi pointer :
"ye varia)el = Tsimp"l; = *ipeData; simp"l Tanda &)ceret* didepan nama simpul menunjukkan bah3a +ariabel tersebut adalah tipe data pointer. "ieData dapat berupa sembarang tipe data, tetapi umumnya dalam program terapan "ieData ini biasanya berupa record. 0ontoh penulisan pointer dengan bentuk record "ye data'hs = TData; Data = re5or* !ama : string[2]; !omor : string[16]; %amat : string[2]; )n*; Var m-s1'm-s2 : data'hs;
ariabel m-s1 dan m-s2 masing-masing bertipe pointer. /etika program dikompilasi, kedua +ariabel ini akan menempati lokasi memori tertentu, tetapi belum menunjuk kesuatu simpul )lokasi memori* yang berisi data. %ointer yang belum menunjuk kesuatu lokasi akan bernilai nil. Nntuk mengalokasikan simpul didalam memori digunakan statemen ne(, yang bentuk umumnya sebagai berikut : !e$ &varia)el(; Nntuk mendealokasikan simpul yang sudah tidak terpakai, maka digunakan statemen dispose. Dsiose &varia)el(; Nntuk mengisi data kedalam pointer )yang memiliki tipe data record* caranya sama dengan pemakaian record, hanya saja setelah nama +ariabel lebih dulu diikuti dengan tanda ceret. 0ontoh : /-s1T.nama := ‘%4ng’; /-s2.a%amat := ‘8%n. BimaLa,ti’;
%emakaian alokasi memori dinamik sangat banyak digunakan oleh program. %rogram-program grafik akan mengalokasikan sejumlah memori untuk menyimpan gambar yang terdapat pada layar. %rogram yang menggunakan "o"u" dan "ulldonmenu juga memanfaatkan alokasi memori dinamik. &agian layar yang ditutupi oleh menu disimpan dibagian memori yang telah dialokasikan. Setelah menu tidak digunakan, bagian yang ditutupi dikembalikan lagi. /arena tidak digunakan, bagian bagian memori yang telah dialokasikan tersebut dikembalikan ke sistem untuk menghemat pemakaian memori. tye n = )dealokasi* Tinteger;
var , : n;
Lat!hani : : integer;
9egin i := 26; 5%rs5r; $rite%n &,T(; ne$ &,(; ,T := i; $rite%n &,T(; rea*%n; en*.
2B
tye oint = T*ata; *ata = re5or* nama : string; a%amat : string; en*; var *t1'*t2 : oint; 9egin 5%rs5r; ne$ &*t1(; ne$ &*t2(; *t1T.nama := F%4ng LiDra5oF; *t1T.a%amat := F#ogya,artaF; $rite%n &FData yang ter*aat *i *t1TF(; $rite%n &*t1T.nama(; $rite%n &*t1T.a%amat(; $rite%n; *t2T := *t1T; $rite%n &FData yang ter*aat *i *t2TF(; $rite%n &*t2T.nama(; $rite%n &*t2T.a%amat(; $rite%n; *isose &*t1(; $rite%n &F*t1 sete%a- *i *isoseF(; $rite%n &*t1T.nama(; $rite%n &*t1T.a%amat(; $rite%n; *isose &*t2(; $rite%n &F*t2 sete%a- *i *isoseF(; $rite%n &*t2T.nama(; $rite%n &*t2T.a%amat(; rea*%n; en*. Soal :
1.
&uatlah program menggunakan pointer dan record untuk menginputkan dan menampilkan data karya3an, seperti $I%,$ama,'aji. 0ontoh : 84m%a- Qega$ai : 2 Data ,e C 1 : !IQ : 6261?
21
!ama Mai
:
Data ,e C 2 : !IQ : 623123 !ama :
Ma i 26 1
BAB I LI%KE- LIST ( SE%ARAI BERA%TAI ) A. S!nle L!n*ed .
Salah satu struktur data dinamis yang paling sederhana adalah Senarai &erantai )!inked !ist*, atau senarai satu arah. Senarai &erantai sendiri punya makna sebagai kumpulan komponen yang disusun secara berurutan dengan menggunakan bantuan pointer. /omponen-komponen yang tersusun tersebut akan disebut sebagai simpul, sehingga pada senarai akan terdapat banyak simpul, dan tiap simpulnya dapat dibagi menjadi dua bagian. &agian pertama dari simpul disebut dengan medan !n6ormas!, yang berisi informasiGdata yang dapat berupa re)ord yanag akan diolah. Sedangkan bagian yang kedua disebut sebagai medan alamat simpul berikutnya. "enam7un )link field *, yang berisi s!m"ul
simpulW.medaninformasi
simpulW.medanpenyambung
&edan !n6orma s!
&edan "enam7un
Nntuk memudahkan setiap pembahasan selanjutnya, maka akan kita tetapkan untuk sebelah kiri simpul disebut sebagai medan informasi dan sebelah kanan simpul disebut sebagai medan penyambung. %erlu diketahui bah3a medan penyambung sebenarnya adalah suatu pointer yang akan menunjuk ke simpul berikutnya, sehingga nilai dari medan ini dapat berupa alamat lokasi simpul berikutnya ataupun dapat bernilai nil . %erlu diingat bah3a setiap simpul terakhir dari linked list medan penyambung harus bernilai nil .
22
0ontoh dari senarai berantai dengan 8 simpul : %ointer yg menunjuk ke a3al senarai
aal
a*h!r
%ointer yg menunjuk ke akhir senarai
&
0
#edan informasi
#edan penyambung yg menunjuk ke simpul berikutnya
;
#edan penyambung yg bernilai n!l
Tampak dari gambar bah3a medan penyambung menunjuk ke simpul berikutnya, dan medan penyambung pada simpul terakhir akan bernilai n!l karena medan penyambung tersebut tidak menunjuk kemanapun. %ada senarai berantai juga terdapat 2 buah pointer aal dan a*h!r, 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. &entuk umum pendeklarasian s!nle l!n*ed l!st : Type nml!st 9 Wnmrecord nmrecord 9 record nm$ar1 : t!"e nm$arn : nml!st end ar node : l!st #edan penghubung yg bertipe data pointe.
%enjelasan : nmlis
: sebuah pointer yang menunjuk ke sebuah record.
nmrecord : nama record yang berisi +ariabel penyimpan data dan nmvar1 nmvarn
berisi medan penyambung. : +ariabel yang akan berfungsi sebagai penyimpan data : +ariabel yang berfungsi sebeagai media penyambung.
0ontoh penulisan Single !inked !ist : "ye sim4% = T*ata; *ata = re5or* info : 5-ar; ,ait : sim4%; en*; var a$a%'a,-ir'9ar4 : sim4%; engan contoh pendeklarasian sederhana tersebut, maka operasi-operasi pengolahan data dapat dilakukan seperti pada contoh program berikut yang berfungsi untuk menambah dan menampilkan data menggunakan linked list. 2
"roram S!nleL!n*edL!st8 uses !ncrt8 t"e s!m"ul 9 data8 data 9 record nama : str!n;23<8 *a!t : s!m"ul8 end8
eklarasi simpul
$ar aal=a*h!r=7antu : s!m"ul8 a : char8 7e!n clrscr8 aal :9 n!l8 a :9 >>8 h!le a !n ;>>=>Y>< do 7e!n ne (7antu)8 r!te (>&asu**an %ama : >)8
%embuatan nilai a3al9 nil, pada saat program pertama dijalankan
readln (7antu.nama)8 r!te (>Tam7ah data la! ;Y5%<: ?>)8
readln (a)8 r!teln8 !6 aal 9 n!l then 7e!n
%roses 1: %roses yg dilakukan saat penginputan data yang pertama
7antu.*a!t :9 n!l8 aal :9 7antu8 a*h!r :9 7antu8 end else 7e!n a*h!r.*a!t :9 7antu8 7antu.*a!t :9 n!l8 a*h!r :9 7antu8 end8 end8 7antu :9 aal8 r!teln (7antu.nama)8 h!le 7antu.*a!t @ n!l do 7e!n 7antu :9 7antu.*a!t8 r!teln (7antu.nama)8 end8 readln8 end.
%roses 2 : %roses penambahan data selanjutnya.
%roses : %roses untuk menampilkan data
%rogram diatas pertama kali setelah pendeklarasian simpul adalah melakukan pemberian nilai nil terhadap +ariabel a$a%, karena pada saat program pertama dijalankan data belum ada sehingga +ariabel a$a% belum menunjuk kesuatu tempat. Tampak pada program terdapat proses, demikian ilustrasi ke proses tersebut : Proses 1 : %roses untuk memberikan nilai pada +ariabel a$a% dan a,-ir saat pertama penginputan data. bantu
a.
bantu
b.
a3al
akhir
c.
24
Tampak bah3a medan penyambung dari bantu ) 9ant4T.,ait* dibuat nilainya n!l karena data masih satu sehingga berperan sebagai a3al dan akhir linked list. Proses 2 : %roses untuk memberikan nilai pada a,-ir untuk menunjuk ke9ant4 yang baru saja diinputkan. a3al
akhir
bantu
a3al
a.
akhir
bantu
b. a3al
akhir $iliai n!l
c. %ada +am*ar a simpul )ant" baru dibentuk. ,am*ar * menjelaskan akhir akan menunjuk ke )ant" yang baru. ,am*ar ) menjelaskan peberian nilai n!l kepada )ant"&.kait, karena )ant" tersebut berada pada posisi terakhir. Tampak pada gambar bah3a yang berpindah arah hanya akhir dan bukan a3al, hal ini menandakan bah3a penambahan dilakukan di belakang linked list. %erlu diingat bah3a dalam linked list terdapat peraturan-peraturan sebagai berikut : 1. a(al akan selalu menunjuk ke a3al 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 "enam7un harus selalu bernilai n!l. Proses : %ada proses ini bantu akan membaca simpul dan menampilkan hasilnya dari a3al sampai akhir linked list. ,"eras! "ada Senara! Beranta! (S!nle L!n*ed L!st) 1. &enam7ah s!m"ul d! 7ela*an. Nntuk contoh dan ilustrasi menambah dibelakang sudah dijelaskan pada contoh program % roses 2. 2. &enam7ah s!m"ul d! de"an. bantu : a3al akhir Ilustrasi
Simpul baru
a.
bantu
a3al
bantuW.kait :9 a3al
akhir
akhir
7.
a3al a3al :9 bantu
28 c
&entuk penulisan dalam bentuk program : ne$&9ant4(; 9ant4T.nama := ‘%4ng’; 9ant4T.,ait := a$a%; a$a% := 9ant4; . &enam7ah s!m"ul d! tenah. Ilustrasi : a3al
akhir
a.
bantu
a3al
Simpul baru
bantu2
akhir
7.
bantu bantuW.kait:9 bantu2W.kait tbanbantu2W.berikut
a3al
bantu
c.
bantu2
a3al
akhir
&entuk penulisan dalam bentuk program : ne$&9ant4(; 9ant4T.nama := ‘%4ng’; bantu :9 a3al a. 9ant4T.,ait := 9ant42T.,ait; 9ant42T.,ait := 9ant4; bantu a3al C.
akhir
bantu2W.kait :9 bantu
akhir
akhir
&enha"us s!m"ul d! aal. Ilustrasi :
a3al :9 bantuW.kait
bantu
7.
a3al
2> dispose)bantu*
c.
&entuk penulisan dalam bentuk program : 9ant4 := a$a%; a$a% := 9ant4T.,ait; *isose&9ant4(; 3.
&enha"us s!m"ul d! tenah. Ilustrasi :
a3al
bantu2
bantu2W.kait :9 bantu
a3al
bantu
akhir
akhir
a.
bantu2
bantu
7. bantu2W.kait :9 bantuW.kait
a3al
bantu2
dispose)bantu*
akhir
c.
&entuk penulisan dalam bentuk program : W-i%e &9ant4T.,aitPni%( or &9ant4T.namaP‘B4*i’( *o 9ant4 := 9ant4T.,ait; If &9ant4 P ni%( t-en
2@
Begin 9ant42T.,ait := 9ant4; 9ant42T.,ait := 9ant4T.,ait; *isose&9ant4(; )n*; bantu :9 akhir D.
&enha"us s!m"ul d! a*h!r. Ilustrasi :
a3al
akhir
bantu
a.
a3al
akhirW.kait :9 bantu
akhir
bantu
7.
a3al
akhir
dispose)bantu* c.
akhirW.kait :9 nil &entuk penulisan dalam bentuk program : 9ant4 := a,-ir; a,-irT.,ait := 9ant4; *isose&9ant4(; a,-irT.,ait := ni%;
B. -ou7le L!n*ed L!st= ouble !inked !ist menggunakan tekhnik yang sama dengan Single !inked !ist. %erbedaan utamanya adalah simpul pada ouble !inked !ist dapat menunjuk kedapan atau kebelakang.
simpul
simpulW.belakang
simpulW.depan
2
0ontoh pendeklarasian -ou7le L!n*ed L!st : "ye simp"l = Tdata; data = re5or* nama : string;
depan,)elakang + simp"l; )n*; Var a$a%'a,-ir'9ar4 : sim4%; Tampak dari contoh pendeklarasian tersebut pada bagian record terdapat dua buah +ariabel yang bertipe pointer ) simp"l* yaitu depan dan )elakang.
akhir
nil
&
baru
0
nil
a.
a3al
akhir
nil
&
0
baru akhirW.depan:9baru baruW.belakang:9akhir
7.
akhir :9 baru a3al nil
akhir &
0
&entuk penulisan dalam bentuk program : a,-irT.*ean := 9ar4; c. 9ar4T.9e%a,ang := a,-ir; 9ar4T.*ean := ni%; a,-ir := 9ar4; 2.
baru nil baruW.belakang :9 nil
&em7aca s!m"ul5data /arena memiliki pointer yang dapat menunjuk ke depan dan ke belakang, operasi pembacaan data dilakukan dari kedua arah, yaitu dari depan dan belakang. &em7aca dar! 7ela*an :
27
bantu
a3al nil
akhir &
0
bantu
nil
a.
%enulisan dalam bentuk program : 9ant4 := a$a%; W-i%e 9ant4 P ni% *o Begin Write%n &‘nama : ‘'9ant4T.nama(; 9ant4 := 9ant4T.*ean; )n*; Fungsi dari penulisan program ini adalah untuk men-alankan pointer )ant" dari a3al hingga akhir list serta menampilkan isi dari simpul yang dile3ati. &em7aca dar! de"an :
bantu
a3al
akhir
program doulelinkedlist & uses 3incrt nil type simpul 9 Wdata data 9 record nama : string a. depan,belakang : simpul end %enulisan dalam bentuk program : +ar a3al,akhir,bantu : simpul 9ant4 := a,-ir; pil : char W-i%e 9ant4 P ni% *o procedure buatlist )+ar bantu : simpul*
begin
Begin
0
bantu
nil
eklarasi simpul double linked list.
%rocedure untuk menambah data
if a3al 9 nil then Write%n &‘nama : ‘'9ant4T.nama(; begin %enambahan dataGsimpul yang 9ant4 := 9ant4T.9e%a,ang; a3al :9 bantu pertama )n*; a3alW.depan :9 nil a3alW.belakang :9 nil di atas adalah untuk men-alankan pointer )ant" dari akhir%erintah-perintah :9 a3al
end akhir hingga ke a3al senarai, serta menampilkan isi dari +ariabel nama else pada setiap simpul yang dile3atinya. begin %enambahan dataGsimpul untuk keakhirW.depan :9 bantu 0ontoh %rogram : sekian kali. bantuW.depan :9 nil bantuW.belakang :9 akhir
akhir :9 bantu end end procedure cetaka3al
%rocedure untuk mencetak data dari a3al list.
+ar bantu : simpul begin clrscr 3riteln )D0etak ata ari 3alD* bantu :9 a3al 3hile bantu KJ nil do begin 3riteln )D$ama : D,bantuW.nama* bantu :9 bantuW.depan end readln
end
%erintah untuk mencetak data dari a3al.
B
procedure cetakakhir +ar bantu : simpul begin clrscr 3riteln )D0etak ata ari khirD* bantu :9 akhir 3hile bantu KJ nil do begin 3riteln )D$ama : D,bantuW.nama* bantu :9 bantuW.belakang end readln end procedure hapuslist +ar bantu : simpul begin
%rocedure untuk mencetak data dari akhir list
%erintah untuk mencetak data dari akhir.
%rocedure untuk menghapus seluruh data dari a3al.
clrscr 3hile a3al KJ nil do %erintah untuk menghapus data dari a3al begin list. bantu :9 a3al a3al :9 a3alW.depan dispose)bantu* end 3riteln )Data telah dihapusD* readln end 3al program utama &egin a3al :9 nil repeat clrscr 3riteln )D%rogram ouble !inked !istD* 3riteln )DLLLLLLLLLLLLLLLLLLLLLLLLLLD* 3riteln )D1. Tambah ataD* 3riteln )D2. 0etak ata ari 3alD* 3riteln )D. 0etak ata ari khirD* 3riteln )D4.
Soal : 1. &uatlah program menggunakan methode Single !inked !ist untuk menginputkan nama= seperti berikut berikut :
/en4 : 1. "am9a- Data 2. a4s Data Dean 3. a4s Data Be%a,ang . +eta, Data Qi%- /en4 [1>2>3>] : Menu " : In4t,an !ama : Alung
2
Kem*ali ke menu. Menu # : a4s Data Kem*ali ke menu. Menu : a4s Data Kem*ali ke menu. Menu : !ama C 1 : !ama C 2 : !ama C 3 : Kem*ali ke menu.
Dari Dean Gist
Dari Be%a,ang Gist
%4ng Dragon !aga
2. &uatlah program menggunakan ouble !inked !ist untuk menginputkan data karya3an yang berupa : nama= n!"= a! . ata yang sudah diinput dari keyboard ditambahkan ke a3al )*uka akhir * !inked !ist. %resentasikan dengan menggunakan menu-menu, seperti : 1. Tambah ata i 3al !ist, 2. 0etak ata, . /eluar.
BAB II A%TRIA% (F0E0E) ntrian adalah suatu kumpulan data yang mana penambahan elemen hanya bisa dilakukan pada suatu ujung )belakangGrear * , dan penghapusan dilakukan le3at ujung lainnya )depanG 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 pintuGujung yang lain. Seperti pada Stac*5Tum"u*an yang mengenal istilah masuk terakhir keluar pertama )!IFR O $ast %n &irst 'ut *. &erbeda dengan ntrian yang mengenal istilah masuk pertama keluar pertama )FIFR O &isrt %n &irst 'ut * Ilustrasi ntrian : de"an
*eluar
masu*
*ean'9e%a,ang : integer; %ada deklarasi diatas, elemen antrian dinyatakan dalam tipe integer. ariabel *ean menunjukkan posisi elemen pertama dalam larik, +ariabel 9e%a,ang menunjukkan posisi elemen terakhir dalam larik. alam suatu permasalahan saat antrian sudah penuh, sementara kita masih ingin terus menambahan data lagi, maka akan terjadi offerflow )kelbihan kapasitas*. engan mengabaikan akan terjadinya offerflow, maka penambahan data pada antrian dalam bentuk programnnya adalah sebagai berikut : Be%a,ang := 9e%a,ang 1; ntrian[9e%a,ang] := O; { 1 : varia*el untuk men+isi antrian } %lustrasi : de"an 9 1
1
A.
2
4
8
>
7ela*an 9 4
%rogram pada saat pertama kali dijalankan antrian masih dalam keadaan kosong, sehingga depan bernilai 1 dan )elakang bernilai . de"an 9 1
1
B.
2
4
8
>
7ela*an 9 C
%ada saat dilakukan penambahan data maka )elakang akan dijumlahkan dengan 1, kemudian antrian pada posisi )elakang )antrian-)elakang* akan disi dengan elemen x. #asih dengan mengabaikan akan terjadinya offerflow, untuk pengurangan G penghapusan pada antrian adalah sebagai berikut : S := antrian[*ean]; Dean := *ean 1; de"an 9
1
2
4
8
>
7ela*an 9 D
4
%ada saat dilakukan pengurangan data maka x akan diisi nilainya dengan kedudukan depan saat itu, kemudian depan dimajukan sebanyak 1 ) depan / 1*. engan keadaan seperti diatas tentu saja dapat terjadi suatu keadaan dimana penambahan elemen baru tidak dapat dilakukan, misalnya karena nilai 9e%a,ang sudah mencapai nilai maksimal akan tetapi antrian yang sesungguhnya masih banyak yang kosong karena nilai *ean lebih besar dari 1, seperti pada gambar di atas. /emungkinan 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. de"an
1
2
7ela*an
4
8
de"an
>
1
7ela*an
2
4
8
>
kan 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. 0ara yang paling baik untuk memecahkan masalah ini adalah dengan menyimpan elemen larik seolah-olah larik berbentuk lingkaran.
*ean
0
D
9e%a,ang
;lemen baru selalu dapat ditambahkan selama masih ada tempat kosong )terdapat tempat kosong antara 9e%a,ang dan *ean*. %ada kenyataan yang sebenarnya larik tidak benar-benar memutar melainkan masih seperti biasa yang memiliki ujung, namun perlakuannya di dalam penulisan program dibuat seakan-akan melingkarGmemutar. &erikut adalah ilustrasi serta penulisan program untuk operasi pada antrian yang dibuat seakan-akan memutar : %ada keadaan a3al antrian disi dengan dua elemen : belakang9> belakang :9 >
depan94
depan :9 4
2al *erikut adalah proses penam*ahan elemen3 karena masih ada tempat yan+ koson+ 4perlu diin+at antrian diperlakukan se*a+ai lin+karan.
if 9e%a,ang = maOima% t-en 9e%a,ang := 1 e%se 9e%a,ang := 9e%a,ang 1;
8
*ean=
9e%a,ang=1
*ean=
9e%a,ang=1
2al *erikut men-elaskan proses pen+hapusan data3 selama masih data *elum koson+ :
S := antrian[*ean]; If *ean = maOima% t-en Dean := 1; )%se Dean := *ean 1;
+ontoh "roram : rogram antrianH; 4ses $in5rt; 5onst maOim4m = 16; tye antri = array[1..maOim4m] of 5-ar; f4n5tion a4s&var antrian : antri( : 5-ar; Pem*uatan array untuk var antrian : antri; antrian 9egin if*ean'9e%a,ang'i%i*ean = maOim4m t-en: integer; e%emen:= : 1 5-ar; *ean f4n5tion osong& : antri( : 9oo%ean; e%se &un)tion untuk men)ek isi antrian 9egin 9egin 6ika *ean = 9e%a,ang 3 *erarti osong *ean:= :=&*ean *ean = 9e%a,ang(; 1; antrian sedan+ koson+ en*;a4s := antrian[*ean]; ro5e*4re tam9a-&var antrian : antri; O : 5-ar(; en*; 9egin en*; 6ika 9e%a,ang *erada pada posisi antrian if 9e%a,ang = maOim4m t-en Begin teratas3 maka *elakan+ dipindah ke 1 9e%a,ang := 1 5%rs5r; e%se *ean := 6; 6ika tidak *erada diatas maka 9e%a,ang 9e%a,ang :=:= 6;9e%a,ang 1; 9e%a,ang dinaikkan 1 not&osong&antrian(( t-en if reeat 6ika antrian tidak koson+ maka3 antrian 9egin 5%rs5r; ditam*ah den+an nilai x pada posisi antrian[9e%a,ang] := O; $rite%n &FDaftar /en4 Qi%i-anF(; 9e%a,ang $rite &O(; $rite%n &FF(; en* $rite%n &F1. /enam9a- )%emenF(; e%se $rite%n &F2. /eng-a4s )%emenF(; 9egin $rite%n &F3. Le%esaiF(; &Fntrian L4*aQen4-F(; $rite &FQi%iLa%aLat4 : F(; reeat &i%i-(; rea*%n @ A 5ase i%iof 4nti% 1 : ,eyresse*; 9egin 9e%a,ang$rite%n := 9e%a,ang 1; )%emenF(; &F/enam9a Pen+em*alian posisi *elakan+ ke tempat if 9e%a,ang = 6 t-en $rite%n &FF(; &un)tion untuk dan se*elumnya sudah penuh 9e%a,ang := maOim4m; $rite &FIsi,an )%emennya : F(;saat antrian men+hapus elemen tidak dapat ditam*ah la+i. en*; rea*%n &e%emen(; en*; tam9a- &antrian'e%emen(; Untuk memindahkan depan ke 1 saat depan en*; *erada di posisi maxim"m . 2 : 9egin if not&osong&antrian(( t-en e%emen := -a4s&antrian( Memindahkan depan se*anyak " elemen3 e%se dan men+hapus elemen. 9egin $rite%n &Fntrian osongF(; e%emen := rea*,ey; 7wal pro+ram utama en*; Penempatan posisi depan dan )elakang di posisi saat awal en*; pro+ram dimulai. > en*; 4nti% i%i- = 3 )n*.
Peman++ilan pro)edure tam*ah saat menam*ah elemen Pen+e)ekan isi antrian saat akan men+hapus elemen. 6ika antrian tidak koson+ maka data akan dihapus3 se*aliknya -ika antrian koson+ akan ada pesan 87ntrian Koson+9.
%rogram 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. 5ika ada pesan : Pntrian /osongQ, berarti program anda sudah benar.
2.
%enambahan di belakang )masuk ke dalam antrian*. *e"ala e*or 7aru %enambahan antrian dengan data baru
*e"ala
e*or
7aru
9ar4T.,ait := ,ea%a
*e"ala
e*or
7aru
e,orT.,ait := 9ar4
*e"ala
e*or
e,or := 9ar4
. 7antu
%enghapusan di depan )/eluar dari antrian*. *e"ala
e*or
bantu :9 kepala
)ant"
kepala
ekor
,ea%a := 9ant4T.,ait 7antu
*e"ala
e*or
ekorW.kait :9 kepala
kepala
ekor
*isose&9ant4( Soal :
1. !engkapilah contoh program antrian dengan menggunakan array yang sebelumnya dengan fasilitas untuk mencetakGmenampilkan data yang ada di antrian, sehingga data yang masih ada diantrian dapat dilihat di layar monitor. 2. &uatlah program seperti pada contoh program yang sebelumnya, namun dikerjakan menggunakan methode antrian dengan pointer.
BAB III S,RT
%engurutan data )sorting* secara umum dapat didefinisikan sebagai suatu proses untuk menyusun kembali himpunan objek menggunakan aturan-aturan tertentu. &erdasarkan cara pengurutan dapat dibedakan menjadi dua bagian, yang pertama adalah pengurutan secara urut naik )as)endin+ *, yaitu data diurutkan mulai dari yang terkecil hingga yang terbesar, yang kedua adalah pengurutan secara urut turun )des)endin+ *, yaitu pengurutan dari data yang besar hingga ke data yang paling kecil. %engurutan merupakan suatu hal yang penting sekali dalam ilmu komputer, praktik-praktik yang sering menggunakan pengurutan biasanya sering terjadi dalam operasi basis data, dimana pengurutan data sangat dibutuhkan untuk memudahkan dalam pencarian data yang diinginkan dari sekian banyak data yang tersimpan. Nntuk melakukan proses pengurutan data pada saat ini telah banyak dikembangkan methode-methode untuk lebih mengefisienkan pengurutan data, diantara methode-methode itu adalah dengan cara : #ethode %enyisipan !angsung, %enyisipan &iner, #ethode Seleksi, #ethode 'elembung, #ethode ShellShort, #ethode "uickShort, dan masih ada beberapa methode lagi. ari banyaknya methode yang dapat melakukan pengurutan ini, maka disinilah kita dituntut untuk dapat memilih methode yang sesuai dengan apa yang sedang kita kerjakan dengan memikirkan efisiensinya.
7
yang akan diurut, dan dari segi lama 3aktu yang dibutuhkan untuk mengurutkan data. /arena banyaknya methode yang dapat dilakukan untuk mengurutkan data, maka untuk pembahasan ini kita hanya akan membahas pengurutan data dengan #ethode 'elembung ) u*le ;ort *. $amun diharapkan setiap mahasis3a juga mempelajari methode-methode lain. %ada pembahasan #ethode 'elembung, kita akan membahasnya pada pengurutan data yang tersimpan pada senarai berantai ) sin+le linked list *. &erikut langkah-langkahnya, dengan data dianggap sudah diinputkan : !angkah 1 : aal A
B
!angkah pertama adalah dengan memberikan nilai pada pointer % untuk menunjuk pada data a3al, dan pointer ! menunjuk pada data sesudahnya. %ada saat posisi seperti gambar, nilai pada pointer ! akan dibandingkan P% dengan nilai pada pointer % , jika nilai pada ! , maka nilainya akan ditukar )untuk pengurutan ascending*. !angkah 2 : aal
A
B
B
!angkah kedua adalah dengan menjalankan pointer ! sampai ke ujung dari senarai, dengan catatan setiap kali mele3ati sebuah simpul, nilainya akan selalu dibandingkan dengan nilai yang ada pada pointer % , jika nilai ! , maka nilainya akan ditukar. % !angkah : aal
A
B
!angkah ketiga adalah, setelah langkah kedua diatas selesai dilakukan, maka pointer % maju satu simpul, dan pointer ! mengambil posisi di depan pointer % , kemudian membandingkan nilai yang ada di pointer ! ke pointer % . !angkah 4 : aal
A
B
B
4B
!angkah keempat adalah sama seperti langkah kedua dengan menjalankan pointer ! sampai ke simpul terakhir sambil membandingkan nilainya dengan yang ada dipointer % . emikian seterusnya sampai pointer % sampai pada ujung senarai berantai atau simpul terakhir. ari langkah-langkah tersebut diatas maka diperolehlah data yang sudah diurutkan secara ascending. Nntuk memperjelas pengertian tentang pengurutan dengan #ethode 'elembung ) u*le ;hort *, berikut contoh programnya : program tessortir uses crt type simpul 9 Wdata data 9 record %endeklarasian simpul untuk senarai berantai dt : char kait : simpul end +ar a3al,,&,baru,akhir,bantu : simpul huruf : string i : integer car : char begin clrscr ne3)a3al* a3al :9 nil 3rite )DInputkan karakter : D*
readln )huruf* for i :9 1 to length)huruf* do begin ne3)baru* baruW.dt :9 hurufAiC if a3al 9 nil then begin baruW.kait :9 nil a3al :9 baru akhir :9 a3al end else begin akhirW.kait :9 baru akhir :9 baru
%roses yang dilakukan untuk memasukkan atau menambah data kedalam senarai berantai
akhirW.kait :9 nil end
end
41
:9 a3al 3hile not) 9 nil* do begin & :9 W.kait 3hile not)& 9 nil* do begin if &W.dt K W.dt then begin car :9 &W.dt &W.dt :9 W.dt W.dt :9 car end & :9 &W.kait end :9 W.kait end 3riteln )D
%erintah yang dilakukan untuk mengurutkan data yang terdapat di dalam senarai berantai secara ascending.
%erintah yang dilakukan untuk menampilkan data yang terdapat pada senarai berantai hasil sortiranGpengurutan.
%rogram diatas adalah program untuk mengurutkan seluruh karakter yang dimasukkan dari keyboard secara ascending.
Soal : 1. &uatlah program untuk mengurutkan data secara descending dengan #ethode &ubble Short, dengan memiliki menu-menu sebagai berikut :
/en4 Qi%i-an : 1. In4t a%imat 2. s-orting a%imat 3. e%4ar Qi%i- /en4 [1>2>3] : Untuk menu " : In4t,an ,a%imat : abcdefghij Untuk menu # : asi% eng4r4tan *es5en*ing : jihgfedcba Untuk Menu : e%4ar. 0atatan : alam pengerjaan soal harus menggunakan procedure atau function.
42