MODUL PRAKTIKUM “ALGORITMA DAN STRUKTUR DATA”
LABORATORIUM KOMPUTER FAKULTAS ILMU KOMPUTER UNIVERSITAS SRIWIJAYA 2011
Universitas Sriwijaya Fakultas Ilmu Komputer Laboratorium
No. Dokumen Revisi
LEMBAR PENGESAHAN MODUL PRAKTIKUM
SISTEM MANAJEMEN MUTU ISO 9001:2008
……. 0
4 JUNI 2011 2 DARI 78
Tanggal Halaman
MODUL PRAKTIKUM
Mata Kuliah Praktikum Kode Mata Kuliah Praktikum SKS Program Studi Semester
: Algoritma Dan Struktur Data : FSK27211 :1 : Sistem Komputer : 3 (Ganjil)
DIBUAT OLEH
DISAHKAN OLEH
DIKETAHUI OLEH
TIM LABORAN LABORATORIUM FASILKOM UNSRI
TIM DOSEN SISTEM KOMPUTER FASILKOM UNSRI
KEPALA LABORATORIUM
2/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
3/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 2
3
4
1 : Menu Utama 2 : Toolbar 3 : Jendela pengetikan kode program 4 : Jendela Message/Pesan kesalahan kode
4/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.
5/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 langkahlangkahnya 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.
6/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 void main() { // Batang Tubuh Program Utama } Prepocessor Directive Adalah salah satu pengarah prepocessor directive yang tersedia pada C++. Preprocessor selalu dijalankan terlebih dahulu pada saat proses kompilasi terjadi. Bentuk umumnya : # include
7/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
Diperlukan pada program yang melibatkan objek cout
#include
Diperlukan bila melibatkan clscr(),yang perintah unrtuk membersihkan layar
#include
Diperlukan bila melibatkan setw() yang bermanfaat untuk mengatur lebar dari suatu tampilan data
#include
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 Fungsi yang akan dieksekusi pertama kali oleh c++ Menyatakan bahwa fungsi main tidak memiliki nilai balik Menyatakan bahwa fungsi tidak memiliki argumen Void main()
Batas atas program
{ cout<<”Hallo dunia”<
}
Pernyataan Tubuh Fungsi main ()
Batas akhir program Komentar Komentar merupakan bagian yang penting dalam program.Kehadirannya sangat membantu pemrogram taupun orang lain dalm memahami program,karena berupa penjelasan mengenai
8/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 : Tipe_data nama_variabel ; 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
9/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 Char Integer
Ukuran Memori (byte) 1 2
Long integer
4
Float Double long double
4 8 10
Jangkauan Nilai -128 hingga +127 -32768 hingga +32767 -2.147.438.648 hingga 2.147.438.647 3,4E-38 hingga 3,4E38 1.7E-308 hingga 1.7E308 3.4E-4932 hingga 1.1E4932
Jumlah Digit Presisi 6-7 15-16 19
Beberapa format yang dipakai untuk mencetak nilai numerik integer : Kode Format %i atau %d %u %li %lu %c %x %o
Hasil yang dicetak Numerik integer bertanda Numerik integer tak bertanda (unsigned integer) Numerik Long integer bertanda Numerik Unsigned Long Integerl Karakter ASCII 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(“=”).
10/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Operator Aritmatika OPERATOR + * / % -
DESKRIPSI Penjumlahan(add) Pengurangan(Substract) Perkalian(Multiply) Pembagian(Divide) Sisa Pembagian Integer(Modulus) Negasi(Negate)
CONTOH m+n m-n m*n m/n m%n -m
Operator Hubungan (Perbandingan) OPERATOR == != > < >= <=
ARTI Sama Dengan(bukan assignment) Tidak sama dengan Lebih besar Lebih kecil Lebih besar atau sama dengan Lebih kecil atau sama dengan
X==Y
CONTOH Apakah X sama dengan Y
X!=Y X>Y X=Y
Apakah X tidak sama dengan Y Apakah X lebih besar Y Apakah X lebih kecil Y Apakah X lebih dari sama dengan Y
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 MIN ^ 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 && II
11/77
DESKRIPSI Logic AND Logic OR
Fakultas Ilmu Komputer – Universitas Sriwijaya
CONTOH m && n m II n
!
Logic NOT
!m
III. Prepraktikum 1. Instal program Turbo C++ pada computer atau laptop 2. Buatlah contoh deklarasi masing-masing tipe dasar dalam Bahasa C atau C++ ! 3. Isilah tabel berikut ini untuk melakukan penelusuran kebenaran penulisan nama variabel-variabel ini. Nama Variabel Nama Nama anda Nama_anda $Nama$Anda 80mahasiswa rata-rata NIM huruf5
Benar/Salah
Alasan
Pembetulan
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 1: 2: 3: 4: 5: 6:
#include //header void main()//fungsi utama { printf(“Selamat Datang di }
Fakultas Ilmu Komputer”);//statement
3. Compile program dengan menekan Alt + F9 atau pilih menu Project Compile 4. Jalankan program dengan menekan Ctrl + F9 atau pilih menu Debug Run
12/77
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
13/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
1: #include 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 "<
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
14/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI. Kesimpulan
VII. Evaluasi dan Pertanyaan 1. Buatlah sebuah program untuk menghitung rumus x ! x
b 2c 2 4ab 2c
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 !
15/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) if (kondisi) Aksi; Gambar 3.2. Struktur Untuk Penyeleksian Satu Kasus (IF)
16/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
#include void main() { int a; a = 10; if (a%2==0) { printf(“%d adalah bilangan genap”,a); } }
Bentuk IF dengan operator Untuk operator logika AND : if (kondisi1 && kondisi2) Aksi; Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
#include void main() { int a = 10; if (a< 15 && a>9) { printf(“15 lebih besar dari %d lebih besar dari 9”,a); } }
Untuk operator logika OR : if (kondisi1 || kondisi2) Aksi; Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
#include void main() { int a = 15; if (a%5==0 || a%2==0) { printf(“%d habis dibagi 5 atau 2”,a); } }
Penyeleksian Dua Kasus, menggunakan struktur IF- ELSE: Dalam struktur IF-ELSE, aksi1 akan dilaksanakan jika kondisi bernilai benar (true), dan jika
17/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 if (kondisi) aksi1; else aksi2; Gambar 3.4. Struktur Untuk Penyeleksian Dua Kasus (IF-ELSE) Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
#include void main() { int a; printf(“Masukkan sebuah bilangan = ”); scanf(“%d”,&a); if (a%2==0) { printf(“%d adalah Bilangan genap”,a); } else { printf(“%d adalah Bilangan ganjil”,a); } }
Penyeleksian Tiga Kasus atau Lebih (Penyeleksian Tersarang) Untuk penyeleksian tiga kasus atau lebih juga menggunakan struktur IF-ELSE sebagaimana halnya permasalahan dua kasus.
18/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Gambar 3.5 Diagram Alir dari Struktur Tiga Kasus IF- ELSE (tersarang) if (kondisi1) pernyataan1; else if (kondisi2) pernyataan2; else if (kondisi3) pernyataan3; else if (kondisiM) pernyataanM; else /*Opsional*/ pernyataanN; /*Opsional*/ Gambar 3.6 Struktur Untuk Penyeleksian Tiga Kasus IF-ELSE (tersarang) Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
#include void main() { int T; printf(“Masukkan Nilai Suhu = ”); scanf(“%d”,&T); if (T<=0) { printf(“Kondisi Beku”); } else if (T>0 && T<=100) { printf(“Kondisi Cair”); } else { printf(“Kondisi Uap”); } }
19/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Struktur CASE Selain bentuk if, pengkondisian dalam bahasa C dapat pula menggunakan bentuk switch, sintaks penulisannya adalah sebagai berikut: switch(ekspresi) { case (kondisi1): Pernyataan1; break; case (kondisi2): Pernyataan2; break; : : case (kondisiN): PernyataanN; break; default: Pernyatanlain; break; } Contoh Program : 1: #include 2: 3: void main() 4: { 5: int nilai; 6: printf(”Masukkan nilai : “); 7: scanf(“%d”,&nilai); 8: 9: switch(nilai) 10: { 11: case(1): 12: { 13: printf(“satu\n”); 14: } 15: break; 16: case(2): 17: { 19: printf(“dua\n”); 20: } 21: break; 22: case(3): 23; { 24: printf(“tiga\n”); 25: } 26: break;
20/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
27: 28: 29: 30: 31: 32: } 33: }
default: { printf(“tidak ada nilai\n”); } break;
Pengulangan Struktur pengulangan terdiri atas dua bagian : 1. Kondisi pengulangan yaitu ekspresi Boolean yang harus dipenuhi untuk melaksanaakan pengulangan 2. Isi atau badan pengulangan yaitu satu atau lebih pernyataan(aksi) yang akan diulang.
Bentuk FOR Perulangan dalam bahasa C dapat menggunakan bentuk FOR, sintaks penulisannya adalah sebagai berikut : for (nilai awal; kondisi perulangan; operasi) { Statement } Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8:
#include void main() { for(int i = 0; i < 9; i++) { printf(“%d ”,i); } }
Bentuk WHILE Perulangan dalam bahasa C dapat pula menggunakan bentuk WHILE, sintaks penulisannya adalah sebagai berikut : while (kondisi) { Statement }
Contoh Program :
21/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
#include void main() { int i = 0; while(i<10) { printf(“%d\n”,i);; i++; } }
Bentuk DO-WHILE Perulangan dalam bahasa C dapat pula menggunakan bentuk DO-WHILE, sintaks penulisannya adalah sebagai berikut : do { Statement } while (kondisi); Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
#include void main() { int i = 0; do { printf(“%d\n”,i); i++; } while(i<10); }
III. Prepraktikum Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai. 1. Jelaskan pada kondisi apa sebaiknya struktur seleksi if dan case digunakan! Apa perbedaan dari kedua struktur tersebut? 2. Jelaskan perbedaan antara struktur pengulangan FOR, WHILE dan DO-While dan bagaimana hasilnya untuk implementasi masing-masing!
IV. Kegiatan Praktikum 1. Buat program untuk menentukan nilai dalam huruf dengan ketentukan mencari nilai akhir
22/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.
23/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
24/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:
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 : 1 2 3 4 5 6 .............................n
Dengan jumlah baris berupa suatu inputan oleh user
25/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
ketiga
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 : void Nama_Prosedur() { Statement } 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 : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
#include void garis(); void main() { garis(); printf(“Nama saya adalah ANI “); garis(); printf(“Saya adalah mahasiswa TEKNIK INFORMATIKA “); garis(); } void garis() { cout<<”-------------------------------------------“<
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
26/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. void Nama_Prosedur( TipeData variable1, TipeData variabel2 ) { Statement } Cara memanggil prosedur: NAMA_PROSEDUR(variabel1,variabel2); Contoh program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
#include void hitung(int a, int b) { int hasil; hasil=a+b; printf(“Hasilnya adalah %d”,&hasil); } void main() { int a,b; printf(“Masukkan nilai A : ”); scanf(a); printf(“Masukkan nilai B : ”); scanf(b); hitung(a,b); }
Prosedur dengan Parameter Masukan / Keluaran Parameter masukan/keluaran adalah parameter yang berfungsi sebagai masukan sekaligus keluaran bagi prosedur tersebut. void Nama_Prosedur( TipeData VariableMasukan, TipeData &VariabelMasukanKeluaran ) { Statement } Cara
memanggil
prosedur:
NAMA_PROSEDUR
VariabelMasukanKeluaran ); Contoh Program :
27/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
(VariabelMasukan,
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
#include void hitung(int a, int b, int &hasil) { int hasil; hasil=a+b; } void main() { int a,b,hasil; printf(“Masukkan nilai A : ”); scanf(a); printf(“Masukkan nilai B : ”); scanf(b); hitung(a,b,hasil); printf(“Hasil nya adalah %d”,hasil); }
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. TipeData Nama_Fungsi( TipeData variabel1, TipeData variabel2) { Statement return variabel } Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
#include int tambah(int a, int b); void main() { int a,b,hasil; printf(“Nilai a = “); scanf(“%d”,&a); printf(“Nilai b = “); scanf(“%d”,&b); hasil = tambah(a,b); printf(“Hasil = %d\n”,hasil); }
28/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
20: 21: int tambah(int a, int b) 22: { 23: int Hasil; 24: Hasil = a + b; 25: return Hasil; 26: }
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 : 1: 2: 3: 4: 5: 6: 7: 8: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
#include int a,b,hasil; int tambah(); void main() { printf(“Nilai a = “); scanf(“%d”,&a); printf(“Nilai b = “); scanf(“%d”,&b); hasil = tambah(); printf(“Hasil = %d\n”,hasil); } int tambah() { int Hasil; Hasil = a + b; return Hasil; }
III. Prepraktikum Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai. 1. Prosedur dan Fungsi merupakan pemrograman modular. Apakah perbedaan antara keduanya?
Kapankah
suatu fungsi dibuat dan digunakan?
Dan kapankah suatu
prosedur digunakan? Bisakah suatu kasus diselesaikan menggunakan prosedur dan fungsi? Sertai alasannya
29/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)
30/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
31/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 : tipe_array nama_array [jumlah data] Ilustrasi array satu dimensi
Array di atas mempunyai enam element. Contoh Program : 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
#include void main() { int a[5] = {10,25,30,45,50}; int i; for(i=0;i<5;i++) { printf(“%d = %d\n”,i,a[i]); } }
Array Multidimensi Array multidimensi adalah array yang mempunyai lebih dari satu dimensi. Misal : A[3][5] artinya array tersebut mempunyai 3 baris 5 kolom.
32/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Bentuk umum : tipe_array nama_array [jumlah data][jumlah data] Ilustrasi array satu dimensi
Array di atas mempunyai delapan belas element. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
#include void main() { int a[3][3] = {{10,20,30},{40,50,60},{70,80,90}}; int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf(“%d ”,a[i][j]); } printf(“\n”); } }
III. Prepraktikum Kerjakan tugas-tugas di bawah ini sebelum praktikum dimulai. 1.
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
33/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
V.
2.
Jalankan program nomor 1 dan analisa hasilnya
3.
Ubahlah program pada soal nomor 1 menjadi bentuk prosedur atau fungsi
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 2 1 2 2 2 1
34/77
menjadi
3 2 2
2 3 2
2 2 3
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
35/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Mulai
L[10] = {20,15,22,14,12,10,24,19,18,16} X
K=0
I = 0 s.d. 9
Data ditemukan di elemen i
L[i]=X
k = k +1 i
k=0
Data tidak ditemukan
Jumlah data = ,k
Selesai
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
36/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 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
37/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
38/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
39/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
40/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
41/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)].
42/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
43/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI.
Kesimpulan
VII. Evaluasi dan Pertanyaan 1.
Buatlah program quick sorting
2.
Buatlah program merge sorting
44/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 : TipeData *NamaVariabel 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.
45/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Contoh program : 1: #include 2: #include 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 = "<
Abstract Data Type (ADT) ADT adalah definisi TYPE dan sekumpulan PRIMITIF (operasi dasar) terhadap TYPE
46/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:
47/77
Fungsi : nama, domain, range dan prekondisi jika ada
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 #include 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 "<
III. Prepraktikum 1. Apa yang dimaksud dengan struktur ? 2. Diketahui definisi struktur dibawah ini (soal 2-6 berdasarkan yang detahui) : struct S { int I; char *c; char c2[100]; float x;
48/77
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
49/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
50/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Lembar Kerja Praktikum 8 : List I.
Tujuan
Setelah mengerjakan LKP 8 ini, anda diharapkan dapat:
II.
1.
Memahami konsep list dan mampu mengimplementasikannya ke bahasa C.
2.
Mampu melakukan operasi insert dan delete pada list.
Dasar Teori
List Linier List linier adalah sekumpulan elemen bertype sama, yang mempunyai keterurutan tertentu, dan setiap elemennya terdiri dari dua bagian, yaitu informasi mengenai elemennya, dan informasi mengenai alamat elemen suksesornya : type ElmtList : 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
51/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 :
52/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
53/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 :
54/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!
55/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 #define #define #define
Nil NULL info(P) (*P).info next(P) (P)->next 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*/
56/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
57/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
58/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 :
59/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 */
60/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 */
61/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 ?
62/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
63/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)).
64/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.
65/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 #include #define Nil 0 #define MaxIdx 15 /* Definisi elemen dan address */ typedef int infotype; typedef int address; /* Indeks tabel */ typedef struct { infotype Info; address Next; } ElmtQueue; extern ElmtQueue TabMem[MaxIdx+1]; typedef struct { address HEAD; /* Alamat penghapusan */ address TAIL; /* Alamat penambahan */ } queue; /** ===== Akses Selektor ===== **/ #define Head(Q) (Q).HEAD #define Tail(Q) (Q).TAIL #define InfoHead(Q) TabMem[(Q).HEAD].Info #define InfoTail(Q) TabMem[(Q).TAIL].Info #define Info(P) TabMem[(P)].Info #define Next(P) TabMem[(P)].Next /** ========== **/ /** ===== Prototype ===== **/ boolean IsEmpty(queue Q); /* Mengirim TRUE jika Q kosong: Head=Nil dan Tail=Nil */ boolean IsFull(queue Q); /* Mengirim TRUE jika tabel penampung elemen Q sudah penuh */ /* Yaitu mengandung MaxEl elemen */ int NbElmt(queue Q); /* Mengirimkan banyaknya elemen queue. Mengirimkan 0 jika Q kosong */ /** ========== **/ /** ===== Kreator ===== **/ void Inisialisasi(void); /* Menyiapkan memori untuk linked Queue agar siap dipakai */ void CreateEmpty(queue *Q); /* Membuat sebuah Q kosong */ /** ========== **/ /** ===== Manajemen Memori ===== **/ void Alokasi (address *P, infotype X); /* Mengirimkan address hasil alokasi sebuah elemen */ /* Jika alokasi berhasil, maka address tidak nil, dan misalnya */ /* menghasilkan P , maka info(P) = X, Next(P) = Nil */ /* Jika alokasi gagal, mengirimkan Nil */ void Dealokasi (address P); /* I.S : P terdefinisi */
66/77
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.
67/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VII. Kesimpulan
68/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 ()
69/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:
70/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 #include #define Nil NULL /* Lengkapilah definisi selektor dibawah ini */ #define Akar(P) (P)->info #define Left(P) (P)->left #define Right(P) (P)->right #define IsUnerLeft(P) Left(P)!=Nil && Right(P)==Nil #define IsUnerRight(P) Left(P)==Nil && Right(P)!=Nil #define IsBin(P) Left(P)!=Nil && Right(P)!=Nil #define IsDaun(P) Left(P)==Nil && Right(P)==Nil typedef int infotype; typedef struct tElmtTree *addrTree; typedef struct tElmtTree { infotype info; addrTree left; addrTree right; } ElmtTree; typedef addrTree BinTree; BinTree Alokasi(infotype I); /* Mengembalikan hasil alokasi sebuah BinTree P dengan Akar(P)=I, */ /* Left(P)=Nil dan Right(P)=Nil */ void Dealokasi(BinTree Node); /* I.S : Node adalah sebuah BinTree dengan Left(Node)=Nil */ /* dan Right(Node)=Nil */ /* F.S : Node dihancurkan dan Node=Nil */ /* Proses : Menghancurkan alamat memori yang ditunjuk Node, dan */ /* nilai Node diset Nil */ void MakeTree(infotype I,BinTree L,BinTree R,BinTree *P); /* I.S : I adalah infotype sembarang, L dan R mungkin Nil ,P */ /* sembarang */ /* F.S : P adalah sebuah pohon baru dengan Akar(*P)=I, */ /* Left(*P)=L, dan Right(*P)=Nil */ /* Proses : Mengalokasikan sebuah pohon baru *P dengan nilai */ /* Akar(*P)=I, Left(*P)=L, dan Right(*P)=Nil jika */ /* alokasi berhasil. Jika alokasi gagal P=Nil */ void DestroyTree(BinTree *P); /* I.S : P adalah pointer ke BinTree, mungkin Nil */ /* F.S : Pohon Biner P dihancurkan, semua memori yang digunakan */ /* dikembalikan, dan P=Nil */
71/77
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.
72/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
73/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 recursivecalls. 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
74/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 subproblem 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.
75/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
int factorial( int x ) { if (x == 1) return(1); else return(x * factorial(x-1)); }
Contoh Program
Rekursive
#include int fact_rec(int n) { if(n<0) return 0; else if (n==0) return 1; else if (n==1) return 1; else return n * fact_rec(n-1); } void main() { int fac; printf ("Masukkan berapa faktorial :"); scanf ("%d",&fac); printf ( "Hasil faktorial dari %d\n",fact_rec(fac)); }
adalah
:
III. Prepraktikum 1.
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
76/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI. Evaluasi dan Pertanyaan 1. Buatlah program dalam bentuk rekursif untuk mendapatkan nilai permutasi !
VII. Kesimpulan
77/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
78/77
Fakultas Ilmu Komputer – Universitas Sriwijaya