MODUL PRAKTIKUM
“ALGORITMA
DAN STRUKTUR DATA
”
LABORATORIUM KOMPUTER
FAKULTAS ILMU KOMPUTER
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
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
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
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.
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 :
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()
{
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
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
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
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
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
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)
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;
15/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI.
Kesimpulan
VII.
Evaluasi dan Pertanyaan
1. Buatlah sebuah program untuk menghitung rumus x !
c ab c b x
2 4 2 2
a,b,dan c sebagai masukan
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)
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: }
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: }
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: }
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: }
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) {
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: }
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
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
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
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: {
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 ) {
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:
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: {
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 :
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
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: }
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: }
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
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.
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
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.
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
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
40/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
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
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
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
44/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
VI.
Kesimpulan
VII.
Evaluasi dan Pertanyaan
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.
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:
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.
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) {
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
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 ?
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
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
53/77
Fakultas Ilmu Komputer – Universitas Sriwijaya
Menambahkan sebuah elemen yang diketahui nilainya sebagai elemen pertama list. Tahap pertama :
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
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!
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*/
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
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 ?
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 secaraLIFO (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
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
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);
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 ?
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
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