Anda di halaman 1dari 28

MODUL I STRUKTUR DATA REKURSI DAN ITERASI I. Tujuan 1. Praktikan memahami apa itu Rekursi dan Iterasi 2.

Praktikan dapat membuat program Rekursi dan Iterasi. 3. Praktikan dapat membandingkan Struktur data Iterasi dan Rekursif.

II. Rekursif Rekursif merupakan suatu kemampuan subrutin untuk memanggil dirinya sendiri, dan tergolong dalam dinamic programming, Rekursif juga merupakan metode matematika yakni defenisi sebuah fungsi yang mengandung fungsi itu sendiri . Procedure/function rekursif dipakai karena memiliki kelebihan yaitu baris program dapat menjadi lebih singkat, tetapi juga memiliki kekurangan yaitu membutuhkan banyak memori, karena setiap kali program bagian dipanggil oleh dirinya sendiri, dibutuhkan sejumlah ruang memori tambahan.

Latihan 1.1 - Menghitung Faktorial(C++) #include<iostream> #include<conio.h> using namespace std; int faktorial(int n){ if(n==0) return 1; else return (n*faktorial(n-1)); } int main(){ int nf; cout<<"Faktorial berapa(>=0) ? : "; cin>>nf; cout<<"\n\n"<<nf<<"! = "<<faktorial(nf); getch(); } Latihan 1.2 - Menampilkan Jumlah Total dan n-0 (Pascal) Program Rekursif; uses crt; var n : integer;

function jumlah(i : Integer):Integer; begin if i=0 then jumlah:=0 else jumlah := i+Jumlah(i-1); end; procedure tampil(j : Integer); begin writeln(j); if j <> 0 then tampil(j-1); end; begin clrscr;
writeln('Program Rekursif untuk menampilkan Angka n-0 dan Total Jumlah');

writeln; write('Masukkan n (n>=1) : '); readln(n); clrscr; tampil(n); writeln; writeln(jumlah(n)); readln; end.

III. ITERASI (Perulangan) Iterasi dalam looping adalah proses yang berpengaruh dalam nilai dari variabel yang ditetapkan sebagai acuan looping. Atau dapat pula dikatakan bahwa, iterasi adalah bagaimana penambahan nilai atau pengurangan dalam perulangan. Iterasi juga merupakan suatu kemampun prosesor untuk melakukan pengulangan tugas atau instruksi. Empat konsep dalam iterasi : Terdapat inisialisasi nilai Terdapat bentuk modifikasi data Statemen yang membentuk iterasi harus menyertakan modifikasi data Harus ada penghentian Iterasi

Latihan 1.3 - Menghitung Faktorial(Pascal) program Faktorial; uses crt; var n,jumlah : Integer; begin clrscr; writeln(' writeln; write('Faktorial dari ? readln(n); jumlah:=1; if n=0 then else for i:=1 to n do begin jumlah:=jumlah*i end; Writeln(n,'! = ',jumlah); readln; end. : '); Program Faktorial');

Latihan 1.4 - Menampilkan Jumlah Total dan n-0 (C++) #include<conio.h> #include<iostream> using namespace std; int n,jumlah,i; int main(){ cout<<"Program Menampilkan angka n-0 dan Total Jumlah\n\n"; cout<<"Masukkan N (n>=0) "; cin>>n;

for(i=n; i>=0; i--){ cout<<i<<endl; } for(i=n; i>=0; i--){ jumlah=i+jumlah; } cout<<jumlah; getch(); }

Tugas 1. Buat Program Rekursif dan Iterasi untuk menampilkan : Contoh N = 5; 54321 4321 321 12 1 2. Buat Program rekursif dan Iterasi untuk menampilkan kata beberapa kali untuk Ilmu dan beberapa kali untuk Komputer. Contoh : Untuk kata Ilmu 2 kali, dan untuk kata Komputer 4 kali : Ilmu Ilmu Komputer Komputer Komputer Komputer

Lihat Perbedaan Pemakaian Rekursif dan Iterasi.

MODUL II STRUKTUR DATA STACK dan QUEUE I. Tujuan 1. Praktikan memahami apa itu Stack da Queue 2. Praktikan dapat membuat program Stack dan Queue.

II. Stack (Tumpukan) A. Pengertian Stack adalah suatu tumpukan dari benda. Konsep Utamanya adalah LIFO(Last In First Out), maksudnya, benda yang terakhir masuk dalam stack akan menjadi benda yang pertama sekali yang akan dikeluarkan dari stack. Ada 2 operasi dasar yang bisa dilaksanakan pada sebuah tumpukan, yaitu oerasi menyisipkan data (Push) dan operasi menghapus data (pop). 1. Single Stack dengan Array (PASCAL) Pendeklarasian untuk Contoh : Const Max = 7; Type TypeData = Byte; Stack Var Top : TipeData; = array [1..Max] of TipeData;

Create : Membuat sebuah Stack Baru yang masih Kosong Procedure Create; Begin Top :=0; End; Full : Fungsi untuk memeriksa apakah stack yang ada sudah penuh Function Full : Boolean; Begin Full := False; If Top=max Then Full :=True; End; Push : Menambahkan Sebuah elemen kedalam stack. Jika stack Penuh, tidak bisa dilakukan. Procedure push(elemen : TypeData);

Begin If not Full then Begin Top := Top+1; Stack[Top]:=elemen; End; End; Empty : Fungsi untuk menentukan apakah stack kosong atau tidak. Function Empty : Boolean; Begin Empty := False; If Top = 0 then Empty:=True; End;

Pop : Mengambil elemen teratas dari stack. Stack tidak boleh kosong Procedure Pop(Elemen: TipeData); Begin If not Empty Then Begin Elemen :=Stack[Top]; Top:=Top-1; End; End;

Clear : Mengosongkan stack Procedure Clear; Begin Top:=0; End;

2. Double Stack dengan Array (PASCAL) Ini merupakan teknik khusus yang dikembangkan untuk menghemat pemakaian memori dalam pembuatan dua stack dengan Array. Intinya adalah penggunaan hanya sebuah array untuk menampung dua stack. Pendeklarasian untuk Contoh : Const Max = 8;

Type TypeData = Integer; Stack Var Top : Array[1..2]of Byte; = array [1..Max] of Byte;

Create : Membuat sebuah Stack Baru yang masih Kosong Procedure Create; Begin Top[1] :=0; Top[2] := Max +1; End;

Full : Fungsi untuk memeriksa apakah double stack sudah penuh Function Full : Boolean; Begin Full := False; If Top[1]+1>=Top[2] Then Full :=True; End; Push : Memasukkan sebuah elemen ke salah satu stack. Procedure push(elemen : TypeData; NoStack : Byte); Begin If not Full then Begin Case NoStack of 1 : Top[1] := Top[1]+1; 2 : Top[2] := Top[2]-1; End; Stack[Top[NoStack]]:=elemen; End; End; Empty : Fungsi untuk menentukan apakah stack1 dan stack2 kosong atau tidak. Function Empty(NoStack: Byte) : Boolean; Begin Empty := False; Case NoStack of 1: if Top[1]=0 Then

Empty:=True; 2: if Top[2]=Max+1 Then Empty:=True; End; End;

Pop : Mengambil elemen teratas dari salah satu stack. Procedure Pop(Var Elemen: TipeData; NoStack:Byte); Begin If not Empty(NoStack) Then Begin Elemen :=Stack[Top[NoStack]]; Case NoStack of 1: Top[1]:=Top[1]-1; 2: Top[2]:=Top[2]+1; End; End; End;

Clear : Mengosongkan salah satu stack Procedure Clear(NoStack:Byte); Begin Case NoStack of 1: Top[1] :=0; 2: Top[2] :=Max+1; End; End;

3. Stack dengan Single Linked List (PASCAL) Selain implementasi stack dengan array seperti diatas, ada cara lain untuk mengimplementasikan stack dalam pascal, yakni dengan menggunakan single linked list. Keunggulannya dibanding array tentu saja adalah penggunaan alokasi memori yang dinamis sehingga menghindari pemborosan memori. Contohnya jika mendeklarasikan stack dengan array sebesar 100 elemen, sementara ketika dipakai oleh user hanya 20 elemen saja, maka terjadi pemborosan memori 80 tempat elemen yang tidak terpakai. Dengan penggunaan Linked list maka tempat yang disediakan akan sesuai dengan banyaknya elemen yang mengisi stack, karena itulah dalam stack dengan linked list tidak ada istilah Full, sebab biasanya program tidak menentukan jumlah

elemen stack yang mungkin ada(Kecuali jika sudah dibatasi oleh pembuatnya). Namun sebenarnya stack ini juga mempunyai batas kapasitas, yakni dibatasi oleh jumlah memori yang tersedia. Pendeklarasian untuk Contoh : Type TipeData Point Simpul = Byte; = ^simpul; = record Isi End; Var Top : Point; = Typedata; Next = Point;

Create : Membuat sebuah Stack Baru yang masih Kosong Procedure Create; Begin Top := Nil; End;

Empty : Fungsi untuk memeriksa apakah stack yang ada masih Kosong. Function Empty:Boolean; Begin Empty := false; If Top=nil then Empty:=true; End;

Push : Memasukkan sebuah elemen ke dalam stack. Procedure push(elemen : TypeData); Var Now : Point; Begin New(Now); Now^.isi := elemen; If empty then Now^.next := nil

Else Now^.next := Top; Top := Now; End;

Pop : Mengambil elemen teratas dari salah satu stack. Procedure Pop(Var Elemen: TipeData); Var Now : Point; Begin If not Empty Then Begin Elemen := Now^.isi; Now := Top; Top := Top^.next; Dispose(Now); End; End;

Clear : Mengosongkan salah satu stack Procedure Clear; Var Trash : TypeData; Begin While not empty do Pop(Trash); End;

4. Operasi Push Perintah Push diguanakan untuk memasukkan data kedalam tumpukan. C++ Void push(NOD **,char item) { NOD *n; n = NodBaru(item); n -> next = *T;

*T = n ; } 5. Operasi Pop Operasi pop adalah operasi untuk menghapus elemen yang terletak pada posisi paling atas dari sebuah tumpukan. Sama halnya dengan operasi push, maka deklarasi untuk operasi pop dapat dilihat : C++ Void pop(NOD **T) { NOD *P; char item; If(!TumpukanKosong(*T)){ P=*T; *T=(*T)-> next; Item=P->data; Free(p); } Return item; }

Untuk mengetahui suatu tumpukan kosong atau tidak : C++ BOOL TumpukanKosong(NOD *T){ Return((BOOL(T==NULL)); } Latihan 1.1 program single_Stack_dengan_array; uses crt; Const Max = 10; Type TypeData = Byte; Var Stack : array [1..Max] of TypeData; Top : TypeData; pilihan : char; input : Typedata;

Procedure Create; Begin Top :=0; End; Function Full : Boolean; Begin Full := False; If Top=max Then Full :=True; End; Procedure push(elemen : TypeData); Begin If not Full then Begin Top:=top+1; Stack[Top]:=elemen; End; End; Function Empty : Boolean; Begin Empty := False; If Top = 0 then Empty:=True; End; Procedure Pop; Begin If not Empty Then Begin write(Stack[Top]);writeln(' Berhasil di push');; Top:=Top-1; End; End; Procedure Clear;

Begin Top:=0; End; procedure tampil; var i : integer; begin writeln; writeln('Tumpukan Saat Ini'); for i:=top downto 1 do writeln(Stack[i]); writeln; end; begin clrscr; writeln('Program Stack dengan Array'); writeln; writeln('1. Memasukkan'); writeln('2. Mengeluarkan'); writeln('3. Show me '); writeln('x to Exit'); writeln; while(true) do begin Tampil; write('Pilihan Anda : '); readln(pilihan); if pilihan='1' then begin write('Masukkan Angka : '); readln(input); push(input); end else if pilihan='2' then begin

pop; end else if (pilihan='x') then begin write('Anda Menekan Tombol Keluar'); delay(40000); exit; end else writeln('Pilihan Anda Salah'); end; end.

III. Queue Queue secara harafiah diartikan sebagai antrian. Queue merupakan salah satu contoh aplikasi dari pembuatan double linked list yang cukup sering kita temui dalam kehidupan sehari-hari, misalnya pada saat anda mengantri di Mesin ATM. Apabila sesorang masuk dalam sebuah antrian disebut Enqueue. Dalam suatu antrian, ada prinsip FIFO(First In First Out) merupakan antrian biasa dimana yang pertama datang akan menjadi yang pertama keluar dari antrian. Antrian juga merupakan suatu kumpulan data yang penambahan elemennya hanya bisa dilakukan pada suatau ujung(disebut dengan belakang atau rear), dan penghapusan atau pengambilan elemen dilakukan lewat ujung yang lain (disebut dengan isi depan atau front). Dalam antrian juga ada istilah lain yaitu LIFO(Last In First Out) dimana yang duluan masuk akan terakhir keluar dari antrian. 1. Implementasi Antrian dengan Array (PASCAL dan C++) PASCAL A. Array Linear Array Linear Array adalah suatu array yang dibuat seakan-akan merupakan suatu garis lurus dengan satu pintu masuk dan satu pintu keluar. Deklarasi untuk Contoh : Const MaxQueue = 6; Type TypeQueue = byte; Var Queue : array[1..maxQueue] of TypeQueue; Head,Tail : Byte;

Operasi-operasi pada Queue dengan Linear Array : Create Procedure create berfungsi untuk menciptakan Queue yang baru dan kosong yaitu dengan cara memberikan nilai awal(head) dan nilai akhir(Tail) dengan 0. 0 menunjukkan bahwa Queue masih kosong. Procedure create; Begin Head := 0; Tail := 0; End; Empty Fungsi empty berfungsi untuk mengecek apakah Queue masih kosng atau sudah berisi data. Function empty:boolean; Begin If Tail = 0 then Empty:=true Else Empty:= False; End; Full Fungsi full berfungsi untuk mengecek apakah Queue sudah penuh atau masih bisa menampung data dengan cara mengecek apakah nilai tail sudah sama dengan jumlah maksimal Queue. Function Full : Boolean; Begin If Tail = MaxQueue then Full := True Else Full := False; End; EnQueue Procedure EnQueue berguna untuk memasukkan 1 elemen kedalan Queue. Procedure EnQueue(Elemen : Byte); Begin If Empty then Begin Head := 1;

Tail := 1; Queue[Head] := Elemen; End Else If not full then Begin Inc(Tail); Queue[Tail] := Elemen; End; End; DeQueue Procedure DeQueue berguna untuk mengambil 1 elemen dari Queue, Operasi ini sering juga disebut Serve. Dalam hal ini, semua elemen dipindahkan satu langkah kedepan. Procedure DeQueue; Var I : byte; Begin If not Empty then Begin For i:=Head to Tail-1 do Queue[i] := Queue[i+1]; Dec(Tail); End; End; Clear Clear berfungsi untuk menghapus semua elemen dalam Queue dengan jalan mengeluarkan sebua elemen tersebut satu per satu sampai kosng dengan memanfaatkan procedure DeQueue. Procedure Clear; Begin While not Empty then DeQueue; End; B. Array Cicular Array Circular array adalah suatu array yang dibuat seakan akan merupakan sebuah lingkaran dengan titik awal(head) dan titik akhir(tail) saling bersebelahan jika array tersebut masih kosong. Operasi-operasi pada Queue dengan Linear Array : Create

Procedure create berfungsi untuk menciptakan Queue yang baru dan kosong yaitu dengan cara memberikan nilai awal(head) degan 1 dan nilai akhir(Tail) dengan Jumlah maksismum data yang akan ditampung array. Procedure create; Begin Head := 1; Tail := Max_Queue; End; Empty Fungsi empty berfungsi untuk mengecek apakah Queue masih kosng atau sudah berisi data. Function empty:boolean; Begin If (Tail mod Max_Queue) + 1 = Head then Empty:=true Else Empty:= False; End; Full Fungsi full berfungsi untuk mengecek apakah Queue sudah penuh atau masih bisa menampung data dengan cara mengecek apakah tempat yang masih kosng tinggal satu atau tidak (untuk membedakan dengan empty dimana semua tempat kosong). Function Full : Boolean; Var X : 1..Max_Queue; Begin X := (Tail Mod Max_Queue) + 1; If (x mod Max_Queue) + 1 = head then Full := True Else Full := False; End; EnQueue Procedure EnQueue berguna untuk memasukkan 1 elemen kedalan Queue. Procedure EnQueue(Elemen : TypeElemen); Begin If not Full then Begin

Tail := (Tail Mod Max_Queue) + 1; Queue[Tail] := Elemen; End End; DeQueue Procedure DeQueue berguna untuk mengambil 1 elemen dari Queue, Operasi ini sering juga disebut Serve. Dalam hal ini, semua elemen dipindahkan satu langkah kebelakang. Procedure DeQueue; Begin If not Empty then Head := (Head Mod Max_queue) + 1 ; End; Clear Clear berfungsi untuk menghapus semua elemen dalam Queue dengan jalan mengeluarkan sebua elemen tersebut satu per satu sampai kosng dengan memanfaatkan procedure DeQueue. Procedure Clear; Begin While not Empty then DeQueue; End; C. Implementasi dengan Array dalam C++ Latihan 2.2 (LIFO) #include<iostream.h> #include<conio.h> #include<stdio.h> typedef char Titem; #define MAXN 6 typedef enum {TIDAK, YA} Tboolean; typedef struct{ Titem array[MAXN]; int first; int last; int number_of_items; } Tqueue; void initialize_queue(Tqueue *Pqueue);

Tboolean enqueue(Tqueue *p, Titem item); Tboolean dequeue(Tqueue *p, Titem *Pitem); void print_queue(const Tqueue *Pqueue); #include<ctype.h> int main(){ Tqueue queue; Tboolean succeed; char chr; initialize_queue(&queue); cout<<"\nMasukkan Karakter untuk melakukan Enqueue "; cout<<"\nTekan angka 1 untuk melakukan Dequeue"; cout<<"\nTekan Enter untuk Keluar\n\n"; cout<<"\nInputan : "; chr = getche(); while(chr!=10 && chr != 13){ if(isalpha(chr)){ succeed=enqueue(&queue,chr); print_queue(&queue); if(succeed) cout<<"\nEnqueue ( "<<chr<<" ) Berhasil"; else cout<<"\nEnqueue ( "<<chr<<" ) Gagal"; } if (chr=='1'){ succeed = dequeue(&queue,&chr); if(succeed){ cout<<"\n Dequeue ( "<<chr<<" ) berhasil"; print_queue(&queue); } else cout<<"\nDequeue Kosong\n"; } cout<<"\nInputan : "; chr=getche(); } Gagal, Antrian Sudah

} void initialize_queue(Tqueue *Pqueue){ Pqueue -> first =0; Pqueue -> last =-1; Pqueue -> number_of_items = 0; } Tboolean enqueue(Tqueue *Pqueue, Titem item){ if(Pqueue -> number_of_items >= MAXN) return (TIDAK); else{ Pqueue ->last++; if(Pqueue -> last>MAXN-1) Pqueue ->last=0; Pqueue->array[Pqueue -> last] = item; Pqueue -> number_of_items++; return(YA); } } Tboolean dequeue(Tqueue *Pqueue, Titem *Pitem){ if(Pqueue -> number_of_items == 0) return (TIDAK); else{ *Pitem = Pqueue -> array[Pqueue -> first++]; if(Pqueue -> first>MAXN-1) Pqueue ->first=0; Pqueue -> number_of_items--; return(YA); } } void print_queue(const Tqueue *Pqueue){ int i,n; cout<<"\nAntrian : "; for(n=1, i=Pqueue -> first; n<=Pqueue>number_of_items;n++){

cout<<Pqueue -> array[i]<<" "; i++; if(i>MAXN-1) i=0; } cout<<"\n\n"; }

2. Implementasi Antrian dengan Double Linked List (PASCAL) Selai menggunakan array, Queue juga dapat dibuat dengan linked list. Perhatikan pendeklaraian berikut untuk contoh berikutnya. Type Point = ^simpul; Simpul = Record Isi : TipeData; Next : Point; End; Queue = Record; Head : Point; Tail : Point; End; Var Q : Queue; N : 0..Max_Queue;

Operasi pada Queue dengan Linear Array : Create Procedure create berfungsi untuk menciptakan Queue yang baru dan kosong yaitu dengan cara mengarahkan pointer head dan tail kepada NIL. Procedure create; Begin Q.Head := NIL; Q.Tail := Q.Head; N := 0; End; Empty Fungsi empty berfungsi untuk mengecek apakah Queue masih kosng atau sudah berisi data.

Function empty:boolean; Begin If Q.Head = NIL then Empty:=true Else Empty:= False; End; Full Fungsi full berfungsi untuk mengecek apakah Queue sudah penuh atau masih bisa menampung data dengan cara mengecek apakah N((jumlah Queue) sudah sama dengan Max_Queue atau belum, jika ya maka penuh. Function Full : Boolean; Begin If N = Max_Queue + 1; Full := True Else Full := False; End; EnQueue Procedure EnQueue berguna untuk memasukkan 1 elemen kedalan Queue. Procedure EnQueue(Elemen : TypeElemen); Var Now : Point; Begin If not Full then Begin New(Now); Now^.isi := Elemen; Now^.Next := NIL; If Empty Then Begin Q.Head := Now; Q.Tail := Now; N := 1; End Else Begin Q.Tail^.Next := Now;

Q.Tail := Now; Inc(N); End End End; DeQueue Procedure DeQueue berguna untuk mengambil 1 elemen dari Queue, hal ini dilakukan dengan cara menghapus satu simpul yang terletak paling depan(Head). Procedure DeQueue; Var Now : Point; Begin If not Empty then Begin Now := Q.Head; Q.Head := Q.Head^.Next; Dispose(Now); Dec(N); End; End; Clear Clear berfungsi untuk menghapus semua elemen dalam Queue dengan jalan mengeluarkan sebua elemen tersebut satu per satu sampai kosng dengan memanfaatkan procedure DeQueue. Procedure Clear; Begin While not Empty then DeQueue; End; Latihan 2.2 Program Queue_dengan_Double_Linked_List; uses crt; const max_Queue = 10; Type Point = ^simpul; Simpul = Record Isi : String;

Next : Point; End; Queue = Record Head : Point; Tail : Point; End; Var Q : Queue; N : 0..Max_Queue; pilihan : char; inputan : string; Procedure create; Begin Q.Head := NIL; Q.Tail := Q.Head; N := 0; End; Function empty:boolean; Begin If Q.Head = NIL then Empty:=true Else Empty:= False; End; Function Full : Boolean; Begin If N = Max_Queue + 1 then Full := True Else Full := False; End; Procedure EnQueue(Elemen : String); Var Now : Point;

Begin If not Full then Begin New(Now); Now^.isi := Elemen; Now^.Next := NIL; If Empty Then Begin Q.Head := Now; Q.Tail := Now; N := 1; End Else Begin Q.Tail^.Next := Now; Q.Tail := Now; Inc(N); End; write(elemen);writeln(' Berhasil di Enqueue'); End else writeln('Queue Sudah Penuh'); delay(20000); End; Procedure DeQueue; Var Now : Point; Begin If not Empty then Begin Now := Q.Head; write(Q.head^.isi); writeln(' Berhasil di Dequeue'); Q.Head := Q.Head^.Next; Dispose(Now); Dec(N); End;

delay(20000); End; Procedure Clear; Begin While not Empty do DeQueue; writeln('Antrian Dikosongkan '); delay(20000); End; procedure tampil(QQ : Queue); Var Now : Point; NN Begin QQ:=Q; NN:=N; If not Empty then Begin Now := QQ.Head; write(QQ.head^.isi); write(' - '); Q.Head := QQ.Head^.Next; Dec(Nn); End else writeln('Antrian Kosong'); delay(20000); End; : 0..max_Queue;

begin create; while(true) do begin clrscr;

writeln('Program Antrian dengan Double Linked List'); writeln;writeln; writeln('1. Enqueue'); writeln('2. Dequeue'); writeln('3. Clear'); writeln('x --> untuk Keluar'); writeln; write('Pilihan : '); pilihan:=readkey; WRITELN; case pilihan of '1': begin write('Inputan : '); readln(inputan); enqueue(inputan); end; '2': Begin dequeue; end; '3': clear; 'x':break; 'X':break; else writeln('Pilihan Salah'); delay(56000); end; end; writeln('Anda Keluar '); delay(20000); end.

MODUL III STRUKTUR DATA DINAMIS I. Tujuan 1. Praktikan memahami apa itu Rekursi dan Iterasi 2. Praktikan dapat membuat program Rekursi dan Iterasi. 3. Praktikan dapat membandingkan Struktur data Iterasi dan Rekursif.

II. Rekursif Rekursif m

III. ITERASI (Perulangan) Iterasi dal

Tugas 1. Bu

Anda mungkin juga menyukai