LAPORAN AKHIR PRAKTIKUM STRUKTUR DATA
NAMA
: SUPRIYANDI
NIM
: DBC 113 170
KELAS
:B
MODUL
: V (PENCARIAN DATA)
JURUSAN TEKNIK INFORMATIKA FAKULTAS TEKNIK UNIVERSITAS PALANGKA RAYA 2014
BAB I TUJUAN DAN LANDASAN TEORI
A. Tujuan Praktikum 1. Mengetahui beberapa metode pencarian data. 2. Mampu menggunakan metode pencarian data pada sebuah program untuk menyelesaikan masalah. B. Landasan Teori Pencarian data (searching) merupakan proses fundamental dalam pengelolaan data. Proses pencarian adalah menemukan nilai (data) tertentu di dalam sekumpulan data yang bertipe sama (baik bertipe dasar atau bertipe bentukan). Pada himpunan yang tidak terurut, dapat digunakan metode pencarian sekunsial (Sequential Search) untuk mencari data. Sedngkan pada himpunan data tidak terurut dapat digunakan metode pencarian sekuensial (Sequential Search) dan biner (Binary Search). Berikut ini merupakan penjelasan dari metode pencarian tersebut. 1. Pencarian Sequensial (Sequensial Search) Sequential Searching adalah Metoda pencarian linier secara berurutan.
Metode
pencarian
linier
cukup
mudah
untuk
di
implementasikan di dalam penulisan sebuah program. Metoda ini menggunakan cara dengan diawali dari ujung sebelah kiri lalu melakukan perbandingan masing masing dari elemen yang ada dengan elemen pencarian. Jika sudah ditemukan, maka pencarian segera berakhir dan fungsi akan menghasilkan nilai True. Sementara jika elemen yang dicari tidak ditemukan hingga akhir dari suatu larik maka pencarian akan berakhir dengan tidak adanya elemen dalam larik tersebut dan fungsi akan menghasilkan nilai False. Dalam melakukan pencarian dalam metoda ini larik atau deretan nilai harus diurutkan terlebih dahulu karena telah terurut maka
kita tahu bahwa elemen yang kita cari nilainya sudah lebih besar dari elemen pada array list yang ditunjuk oleh index. Kita tidak perlu melakukan pencarian lebih lanjut karena elemen yang kita cari pasti tidak akan kita temukan di bagian sisa array yang ada. Ini memungkinkan pencarian berlangsung secara lebih cepat saat elemen yang kita cari berada di bagian depan array list yang ada. Tentu saja berlawanan yaitu jika elemen yang dicari berada di ujung bagian array list.
Procedure SequensialSort (Var A : Tabel; N : integer; x : tipedata;
Var iSearch : integer);
{IS : A adalah tabel dengan banyaknya data N. x adalah data yang dicari dan bertipe sama dengan elemen tabel} {FS : iSearch <> 0 bila A[iSearch] = x , iSearch = 0 bila x tidak ditemukan di A} Var i : integer; {counter} Begin If (N = 0) then iSearch := 0 {tabel berisi data 0} Else Begin i := 1; While ((A[i].NIM < x) and (i < N)) do i := i + 1; If (A[i].NIM = x) then iSearch
:= i;
iSearch
:= 0;
Else End; End;
2. Pencarian Biner (Binary Search) Binary Search adalah suatu metode dalam Searching dengan cara konvensional yaitu pencarian selalu mulai dari ujung kiri larik dimana hal itu di tunjukan oleh inisiasi objek index dengan nilai 0. Selanjutnya kita lakukan penelusuran larik untuk melakukan pencarian larik hingga ke ujung larik tercapai. Untuk memahami bagaimana Binary Search bekerja, bayangkan saat kita mencoba menebak bilangan diantara rentang 1 – 100 secara terurut yang diberikan salah seorang teman kepada kita.misalkan untuk setiap tebakan yang kita buat, teman kita akan mengatakan tebakan kita benar,terlalu kecil atau terlalu besar.tebakan terbaik saat awal tentu nya 50 jika tebakan tersebut terlalu tinggi selanjutnya kita sebaiknya menebak 25 , sementara jika terlalu besar tebakan kita selanjutnya 75. Setiap kali menebak kita selalu memilih di tengah tengah dengan menyesuaikan batas bawah dan batas atas bilangan. Ada tiga kemungkinan yang akan terjadi, yaitu : (1) data ditengah = data yang dicari : pencarian selesai, data ditemukan, (2) data ditengah < data yang dicari : pencarian data di sebelah “kanan”, dan (3) data di tengah > data yang dicari : pencarian di sebelah “kiri”. Proses dilakukan berulang-ulang sampai data ditemukan atau himpunan data tidak bisa dibagi lagi.
Procedure BinarySort (Var A : Tabel; N : integer; x : tipedata; Var iSearch : integer); {IS : A adalah tabel dengan banyaknya data N. x adalah data yang dicari dan bertipe sama dengan elemen tabel}
{FS : iSearch <> 0 bila A[iSearch] = x, iSearch = 0 bila x t6idak ditemukan pada A} Var
Bawah, atas, tengah : integer; Found
: Boolean;
Begin If (N = 0) then iSearch := 0 {tabel berisi data 0} Else Begin Bawah := 1; Atas := N; Found := false; While ((not found) and (atas > bawah)) do Begin Tengah := (bawah + atas) div 2; If (A[tengah].NIM = x) then Found := true; Else If (A[tengah].NIM = x) then Atas := tengah – 1; Else Bawah := tengah + 1; End; If found then iSearch := tengah; Else iSearch := 0; End; End;
BAB II LANGKAH KERJA
Buatlah sebuah program dengan ketentuan sebagai berikut : 1. Pencarian (searching) data dengan menggunakan kedua metode : a. Pencarian Sekuensial b. Pencarian Biner 2. Masukan awal adalah data bertipe record Pegawai Perusahaan yang telah terurut membesar (ascending) dengan elemen : Nomor_Pegawai
: integer;
Nama_Pegawai
: string[30];
Bagian
: string[20];
Gaji
: integer;
3. Pencarian data didasarkan pada Nomor_Induk pegawai yang dicari. Perintah untuk melakukan pencarian tidak hanya sekali, bisa dilakukan berulang-ulang sesuai keinginan pengguna/user. 4. Keluaran/hasil berupa data yang dicari untuk setiap perintah pencarian.
BAB III PEMBAHASAN
Pada Modul V (Pencarian Data) ini, kita disuruh membuat sebuah program untuk menampilkan data pegawai dengan metode pencarian Sekuensial dan metode pencarian biner. Pencarian data didasarkan pada Nomor Pegawai yang dicari. Perintah untuk melakukan pencarian bisa dilakukan berulang-ulang sesuai keinginan pengguna/user. Output/keluaran berupa data yang dicari untuk perintah pencarian. Listing programnya sebagai berikut: program searching; uses crt; const nmax = 100; type rdata = record nip
: integer;
nama : string[30]; bag
: string[20];
gaji : longint; end; adata = array [1..nmax] of rdata; var data : adata; n : integer; plh, ch : char;
procedure inputData(var A:adata; var ndata:integer); var
i : integer; begin clrscr; writeln('INPUTKAN DATA PEGAWAI'); writeln; write('Banyaknya data pegawai : '); readln(ndata); writeln; for i:=1 to ndata do begin writeln('Pegawai Ke-',i); write('Nomor pegawai
: '); readln(A[i].nip);
write('Nama pegawai
: '); readln(A[i].nama);
write('Bagian
: '); readln(A[i].bag);
write('Gaji
: '); readln(A[i].gaji);
writeln; end; writeln; write('TEKAN ENTER UNTUK MENU'); readkey; end;
function menu : char; var c : char; begin clrscr; writeln('MENU SEARCHING'); writeln; writeln('1. Pencarian Sekuensial');
writeln('2. Pencarian Biner'); writeln('3. Keluar Program'); repeat writeln; write('Pilih 1, 2 atau 3 = '); c := readkey; writeln(c); if not (c in ['1','2','3']) then writeln('Input Salah !!!'); until(c in ['1','2','3']); menu := c; end;
procedure sekuensial(var A:adata; ndata: integer); var i : integer; nomor : integer; begin clrscr; writeln('--- Pencarian Sekuensial ---'); writeln; write('Masukkan Nomor Pegawai yang dicari : '); readln(nomor); writeln; writeln('Hasil Pencarian :'); writeln; i:=1; while ((A[i].nip < nomor) and (i<=ndata)) do i := i + 1; if (A[i].nip=nomor) then
begin writeln('Data ditemukan !!!'); writeln('Nomor pegawai
: ',A[i].nip);
writeln('Nama pegawai
: ',A[i].nama);
writeln('Bagian
: ',A[i].bag);
writeln('Gaji
: ',A[i].gaji);
end else writeln('Maaf! Data tidak bisa ditemukan !!!'); end;
procedure biner(var A:adata; ndata: integer); var bawah, atas, nomor : integer; tengah : integer; found : boolean; begin clrscr; writeln('--- Pencarian Biner ---'); writeln; write('Masukkan Nomor Pegawai yang dicari : '); readln(nomor); writeln; writeln('Hasil Pencarian :'); writeln;
bawah := 1; atas := ndata; found := false;
while (not found) and (atas>=bawah) do begin tengah := (bawah+atas) div 2; if (A[tengah].nip=nomor) then found := true else if (A[tengah].nip>nomor) then atas := tengah - 1 else bawah := tengah + 1; end;
if found then begin writeln('Data ditemukan !!!'); writeln('Nomor pegawai
: ',A[tengah].nip);
writeln('Nama pegawai
: ',A[tengah].nama);
writeln('Bagian
: ',A[tengah].bag);
writeln('Gaji
: ',A[tengah].gaji);
end else writeln('Maaf! Data tidak bisa ditemukan !!!'); end;
{program utama} begin inputData(data,n); writeln; repeat plh := menu;
case plh of '1' : sekuensial(data,n); '2' : biner(data,n); '3' : exit; end; writeln; repeat writeln; write('mau cari lagi..???(Y/T)'); ch := readkey; if not (ch in ['Y','T']) then writeln(' >> Input Salah !!!'); until(ch in ['Y','T']); until(ch='0'); end.
Pembahasan : program searching; uses crt; const nmax = 100; var data : adata; n : integer; plh, ch : char;
Bagian diatas adalah bagian awal dari program ini. Pada bagian awal ini dibuat sebuah konstanta yaitu nmax dengan nilai 100, ini berfungsi untuk menetapkan variabel baru ( const Max ) dengan panjang karakter 100 (yang berarti bernilai konstan). type rdata = record nip
: integer;
nama : string[30]; bag
: string[20];
gaji : longint; end; adata = array [1..nmax] of rdata;
Coding diatas merupakan penentuan type yang akan kita gunakan. Penentuan ini hampir sama seperti penentuan pada variable yaitu dengan menetapkan tipe data yang tepat. Saya menggunakan variabel longint karena jika menggunakan integer rentang nilainya hanya (-32768 s/d 32767) apabila melebihi 32767 maka akan bernilai (-) sehingga tidak cocok untuk memasukkan nilai gaji yang bisa saja melebihi angka tersebut. Sedangkan longint memiliki rentang
nilai
(2147483648
s/d
2147483647)
mendeklarasikan suatu gaji seseorang.
sehingga
cocok
untuk
rdata = array[1..NMAX] of rdata; fungsi array tersebut adalah bermaksud bahwa data yang dimasukan memiliki jumlah karakter maksimum yaitu setara dengan definisi yang telah ditentukan sebelumnya pada const NMAX. var data : adata; n : integer; plh, ch : char;
Coding diatas merupakan variabel global, sedangkan coding program yang berada di dalam fungsi atau prosedure adalah merupakan sebuah variabel local. Variable inilah yang berpengaruh terhadap keseluruhan program. Semua sub program dapat mengakses, mempergunakan, dan memodifikasi variable tersebut.Namun pada setiap procedure akan diberikan lagi variabelnya selain pada penentuan variable globalnya. procedure inputData(var A:adata; var ndata:integer); var i : integer; begin clrscr; writeln('INPUTKAN DATA PEGAWAI'); writeln; write('Banyaknya data pegawai : '); readln(ndata); writeln; for i:=1 to ndata do begin writeln('Pegawai Ke-',i); write('Nomor pegawai
: '); readln(A[i].nip);
write('Nama pegawai
: '); readln(A[i].nama);
write('Bagian
: '); readln(A[i].bag);
write('Gaji
: '); readln(A[i].gaji);
writeln; end; writeln; write('TEKAN ENTER UNTUK MENU'); readkey; end;
Procedure ini berfungsi untuk melakukan penginputan data. Dalam penginputan data, procedure ini tidak menggunakan implementasi pada pointer. Sesuai dengan ketentuan tugas pada modul ini, pengguna diminta untuk memasukan nominal/jumlah data yang kira-kira akan dimasukan. Setelah itu, barulah data dapat diinputkan sebanyak n data yang disesuaikan dengan rumus
“for i:=1 to ndata do”.
function menu : char; var c : char; begin clrscr; writeln('MENU SEARCHING'); writeln; writeln('1. Pencarian Sekuensial'); writeln('2. Pencarian Biner'); writeln('3. Keluar Program'); repeat writeln; write('Pilih 1, 2 atau 3 = '); c := readkey; writeln(c); if not (c in ['1','2','3']) then writeln('Input Salah !!!');
until(c in ['1','2','3']); menu := c; end;
Pada bagian ini, merupakan sebuah fungsi yang digunakan untuk membuat sebuah menu utama yang nantinya akan akan tampil pada saat program dijalan, sehingga pengguna akan menjadi lebih mudah pada saat melakukan pemakaian pada programnya. procedure sekuensial(var A:adata; ndata: integer); var i : integer; nomor : integer; begin clrscr; writeln('--- Pencarian Sekuensial ---'); writeln; write('Masukkan Nomor Pegawai yang dicari : '); readln(nomor); writeln; writeln('Hasil Pencarian :'); writeln; i:=1; while ((A[i].nip < nomor) and (i<=ndata)) do i := i + 1; if (A[i].nip=nomor) then begin writeln('Data ditemukan !!!'); writeln('Nomor pegawai
: ',A[i].nip);
writeln('Nama pegawai
: ',A[i].nama);
writeln('Bagian
: ',A[i].bag);
writeln('Gaji
: ',A[i].gaji);
end else writeln('Maaf! Data tidak bisa ditemukan !!!'); end;
Procedure ini merupakan sebuah procedur pencarian data sequential. Pada procedure ini, pernyataan yang digunakan adalah pernyataan yang mnggunakan while-do. While-do dapat digunakan apabila bilangan cacah perulangan masih belum diketahui. While-do memerlukan inisialisasi
nilai
awal
terlebih
dahulu
dan
besarnya
nilai
penambahan/penurunan pada variable pencacah yang digunakan sebagai pengendali untuk menghentikan perulangan. Pada procedure ini terdapat suatu keadaan/kondisi dimana while
((A[i].nip
<
nomor) dan (i<=ndata)) do. apabila kondisi tersebut terpenuhi,
maka rumus yang akan dijalankan adalah i:= i+1. procedure biner(var A:adata; ndata: integer); var bawah, atas, nomor : integer; tengah : integer; found : boolean; begin clrscr; writeln('--- Pencarian Biner ---'); writeln; write('Masukkan Nomor Pegawai yang dicari : '); readln(nomor); writeln; writeln('Hasil Pencarian :'); writeln;
bawah := 1;
atas := ndata; found := false;
while (not found) and (atas>=bawah) do begin tengah := (bawah+atas) div 2; if (A[tengah].nip=nomor) then found := true else if (A[tengah].nip>nomor) then atas := tengah - 1 else bawah := tengah + 1; end;
if found then begin writeln('Data ditemukan !!!'); writeln('Nomor pegawai
: ',A[tengah].nip);
writeln('Nama pegawai
: ',A[tengah].nama);
writeln('Bagian
: ',A[tengah].bag);
writeln('Gaji
: ',A[tengah].gaji);
end else writeln('Maaf! Data tidak bisa ditemukan !!!'); end;
Procedure ini adalah procedure yang menjalankan fungsi pencarian secara biner. Pada procedure ini, penentuan terhadap variable kembali dilakukan yaitu untuk membuat variable lokal yang akan digunakan pada procedure fungsi yang terdapat pada bagian procedure ini. Pada procedure ini juga terdapat sebuah rumus untuk melakukan pencarian
data. Kondisi yang ada adalah while ((not found) and (atas>=bawah)) do….. maka jika kondisi tersebut terpenuhi langkah yang akan dikerjakan adalah dengan menggunakan rumus tengah:=(atas+bawah) dan data ditemukan, berarti hasilnya akan ada/dianggap benar (true). Namun jika tidak maka tahapan yang akan dikerjakan adalah dengan menggunakan rumus atas:=tengah-1, dan apabila tetap tidak terpenuhi akan menggunakan bawah:=tengah+1. {program utama} begin inputData(data,n); writeln; repeat plh := menu; case plh of '1' : sekuensial(data,n); '2' : biner(data,n); '3' : exit; end; writeln; repeat writeln; write('mau cari lagi..???(Y/T)'); ch := readkey; if not (ch in ['Y','T']) then writeln(' >> Input Salah !!!'); until(ch in ['Y','T']); until(ch='0'); end.
Berikut ini merupakan program utama, dimana nantinya akan akan tampil pada saat program dijalan, sehingga pengguna akan menjadi lebih mudah pada saat melakukan pemakaian pada programnya.
fungsi yang dipakai adalah case pilih of. Apabila kita memasukkan input 1 maka metode pencarian yang digunakan adalah “Sequensial”. Apabila kita memasukkan input 2 maka metode pencaran yang digunakan adalah “Biner”. Jika memasukkan input 3, maka program untuk keluar dari program utama. Ketika program sudah berhasil dijalankan, maka program akan meminta inputan jumlah data, kemudian meminta inputan Nomor Pegawai, Nama Pegawai, Bagian, dan Gaji sebanyak data yang diinputkan. Ketika selesai penginputan data, program akan meminta nilai yang ingin dicari, kemudian program akan menjalankan procedure pencarian dengan metode Sequential search/Binary search. Kemudian program akan menghasilkan hasil berdasarkan Nomor Pegawai yang ingin dicari.
BAB IV KESIMPULAN
Kesimpulan dari hasil praktikum ini adalah sebagai berikut : Pencarian data adalah prosedur atau cara untuk mencari suatu nilai dalam sekumpulan data yang bertipe data sama (tipe dasar atau tipe bentukan). Metode Pencarian data ada bermacam-macam, sebagiannya adalah Sequential search dan Binary Search. Sequential search adalah melakukan suatu perbandingan nilai yang dicari dengan setiap elemen pada array mulai dari indeks terkecil sampai indeks terbesar. Sequential search tidak dipengaruhi oleh urutan data. Metode Sequential Search adalah metode paling sederhana dari sejumlah metode pencarian. Binary search adalah metode pencarian untuk data sudah terurut. Pertama-tama pencarian dilakukan di tengah indeks, jika nilai yang dicari lebih besar dari nilai indeks tengah nya maka ia akan mencari ke bagian kanan dari indeks tengah, dan jika lebih kecil maka sebaliknya.
BAB V DAFTAR PUSTAKA
2014.Modul
Praktikum
Struktur
Data.
Palangkaraya:Universitas
Palangkaraya. http://hendra-ryuka.blogspot.com/2010/05/searching.html http://pelajarimemahami.blogspot.com/2012/04/searching-dalam-strukturdata.html
BAB VI LAMPIRAN Input
Output 1. Menu Inputan Data Pegawai :
2. Menu Searching :
3. Pencarian Dengan Metode “Pencarian Sekuensial”
4. Pencarian Dengan Metode “Pencarian Biner”