Modul Algoritma dan Struktur Data

78
MODUL PRAKTIKUM “ALGORITMA DAN STRUKTUR DATALABORATORIUM KOMPUTER FAKULTAS ILMU KOMPUTER UNIVERSITAS SRIWIJAYA 2011

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.

68/77

Fakultas Ilmu Komputer – Universitas Sriwijaya

VII. Kesimpulan

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