Modul Algoritma dan Struktur Data
Transcript of Modul Algoritma dan Struktur Data
MODUL PRAKTIKUM
“ALGORITMA DAN STRUKTUR DATA”
LABORATORIUM KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS SRIWIJAYA
2011
2/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Universitas Sriwijaya
Fakultas Ilmu Komputer
Laboratorium
LEMBAR PENGESAHAN
MODUL PRAKTIKUM
SISTEM MANAJEMEN
MUTU
ISO 9001:2008
No. Dokumen ……. Tanggal 4 JUNI 2011
Revisi 0 Halaman 2 DARI 78
MODUL PRAKTIKUM
Mata Kuliah Praktikum : Algoritma Dan Struktur Data
Kode Mata Kuliah Praktikum : FSK27211
SKS : 1
Program Studi : Sistem Komputer
Semester : 3 (Ganjil)
DIBUAT OLEH DISAHKAN OLEH DIKETAHUI OLEH
TIM LABORAN
LABORATORIUM
FASILKOM UNSRI
TIM DOSEN SISTEM
KOMPUTER FASILKOM
UNSRI
KEPALA LABORATORIUM
3/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Daftar Isi
Halaman Depan .......................................................................................................... 1
Lembar Pengesahan Modul Praktikum ...................................................................... 2
Daftar Isi .................................................................................................................... 3
Lembar Kerja Praktikum 1 : Pengenalan Lingkungan C dan C++ ............................ 4
Lembar Kerja Praktikum 2 : Pengkondisian dan Pengulangan ................................. 16
Lembar Kerja Praktikum 3 : Prosedur dan Fungsi..................................................... 26
Lembar Kerja Praktikum 4 : Array / Larik ................................................................ 32
Lembar Kerja Praktikum 5 : Searching ..................................................................... 35
Lembar Kerja Praktikum 6 : Sorting .......................................................................... 41
Lembar Kerja Praktikum 7 : Pointer dan ADT .......................................................... 45
Lembar Kerja Praktikum 8 : List ............................................................................... 51
Lembar Kerja Praktikum 9 : Stack............................................................................. 59
Lembar Kerja Praktikum 10 : Queue ......................................................................... 64
Lembar Kerja Praktikum 11 : Binary Search Tree .................................................... 69
Lembar Kerja Praktikum 12 : Rekursif ...................................................................... 74
Referensi .................................................................................................................... 78
4/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 1 : Pengenalan Lingkungan C dan C++
I. Tujuan
Setelah mengerjakan LKP 1 ini, anda diharapkan dapat:
1. mengenal lingkungan salah satu compiler bahasa pemrograman C yaitu Turbo C++
4.5.
2. menggunakan compiler tersebut untuk menyelesaikan kasus sederhana.
3. mengenal berbagai tipe data, operator dan statement I/O pada bahasa C dan C++.
4. menggunakan variable, tipe data, operator dan statement I/O untuk menyelesaikan
berbagai kasus sederhana.
II. Dasar Teori
Pengenalan Lingkungan Turbo C++ 4.5
Turbo C++ 4.5 adalah tool yang dipakai untuk membuat code program dalam bahasa C
ataupun C++. Berikut adalah jendela utama Turbo C++ 4.5.
1 : Menu Utama
2 : Toolbar
3 : Jendela pengetikan kode program
4 : Jendela Message/Pesan kesalahan kode
1
2
3
4
5/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Create new, Open, Save, Save As File
Untuk memulai membuat kode program di Turbo C++ 4.5 langkah-langkahnya adalah
sebagai berikut :
1. Buka Turbo C++ 4.5 dari menu program sehingga akan keluar jendela Turbo C++ berikut
:
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.
6/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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.
Compile Program, Pendeteksian Error dan Warning, Run Program
Setelah menuliskan kode program, maka berikutnya adalah compile program dengan tujuan
untuk mendeteksi kesalahan-kesalahan dalam penulisan kode program. Adapun langkah-
langkahnya adalah sebagai berikut :
1. Pilih menu Project > Compile, atau kombinasi tombol ALT+F9, akan tampil jendela
status compile seperti berikut :
Dari status di atas maka tidak ditemukan error atau warning pada program.
7/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 :
Jendela di bawah ini menunjukkan terdapat warning pada program.
Untuk melihat pesan warning tersebut, klik tombol OK.
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
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>
# prepocessor directive
void main()
{
// Batang Tubuh Program Utama
}
8/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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> Diperlukan pada program yang melibatkan objek cout
#include <conio.h> Diperlukan bila melibatkan clscr(),yang perintah unrtuk
membersihkan layar
#include <iomanip.h> Diperlukan bila melibatkan setw() yang bermanfaat untuk
mengatur lebar dari suatu tampilan data
#include <math.h> Diperlukan pada program yang menngunakan operasi sqrt()
yang bermanfaat untuk operasi matematika kuadrat
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
Komentar
Komentar merupakan bagian yang penting dalam program.Kehadirannya sangat membantu
pemrogram taupun orang lain dalm memahami program,karena berupa penjelasan mengenai
Void main()
{
cout<<”Hallo dunia”<<endl;
}
Pernyataan
Tubuh Fungsi main ()
Fungsi yang akan dieksekusi pertama kali oleh c++
Menyatakan bahwa fungsi main tidak memiliki nilai balik
Menyatakan bahwa fungsi tidak memiliki argumen
Batas atas program
Batas akhir program
9/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 */
Jenis 2 : // Komentar anda diletakkan disini ( hanya bisa perbaris )
Tanda Semikolon
Tanda semicolon “ ; ” digunakan untuk mengakhiri sebuah pernyataan. Setiap
pernyataan harus diakhiri dengan sebuah tanda semicolon.
Cout (dibaca : C out)
Pernyataan cout merupakan sebuah objek di dalam C++, yang digunakan untuk
mengarahkan data ke dalam standar output (cetak pada layar).
Variabel
Variabel adalah suatu pengenal (identifier) yang digunakan untuk mewakili suatu nilai
tertentu di dalam proses program. Berbeda dengan konstanta yang nilainya selalu tetap, nilai
dari suatu variable bisa diubah-ubah sesuai kebutuhan.
Deklarasi
Deklarasi diperlukan bila kita akan menggunakan pengenal (identifier) dalam program.
Identifier dapat berupa variable, konstanta dan fungsi.
Deklarasi Variabel
Bentuk umumnya :
Contoh : int x; //x di sini sebagai variabel bertype integer
float luas; //luas adalah variabel bertype float
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
Tipe_data nama_variabel ;
10/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 Ukuran Memori
(byte)
Jangkauan Nilai Jumlah Digit
Presisi
Char 1 -128 hingga +127 -
Integer 2 -32768 hingga +32767 -
Long integer 4 -2.147.438.648 hingga
2.147.438.647 -
Float 4 3,4E-38 hingga 3,4E38 6-7
Double 8 1.7E-308 hingga 1.7E308 15-16
long double 10 3.4E-4932 hingga 1.1E4932 19
Beberapa format yang dipakai untuk mencetak nilai numerik integer :
Kode Format Hasil yang dicetak
%i atau %d
%u
%li
%lu
Numerik integer bertanda
Numerik integer tak bertanda (unsigned integer)
Numerik Long integer bertanda
Numerik Unsigned Long Integerl
%c Karakter ASCII
%x
%o
Hexadecimal Integer
Octal Integer
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.
Field–field tersebut digabungkan menjadi satu tujuan untuk kemudahan dalam operasi.
Mengenai tipe data bentukan akan dibahas lebih lanjut pada mata kuliah Algoritma dan
Pemrograman 2.
Operator dan Statement I/O
Operator adalah symbol yang biasa dilibatkan dalam program untuk melakukan sesuatu
operasi atau manipulasi.
Operator Penugasan
Operator penugasan dalam bahasa C++ berupa tanda sama dengan(“=”).
11/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Operator Aritmatika
OPERATOR DESKRIPSI CONTOH
+ Penjumlahan(add) m + n
- Pengurangan(Substract) m - n
* Perkalian(Multiply) m * n
/ Pembagian(Divide) m / n
% Sisa Pembagian Integer(Modulus) m % n
- Negasi(Negate) -m
Operator Hubungan (Perbandingan)
OPERATOR ARTI CONTOH
== Sama Dengan(bukan
assignment)
X==Y Apakah X sama dengan Y
!= Tidak sama dengan X!=Y Apakah X tidak sama dengan Y
> Lebih besar X>Y Apakah X lebih besar Y
< Lebih kecil X<Y Apakah X lebih kecil Y
>= Lebih besar atau
sama dengan
X>=Y Apakah X lebih dari sama dengan Y
<= Lebih kecil atau sama
dengan
X<=Y Apakah X kurang dari sama dengan
Y
Operator Naik dan Turun (Increment dan Decrement)
Operator Increment ++
Operator Decrement --
Operator pre-increment dan post-decrement mempunyai fungsi yang sama yaitu,
untuk menambah atau mengurangi satu nilai.
Operator Bitwise
OPERATOR DESKRIPSI CONTOH
<< Geser n bit ke kiri M << N
>> Geser n bit ke kanan M >> N
& Bitwise AND M & N
I Bitwise OR M I N
^ Bitwise XOR M ^ N
~ Bitwise NOT ~M
NB : Seluruh operator bitwise hanya bisa dikenakan pada operand bertipe data int atau chaR.
Operator Logika
Operator logika digunakan untuk menghubungkan dua atau lebih ungkapan menjadi sebuah
ungkapan berkondisi.
OPERATOR DESKRIPSI CONTOH
&& Logic AND m && n
II Logic OR m II n
12/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 Benar/Salah Alasan Pembetulan
Nama
Nama anda
Nama_anda
$Nama$Anda
80mahasiswa
rata-rata
NIM
huruf5
4. Jelaskan aturan-aturan yang digunakan dalam penulisan nama variable.
IV. Kegiatan Praktikum
1. Bukalah software Turbo C++
2. Program mengeluarkan tulisan ”Selamat Datang di Fakultas Ilmu Komputer”
Algoritma
Deklarasi :
-
Algoritma :
write(“Selamat Datang di Fakultas Ilmu Komputer”)
Ketikkan kode program berikut berdasarkan algoritma yang diberikan diatas
3. Compile program dengan menekan Alt + F9 atau pilih menu Project Compile
4. Jalankan program dengan menekan Ctrl + F9 atau pilih menu Debug Run
! Logic NOT !m
1: #include <stdio.h> //header
2:
3: void main()//fungsi utama
4: {
5: printf(“Selamat Datang di Fakultas Ilmu Komputer”);//statement 6: }
13/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
5. Simpan file dengan nama Praktikum1.cpp
6. Buka file baru dengan menekan File New
7. Ketikkan kode program berdasarkan algoritma yang diberikan
Algoritma
Deklarasi :
-
Algoritma :
write(“Selamat Datang di Fakultas Ilmu Komputer”)
write(“Nama Anda”)
write(“Nim Anda”)
write(“Jurusan Anda”)
8. Simpan file dengan nama Praktikum2.cpp
9. Jalankan program praktikum2.cpp
10. Buatlah sebuah program menghitung volume balok dengan panjang = 2,lebar = 2,dan
tinggi = 1.type data tinggi,panjang, lebar dan volume adalah integer.
Algoritma
Deklarasi :
int panjang = 2
int lebar = 2
int tinggi = 1
volume : integer
Algoritma :
Volume panjang * lebar * tinggi
write(“volume balok adalah ” + volume)
Ketikkan kode program berikut berdasarkan algoritma yang diberikan diatas
14/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
11. Jalankan program soal nomor 10 dan analisa hasilnya
12. Buat program menghitung volume bola dengan phi sebagai konstanta dan jari-jari
sebagai masukan.
Algoritma
Deklarasi :
const Phi = 3.14 {konstanta}
v,r : real
Algoritma :
read(r)
v 1.33 * phi * r * r
write (v)
13. Jalankan program nomor 12 dan analisa hasilnya
V. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
13
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: }
15/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI. Kesimpulan
VII. Evaluasi dan Pertanyaan
1. Buatlah sebuah program untuk menghitung rumus x !
c
abcbx
2
42 2 a,b,dan c sebagai masukan
2. Buat sebuah program untuk menampilkan data mahasiswa berupa nama, nim, umur,
nilai (dalam decimal). Yang mana data tersebut berupa inputan dari user !
16/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 2: Pengkondisian dan Pengulangan
I. Tujuan
Setelah mengerjakan LKP 2 ini, anda diharapkan dapat:
1. memahami konsep pengkondisian dan pengulangan dalam pemrograman
2. mengenal berbagai bentuk pengkondisian dan pengulangan pada bahasa C.
3. menggunakan pengkondisian dan pengulangan untuk menyelesaikan berbagai kasus
sederhana.
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.
Gambar 3.1 Diagram Alir Struktur Penyeleksian Satu Kasus (IF)
Gambar 3.2. Struktur Untuk Penyeleksian Satu Kasus (IF)
if (kondisi)
Aksi;
17/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Contoh Program :
Bentuk IF dengan operator
Untuk operator logika AND :
Contoh Program :
Untuk operator logika OR :
Contoh Program :
Penyeleksian Dua Kasus, menggunakan struktur IF- ELSE:
Dalam struktur IF-ELSE, aksi1 akan dilaksanakan jika kondisi bernilai benar (true), dan jika
if (kondisi1 && kondisi2)
Aksi;
1: #include <stdio.h>
2: void main()
3: {
4: int a = 10;
5:
6: if (a< 15 && a>9)
7: {
8: printf(“15 lebih besar dari %d lebih besar dari 9”,a);
9: }
10: }
if (kondisi1 || kondisi2)
Aksi;
1: #include <stdio.h>
2: void main()
3: {
4: int a = 15;
5:
6: if (a%5==0 || a%2==0)
7: {
8: printf(“%d habis dibagi 5 atau 2”,a);
9: }
10: }
1: #include <stdio.h>
2: void main()
3: {
4: int a;
5:
6: a = 10;
7:
8: if (a%2==0)
9: {
10: printf(“%d adalah bilangan genap”,a);
11: }
12: }
18/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
kondisi bernilai salah (false) maka aksi2 yang akan dilaksanakan. Statemen else menyatakan
ingkaran (negation) dari kondisi.
Gambar 3.3 Diagram Alir Struktur IF- ELSE
Gambar 3.4. Struktur Untuk Penyeleksian Dua Kasus (IF-ELSE)
Contoh Program :
Penyeleksian Tiga Kasus atau Lebih (Penyeleksian Tersarang)
Untuk penyeleksian tiga kasus atau lebih juga menggunakan struktur IF-ELSE sebagaimana
halnya permasalahan dua kasus.
if (kondisi)
aksi1;
else
aksi2;
1: #include <stdio.h>
2:
3: void main()
4: {
5: int a;
6:
7: printf(“Masukkan sebuah bilangan = ”);
8: scanf(“%d”,&a);
9:
10: if (a%2==0)
11: {
12: printf(“%d adalah Bilangan genap”,a);
13: }
14: else
15: {
16: printf(“%d adalah Bilangan ganjil”,a);
17: }
18: }
19/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Gambar 3.5 Diagram Alir dari Struktur Tiga Kasus IF- ELSE (tersarang)
Gambar 3.6 Struktur Untuk Penyeleksian Tiga Kasus IF-ELSE (tersarang)
Contoh Program :
if (kondisi1)
pernyataan1;
else if (kondisi2)
pernyataan2;
else if (kondisi3)
pernyataan3;
else if (kondisiM)
pernyataanM;
else /*Opsional*/
pernyataanN; /*Opsional*/
1: #include <stdio.h>
2:
3: void main()
4: {
5: int T;
6:
7: printf(“Masukkan Nilai Suhu = ”);
8: scanf(“%d”,&T);
9:
10: if (T<=0)
11: {
12: printf(“Kondisi Beku”);
13: }
14: else if (T>0 && T<=100)
15: {
16: printf(“Kondisi Cair”);
17: }
18: else
19: {
20: printf(“Kondisi Uap”);
21: }
22: }
20/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Struktur CASE
Selain bentuk if, pengkondisian dalam bahasa C dapat pula menggunakan bentuk switch,
sintaks penulisannya adalah sebagai berikut:
Contoh Program :
switch(ekspresi)
{
case (kondisi1):
Pernyataan1;
break;
case (kondisi2):
Pernyataan2;
break;
:
:
case (kondisiN):
PernyataanN;
break;
default:
Pernyatanlain;
break;
}
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;
21/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 :
Contoh Program :
Bentuk WHILE
Perulangan dalam bahasa C dapat pula menggunakan bentuk WHILE, sintaks penulisannya
adalah sebagai berikut :
Contoh Program :
27: default:
28: {
29: printf(“tidak ada nilai\n”);
30: }
31: break;
32: }
33: }
for (nilai awal; kondisi perulangan; operasi)
{
Statement
}
1: #include <stdio.h>
2: void main()
3: {
4: for(int i = 0; i < 9; i++)
5: {
6: printf(“%d ”,i);
7: }
8: }
while (kondisi)
{
Statement
}
22/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Bentuk DO-WHILE
Perulangan dalam bahasa C dapat pula menggunakan bentuk DO-WHILE, sintaks
penulisannya adalah sebagai berikut :
Contoh Program :
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!
IV. Kegiatan Praktikum
1. Buat program untuk menentukan nilai dalam huruf dengan ketentukan mencari nilai
akhir
1: #include <stdio.h>
2:
3: void main()
4: {
5: int i = 0;
6: while(i<10)
7: {
8: printf(“%d\n”,i);;
9: i++;
10: }
11: }
do {
Statement
}
while (kondisi);
1: #include <stdio.h>
2:
3: void main()
4: {
5: int i = 0;
6: do
7: {
8: printf(“%d\n”,i);
9: i++;
10: }
11: while(i<10);
12: }
23/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Nilai akhir = (15% *laporan)+(15%*kuis)+(30%*mid)+(40%*uas)
Ketentuannya : A >85 s/d 100
B >70 s/d 85
C >55 s/d 70
D >40 s/d 55
E <40
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.
24/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
4
25/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI. Kesimpulan
VII. Evaluasi dan Pertanyaan
1. Buat sebuah program kalkulator sederhana dengan inputan berupa, bilangan pertama,
operator, dan bilangan kedua.
2. Buatlah program untuk menghitung pangkat dengan bilangan dan pemangkatnya
merupakan masukan dari user
3. Buatlah program untuk mengurutkan tiga buah bilangan bulat (dari yang terkecil ke
yang terbesar) yang dimasukkan melalui piranti masukan! (Asumsi: ketiga
bilangan yang dimasukkan adalah bilangan yang berbeda)
Contoh:
Masukkan bilangan pertama : 9
Masukkan bilangan kedua : 1
Masukkan bilangan ketiga : -7
Urutan bilangan: -7 1 9
4. Buat sebuah program yang dapat menampilkan keluaran sebagai berikut :
Dengan jumlah baris berupa suatu inputan oleh user
1
2 3
4 5 6
.............................n
26/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 3: Prosedur dan Fungsi
I. Tujuan
Setelah mengerjakan LKP 3 ini, anda diharapkan dapat:
1. memahami konsep fungsi dan prosedur dalam pemrograman
2. menggunakan fungsi dan prosedur untuk menyelesaikan berbagai kasus sederhana.
II. Dasar Teori
Definisi dan Bentuk Umum Prosedur
Prosedur adalah suatu fungsi yang tidak mengembalikan nilai, karena itu tipe data untuk
prosedur adalah void atau kosong. Sintaks penulisannya adalah sebagai berikut :
Cara memanggil prosedur: NAMA_PROSEDUR;
Ketika NAMA_PROSEDUR dipanggil, kendali program berpindah 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 :
Prosedur dengan Parameter Masukan
Parameter masukan adalah parameter yang nilainya berlaku sebagai masukan untuk
prosedur. Pada parameter masukan, nilai parameter aktual diisikan ke dalam parameter
void Nama_Prosedur()
{
Statement
}
1: #include <stdio.h>
2:
3: void garis();
4:
5: void main()
6: {
7: garis();
8: printf(“Nama saya adalah ANI “);
9: garis();
10: printf(“Saya adalah mahasiswa TEKNIK INFORMATIKA “);
11: garis();
12: }
13: void garis()
14: {
15: cout<<”-------------------------------------------“<<endl;
16: }
27/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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.
Cara memanggil prosedur: NAMA_PROSEDUR(variabel1,variabel2);
Contoh program :
Prosedur dengan Parameter Masukan / Keluaran
Parameter masukan/keluaran adalah parameter yang berfungsi sebagai masukan sekaligus
keluaran bagi prosedur tersebut.
Cara memanggil prosedur: NAMA_PROSEDUR (VariabelMasukan,
VariabelMasukanKeluaran );
Contoh Program :
void Nama_Prosedur( TipeData variable1, TipeData variabel2 )
{
Statement
}
1: #include <stdio.h>
2:
3: void hitung(int a, int b)
4: {
5: int hasil;
6: hasil=a+b;
7: printf(“Hasilnya adalah %d”,&hasil);
8: }
9:
10: void main()
11: {
12: int a,b;
13: printf(“Masukkan nilai A : ”);
14: scanf(a);
15: printf(“Masukkan nilai B : ”);
16: scanf(b);
17: hitung(a,b);
18: }
void Nama_Prosedur( TipeData VariableMasukan, TipeData &VariabelMasukanKeluaran )
{
Statement
}
28/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Definisi dan Bentuk Umum Fungsi
Fungsi juga merupakan modul program yang mempunyai tujuan spesifik. Fungsi
memberikan/mengembalikan (return) sebuah nilai dan tipe tertentu (tipe dasar atau tipe
bentukan). Fungsi diakses dengan memanggil namanya.
Contoh Program :
1: #include <stdio.h>
2:
3: void hitung(int a, int b, int &hasil)
4: {
5: int hasil;
6: hasil=a+b;
7: }
8:
9: void main()
10: {
11: int a,b,hasil;
12: printf(“Masukkan nilai A : ”);
13: scanf(a);
14: printf(“Masukkan nilai B : ”);
15: scanf(b);
16: hitung(a,b,hasil);
17: printf(“Hasil nya adalah %d”,hasil);
18: }
TipeData Nama_Fungsi( TipeData variabel1, TipeData variabel2)
{
Statement
return variabel
}
1: #include <stdio.h>
2:
3: int tambah(int a, int b);
4:
5: void main()
6: {
7: int a,b,hasil;
8:
9: printf(“Nilai a = “);
10: scanf(“%d”,&a);
11:
12: printf(“Nilai b = “);
13: scanf(“%d”,&b);
14:
15: hasil = tambah(a,b);
16:
17:
18: printf(“Hasil = %d\n”,hasil);
19: }
29/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Variabel Global dan Lokal
Variabel-variabel yang dideklarasikan di dalam bagian Deklarasi Prosedur ataupun Fungsi
bersifat “lokal” dan hanya dapat digunakan di dalam Prosedur/Fungsi yang melingkupinya
saja. Sedangkan variabel-variabel yang dideklarasikan di dalam program utama bersifat
“global” dan dapat digunakan di bagian manapun di dalam program, baik di dalam program
utama maupun di dalam Prosedur/Fungsi.
Contoh Program :
III. Prepraktikum
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1. Prosedur dan Fungsi merupakan pemrograman modular. Apakah perbedaan antara
keduanya? Kapankah suatu fungsi dibuat dan digunakan? Dan kapankah suatu
prosedur digunakan? Bisakah suatu kasus diselesaikan menggunakan prosedur dan
fungsi? Sertai alasannya
20:
21: int tambah(int a, int b)
22: {
23: int Hasil;
24: Hasil = a + b;
25: return Hasil;
26: }
1: #include <stdio.h>
2: int a,b,hasil;
3: int tambah();
4:
5: void main()
6: {
7:
8: printf(“Nilai a = “);
10: scanf(“%d”,&a);
11:
12: printf(“Nilai b = “);
13: scanf(“%d”,&b);
14:
15: hasil = tambah();
16:
17:
18: printf(“Hasil = %d\n”,hasil);
19: }
20:
21: int tambah()
22: {
23: int Hasil;
24: Hasil = a + b;
25: return Hasil;
26: }
30/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
IV. Kegiatan Praktikum
1. Buatlah program menghitung luas lingkaran dengan menggunakan prosedur dan ada
prosedur input, prosedur hitung, prosedur output.
Algoritma
Deklarasi :
r: integer
luas : float
procedur input(input/output r: integer) {input data jari jari}
procedur hitung(input/output r: integer, input/output luas:float)
{menghitung luas lingkaran}
procedur output(input r: integer, input luas:float) {menampilakan jari
jari dan luas lingkaran}
Algoritma :
input(r)
hitung(r,luas)
output(r,luas)
2. Jalankan program pada soal nomor 1 dan analisa hasilnya
3. Ubahlah program pada soal nomor 1 dengan menggunakan FUNGSI
4. Buatlah program menghitung factorial dengan menggunakan prosedur dimana
bilangan factorial nya merupakan masukkan dari user
Algoritma
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)
31/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
5. Jalankan program pada soal nomor 4 dan analisa hasilnya
6. Ubahlah program pada soal nomor 4 dengan menggunakan FUNGSI
V. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
6
VI. Kesimpulan
VII. Evaluasi dan Pertanyaan
1. Dengan menggunakan fungsi dan prosedur buatlah sebuah program untuk menghitung
Kelipatan Persekutuan Terkecil dari dua bilangan yang diinputkan
2. Dengan menggunakan fungsi dan prosedur buatlah sebuah program untuk menghitung
nilai sinus, cosinus, dan tangen dari sebuah sudut yang diinputkan
Petunjuk : Gunakan header “math.h”, serta fungsi – fungsi matematika pada Compiler
Turbo C++ 4.5
32/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 4: Array / Larik
I. Tujuan
Setelah mengerjakan LKP 4 ini, anda diharapkan dapat:
1. memahami konsep array dalam pemrograman
2. menggunakan array untuk menyelesaikan berbagai kasus sederhana.
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 keterurutan, misalnya integer atau karakter (karena ia
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 :
Ilustrasi array satu dimensi
Array di atas mempunyai enam element.
Contoh Program :
Array Multidimensi
Array multidimensi adalah array yang mempunyai lebih dari satu dimensi. Misal : A[3][5]
artinya array tersebut mempunyai 3 baris 5 kolom.
tipe_array nama_array [jumlah data]
1: #include <stdio.h>
2:
3: void main()
4: {
5: int a[5] = {10,25,30,45,50};
6: int i;
7:
8: for(i=0;i<5;i++)
9: {
10: printf(“%d = %d\n”,i,a[i]);
11: }
12: }
33/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Bentuk umum :
Ilustrasi array satu dimensi
Array di atas mempunyai delapan belas element.
III. Prepraktikum
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1. Sebutkan dan jelaskan keuntungan-keuntungan penggunaan larik dan matriks!
2. Kapankan sebaiknya larik dan matriks digunakan? Jelaskan!
IV. Kegiatan Praktikum
1. Buatlah program menjumlahkan 2 buah array. Array A ditambah Array B
menghasilkan Array C
Algoritma
Deklarasi :
ArrayA: array [1..5] of real
ArrayB: array [1..5] of real
ArrayC: array [1..5] of real
i : integer
Algoritma :
for i 1 to 5 do
tipe_array nama_array [jumlah data][jumlah data]
1: #include <stdio.h>
2:
3: void main()
4: {
5: int a[3][3] = {{10,20,30},{40,50,60},{70,80,90}};
6: int i,j;
7:
8: for(i=0;i<3;i++)
9: {
10: for(j=0;j<3;j++)
11: {
12: printf(“%d ”,a[i][j]);
13: }
14: printf(“\n”);
15: }
16: }
34/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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
2. Jalankan program nomor 1 dan analisa hasilnya
3. Ubahlah program pada soal nomor 1 menjadi bentuk prosedur atau fungsi
V. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
3
VI. Kesimpulan
VII. Evaluasi dan Pertanyaan
1. Buat program dengan larik untuk menghitung rata-rata deret bilangan ganjil 1... 100
yang habis dibagi 5
2. Buatlah program mengubah matriks inputan , seperti contoh berikut ini :
1 2 2 3 2 2
2 1 2 menjadi 2 3 2
2 2 1 2 2 3
35/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 5: Searching
I. Tujuan
Setelah mengerjakan LKP 5 ini, anda diharapkan dapat:
1. memahami konsep-konsep pencarian yang telah dibakukan.
2. menerapkan Pencarian dalam berbagai kasus sederhana
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)
Metode Pencarian Beruntun
Konsep yang digunakan dalam metode ini adalah membandingkan data-data yang ada
dalam kumpulan tersebut, mulai dari elemen pertama sampai elemen ditemukan, atau sampai
elemen terakhir. Perhatikan alur di bawah ini :
20 15 22 14 12 10 24 19 18 16
Data yang akan dicari adalah X, misal X = 10, maka elemen yang diperiksa adalah
elemen yang bernilai 10.
Flowchart
36/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Metode Pencarian Bagi Dua (Binary Search)
Metode ini diterapkan pada sekumpulan data yang sudah terurut (menaik atau menurun).
Metode ini lebih cepat dibandingkan metode pencarian beruntun. Data yang sudah terurut
menjadi syarat mutlak untuk menggunakan metode ini.
Konsep dasar metode ini adalah membagi 2 jumlah elemennya, dan menentukan apakah data
yang berada pada elemen paling tengah bernilai sama, maka langsung data tengah dicari
ditemukan. Jika data di elemen terurut naik, maka jika data yang berada di tengah kurang dari
data yang dicari, maka pencarian selanjutnya berkisar di elemen tengah ke kanan, dan begitu
seterusnya sampai ketemu atau tidak sama sekali. Dan sebaliknya untuk nilai data yang
berada di tengah lebih dari data yang dicari, maka pencarian selanjutnya berkisar di elemen
tengah ke kiri, dan begitu seterusnya sampai ketemu atau tidak sama sekali. Dan demikian
i
Jumlah data = ,k
Selesai
k = 0 Data tidak ditemukan
k = k +1
I = 0 s.d. 9
L[i]=X Data ditemukan di
elemen i
Mulai
L[10] = {20,15,22,14,12,10,24,19,18,16}
X
K = 0
37/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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.
Langkah-langkah untuk metode pencarian bagi dua.
1. Asumsikan data terurut secara horizontal dari indeks 0 samapi n-1, untuk menggunkan
istilah kanan dan kiri.
2. Misalkan kumpulan data yang berjumlah n adalah larik L, dan data yang akan dicari
adalah X.
3. Tentukan nilai indeks awal i=0 dan indeks akhir j = n-1.
4. Tentukan 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.
5. Asumsikan bahwa data terurut menaik (tergantung hasil nomor 3).
6. Misalkan variabel k adalah indeks paling tengah, diperoleh dengan rumus :
K = (I + j) div 2
7. Periksa, jika L[k] = x, maka data dicari langsung ketemu di elemen k.
8. Jika nomor 7 tidak terpenuhi, periksa jika L[k]<X, maka pencarian berikutnya dilakukan di
sisi kanan indeks k, lakukan proses seperti pada nomor 6, dimana nilai indeks I sekarang
sama dengan nilai indeks sebelumnya.
I=k
K=(i+j)div2
Dan seterusnya sampai nilai X dicari ketemu atau tidak sama sekali.
9. Jika nomor 8 tidak terpenuhi, maka tidak pasti nilai Lk]>X, maka pencarian berikutnya
dilakukan di sisi kiri indeks k, lakukan proses seperti pada nomor 6, dimana nilai indeks j
sekarang sama dengan nilai indeks k sebelumnya.
J=k
K=(i+j)div2
38/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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
39/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Elemen tengah sekarang adlah 1 dengan L[1} = 14
5. Karena nilai data di elemen tengah sama dengan nilai data yang dicari X, maka pencarian
berakhir. Data X ditemukan di iNdeks ke-1.
III. Prepraktikum
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1. Jelaskan konsep pencarian Beruntun
2. Jelaskan konsep pencarian Bagidua
3. Sebutkan dan jelaskan keuntungan-keuntungan penggunaan pencarian beruntun
dan bagi dua!
IV. Kegiatan Praktikum
1. Buatlah program pencarian beruntun berdasarkan langkah langkah yang telah
djelaskan diatas.
2. Buatlah program pencarian bagi dua berdasarkan langkah langkah yang telah
dijekaskan diatas
V. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
2
VI. Kesimpulan
VII. Evaluasi dan Pertanyaan
1. Buat program untuk menghapus atau mengubah sebuah data di dalam sekumpulan
nilai, langkah pertama yang harus ditempuh adalah mencari data tersebut, lalu
menghapus atau mengubahnya dengan menggunakan metode pencarian beruntun
40/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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
41/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 6: Sorting
I. Tujuan
Setelah mengerjakan LKP 6 ini, anda diharapkan dapat:
1. memahami dan menterjemahkan metode pencarian
2. menerapkan pengurutan dalam berbagai kasus sederhana
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]
Bermacam-macam metode yang dipakai untuk melakukan pengurutan, antara lain :
- 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
Metode Pengurutan Gelembung
Metode ini diinspirasi oleh gelembung sabun yang berada di permukaan air. Karena berat
jenis gelembung sabun lebih ringan dibandingkan dengan berat jenis air, sehingga gelembung
42/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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
Jika data-data tersebut disimpan di dalam larik L, maka :
1. Untuk pengurutan menaik, pembandingnya sebagai berikut :
L[n] < L{n-1]
2. Untuk pengurutan menurun, pembandingnya sebagai berikut :
L[n] > L[n-1]
Jika kondisi diatas terpenuhi, maka nilai data yang ada di indeks n-1 akan ditukar dengan
nilai data yang ada di indeks n.
Metode Pengurutan Pilih ( Selection Sort)
Metode ini memiliki konsep memilih data yang maksimum/minimum dari suatu kumpulan
data larik L, lalu menempatkan data tersebut ke elemen paling akhir atau paling awal sesuai
pengurutan yang diinginkan. Data maksimum/minimum yang diperoleh, diasingkan ke
tempat lain, dan tidak diikutsertakan pada proses pencarian data maksimum/minimum
berikutnya. Perhatikan ilustrasi berikut :
Misalkan ada sekumpulan data acak berjumlah n elemen yang disimpan di dalam larik L,
akan diurut menaik, maka langkah-langkah yang harus dilakukan adalah :
1. Menentukan jumlah iterasi, yaitu pass = n-2
2. Untuk setiap pass ke-I = 0,1,2, … , pass, lakukan
a. Cari elemen terbesar (maks) dari elemen ke-i sampai ke-(n-1)
b. Pertukaran maks dengan elemen ke-i
c. Kurangin n sayu (n = n -1)
Rincian tiap-tiap pas adalah sebagai berikut :
- pass 0
Cari elemen maksimum di dalam L[0 … (n-1)].
43/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Pertukarkan elemen maksimum dengan elemen L[n-1]
- 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
Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai.
1. Jelaskan konsep pengurutan bubble sort, selection sort
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. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
3
44/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI. Kesimpulan
VII. Evaluasi dan Pertanyaan
1. Buatlah program quick sorting
2. Buatlah program merge sorting
45/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 7 : Pointer dan ADT
I. Tujuan
Setelah mengerjakan LKP 7 ini, anda diharapkan dapat:
1. Memahami konsep pointer di dalam Bahasa C
2. Memahami konsep copy value dan copy address
3. Menggunakan pointer di dalam program lainnya
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 :
Contoh :
a *c b *d Var
2 * 3 * Value
A * B * 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.
TipeData *NamaVariabel
46/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Contoh program :
Pemberian Memori Alokasi Pada Pointer
Sebuah pointer itu tidak memiliki alamat, sehingga pointer harus menumpang pada variabel
lain. Namun sekarang kita memberikan alamat kepada variabel pointer sehingga pointer
tidak lagi menumpang pada variabel lain.Untuk membuat alamat menggunakan malloc yang
disesuaikan dengan panjang data.
Contoh Program :
Abstract Data Type (ADT)
ADT adalah definisi TYPE dan sekumpulan PRIMITIF (operasi dasar) terhadap TYPE
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:}
VariabelPointer = (TipeData *) malloc(sizeof(TipeData));
1: #include<iostream.h>
2: #include<conio.h>
3: #include<malloc.h>
4:
5: void main()
6: {
7: int *p;
8:
9: p =(int *)malloc(sizeof(int));//membuat alamat
10:
11: *p=5;//deklarasi nilai
12:
13: cout<<"isi P "<< *p<<endl;
14: cout<<"alamat P "<<p<<endl;
15: }
47/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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
GARIS yang terdiri dari dua buah POINT
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:
Fungsi : nama, domain, range dan prekondisi jika ada
48/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Prosedur : Initial State, Final State dan Proses yang dilakukan
Body/realisasi dari primitif, berupa kode program dalam bahasa yang bersangkutan.
Realisasi fungsi dan prosedur harus sedapat mungkin memanfaatkan selektor dan konstruktor.
Sebuah contoh pendeklarasian struktur dapat dilihat dibawah ini :
struct data_tanggal
{
int tahun;
int bulan;
int tanggal;
};
Anggota struktur diakses dengan menggunakan bentuk :
variabel_struktur.nama_anggota
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;
#include<iostream.h> typedef struct lingkaran{
float r;
float keliling;
float luas;
};
void kllluas(lingkaran &L);
void main()
{
lingkaran L;
cout<<"masukkan jari-jari :";
cin>>L.r;
kllluas (L);
cout<<" keliling "<<L.keliling<<endl;
cout<<" luas "<<L.luas;
}
void kllluas(lingkaran &L)
{
L.keliling = 2*3.14*L.r;
L.luas =3.14*L.r*L.r;
}
49/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 ?
IV. Kegiatan Praktikum
1. Terjemahkan prototipe/primitive kasus pointer di berikut ini ke dalam bahasa C
dengan langkah-langkah :
a. d=&a
b. c=a
c. e=&b
d. b=c
e. *d=c
Prototipe dan Primitif / Algoritma
a b c
2 3 5
A B C
*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. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
50/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
2
VI. Evaluasi dan Pertanyaan
1. Untuk kasus pointer, ketikkan code berikut ;
&c = d;
Apa yang terjadi ? alasanya ?
2. Untuk kasus pointer, hapus code &c = d;, ganti dengan kode berikut :
d = &c;
Apakah masih error ? alasannya ?
3. Untuk kasus array, bagaimana jika nilai n diubah menjadi n=3 ?
VII. Kesimpulan
51/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 8 : List
I. Tujuan
Setelah mengerjakan LKP 8 ini, anda diharapkan dapat:
1. Memahami konsep list dan mampu mengimplementasikannya ke bahasa C.
2. Mampu melakukan operasi insert dan delete pada list.
II. 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 :
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
Jadi, sebuah list linier dikenali :
elemen pertamanya, biasanya melalui alamat elemen pertama yang disebut : First alamat
elemen berikutnya (suksesor), jika kita mengetahui alamat sebuah elemen,yang dapat
diakses melalui informasi NEXT. NEXT mungkin ada secaraeksplisit (seperti contoh
di atas), atau secara implisit yaitu lewat kalkulasi atau fungsi suksesor. Setiap elemen
mempunyai alamat, yaitu tempat elemen disimpan dapat diacu. Untuk mengacu sebuah
elemen, alamat harus terdefinisi. Dengan alamat tersebut Informasi yang tersimpan
type ElmtList : <Info : InfoType, Next :address>
52/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
pada elemen list dapat diakses elemen terakhirnya.
Ada berbagai cara untuk mengenali elemen akhir
Jika L adalah list, dan P adalah address:
Alamat elemen pertama list L dapat diacu dengan notasi :
First(L)
Elemen yang diacu oleh P dapat dikonsultasi informasinya dengan notasi Selektor :
Info(P)
Next(P)
Beberapa definisi :
o List L adalah list kosong, jika First(L) = Nil
o Elemen terakhir dikenali, misalnya jika Last adalah alamat element terakhir, maka
Next(Last) =Nil
INSERT-First
Menambahkan sebuah elemen yang diketahui alamatnya sebagai elemen pertama
list.Insert elemen pertama, List kosong :
53/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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
54/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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.
Insert sebagai elemen terakhir list tidak kosong
DELETE-First : menghapus elemen pertama list linier Elemen yang dihapus dicatat
alamatnya :
55/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 :
List tidak menjadi kosong (masih mengandung elemen) :
III. Prepraktikum
1. Jelaskan struktur data linked list!
2. Jelaskan operasi-operasi pada linked list!
3. Jelaskan macam-macam linked list dan gambar dari macam-macam linked list
tersebut!
56/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Prototipe dan Primitif /Algoritma
/*file : list1.h*/
/*contoh ADT list berkait dengan representasi fisik pointer*/
/*representasi address dengan pointer*/
/*infotype adalah integer*/
#ifndef list_H
#define list_H
#include "boolean.h"
#define Nil NULL
#define info(P) (*P).info
#define next(P) (P)->next
#define First(L) ((L).First)
#define infotype int
typedef struct tElmtlist *address;
typedef struct tElmtlist
{
infotype info;
address next;
} Elmtlist;
/*Definisi list*/
/*List kosong : First(L) = Nil*/
/*Setiap elemen dengan address P dapat diacu info(P), Next (P)*/
/*Elemen terakhir list : jika addressnya Last, maka Next(Last) = Nil*/
typedef struct
{
address First;
} List;
/*PROTOTYPE*/
/*test list kosong*/
boolean ListEmpty (List L);
/*true jika list kosong*/
/*PEMBUATAN LIST KOSONG*/
void CreateList (List *L);
/*membentuk list kosong*/
/*MANAJEMEN MEMORI*/
address alokasi (infotype X);
/*mengirimkan address hasil alokasi sebuah elemen*/
/*jika alokasi berhasil, maka address tidak nil, dan */
/*bila menghasilkan P, maka info(P) = X, Next(P) = Nil*/
/*jika alokasi gagal, mengirimkan Nil*/
void dealokasi (address P);
/*mengembalikan P ke sistem*/
/*melakukan dealokasi/pengembalian address P*/
57/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
/*PRIMITF BERDASARKAN ALAMAT*/
void InsertFirst(List *L, address P);
/*menambahkan elemen beraddress P sebagai elemen pertama*/
void InsertAfter(List *L, address P, address Prec);
/*Prec pastilah elemen list dan bukan elemen terakhir*/
void InsertLast(List *L, address P);
/*P ditambahkan sebagai elemen terakhir yang baru*/
/*PENGHAPUSAN SEBUAH ELEMEN*/
void DelFirst(List *L, address *P);
/*P adalah alamat elemen pertama list sebelum penghapusan*/
/*elemen list berkurang satu, firstelemen baru adalah suksesor elemen
pertama yang lama*/
void DelP(List *L, infotype X);
/*jika ada elemen list beraddress P, dengan info(P) = X*/
/*maka P dihapus dari list dan didealokasi*/
/*jika tak ada, maka list tetap*/
void DelLast (List *L, address *P);
/*P adalah alamat elemen terakhir list sebelum penghapusan*/
/*Last Elemen yang baru adalah predesesor elemen pertama yang lama*/
void DelAfter(List *L, address *Pdel, address Prec);
/*Prec adalah anggota list*/
/*menghapus Next (Prec)*/
/*PROSES SEMUA ELEMEN LIST*/
void Printinfo(List L);
/*semua info yang disimpan pada elemen list diprint*/
/*jika list ksoong, hanya menuliskan "list kosong"*/
int NbElmt(List L);
/*mengirimkan banyaknya elemen list, 0 bila list kosong*/
infotype Max(List L);
/*mengirimkan nilai info(P) yang maksimum*/
infotype Min(List L);
/*mengirimkan nilai info(P) yang minimum*/
#endif
IV. Kegiatan Praktikum
1. Ketik kode program dibawah ini kemudian simpan dengan nama boolean.h
58/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
2. Ketik prototipe/primitif di atas dan simpan dengan nama list.h.
3. Buat file list.c yang berisi implementasi dari list.h.
4. Buat file main driver mlist.c.
V. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
4
VI. Evaluasi dan Pertanyaan
1. Tuliskan algoritma untuk nilai maksimum list dan minimum list ?
2. Tambahkan program untuk mencetak address max dan address min ?
VII. Kesimpulan
59/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 9 : Stack
I. Tujuan
Setelah mengerjakan LKP 9 ini, anda diharapkan dapat:
1. Memahami konsep stack dan mengimplemetasikannya ke bahasa C.
2. Mampu melakukan operasi pop dan push pada stack.
II. Dasar Teori
Stack (Tumpukan) adalah list linier yang :
1. Dikenali elemen puncaknya (TOP)
2. Aturan penyisipan dan penghapusan elemennya tertentu :
- Penyisipan selalu dilakukan "di atas" TOP
- Penghapusan selalu dilakukan pada TOP
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
- perhitungan ekspresi artimatika
- rekursifitas
- backtracking
- dan algoritma lanjut yang lain
Definisi Fungsional
Diberikan S adalah Stack dengan elemen ElmtS, maka definisi fungsional stack adalah :
60/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 */
61/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
/* deklarasi type dan prototype */
#ifndef stackt_H
#define stackt_H
#include "boolean.h"
#define MaxEl 10
#define Nil 0
typedef int infotype;
typedef int address;
typedef struct { infotype T[MaxEl+1];
address Top;
} Stackt;
//Prototype
//Kreator
void CreateEmpty(Stackt *S);
//Mengirim true jika stack kosong
boolean IsEmpty(Stackt *S);
//mengirim true jika penampung sudah penuh
boolean IsFull(Stackt *S);
//menambahkan elemen ke stack
void Push(Stackt *S, infotype X);
//menghapus sebuah elemen stack
void Pop(Stackt *S);
#endif
2. Stack Dinamis
/* File: stack.h */
#ifndef stack_h
#define stack_h
#define true 1
#define false 0
#define boolean unsigned char
int infotype, address;
typedef struct{
int top;
int *T;
int size;
} stack;
/* ***** Konstruktor/Kreator ***** */
/* Membuat sebuah stack s yang kosong berkapasitas size */
void CreateEmpty(stack *s, int size);
/* Destruktor : Dealokasi seluruh table memori sekaligus */
62/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
void destruct(stack *s);
/* Mengirim true jika tabel penampung nilai elemen stack penuh */
boolean IsFull(stack s);
/* Mengirim true jika stack kosong */
boolean IsEmpty(stack s);
/* Menambahkan x sebagai elemen stack s */
void push(stack *s, int x);
/* Menghapus x dari stack s */
void pop(stack *s, int *x);
/* Menambahkan x sebagai elemen stack s, jika s mencapai nilai
maksimum */
/* maka s akan melakukan grow, yaitu menambah kapasitas maksimum */
void pushgrow(stack *s, int x);
/* Menambah kapasitas penampung stack s */
void grow(stack *s);
/* Menghapus x dari stack s. Jika s mencapai nilai minimum */
/* maka s akan melakukan shrink, yaitu mengurangi kapasitas maksimum
*/
void popshrink(stack *s, int *x);
/* Mengurangi kapasitas maksimum penampung stack s */
void shrink(stack *s);
#endif
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. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
4
VI. Evaluasi dan Pertanyaan
1. Tulis algoritma Push dan Pop pada stack statis dan dinamis ?
2. Sehubungan dengan pertanyaan 1, ada perbedaankah ? beri penjelasan ?
63/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
3. Tentukan apakah sebuah kalimat yang diinputkan dalam program (dengan
menggunakan stack) adalah sebuah polindrom atau bukan. Polindrom adalah kalimat
yang jika dibaca dari depan dan dari belakang, maka bunyinya sama.
Contoh :
Kalimat : sugus
Kalimat tersebut adalah polindrom
VII. Kesimpulan
64/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 10 : Queue
I. Tujuan
Setelah mengerjakan LKP 10 ini, anda diharapkan dapat:
1. Memahami konsep Queue dan mengimplementasikannya ke bahasa C.
2. Mampu melakukan operasi add dan delete pada queue.
II. Dasar Teori
Queue adalah list linier yang :
a. Dikenali elemen pertama (HEAD) dan elemen terakhirnya (TAIL),
b. Aturan penyisipan dan penghapusan elemennya didefinisikan sebagai berikut:
- Penyisipan selalu dilakukan setelah elemen terakhir
- Penghapusan selalu dilakukan pada elemen pertama
c. Satu elemen dengan yang lain dapat diakses melalui informasi NEXT.
Struktur data ini banyak dipakai dalam informatika, misalnya untuk merepresentasi :
- antrian job yang harus ditangani oleh sistem operasi
- antrian dalam dunia nyata.
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)).
65/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Definisi Fungsional Queue
Diberikan Q adalah QUEUE dengan elemen ElmtQ maka definisi fungsional antrian adalah:
Implementasi QUEUE dengan tabel :
Memori tempat penyimpan elemen adalah sebuah tabel dengan indeks 1..IdxMax. IdxMax
dapat juga dipetakan ke kapasitas Queue. Representasi field Next: Jika i adalah address
sebuah elemen, maka suksesor i adalah Next dari elemen Queue.
Tabel dengan hanya representasi TAIL adalah indeks elemen terakhir, HEAD selalu diset
sama dengan 1 jika Queue tidak kosong. Jika Queue kosong, maka HEAD=0. Ilustrasi Queue
tidak kosong, dengan 5 elemen :
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.
66/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 */
67/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
/* F.S : P dikembalikan ke sistem */ /* Melakukan dealokasi/pengembalian address P */
/** ========== **/ /** ===== Primitif Add/Delete ===== **/ void Add(queue *Q, infotype X);
/* Menambahkan X pada Q dengan aturan FIFO */
/* Jika Tail(Q)=MaxEl+1 maka geser isi tabel, shg Head(Q)=1 */ /* precondition: tabel penampung elemen Q tidak penuh */ void Del(queue *Q, infotype *X);
/* Menghapus X pada Q dengan aturan FIFO */ /* precondition: tabel penampung elemen Q tidak kosong */
/** ========== **/ #endif
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. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
4
VI. Evaluasi dan Pertanyaan
1. Tuliskan algoritma add dan delete pada queue di atas ?
2. Buatlah program antrian nasabah bank dengan skenario seperti berikut !
Terdapata 2 buah loket yaitu Teller dan Custumer service.
Data nasabah terdiri dari Nama dan Tujuan.
Maksimal antrian 20 orang nasabah untuk setiap loket.
Jika nasabah yang datang menuju teller, masukkan antrian ke teller dan sebaliknya
jika nasabah ingin menuju Custumer Service, masukkan pada antrian Custumer
service. Untuk mengetahui apakah nasabah menuju ke Teller atau Custumer service
dapat dilihat pada data tujuan. Berikan pula fungsi untuk mengitung jumlah nasabah
baik yang ada di loket Teller maupun loket Custumer service.
69/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 11 : Binary Search Tree
I. Tujuan
Setelah mengerjakan LKP 11 ini, anda diharapkan dapat:
1. Memahami konsep binary search tree dan mengimplementasikannya ke bahasa C.
2. Mampu melakukan operasi add dan delete dan search pada tree.
II. Dasar Teori
Sebuah pohon biner adalah himpunan terbatas yang
- mungkin kosong, atau
- terdiri dari sebuah simpul yang disebut akar
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)
Sub pohon ditunjukkan dengan penulisan ()
70/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Pohon Seimbang (balanced tree)
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
Pohon Biner Terurut (Binary serach tree)
Pohon biner terurut P memenuhi sifat :
Semua simpul subpohon kiri selalu < dari Info(P)
Semua simpul subpohon kiri selalu > dari Info(P)
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:
71/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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 */
72/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
/* Proses : Menghancurkan pohon biner P, semua memori yang */
/* digunakan dihancurkan dan P=Nil */
void PrintTree(BinTree P);
/* I.S : P adalah pohon biner mungkin kosong */
/* F.S : P tidak berubah, semua nilai dituliskan ke layar */
/* Proses : Menuliskan semua nilai info dari setiap simpul pohon
/* dengan notasi prefix contoh : (7(3()(5()()))(11()())) */
BinTree Search(BinTree P,infotype I);
/* Mengembalikan alamat simpul pohon P dimana nilai info = I, jika */
/* tidak ada mengembalikan Nil */
int NbElmt(BinTree P);
/* Mengembalikan jumlah simpul dari pohon P, P mungkin kosong */
int NbDaun(BinTree P);
/* Mengembalikan jumlah daun dari pohon P, P mungkin kosong */
int IsSkewLeft(BinTree P);
/* Mengembalikan 1 jika P adalah pohon condong kiri, atau 0 jika
/* bukan condong kiri */
int IsSkewRight(BinTree P);
/* Mengembalikan 1 jika P adalah pohon condong kanan, atau 0 */
/* jika bukan condong kanan */
int Level(BinTree P,infotype I);
/* Mengembalikan level I dalam pohon P, jika I tidak ada dalam */
/* pohon P mengembalikan 0 */
void Add(BinTree *P,infotype I);
/* I.S : P adalah pointer ke pohon biner P mungkin kosong, */
/* Pohon P tidak mempunyai simpul dengan nilai I */
/* F.S : I menjadi salah satu simpul pohon P, dan P tetap */
/* memenuhi aturan biner search tree */
/* Proses : menambahkan I menjadi salah satu simpul pohon P */
/* dengan aturan biner search tree */
void Del(BinTree *P,infotype I);
/* I.S : P adalah pointer ke pohon biner P mungkin kosong, */
/* I bernilai sembarang */
/* F.S : Jika terdapat simpul dari P dengan nilai info = I, maka */
/* simpul dihapus */
/* Proses : Menghapus simpul dari pohon P jika nilai info = I dan P */
/* tetap memenuhi aturan biner search tree */
infotype Sum(BinTree P);
/* Mengembalikan hasil penjumlahan semua nilai info dari setiap */
/* simpul yang dimiliki pohon P */
#endif // BST_H
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.
73/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
4. Buat file main driver-nya.
V. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
.
.
4
VI. Evaluasi dan Pertanyaan
1. Tuliskan algoritma add dan delete tree di atas ?
2. Buatlah fungsi untuk menampilkan data secara inorder, preorder, postorder, dan
fungsi menghapus suatu node pada tree!
3. Buatlah program lengkap untuk semua operasi-operasi didalam tree (insert, find,
traverse, count, height, find max, find min, child) dengan berbasis menu !
VII. Kesimpulan
74/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 12 : Rekursif
I. Tujuan
Setelah mengerjakan LKP 12 ini, anda diharapkan dapat:
1. Memahami konsep rekursif dan mengimplementasikannya ke bahasa C.
2. Mampu mengimplementasikannya ke dalam bahasa C dan C++.
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
Dapat digunakan ketika inti dari masalah terjadi berulang kali
Sedikit lebih efisien dari iterasi tapi lebih elegan
Method-methodnya dimungkinkan untuk memanggil dirinya sendiri
Data yang berada dalam method tersebut seperti argument disimpan sementara
kedalam stack sampai method pemanggilnya diselesaikan
Secara umum, algoritma rekursif selalu mengandung dua macam kasus:
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 recursive-
calls.
Supaya tidak terjadi rekursi yang tak berhingga, setiap langkah rekursif haruslah
mengarah ke kasus penyetop (base case).
Punya kasus dasar
Kasus yang sangat sederhana yang dapat memproses input tanpa perlu melakukan
rekursif (memanggil method) lagi
75/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Rekursif mengarah ke kasus dasar
Percaya.
Pada proses pemanggilan rekursif, asumsikan bahwa pemanggilan rekursif
(untuk problem yang lebih kecil) adalah benar.
Contoh: pangkatRekursif (x, n)
Asumsikan: pangkatRekursif (x, n - 1) menghasilkan nilai yang benar.
Nilai tersebut harus diapakan sehingga menghasilkan nilai pangkatRekursif (x,
n) yang benar?
Jawabannya: dikalikan dengan x
Aturan penggabungan: Hindari duplikasi pemanggilan rekursif untuk sub-
problem yang sama
Method rekursif adalah method yang memanggil dirinya sendiri baik secara langsung
maupun secara tidak langsung.
ATURAN REKURSIF
Definisikan base case: yang dapat memproses input tanpa perlu recursive lagi
Pada bagian rekursif pastikan akan bergerak menuju base case.
Asumsikan bahwa pemanggilan rekursif terhadap sub problem berjalan benar.
hindari duplikasi proses untuk nilai input yang sama dalam recursive call yang
terpisah.
Bila memungkinkan lakukan tail recursive.
76/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Contoh Program
III. Prepraktikum
1. Jelaskan apa yang dimaksud dengan rekursif ?
2. Jelaskan perbedaan antara iterasi dan rekrusif ?
Prototipe dan Primitif /Algoritma
IV. Kegiatan Praktikum
1. Buat Program untuk menghitung bilangan fibonachi dengan menggunakan rekursif ?
V. Hasil LKP (ditulis tangan di kertas A4)
No Deskripsi Jawaban
1
int factorial( int x )
{
if (x == 1)
return(1);
else
return(x * factorial(x-1));
}
#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 adalah :
%d\n",fact_rec(fac));
}
Rekursive
77/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI. Evaluasi dan Pertanyaan
1. Buatlah program dalam bentuk rekursif untuk mendapatkan nilai permutasi !
VII. Kesimpulan
78/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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