Modul Praktikum Algoritma Dan Struktur Data
Modul Praktikum Algoritma Dan Struktur Data
LABORATORIUM KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS SRIWIJAYA
2011
Universitas Sriwijaya
Fakultas Ilmu Komputer
Laboratorium
No. Dokumen
Revisi
LEMBAR PENGESAHAN
MODUL PRAKTIKUM
SISTEM MANAJEMEN
MUTU
ISO 9001:2008
.
0
4 JUNI 2011
2 DARI 78
Tanggal
Halaman
MODUL PRAKTIKUM
DIBUAT OLEH
DISAHKAN OLEH
DIKETAHUI OLEH
TIM LABORAN
LABORATORIUM
FASILKOM UNSRI
KEPALA LABORATORIUM
2/77
Daftar Isi
Halaman Depan ..........................................................................................................
16
26
32
35
41
45
51
59
64
69
74
Referensi ....................................................................................................................
78
3/77
Tujuan
II.
Dasar Teori
1 : Menu Utama
2 : Toolbar
3 : Jendela pengetikan kode program
4 : Jendela Message/Pesan kesalahan kode
4/77
2. Kemudian pilih menu File > New maka akan tampil jendela baru (di dalam jendela utama
Turbo C++) untuk menuliskan kode program.
3. Setelah menuliskan kode program maka simpan dengan memilih menu File > Save as
(untuk menyimpan dengan nama baru) atau File > Save (Tidak menyimpan dengan nama
baru bila sudah pernah disimpan). Tentukan dirve dan direktori tempat penyimpanan.
5/77
Untuk membuka file atau kode program yang sudah pernah dibuat maka langkah-langkahnya
adalah seperti berikut :
1. Pilih menu File > Open maka akan tampil jendela seperti berikut :
2. Tentukan drive dan direktori lokasi tempat menyimpan file program kemudian klik OK.
Dari status di atas maka tidak ditemukan error atau warning pada program.
6/77
Dari status di atas dapat dilihat bahwa terdapat error pada program. Untuk melihat pesan
error tersebut klik OK maka akan tampil jendela pesan error seperti berikut :
2. Setelah kode program di-compile maka langkah berikutnya adalah menjalankannya, yaitu
dengan memilih menu Debug > Run atau kombinasi tombol CTRL+F9.
Pengenalan C++
Setiap program C++ mempunyai bentuk seperti berikut ini yaitu:
# prepocessor directive
void main()
{
// Batang Tubuh Program Utama
}
Prepocessor Directive
Adalah salah satu pengarah prepocessor directive yang tersedia pada C++. Preprocessor
selalu dijalankan terlebih dahulu pada saat proses kompilasi terjadi. Bentuk umumnya :
# include <nama_file>
7/77
tidak diakhiri dengan tanda semicolon, karena bentuk tersebut bukanlah suatu bentuk
pernyataan, tetapi merupakan prepocessor directive. Baris tersebut menginstrusikan kepada
kompiler yang menyisipkan file lain dalam hal ini file yang berakhiran .h(file header) yaitu
file yang berisi sebagai deklarasi contohnya:
Preprocessor Directive
Fungsi
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
#include <math.h>
Fungsi Main ()
Fungsi ini menjadi awal dan akhir eksekusi program C++. main adalah nama judul fungsi.
Melihat bentuk seperti itu dapat kita ambil kesimpulan bahwa batang tubuh program utama
berada didalam fungsi main( ).
Kata void yang mendahului main() dipakai untuk menyatakan bahwa fungsi ini tidak
memiliki nilai balik
Fungsi yang akan dieksekusi pertama kali oleh c++
Menyatakan bahwa fungsi main tidak memiliki nilai balik
Menyatakan bahwa fungsi tidak memiliki argumen
Void main()
{
cout<<Hallo dunia<<endl;
Pernyataan
Tubuh Fungsi main ()
8/77
program atau bagian-bagian dari program.Komentar tidak pernah dicompile oleh compiler.
Dalam C++ terdapat 2 jenis komentar, yaitu :
Jenis 1 : /* Komentar anda diletakkan di dalam ini
Bisa mengapit lebih dari satu baris
*/
Deklarasi Konstanta
a. Menggunakan keyword const
Contoh : const float PI = 3.14152965;
Berbeda dengan variable, konstanta bernama tidak dapat diubah jika telah diinisialisasi
b. Menggunakan #define
Contoh : #define PI 3.14152965
Keuntungan menggunakan #define apabila dibandingkan dengan const adalah kecepatan
kompilasi, karena sebelum kompilasi dilaksanakan, kompiler pertama kali mencari
9/77
symbol #define (oleh sebab itu mengapa # dikatakan prepocessor directive) dan
mengganti semua Phi dengan nilai 3.14152965.
Tipe Data
Tipe Data dapat dibedakan menjadi dua, yaitu tipe data dasar dan tipe data bentukan
Tipe Data Dasar
Adalah tipe yang dapat langsung dipakai.
Tipe Dasar
Char
Integer
Ukuran Memori
(byte)
1
2
Long integer
Float
Double
long double
4
8
10
Jangkauan Nilai
-128 hingga +127
-32768 hingga +32767
-2.147.438.648 hingga
2.147.438.647
3,4E-38 hingga 3,4E38
1.7E-308 hingga 1.7E308
3.4E-4932 hingga 1.1E4932
Jumlah Digit
Presisi
6-7
15-16
19
Tipe Bentukan
Tipe bentukan adalah type yang dibentuk dari type dasar atau dari type bentukan lain yang
sudah didefinisikan, contohnya tipe struktur. Struktur terdiri dari data yang disebut field.
Fieldfield tersebut digabungkan menjadi satu tujuan untuk kemudahan dalam operasi.
Mengenai tipe data bentukan akan dibahas lebih lanjut pada mata kuliah Algoritma dan
Pemrograman 2.
10/77
Operator Aritmatika
OPERATOR
+
*
/
%
-
DESKRIPSI
Penjumlahan(add)
Pengurangan(Substract)
Perkalian(Multiply)
Pembagian(Divide)
Sisa Pembagian Integer(Modulus)
Negasi(Negate)
CONTOH
m+n
m-n
m*n
m/n
m%n
-m
ARTI
Sama Dengan(bukan
assignment)
Tidak sama dengan
Lebih besar
Lebih kecil
Lebih besar atau
sama dengan
Lebih kecil atau sama
dengan
X==Y
CONTOH
Apakah X sama dengan Y
X!=Y
X>Y
X<Y
X>=Y
X<=Y
11/77
DESKRIPSI
Logic AND
Logic OR
CONTOH
m && n
m II n
Logic NOT
!m
III. Prepraktikum
1. Instal program Turbo C++ pada computer atau laptop
2. Buatlah contoh deklarasi masing-masing tipe dasar dalam Bahasa C atau C++ !
3. Isilah tabel berikut ini untuk melakukan penelusuran kebenaran penulisan nama
variabel-variabel ini.
Nama Variabel
Nama
Nama anda
Nama_anda
$Nama$Anda
80mahasiswa
rata-rata
NIM
huruf5
Benar/Salah
Alasan
Pembetulan
3. Compile program dengan menekan Alt + F9 atau pilih menu Project Compile
4. Jalankan program dengan menekan Ctrl + F9 atau pilih menu Debug Run
12/77
13/77
1: #include <iostream.h>
2: void main ()
3: {
4:
Int volume,panjang,lebar,tinggi;
5:
panjang = 2;
6:
lebar=2;
7:
tinggi =1;
8:
volume =panjang*lebar*tinggi;
9:
cout<<"volume balok adalah "<<volume;
10: }
V.
No
Deskripsi Jawaban
1
.
.
13
14/77
VI. Kesimpulan
b 2c 2 4ab
2c
2. Buat sebuah program untuk menampilkan data mahasiswa berupa nama, nim, umur,
nilai (dalam decimal). Yang mana data tersebut berupa inputan dari user !
15/77
Tujuan
II.
Dasar Teori
Pengkondisian
Pada umumnya satu permasalahan yang komplek memerlukan suatu penyelesaian kondisi.
Dengan menyeleksi suatu kondisi, maka selanjutnya dapat ditentukan tindakan apa yang
harus dilakukan, tergantung pada hasil kondisi penyeleksian. Jadi suatu aksi hanya dikerjakan
apabila persyaratan atau kondisi tertentu terpenuhi.
Penyeleksian Satu Kasus, dengan menggunakan struktur IF:
Pada penyeleksian satu kasus, kondisi akan diseleksi oleh statemen if. Bila kondisi bernilai
benar (true), maka aksi sesudah kata then (dapat berupa satu atau lebih aksi) akan diproses.
Bila kondisi bernilai salah (false), maka tidak ada aksi yang akan dikerjakan. Statemen endif
adalah untuk mempertegas bagian awal dan bagian akhir struktur IF.
16/77
Contoh Program :
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
#include <stdio.h>
void main()
{
int a;
a = 10;
if (a%2==0)
{
printf(%d adalah bilangan genap,a);
}
}
#include <stdio.h>
void main()
{
int a = 10;
if (a< 15 && a>9)
{
printf(15 lebih besar dari %d lebih besar dari 9,a);
}
}
#include <stdio.h>
void main()
{
int a = 15;
if (a%5==0 || a%2==0)
{
printf(%d habis dibagi 5 atau 2,a);
}
}
17/77
kondisi bernilai salah (false) maka aksi2 yang akan dilaksanakan. Statemen else menyatakan
ingkaran (negation) dari kondisi.
#include <stdio.h>
void main()
{
int a;
printf(Masukkan sebuah bilangan = );
scanf(%d,&a);
if (a%2==0)
{
printf(%d adalah Bilangan genap,a);
}
else
{
printf(%d adalah Bilangan ganjil,a);
}
}
18/77
Gambar 3.5 Diagram Alir dari Struktur Tiga Kasus IF- ELSE (tersarang)
if (kondisi1)
pernyataan1;
else if (kondisi2)
pernyataan2;
else if (kondisi3)
pernyataan3;
else if (kondisiM)
pernyataanM;
else
/*Opsional*/
pernyataanN; /*Opsional*/
Gambar 3.6 Struktur Untuk Penyeleksian Tiga Kasus IF-ELSE (tersarang)
Contoh Program :
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
#include <stdio.h>
void main()
{
int T;
printf(Masukkan Nilai Suhu = );
scanf(%d,&T);
if (T<=0)
{
printf(Kondisi Beku);
}
else if (T>0 && T<=100)
{
printf(Kondisi Cair);
}
else
{
printf(Kondisi Uap);
}
}
19/77
Struktur CASE
Selain bentuk if, pengkondisian dalam bahasa C dapat pula menggunakan bentuk switch,
sintaks penulisannya adalah sebagai berikut:
switch(ekspresi)
{
case (kondisi1):
Pernyataan1;
break;
case (kondisi2):
Pernyataan2;
break;
:
:
case (kondisiN):
PernyataanN;
break;
default:
Pernyatanlain;
break;
}
Contoh Program :
1: #include <stdio.h>
2:
3: void main()
4: {
5:
int nilai;
6:
printf(Masukkan nilai : );
7:
scanf(%d,&nilai);
8:
9:
switch(nilai)
10:
{
11:
case(1):
12:
{
13:
printf(satu\n);
14:
}
15:
break;
16:
case(2):
17:
{
19:
printf(dua\n);
20:
}
21:
break;
22:
case(3):
23;
{
24:
printf(tiga\n);
25:
}
26:
break;
20/77
27:
28:
29:
30:
31:
32:
}
33: }
default:
{
printf(tidak ada nilai\n);
}
break;
Pengulangan
Struktur pengulangan terdiri atas dua bagian :
1. Kondisi pengulangan yaitu ekspresi Boolean yang harus dipenuhi untuk
melaksanaakan pengulangan
2. Isi atau badan pengulangan yaitu satu atau lebih pernyataan(aksi) yang akan diulang.
Bentuk FOR
Perulangan dalam bahasa C dapat menggunakan bentuk FOR, sintaks penulisannya adalah
sebagai berikut :
for (nilai awal; kondisi perulangan; operasi)
{
Statement
}
Contoh Program :
1:
2:
3:
4:
5:
6:
7:
8:
#include <stdio.h>
void main()
{
for(int i = 0; i < 9; i++)
{
printf(%d ,i);
}
}
Bentuk WHILE
Perulangan dalam bahasa C dapat pula menggunakan bentuk WHILE, sintaks penulisannya
adalah sebagai berikut :
while (kondisi)
{
Statement
}
Contoh Program :
21/77
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#include <stdio.h>
void main()
{
int i = 0;
while(i<10)
{
printf(%d\n,i);;
i++;
}
}
Bentuk DO-WHILE
Perulangan dalam bahasa C dapat pula menggunakan bentuk DO-WHILE, sintaks
penulisannya adalah sebagai berikut :
do
{
Statement
}
while (kondisi);
Contoh Program :
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
#include <stdio.h>
void main()
{
int i = 0;
do
{
printf(%d\n,i);
i++;
}
while(i<10);
}
III. Prepraktikum
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1. Jelaskan pada kondisi apa sebaiknya struktur seleksi if dan case digunakan! Apa
perbedaan dari kedua struktur tersebut?
2. Jelaskan perbedaan antara struktur pengulangan FOR, WHILE dan DO-While dan
bagaimana hasilnya untuk implementasi masing-masing!
22/77
Algoritma
Deklarasi :
laporan,kuis,mid,uas : integer
NA : float
Algoritma :
read(laporan)
read(kuis)
read(mid)
read(uas)
NA (0.15*laporan) + (0.15*kuis) + (0.3*mid) + (0.4*uas)
write(Nilai akhir anda adalah + NA)
if(NA >85 and NA<=100)
write(Nilai A)
elseif(NA >70 and NA<=85)
write(Nilai B)
elseif(NA >55 and NA<=70)
write(Nilai C)
elseif(NA >45 and NA<=55)
write(Nilai D)
else
write(Nilai E)
endif
2. Jalankan program dari soal nomor 1 dan analisa hasilnya
3. Ubahlah program pada soal nomor 1 dengan menggunakan pengkondisian bentuk
SWITCH CASE
4. Buatlah program menampilkan nilai yang habis dibagi dengan 3.Antara 1 -10.
23/77
Algoritma
Deklarasi :
i : integer
Algoritma :
write(Program Menampilkan Bilangan Habis dibagi 3 )
for i0 to 10 do
if(i%3==0)
write(i)
endif
endfor
5. Jalankan program pada soal nomor 4 dan analisa hasilnya
6. Ubahlah program pada soal nomor 1 dengan menggunakan pengulangan bentuk
WHILE dan DO-WHILE
7. Buatlah program berdasarkan algoritma berikut ini :
Algoritma
Deklarasi :
i,j : integer
Algoritma :
for i 1 to 5 do
for j 5 to i do
write(*)
endfor
write(\n)
endfor
8. Jalankan program pada soal nomor 7 dan analisa hasilnya
V.
No
Deskripsi Jawaban
1
.
.
4
24/77
VI. Kesimpulan
terbesar) yang
masukan!
(Asumsi:
Urutan bilangan: -7
25/77
ketiga
Tujuan
II.
Dasar Teori
secara otomatis ke
prosedur tersebut. Instruksi di dalam badan prosedur dilaksanakan. Setelah semua instruksi
selesai dilaksanakan, kendali program berpindah secara otomatis ke instruksi sesudah
pemanggilan prosedur.
Contoh Program :
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
#include <stdio.h>
void garis();
void main()
{
garis();
printf(Nama saya adalah ANI );
garis();
printf(Saya adalah mahasiswa TEKNIK INFORMATIKA );
garis();
}
void garis()
{
cout<<-------------------------------------------<<endl;
}
26/77
formal yang bersesuaian. Nilai ini digunakan di dalam badan prosedur yang bersangkutan.
Nilai yang dinyatakan oleh parameter masukan tidak dapat dikirim keluar prosedur. Itulah
alasan mengapa parameter jenis ini diacu sebagai parameter masukan.
void Nama_Prosedur( TipeData variable1, TipeData variabel2 )
{
Statement
}
Cara memanggil prosedur: NAMA_PROSEDUR(variabel1,variabel2);
Contoh program :
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
#include <stdio.h>
void hitung(int a, int b)
{
int hasil;
hasil=a+b;
printf(Hasilnya adalah %d,&hasil);
}
void main()
{
int a,b;
printf(Masukkan nilai A : );
scanf(a);
printf(Masukkan nilai B : );
scanf(b);
hitung(a,b);
}
memanggil
prosedur:
NAMA_PROSEDUR
VariabelMasukanKeluaran );
Contoh Program :
27/77
(VariabelMasukan,
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
#include <stdio.h>
void hitung(int a, int b, int &hasil)
{
int hasil;
hasil=a+b;
}
void main()
{
int a,b,hasil;
printf(Masukkan nilai A : );
scanf(a);
printf(Masukkan nilai B : );
scanf(b);
hitung(a,b,hasil);
printf(Hasil nya adalah %d,hasil);
}
#include <stdio.h>
int tambah(int a, int b);
void main()
{
int a,b,hasil;
printf(Nilai a = );
scanf(%d,&a);
printf(Nilai b = );
scanf(%d,&b);
hasil = tambah(a,b);
printf(Hasil = %d\n,hasil);
}
28/77
20:
21: int tambah(int a, int b)
22: {
23:
int Hasil;
24:
Hasil = a + b;
25:
return Hasil;
26: }
#include <stdio.h>
int a,b,hasil;
int tambah();
void main()
{
printf(Nilai a = );
scanf(%d,&a);
printf(Nilai b = );
scanf(%d,&b);
hasil = tambah();
printf(Hasil = %d\n,hasil);
}
int tambah()
{
int Hasil;
Hasil = a + b;
return Hasil;
}
III. Prepraktikum
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1. Prosedur dan Fungsi merupakan pemrograman modular. Apakah perbedaan antara
keduanya?
Kapankah
29/77
Deklarasi :
factorial, hasil: integer
procedur input(input/output factorial: integer) {input bilangan yang
akan difaktorialkan}
procedur hitung_faktorial(input/output factorial: integer, input/output
hasil:integer) {menghitung faktorial}
procedur output(input hasil:float) {menampilakan hasil factorial }
Algoritma :
input(factorial)
hitung(factorial,hasil)
output(hasil)
30/77
5.
6.
V.
No
Deskripsi Jawaban
1
.
.
6
VI. Kesimpulan
31/77
Tujuan
II.
Dasar Teori
Larik adalah tipe terstruktur yang terdiri dari sejumlah elemen-elemen yang bertipe sama.
Banyaknya elemen dalam suatu larik ditunjukkan oleh suatu indeks yang harus merupakan
tipe
data yang
menyatakan posisi data). Tiap-tiap elemen di larik dapat diakses langsung melalui indeksnya.
Suatu larik memiliki jumlah elemen yang jumlahnya tetap, sehingga jumlah elemen larik
tidak dapat diubah selama pelaksanaan program.
Array Satu Dimensi
Bentuk umum :
tipe_array nama_array [jumlah data]
Ilustrasi array satu dimensi
#include <stdio.h>
void main()
{
int a[5] = {10,25,30,45,50};
int i;
for(i=0;i<5;i++)
{
printf(%d = %d\n,i,a[i]);
}
}
Array Multidimensi
Array multidimensi adalah array yang mempunyai lebih dari satu dimensi. Misal : A[3][5]
artinya array tersebut mempunyai 3 baris 5 kolom.
32/77
Bentuk umum :
tipe_array nama_array [jumlah data][jumlah data]
Ilustrasi array satu dimensi
#include <stdio.h>
void main()
{
int a[3][3] = {{10,20,30},{40,50,60},{70,80,90}};
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf(%d ,a[i][j]);
}
printf(\n);
}
}
III. Prepraktikum
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1.
2.
33/77
read(ArrayA[i])
endfor
for i 1 to 5 do
read(ArrayB[i])
endfor
for i 1 to 5 do
ArrayC[i] = ArrayA[i] + ArrayB[i]
endfor
for i 1 to 5 do
read(ArrayC[i])
endfor
V.
2.
3.
Ubahlah program pada soal nomor 1 menjadi bentuk prosedur atau fungsi
No
Deskripsi Jawaban
1
.
.
3
VI. Kesimpulan
34/77
menjadi
3
2
2
2
3
2
2
2
3
Tujuan
II.
Dasar Teori
Fungsi pencarian itu sendiri adalah memvalidasi (mencocokan) data. Sebagai contoh, untuk
menghapus atau mengubah sebuah data di dalam sekumpulan nilai, langkah pertama yang
harus ditempuh adalah mencari data tersebut, lalu menghapus atau mengubahnya.
Ada sebuah kasus sederhana, misalkan terdapat 10 data yang bertpe integer, terangkum di
dalam variabel larik L. Terdapat data X di dalam larik L tersebut. Bagaimana proses
pencarian data X tersebut ? Jika ketemu maka akan mengeluarkan pesan teks Data
ditemukan ! atau jika tidak ditemukan akan mengeluarkan pesan teks Data tidak
ditemukan . Serta menampilkan di elemen ke beberapa elemen tersebut ditemukan, dan
berapa jumlah data X di larik L.
Ada beberapa metode mencari data di dalam sekumpulan data yang bertipe sama yaitu :
1. Metode Pencarian Beruntun (Sequential Search)
2. Metode Pencarian Bagi Dua (Binary Search)
19 18 16
Data yang akan dicari adalah X, misal X = 10, maka elemen yang diperiksa adalah
elemen yang bernilai 10.
Flowchart
35/77
Mulai
L[10] = {20,15,22,14,12,10,24,19,18,16}
X
K=0
I = 0 s.d. 9
Data ditemukan di
elemen i
L[i]=X
k = k +1
i
k=0
Jumlah data = ,k
Selesai
36/77
sebaliknya untuk data yang terurut menurun. Dalam hal ini tentukan indeks paling awal dan
indeks paling akhir, untuk membagi 2 elemen tersebut.
Indeks awal = i, dimana nilai i, pada awalnya bernilai 0;
Indeks akhir =j, dimana nilai j, pada awalnya bernilai sama dengan jumlah elemen.
apakah
data
terurut
menurun
atau
meniak
dengan
menggunakan
membandingkan apakah elemen paling kiri L[0] lebih dari atau kurang dari eleemn paling
kanan L[n-1].
Jika data di elemen paling kiri L[0] > data di elemen paling kanan L[n-1], maka data
terurut menurun.
Jika data elemen paling kiri L[0] < data di elemen paling kanan L[n-1], maka data
terurut menaik.
37/77
Dan seterusnya sampai nilai X dicari ketemu atu tidak sama sekali.
10. Jika data terurut menurun, maka tukar kondisi yang ada di nomor 8 dan 9.
Contoh :
Diberikan 10 data terurut L[10] = {12,14,15,17,23,25,45,67,68,70}. Cari nilai X = 14 di
elemen tersebut.
Solusi :
1. Menentukan apakah data terurut menaik atau menurun.
L[0] = 12
L[9] = 70
Karena L[0] < L[9], maka data tersebut terurut menaik.
2. Misal indeks paling kiri adlah I = 0 dan indeks paling kanan adalah j = 9, maka indeks
tengahnya adalah :
K = (i+j) div 2
= (0+9) div 2
= 4.
Elemen tengah sekarang adalah 4 dengan L[4] = 23.
3. Karena data di indeks tengah lebih dari nilai data yang dicari (L[4] > X), maka pencarian
berikutnya dilakukan pada sisi kiri indeks k, maka nilai j sekarang sama dengan k, lalu
lakukan proses sama seperti nomor 2.
J=k
=4
K= (i+j) div 2
= (0 +4) div 2
=2
Elemen tengah sekarang adalah 2 dengan L[2] = 15.
4. Karena data di indeks tengah lebih dari nilai data yang dicari (L[2] >X), maka pencarian
berikutnya dilakukan pada sisi kiri indeks k, maka nilai j sekarang sama dengan k, lalu
lakukan proses sama seperti nomor 2.
J=k
=2
K = (i+j) div 2
= (0 +2) dic 2
=1
38/77
III. Prepraktikum
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1.
2.
3.
2.
Buatlah program pencarian bagi dua berdasarkan langkah langkah yang telah
dijekaskan diatas
V.
No
Deskripsi Jawaban
1
2
VI. Kesimpulan
39/77
2. Buat program untuk menyisipkan data ke dalam kumpulan data, jika data telah ada,
maka data tersebut tidak akan disisipkan, selainnya akan disisipkan ke dalam
kumpulan data tersebut
40/77
Tujuan
II.
Dasar Teori
Pengurutan (sorting) adalah proses mengatur sekumpulan obyek menurut urutan atau susunan
tertentu. Urutan tersebut dapat menaik (ascending) atau menurun (descending). Jika diberikan
n buah elemen disimpan di dalam larik L, maka :
-
pengurutan menaik adalah L[0] < L[1] < L[2] < < L[n-1]
pengurutan menaik adalah L[0] > L[1] > L[2] > > L[n-1]
Bubble Sort
Selection Sort
Insertion Sort
Heap Sort
Shell Sort
Quick Sort
Merge Sort
Radix Sort
Tree Sort
Pada bagian ini hanya akan dibahas mengenai tiga buah metode sederhana yang mendasar,
yaitu :
1. Metode Pengurutan Gelembung (Bubble Sort)
2. Metode Pengurutan Pilih (Selection Sort)
3. Metode Quick Sort
4. Metode Merge Sort
41/77
sabun selalu terapung di permukaan air. Prinsip pengapungan inilah yang diterapkan ke
metode ini, dimana nilai yang paling rendah berada di posisi paling atas, melalui proses
pertukaran.
Konsep dasar dari metode ini adalah setiap data yang ada di kumpulan, dibandingkan dengan
data-data lainnya, artinya jika jumlah data sebanyak 5, maka akan terjadi perbandingan
sebanyak (5-1)2 = 16 kali.
Atau secara umum dapat ditarik rumus, untuk jumlah data sebanyak n buah, maka :
Jumlah iterasi pembandingan = (n-1)2
pass 0
Cari elemen maksimum di dalam L[0 (n-1)].
42/77
pass 1
Cari elemen maksimum di dalam L[0 .. (n-2)]
Pertukarkan elemen maksimum dengan elemen L[n-2]
pass 2
Cari elemen maksimum di dalam L[0 .. (n-3)]
Pertukarkan elemen maksimum dengan elemen L[n-3]
.
.
.
-
pass 3
Cari elemen maksimum di dalam L[0 .. 1]
Pertukarkan elemen maksimum dengan elemen L[1]
III.
Prepraktikum
2.
Bandingkan masing masing metode pencarian yang ada, kemudian metode mana
yang paling baik ? Mengapa ?
IV.
Kegiatan Praktikum
1. Buatlah program pengurutan gelembung berdasarkan langkah langkah yang terlah
dijelaskan diatas.
2. Buatlah program pengurutan seleksi berdasarkan langkah langkah yang terlah
dijelaskan diatas
V.
No
Deskripsi Jawaban
1
.
.
3
43/77
VI.
Kesimpulan
2.
44/77
Tujuan
2.
3.
II.
Dasar Teori
Pointer
Pointer (variabel penunjuk) adalah suatu variabel yang berisi alamat memori dari suatu
variabel lain. Lokasi memori tersebut mungkin diwakili oleh sebuah variabel atau
mungkin juga lokasi bebas dalam memori. Sedangkan pointer sendiri yang berupa nilai
ditampung dalam sebuah variabel yang disebut variabel pointer. Jadi variable pointer atau
pointer berisi suatu nilai yang menyatakan alamat suatu lokasi.
Suatu variable pointer didefinisikan dengan bentuk :
TipeData *NamaVariabel
Contoh :
a
*c
*d
Var
Value
Address
Step :
1.
d=&a *d = 2 ; d = A
2.
c=&b *c = 3 ; c = B
3.
b=*d b = 2 ; &b = B
4.
*d=*c *d = 2 ; d = A
Dari contoh di atas terlihat bahwa addres pada variabel pointer dapat berubah ubah,
apabila addres suatu variabel pointer berubah maka valuenya akan berubah sesuai addres
yang ditunjuk oleh pointer tersebut. Apabila pada address yang ditunjuk oleh pointer
tersebut mengalami perubahan value, maka value pada pointer juga akan berubah.
45/77
Contoh program :
1: #include<iostream.h>
2: #include<conio.h>
3: void main()
4: {
5:
int x;
6:
float y;
7:
long z;
8:
9:
x = 3;
10:
y = 3.7;
11:
z = 1000;
12:
13:
cout<<"isi variabel x = "<<x<<endl;
14:
cout<<"isi variabel y = "<<y<<endl;
15:
cout<<"isi variabel z = "<<z<<endl;
16:
17:
cout<<endl;
18:
19:
cout<<"alamat variabel x = "<<&x<<endl;
20:
cout<<"alamat variabel y = "<<&y<<endl;
21:
cout<<"alamat variabel z = "<<&z<<endl;
22:}
46/77
tersebut. Selain itu, dalam sebuah ADT yang lengkap, disertakan pula definisi invarian dari
TYPE dan aksioma yang berlaku. ADT merupakan definisi statik. Definisi type dari
sebuah ADT dapat mengandung sebuah definisi ADT lain.
Misalnya:
ADT Waktu yang terdiri dari ADT JAM dan ADT DATE
SEGI4
yang
terdiri
dari
pasangan
dua
buah
POINT
(Top,
Left)
dan
(Bottom,Right)
Type diterjemahkan menjadi type terdefinisi dalam bahasa yang bersangkutan, misalnya
menjadi record dalam bahasa Ada/Pascal atau struct dalam bahasa C. Primitif, dalam
konteks prosedural, diterjemahkan menjadi fungsi atau prosedur.
Primitif dikelompokkan menjadi :
Konstruktor/Kreator, pembentuk nilai type. Semua objek (variabel) bertype tsb harus
melalui konstruktor. Biasanya namanya diawali Make.
Selektor, untuk mengakses komponen type (biasanya namanya diawali dengan Get)
Prosedur pengubah nilai komponen (biasanya namanya diawali Get)
Validator komponen type, yang dipakai untuk mentest apakah dapat membentuk type
sesuai dengan batasan
Destruktor/Dealokator, yaitu untuk .menghancurkan. nilai objek (sekaligus memori
penyimpannya)
Baca/Tulis, untuk interface dengan input/output device
Operator relational, terhadap type tsb untuk mendefinisikan lebih besar, lebih kecil,
sama dengan, dsb
Aritmatika terhadap type tsb, karena biasanya aritmatika dalam bahasa pemrograman
hanya terdefinisi untuk bilangan numerik
Konversi dari type tersebut ke type dasar dan sebaliknya
ADT biasanya diimplementasi menjadi dua buah modul, yaitu:
Definisi/Spesifikasi Type dan primitif.
o Spesifikasi type sesuai dengan bahasa yang bersangkutan.
o Spesifikasi dari primitif sesuai dengan kaidah dalam konteks prosedural, yaitu:
47/77
Body/realisasi dari primitif, berupa kode program dalam bahasa yang bersangkutan.
Realisasi fungsi dan prosedur harus sedapat mungkin memanfaatkan selektor dan konstruktor.
III. Prepraktikum
1. Apa yang dimaksud dengan struktur ?
2. Diketahui definisi struktur dibawah ini (soal 2-6 berdasarkan yang detahui) :
struct S
{
int I;
char *c;
char c2[100];
float x;
48/77
long int l;
}
3. Berapakah struktur yang didefinisikan dari yang diketahui di atas ?
4. Berapakah anggota yang didefinisikan ?
5. Berapakah jumlah variabel struktur yang didefinisikan ? Jika ada, apa saja namanya ?
*d
*e
*
var
value
address
Cetak nilai dan alamat variabel-variabel di atas.
2.
Ubahlah program ADT pada contoh soal yang mana variable ADT merupakan
variable pointer.
V.
No
Deskripsi Jawaban
49/77
VII. Kesimpulan
50/77
Tujuan
II.
1.
2.
Dasar Teori
List Linier
List linier adalah sekumpulan elemen bertype sama, yang mempunyai keterurutan tertentu,
dan setiap elemennya terdiri dari dua bagian, yaitu informasi mengenai elemennya, dan
informasi mengenai alamat elemen suksesornya :
type ElmtList : <Info : InfoType, Next :address>
dengan InfoType adalah sebuah type terdefinisi yang menyimpan informasi sebuah elemen
list; Next adalah address ("alamat") dari elemen berikutnya (suksesor). Dengan
demikian, jika didefinisikan First adalah alamat elemen pertama list, maka elemen
berikutnya dapat diakses secara suksesif dari field Next elemen tersebut Alamat yang
sudah didefinisikan disebut sudah di-alokasi. Didefinisikan suatu konstanta Nil, yang
artinya alamat yang tidak terdefinisi. Alamat ini nantinya akan didefinisikan secara lebih
konkret ketika list linier diimplementasi pada struktur data fisik
51/77
INSERT-First
Menambahkan sebuah elemen yang diketahui alamatnya sebagai elemen pertama
list.Insert elemen pertama, List kosong :
52/77
Menambahkan sebuah elemen yang diketahui nilainya sebagai elemen pertama list.
Tahap pertama :
Insert Nilai 3 sebagai elemen pertama, List : karena yang diketahui adalah nilai, maka harus
dialokasikan dahulu sebuah elemen supaya nilai 3 dapat di-insert Jika alokasi berhasil, P
tidak sama dengan Nil
53/77
INSERT-After :
Menyisipkan sebuah elemen beralamat P setelah sebagai suksesor dari sebuah
elemen list linier yang beralamat Prec
INSERT-Last
Menyisipkan sebuah elemen beralamat P setelah sebagai elemen terakhir sebuah list linier.
Ada dua kemungkinan list kosong atau tidak kosong. Insert sebagai elemen terakhir list tidak
kosong.
DELETE-First : menghapus elemen pertama list linier Elemen yang dihapus dicatat
alamatnya :
54/77
DELETE-After :
Penghapusan suksesor sebuah elemen :
DELETE-Last :
Menghapus elemen terakhir list dapat dilakukan jika alamat dari elemen sebelum
elemen terakhir diketahui. Persoalan selanjutnya menjadi persoalan DELETEAFTER,
kalau Last bukan satu-satunya elemen list linier. Ada dua kasus, yaitu list menjadi
kosong atau tidak. Kasus list menjadi kosong :
III. Prepraktikum
1.
2.
3.
Jelaskan macam-macam linked list dan gambar dari macam-macam linked list
tersebut!
55/77
Nil NULL
info(P) (*P).info
next(P) (P)->next
First(L) ((L).First)
56/77
57/77
V.
No
Deskripsi Jawaban
1
.
.
4
2.
VII. Kesimpulan
58/77
Tujuan
II.
Dasar Teori
Karena aturan penyisipan dan penghapusan semacam itu, TOP adalah satu-satunya alamat
tempat terjadi operasi, elemen yang ditambahkan paling akhir akan menjadi elemen yang
akan dihapus. Dikatakan bahwa elemen Stack akan tersusun secara LIFO (Last In First
Out).
Struktur data ini banyak dipakai dalam informatika, misalnya untuk merepresentasi :
-
pemanggilan prosedur
rekursifitas
backtracking
Definisi Fungsional
Diberikan S adalah Stack dengan elemen ElmtS, maka definisi fungsional stack adalah :
59/77
Definisi Selektor adalah Jika S adalah sebuah Stack, maka Top(S) adalah alamat
elemen TOP, di mana operasi penyisipan/penghapusan dilakukan InfoTop(S) adalah
informasi yang disimpan pada Top(S).
Definisi Stack kosong adalah Stack dengan Top(S)=Nil (tidak terdefinisi). Implementasi
Stack dengan tabel :
Tabel dengan hanya representasi TOP adalah indeks elemen Top dari Stack. Jika
Stack kosong, maka TOP=0.
Ilustrasi Stack tidak kosong, dengan 5 elemen :
III. Preparktikum
1. Jelaskan struktur data stack!
2. Buatlah ilustrasi untuk masing-masing operasi pada stack!
Prototipe dan Primitif /Algoritma
1. Stack Statis
/* file : stackt.h */
60/77
61/77
IV.
Kegiatan Praktikum
1. Buat file boolean.h
2. Ketik prototipe/primitif di atas dan simpan dengan nama stackt.h dan stack.h.
3. Buat file .c yang berisi implementasi dari file .h.
4. Buat file main driver-nya.
V.
No
Deskripsi Jawaban
1
.
.
4
VI.
62/77
: sugus
VII. Kesimpulan
63/77
Tujuan
II.
Dasar Teori
c. Satu elemen dengan yang lain dapat diakses melalui informasi NEXT.
Struktur data ini banyak dipakai dalam informatika, misalnya untuk merepresentasi :
-
Maka secara lojik, sebuah QUEUE dapat digambarkan sebagai list linier yang setiap
elemennya adalah
type ElmtQ : < Info : InfoType, Next :address>
dengan InfoType adalah sebuah type terdefinisi yang menentukan informasi yang disimpan
pada setiap elemen queue, dan address adalah "alamat" dari elemen. Selain itu alamat
elemen pertama (HEAD) dan elemen terakhir(TAIL) dicatat : Maka jika Q adalah Queue dan
P adalah adaress, penulisan untuk Queue adalah : Head(Q),Tail(Q), Info(Head(Q)),
Info(Tail(Q)).
64/77
Algoritma paling sederhana untuk penambahan elemen jika masih ada tempat adalah
dengan memajukan TAIL. Kasus khusus untuk Queue kosong karena HEAD harus diset
nilainya menjadi 1. Algoritma paling sederhana dan naif untuk penghapusan elemen
jika Queue tidak kosong: ambil nilai elemen HEAD, geser semua elemen mulai dari
HEAD+1 s/d TAIL (jika ada), kemudian TAIL mundur. Kasus khusus untuk Queue
dengan keadaan awal berelemen 1, yaitu menyesuaikan HEAD dan TAIL dengan DEFINISI.
Algoritma ini mencerminkan pergeseran orang yang sedang mengantri di dunia nyata, tapi
tidak efisien.
65/77
III. Prepraktikum
1. Jelaskan struktur data queue!
2. Buatlah ilustrasi untuk masing-masing operasi pada queue!
Prototipe dan Primitif /Algoritma
/* Nama file QueueList.h */
#ifndef QueueList_H
#define QueueList_H
#include "boolean.h"
#include <stdio.h>
#include <stdlib.h>
#define Nil 0
#define MaxIdx 15
/* Definisi elemen dan address */
typedef int infotype;
typedef int address; /* Indeks tabel */
typedef struct
{
infotype Info;
address Next;
} ElmtQueue;
extern ElmtQueue TabMem[MaxIdx+1];
typedef struct
{
address HEAD; /* Alamat penghapusan */
address TAIL; /* Alamat penambahan */
} queue;
/** ===== Akses Selektor ===== **/
#define Head(Q) (Q).HEAD
#define Tail(Q) (Q).TAIL
#define InfoHead(Q) TabMem[(Q).HEAD].Info
#define InfoTail(Q) TabMem[(Q).TAIL].Info
#define Info(P) TabMem[(P)].Info
#define Next(P) TabMem[(P)].Next
/** ========== **/
/** ===== Prototype ===== **/
boolean IsEmpty(queue Q);
/* Mengirim TRUE jika Q kosong: Head=Nil dan Tail=Nil */
boolean IsFull(queue Q);
/* Mengirim TRUE jika tabel penampung elemen Q sudah penuh */
/* Yaitu mengandung MaxEl elemen */
int NbElmt(queue Q);
/* Mengirimkan banyaknya elemen queue. Mengirimkan 0 jika Q kosong */
/** ========== **/
/** ===== Kreator ===== **/
void Inisialisasi(void);
/* Menyiapkan memori untuk linked Queue agar siap dipakai */
void CreateEmpty(queue *Q);
/* Membuat sebuah Q kosong */
/** ========== **/
/** ===== Manajemen Memori ===== **/
void Alokasi (address *P, infotype X);
/* Mengirimkan address hasil alokasi sebuah elemen */
/* Jika alokasi berhasil, maka address tidak nil, dan misalnya */
/* menghasilkan P , maka info(P) = X, Next(P) = Nil */
/* Jika alokasi gagal, mengirimkan Nil */
void Dealokasi (address P);
/* I.S : P terdefinisi */
66/77
IV.
Kegiatan Praktikum
1. Buat file boolean.h
2. Ketik prototipe/primitif di atas dan simpan dengan namaADT Queue1.h.
3. Buat file .c yang berisi implementasi dari file .h.
4. Buat file main driver-nya.
V.
No
Deskripsi Jawaban
1
.
.
4
VI.
67/77
VII. Kesimpulan
68/77
Tujuan
II.
Dasar Teori
dan dua buah himpunan lain yang disjoint yang merupakan pohon biner, yang disebut
sebagai sub pohon kiri dan sub pohon kanan dari pohon biner tersebut. Perhatikanlah
perbedaan pohon biner dengan pohon biasa : pohon biner mungkin kosong, sedangkan pohon
n-aire tidak mungkin kosong.
Contoh pohon ekspresi aritmatika
Karena adanya arti bagi sub pohon kiri dan sub pohon kanan, maka dua buah pohon
biner sebagai berikut berbeda (pohon berikut disebut pohoncondong/skewed tree)
69/77
Pohon seimbang tingginya: perbedaan tinggi sub pohon kiri dengan sub pohon
kanan maksimum 1
Pohon seimbang banyaknya simpul: perbedaan banyaknya simpul sub pohon kiri
dengan sub pohon kanan maksimum 1
Untuk simpul yang sama nilainya : disimpan berapa kali muncul. Maka sebuah node P
akan menyimpan informasi : Info(P), Left(P), Right(P) , Count(P) yaitu banyaknya
kemunculan Info(P).
Contoh eksekusi penghapusan node pada pohon biner terurut:
70/77
III. Prepraktikum
1. Jelaskan struktur data tree/pohon!
2. Jelaskan masing - masing jenis traverse dan buatlah ilustrasinya!
Prototipe dan Primitif /Algoritma
/* file : bst.h */
#ifndef BST_H_
#define BST_H_
#include <stdlib.h>
#include <stdio.h>
#define Nil NULL
/* Lengkapilah definisi selektor dibawah ini */
#define Akar(P) (P)->info
#define Left(P) (P)->left
#define Right(P) (P)->right
#define IsUnerLeft(P) Left(P)!=Nil && Right(P)==Nil
#define IsUnerRight(P) Left(P)==Nil && Right(P)!=Nil
#define IsBin(P) Left(P)!=Nil && Right(P)!=Nil
#define IsDaun(P) Left(P)==Nil && Right(P)==Nil
typedef int infotype;
typedef struct tElmtTree *addrTree;
typedef struct tElmtTree {
infotype info;
addrTree left;
addrTree right;
} ElmtTree;
typedef addrTree BinTree;
BinTree Alokasi(infotype I);
/* Mengembalikan hasil alokasi sebuah BinTree P dengan Akar(P)=I, */
/* Left(P)=Nil dan Right(P)=Nil */
void Dealokasi(BinTree Node);
/* I.S : Node adalah sebuah BinTree dengan Left(Node)=Nil */
/* dan Right(Node)=Nil */
/* F.S : Node dihancurkan dan Node=Nil */
/* Proses : Menghancurkan alamat memori yang ditunjuk Node, dan */
/* nilai Node diset Nil */
void MakeTree(infotype I,BinTree L,BinTree R,BinTree *P);
/* I.S : I adalah infotype sembarang, L dan R mungkin Nil ,P */
/* sembarang */
/* F.S : P adalah sebuah pohon baru dengan Akar(*P)=I, */
/* Left(*P)=L, dan Right(*P)=Nil */
/* Proses : Mengalokasikan sebuah pohon baru *P dengan nilai */
/* Akar(*P)=I, Left(*P)=L, dan Right(*P)=Nil jika */
/* alokasi berhasil. Jika alokasi gagal P=Nil */
void DestroyTree(BinTree *P);
/* I.S : P adalah pointer ke BinTree, mungkin Nil */
/* F.S : Pohon Biner P dihancurkan, semua memori yang digunakan */
/* dikembalikan, dan P=Nil */
71/77
IV.
Kegiatan Praktikum
1. Buat file boolean.h
2. Ketik prototipe/primitif di atas dan simpan dengan nama bst.h
3. Buat file .c yang berisi implementasi dari file .h.
72/77
V.
No
Deskripsi Jawaban
1
.
.
4
VI.
VII. Kesimpulan
73/77
Tujuan
II.
Dasar Teori
Method yang memanggil dirinya sendiri baik secara langsung maupun secara tidak langsung.
Fungsi yang memanggil dirinya, secara langsung atau lewat fungsi lain, disebut fungsi
rekursif. Proses pemanggilan diri itu disebut rekursi (recursion).
Rekursif sangat memudahkan untuk memecahkan permasalahan yang kompleks. Ciri masalah
yang dapat diselesaikan secara rekursif adalah masalah itu dapat di-reduksi menjadi satu atau
lebih masalah-masalah serupa yang lebih kecil.
Sifat-sifat rekursif
Data yang berada dalam method tersebut seperti argument disimpan sementara
kedalam stack sampai method pemanggilnya diselesaikan
kasus induksi: satu atau lebih kasus yang pemecahan masalahnya dilakukan dengan
menyelesaikan masalah serupa yang lebih sederhana (yaitu menggunakan recursive
calls)
kasus dasar atau kasus penyetop (base case): satu atau lebih kasus yang sudah
sederhana sehingga pemecahan masalahnya tidak perlu lagi menggunakan recursivecalls.
Supaya tidak terjadi rekursi yang tak berhingga, setiap langkah rekursif haruslah
Kasus yang sangat sederhana yang dapat memproses input tanpa perlu melakukan
rekursif (memanggil method) lagi
74/77
ATURAN REKURSIF
Definisikan base case: yang dapat memproses input tanpa perlu recursive lagi
hindari duplikasi proses untuk nilai input yang sama dalam recursive call yang
terpisah.
75/77
Contoh Program
Rekursive
#include<stdio.h>
int fact_rec(int n)
{
if(n<0)
return 0;
else if (n==0)
return 1;
else if (n==1)
return 1;
else
return n * fact_rec(n-1);
}
void main()
{
int fac;
printf ("Masukkan berapa faktorial :");
scanf ("%d",&fac);
printf
(
"Hasil
faktorial
dari
%d\n",fact_rec(fac));
}
adalah
III. Prepraktikum
1.
2.
V.
No
Deskripsi Jawaban
76/77
VII. Kesimpulan
77/77
Referensi :
Fachrurrozi, M (2011). Modul Praktikum Struktur Data Fasilkom Unsri
Kernighan, Brian W and Dennis M. Ritchie. (1988). The C Programming Languange. New Delhi
: Prentice Hall of India
Kristanto, Andri. (2003). Algoritma dan Pemrograman dengan C++. Yogyakarta : Graha Ilmu
Liem, Inggriani. (2007). Diktat Algoritma dan Pemrograman Prosedural. Teknik Informatika ITB
Munir, Rinaldi. (2005). Algoritma dan Pemrograman dalam Bahasa Pascal dan C. Informatika
Bandung.
Sjukani, Moh. (2007). Algoritma (Algoritma dan Struktur Data 1) dengan C, C++, dan Java.
Jakarta : Mitra Wacana Media
78/77