Anda di halaman 1dari 49

Skema Standar (Bag.

2)

Tim Pengajar
IF1210 Dasar Pemrograman
Kamis, 4 April 2019
Sebelumnya…
• Pentingnya skema standar
• Skema standar
– Skema validasi I dan II
– Skema pengulangan
– Skema pemrosesan sekuensial

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 2
Pemrograman/sem. 2 2018/2019
ARRAY

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 3
Pemrograman/sem. 2 2018/2019
Array – contoh visualisasi

NMin NMin+1 NMin+2 NMin+3 NMax-2 NMax-1 NMax

Array Elemen Array, dengan


Indeks Array, dengan tipe homogen untuk
tipe ordinal setiap elemen

• Type array adalah type yang mendefinisikan sekumpulan


(satu atau lebih) elemen bertype sama
• Setiap elemen tersusun secara terurut (kontigu) dan dapat
diakses dengan menggunakan indeks
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 4
Pemrograman/sem. 2 2018/2019
Mendeklarasikan Array (1)
• Array dideklarasikan sebagai variabel:
<nama-var> : array [<idxmin>..<idxmax>] of <type-elemen>;

– Contoh: TabInt : array [1..10] of integer;


• Array bernama TabInt dengan setiap elemen bertype
integer, dengan ukuran 10 elemen, dengan alamat setiap
elemen array (indeks) adalah dari indeks ke-1 s.d. 10
– Mengakses elemen array: <namaarray>[<indeks>]
• Contoh: TabInt[i] := TabInt[i-1] + 10;
writeln(TabInt[7]);

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 5
Pemrograman/sem. 2 2018/2019
Mendeklarasikan Array (2)
• Array dideklarasikan sebagai komponen type
bentukan:
• Contoh-1:
type TabInt = array [1..100] of integer;
– type TabInt dideklarasikan sebagai array of integer
– Contoh penggunaan:
var
T : TabInt; { var T bertype TabInt }
– Contoh mengakses elemen:
T[i] := T[i-1] + 10;
writeln(T[7]);

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 6
Pemrograman/sem. 2 2018/2019
Mendeklarasikan Array (3a)
• Array dideklarasikan sebagai type bentukan
dengan 2 komponen utama:
– Container array : suatu array of <type-elemen>
– Nilai efektif: berapa banyak elemen array yang terisi;
minimum 0
• Contoh-2:
type TabInt = record
Tab : array [1..100] of integer;
Neff : integer; { Nilai efektif;
Neff >= 0 }
end;

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 7
Pemrograman/sem. 2 2018/2019
Mendeklarasikan Array (3b)
• Contoh-2
– Contoh penggunaan:
var
T1 : TabInt; { var T1 bertype TabInt }
– Contoh mengakses elemen:
T.Tab[i] := T.Tab[i-1] + 10;
writeln(T.Tab[7]);
Writeln(T.Neff); { mencetak nilai efektif }

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 8
Pemrograman/sem. 2 2018/2019
Contoh Lain Penggunaan Array
type
Kata = record
T : array [1..50] of char;
length : integer; { panjang Kata}
end;
Point = record
X, Y : real;
end;
var
TabJumlahHari : array [1..12] of integer;
TabPoint : array [1..100] of Point;
K1, K2 : Kata;
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 9
Pemrograman/sem. 2 2018/2019
SKEMA PEMROSESAN SEKUENSIAL
PADA ARRAY
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 10
Pemrograman/sem. 2 2018/2019
Pemrosesan Sekuensial pada Array
• Merupakan pemrosesan sekuensial tanpa mark
• Dimungkinkan adanya akses langsung jika indeks
terdefinisi
– First-Elmt adalah elemen tabel dengan indeks terkecil
– Next-Elmt dicapai melalui suksesor indeks
• Model akses sekuensial tanpa mark
– kondisi berhenti adalah jika indeks sudah mencapai harga
indeks yang terbesar yang telah terdefinisi
• Tabel tidak mungkin “kosong”
– jika kita mendefinisikan tabel, maka minimal mengandung
sebuah elemen

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 11
Pemrograman/sem. 2 2018/2019
Skema Pemrosesan Sekuensial
{ KAMUS UMUM PEMROSESAN ARRAY }
const
NMin = 1; { batas bawah indeks }
NMax = 100; { batas atas indeks }
type
ElType = ...; {suatu type terdefinisi, misalnya integer}
var
i : integer; {[NMin..NMax]}
T : array [NMin..NMax] of ElType; {array berelemen ElType}
{ Deklarasi Prosedur }
procedure Inisialisasi; {persiapan sebelum pemrosesan}
procedure Proses (X : ElType); {proses current-elmt array T}
procedure Terminasi; {penutupan setelah pemrosesan selesai}
{ SKEMA PEMROSESAN ARRAY T untuk indeks [NMin..NMax] }
{ Traversal Array T untuk indeks bernilai NMin..NMax }

{ Skema }
Inisialisasi; Pada skema ini diasumsikan
for i:=NMin to NMax do
bahwa seluruh elemen tabel
Proses(T[i]);
Terminasi;
terisi.

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 12
Pemrograman/sem. 2 2018/2019
Skema Pengisian dan
Penulisan Isi Array
(Skema Traversal terhadap Array)

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 13
Pemrograman/sem. 2 2018/2019
Mengisi Tabel, Jumlah Elemen Diketahui
Program ISITABEL1;
{ Traversal untuk mengisi, dengan membaca nilai setiap elemen tabel
dari keyboard jika banyaknya elemen tabel yaitu N diketahui. Nilai
yang dibaca akan disimpan di T[Nmin] s.d. T[N]. Nilai N harus dalam
daerah nilai indeks yang valid. }
{ KAMUS }
const
NMin = 1; { NMin : batas bawah indeks }
NMax = 100; { NMax : batas atas indeks }
var
i : integer; { [NMin..NMax] }
T : array [NMin..NMax] of integer;
N : integer;
{ ALGORITMA }
Catatan: N sebenarnya adalah indeks maksimum
begin efektif. Tetapi, karena NMin=1, maka N juga
{ Inisialisasi N } merupakan jumlah elemen tabel yang terdefinisi
repeat
read(N);
until (N >= NMin) and (N <= NMax);
{ Pengisian array dari pembacaan dari keyboard }
for i := NMin to N do
read(T[i]);
end. NUM+WDS+FNA/IF1210 Dasar
4/1/2019 14
Pemrograman/sem. 2 2018/2019
Mengisi Tabel,
Jumlah Elemen Tidak Diketahui (1)
Program ISITABEL2;
{ Traversal untuk mengisi, dengan membaca nilai setiap elemen
tabel dari keyboard yang diakhiri dengan 9999. Nilai yang
dibaca akan disimpan di T[Nmin] s.d. T[N], nilai N harus
berada dalam daerah nilai indeks yang valid, atau 0 jika tabel
kosong. }
{ KAMUS }
const
NMin = 1; { NMin : batas bawah indeks }
NMax = 100; { NMax : batas atas indeks }
var
i : integer; { [NMin..NMax] }
T : array [NMin..NMax] of integer;
N : integer; { indeks efektif tabel, 0 jika tabel kosong }
x : integer; { nilai yg dibaca & akan disimpan sbg elemen
tabel }
{ ALGORITMA }
... { next slide }
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 15
Pemrograman/sem. 2 2018/2019
Mengisi Tabel,
Jumlah Elemen Tidak Diketahui (2)

{ ALGORITMA }
begin
i := NMin; { Inisialisasi }
read (x); { First element }
while (x <> 9999) and (i <= NMax) do
begin
T[i] := x; { Proses }
i := i + 1;
read(x); { Next element }
end;
{ x = 9999 or i > NMax }
if (i > NMax) then
writeln ('Tabel sudah penuh');
N := i – 1;
Jika pada saat read pertama kali sudah diisi
end.
“9999”, maka N akan berisi NMin – 1. Karena
NMin =1, proses ini aman (N diisi 0). Hati-hati
jika NMin <> 1.
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 16
Pemrograman/sem. 2 2018/2019
Menuliskan Isi Tabel Secara Mundur
Program TULISTABELMundur;
{ Menuliskan isi tabel dr indeks terbesar ke indeks terkecil }
{ KAMUS }
const
NMin = 1;
NMax = 100;
var
TabelInt : array [NMin..NMax] of integer;
i : integer; { [Nmin..Nmax], indeks tabel }
N : integer; { ukuran efektif tabel yang terisi 1..N }
{ ALGORITMA }
begin
{ Di titik ini: TabelInt[1..N] sudah diisi,
algoritma berikut hanya menuliskan mundur }
for i := N downto 1 do
writeln (T[i]);
end.

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 17
Pemrograman/sem. 2 2018/2019
Studi Kasus (1)
• Hasil perlombaan sebuah lomba loncat indah
tingkat internasional ditentukan oleh
sekelompok juri dari berbagai negara. Seorang
juri memberikan nilai dalam bentuk bilangan
bulat 0 s.d. 10
• Nilai untuk seorang juri disimpan dalam
bentuk type data sebagai berikut:
type
NilaiJuri = record
asalnegara : string;
nilai : integer; { 0..10 }
end;
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 18
Pemrograman/sem. 2 2018/2019
Studi Kasus (2)
• Untuk satu kejuaraan jumlah juri bisa
berubah. Karena itulah data nilai semua juri
untuk seorang atlit disimpan dalam bentuk
sebuah array sbb:
const
MaxJuri = 10;
type
arrNilai = record
tabNilai : array[1..MaxJuri] of NilaiJuri;
NELMT : integer; { Banyaknya juri }
end;

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 19
Pemrograman/sem. 2 2018/2019
Latihan 1 – Skema Pengisian dan
Penulisan Isi Array
• Buatlah program (dalam Pascal), jika dalam sebuah
kejuaraan loncat indah, diketahui ada n juri.
Seharusnya n >= 3, tetapi mungkin saja pengguna salah
memasukkan nilai. Jika n < 3, ulangi pembacaan sampai
didapatkan n yang benar.
• Jika n >= 3:
– Buatlah program yang membaca nilai n sebagai masukan,
lalu membaca dan menyimpan n negara asal dan nilai juri
untuk seorang atlit dari keyboard.
– Selanjutnya tuliskan ulang semua asal negara juri dan nilai
yang diberikannya, mulai dari juri yang paling akhir
dimasukkan nilainya ke juri yang paling awal
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 20
Pemrograman/sem. 2 2018/2019
Skema Pencarian Nilai Ekstrim
dalam Array
(Nilai Maksimum/Minimum)

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 21
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Ekstrim
• Kamus umum yang digunakan:
{ KAMUS UMUM }
const
NMax = 100;
type
TabInt = array [1..NMax] of integer;
var
{ jika diperlukan sebuah tabel, maka akan dibuat
deklarasi sebagai berikut: }
T : TabInt; { tabel integer }
N : integer; { indeks efektif, 1 <= N <= NMax }

• Pada algoritma berikut diasumsikan array tidak kosong


– Nilai ekstrim pada tabel kosong tidak terdefinisi

NUM+WDS+FNA/IF1210 Dasar
4/1/2019 22
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Maksimum (1)
Versi mengembalikan NILAI maksimum
procedure MAX1 (T : TabInt; N : integer; var MAX : integer);
{ Pencarian harga maksimum:
I.S. Tabel T tidak kosong, karena jika kosong maka maks tidak
terdefinisi, N >= 1
F.S. Menghasilkan harga maksimum MAX dari tabel T[1..N] secara
sekuensial mulai dari indeks 1..N }
{ KAMUS LOKAL }
var
i : integer; { indeks untuk pencarian }
{ ALGORITMA }
begin
MAX := T[1]; { inisialisasi, T[1] diasumsikan adl. nilai maks }
i := 2; { pembandingan nilai maks dimulai dari elemen ke-2 }
while (i <= N) do
begin
if (MAX < T[i]) then
MAX := T[i];
i := i + 1;
end; { i > N : semua elemen sudah selesai diperiksa }
end; NUM+WDS+FNA/IF1210 Dasar
4/1/2019 23
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Maksimum (1)
Versi mengembalikan NILAI maksimum
procedure MAX1 (T : TabInt; N : integer; var MAX : integer);
{ Pencarian harga maksimum:
I.S. Tabel T tidak kosong, karena jika kosong maka maks tidak
terdefinisi, N >= 1
F.S. Menghasilkan harga maksimum MAX dari tabel T[1..N] secara
sekuensial mulai dari indeks 1..N }
{ KAMUS LOKAL }
var Nilai yang dihasilkan adalah nilai
i : integer; { indeks untuk pencarian } maksimum, indeks tempat nilai
{ ALGORITMA } maksimum tidak diketahui
begin
MAX := T[1]; { inisialisasi, T[1] diasumsikan adl. nilai maks }
i := 2; { pembandingan nilai maks dimulai dari elemen ke-2 }
while (i <= N) do
begin
Elemen pertama tabel diproses secara khusus
if (MAX < T[i]) then
MAX := T[i];
i := i + 1;
end; { i > N : semua elemen sudah selesai diperiksa }
end; NUM+WDS+FNA/IF1210 Dasar
4/1/2019 24
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Maksimum (2)
Versi mengembalikan INDEKS maksimum
procedure MAX2 (T : TabInt; N : integer; var IMax : integer);
{ Pencarian indeks dengan harga Maksimum
I.S. Tabel tidak kosong, karena jika kosong maka maks tidak
terdefinisi, N >= 1
F.S. Menghasilkan indeks IMax terkecil, dengan harga
T[IMax] dalam Tabel T [1..N] adalah maksimum }
{ KAMUS LOKAL }
var
i : integer;
{ ALGORITMA }
begin
IMax := 1;
i := 2;
while (i <= N) do
begin
if (T[IMax] < T[i]) then
IMax := i;
i := i + 1;
end; { i > N : semua elemen sudah selesai diperiksa }
end;
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 25
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Maksimum (2)
Versi mengembalikan INDEKS maksimum
procedure MAX2 (T : TabInt; N : integer; var IMax : integer);
{ Pencarian indeks dengan harga Maksimum
I.S. Tabel tidak kosong, karena jika kosong maka maks tidak
terdefinisi, N >= 1
F.S. Menghasilkan indeks IMax terkecil, dengan harga
T[IMax] dalam Tabel T [1..N] adalah maksimum }
{ KAMUS LOKAL }
var Tidak menghasilkan nilai maksimum
i : integer; melainkan indeks dimana nilai maksimum
{ ALGORITMA } berada
begin
IMax := 1;
i := 2; Elemen pertama tabel diproses secara khusus
while (i <= N) do
begin
if (T[IMax] < T[i]) then
IMax := i;
i := i + 1;
end; { i > N : semua elemen sudah selesai diperiksa }
end;
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 26
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Maksimum (3)
Versi maksimum dari bil. positif (v.1)
procedure MAXPOS (T:TabInt; N:integer; var Max:integer);
{ Pencarian harga Maksimum di antara bilangan positif
I.S. Tabel mungkin kosong: N=0; Jika tidak kosong; semua elemen
tabel T bernilai positif
F.S. Max berisi nilai elemen tabel yang maksimum. Jika T kosong,
Max = -9999
Menghasilkan harga maksimum (MAX) Tabel T [1..N] secara
sekuensial mulai dari T[1] }
{ Kamus Lokal }
var
i : integer;
{ ALGORITMA }
begin
Max := -9999; { inisialisasi dgn nilai yg pasti digantikan!
misal nilai minimum representasi integer }
for i := 1 to N do
if (Max < T[i]) then
Max := T[i];
{ i = ??, semua elemen sudah selesai diperiksa }
end;
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 27
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Maksimum (3)
Versi maksimum dari bil. positif (v.1)
procedure MAXPOS (T:TabInt; N:integer; var Max:integer);
{ Pencarian harga Maksimum di antara bilangan positif
I.S. Tabel mungkin kosong: N=0; Jika tidak kosong; semua elemen
tabel T bernilai positif
F.S. Max berisi nilai elemen tabel yang maksimum. Jika T kosong,
Max = -9999
Menghasilkan harga maksimum (MAX) Tabel T [1..N] secara
sekuensial mulai dari T[1] }
{ Kamus Lokal }
Semua elemen tabel diperiksa dengan cara yang
var sama. Oleh sebab itu, nilai MAX harus
i : integer; diinisialisasi dengan nilai yang sudah pasti akan
{ ALGORITMA } digantikan oleh nilai yang ada di dalam tabel
begin
Max := -9999; { inisialisasi dgn nilai yg pasti digantikan!
misal nilai minimum representasi integer }
for i := 1 to N do Pengulangan ini tidak aman untuk seluruh
if (Max < T[i]) then kasus. Carilah letak permasalahannya.
Max := T[i];
{ i = ??, semua elemen sudah selesai diperiksa }
end;
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 28
Pemrograman/sem. 2 2018/2019
Pencarian Nilai Maksimum (4)
Versi maksimum dari bil. positif (v.2)
procedure MAXPOS (T:TabInt; N:integer; var Max:integer);
{ Pencarian harga Maksimum di antara bilangan positif
I.S. Tabel mungkin kosong: N=0; Jika tidak kosong, semua elemen
tabel T bernilai positif
F.S. Max berisi nilai elemen tabel yang maksimum. Jika kosong,
Max = -9999
Menghasilkan harga Maksimum (MAX) Tabel T [1..N] secara
sekuensial mulai dari T[1] }
{ Kamus Lokal }
var
i : integer;
{ ALGORITMA }
begin
Max := -9999; { inisialisasi dgn nilai yg pasti digantikan!
misal nilai minimum representasi integer }
i := 1;
while (i <= N) do
begin
if (Max < T[i]) then
Max := T[i];
i := i + 1;
end; { i = N+1, semua elemen sudah selesai diperiksa }
end. NUM+WDS+FNA/IF1210 Dasar
4/1/2019 29
Pemrograman/sem. 2 2018/2019
Latihan 2 –
Skema Pencarian Nilai Ekstrem
• Penilaian akhir seorang atlit dalam kejuaraan
loncat indah ditentukan dengan menggunakan
teknik mean olympic, yaitu: jika ada n juri, maka
dihitung nilai tertinggi, misalnya max, dan nilai
terendah misalnya min, dan selanjutnya nilai
akhir seorang atlit didapatkan sebagai:
nilai_akhir = (  nilai_juri – max – min ) / (n - 2)

• Lanjutkan program pada latihan 1 dengan


menuliskan nilai akhir untuk atlit yang
bersangkutan.
NUM+WDS+FNA/IF1210 Dasar
4/1/2019 30
Pemrograman/sem. 2 2018/2019
SKEMA PENCARIAN
PADA ARRAY/ TABEL
NUM/TW/IF1210 Dasar
2019/4/1 31
Pemrograman/sem. 2 2014/2015
Table Lookup (Searching)
• Merupakan proses yang penting karena sering dilakukan
terhadap sekumpulan data yang disimpan dalam tabel
• Ada beberapa variasi pencarian
– Metoda mana yang dipakai menentukan kecepatan pencarian

{ KAMUS UMUM }
const
NMax = 100;
type
TabInt = array [1..NMax] of integer;
var
{ jika diperlukan sebuah tabel, maka akan dibuat
deklarasi sebagai berikut: }
T : TabInt; { tabel integer }
N : integer; { indeks efektif, 1 <= N <= NMax }

NUM/TW/IF1210 Dasar
2019/4/1 32
Pemrograman/sem. 2 2014/2015
Algoritma Pencarian Sequential
Skema Pencarian Tanpa Boolean
procedure SEQSearchX1 (T : TabInt; N : integer;
var IX : integer; X : integer);
{ Mencari harga X dalam Tabel T [1..N] secara sekuensial mulai
dari T[1]. Hasilnya adalah indeks IX di mana T[IX] = X
(i terkecil); IX = 0 jika tidak ketemu }
{ Kamus Lokal }
var
i : integer; { [1..NMax], indeks untuk pencarian }
{ ALGORITMA }
begin
i := 1;
while (i < N) and (T[i] <> X) do
begin
i := i + 1;
end; { i = N or T[i] = X}
if (T[i] = X ) then
IX := i
else { T[i] <> X }
IX := 0;
end;
NUM/TW/IF1210 Dasar
2019/4/1 33
Pemrograman/sem. 2 2014/2015
Algoritma Pencarian Sequential
Skema Pencarian Tanpa Boolean
procedure SEQSearchX1 (T : TabInt; N : integer; X : integer;
var IX : integer);
{ Mencari harga X dalam Tabel T [1..N] secara sekuensial mulai
dari T[1]. Hasilnya adalah indeks IX di mana T[IX] = X
(i terkecil); IX = 0 jika tidak ketemu. N > 0. }
{ Kamus Lokal }
var
i : integer; { [1..NMax], indeks untuk pencarian }
{ ALGORITMA }
Harus dipastikan bahwa T
begin
i := 1; tidak kosong; sehingga
while (i < N) and (T[i] <> X) do tidak ada pemeriksaan T[i]
begin yang tidak terdefinisi
i := i + 1;
end; { i = N or T[i] = X}
if (T[i] = X ) then
IX := i
else { T[i] <> X }
IX := 0;
end;
NUM/TW/IF1210 Dasar
2019/4/1 34
Pemrograman/sem. 2 2014/2015
Algoritma Pencarian Sequential
Skema Pencarian Dengan Boolean
procedure SEQSearchX2 (T : TabInt; N : integer; X : integer;
var IX : integer; var Found : boolean);
{ Mencari harga X dalam Tabel T [1..N] secara sekuensial mulai
dari T[1]. Hasilnya adalah indeks IX di mana T[IX] = X
(i terkecil); IX = 0 jika tidak ketemu, dan sebuah boolean
Found (true jika ketemu) }
{ Kamus Lokal }
var
i : integer; { [1..N+1], indeks untuk pencarian }
{ ALGORITMA }
begin
Found := false; { awal pencarian, belum ketemu }
i := 1;
while (i <= N) and (not(Found)) do
begin
if (T[i] = X) then
Found := true
else
i := i + 1;
end; { i > N or Found }
if (Found) then
IX := i
else
IX := 0;
end; NUM/TW/IF1210 Dasar
2019/4/1 35
Pemrograman/sem. 2 2014/2015
Algoritma Pencarian Sequential
Skema Pencarian Dengan Boolean
procedure SEQSearchX2 (T : TabInt; N : integer; X : integer;
var IX : integer; var Found : boolean);
{ Mencari harga X dalam Tabel T [1..N] secara sekuensial mulai
dari T[1]. Hasilnya adalah indeks IX di mana T[IX] = X
(i terkecil); IX = 0 jika tidak ketemu, dan sebuah boolean
Found (true jika ketemu) }
{ Kamus Lokal }
var
i : integer; { [1..N+1], indeks untuk pencarian }
{ ALGORITMA }
begin
Found := false; { awal pencarian, belum ketemu }
i := 1;
while (i <= N) and (not(Found)) do T boleh kosong karena
begin tidak ada pemeriksaan
if (T[i] = X) then nilai T[i] pada kondisi
Found := true pengulangan
else
i := i + 1;
end; { i > N or Found }
if (Found) then
IX := i
else
IX := 0;
end; NUM/TW/IF1210 Dasar
2019/4/1 36
Pemrograman/sem. 2 2014/2015
Algoritma Pencarian Sequential
Pada Tabel Terurut (1)
• Diketahui sebuah tabel bilangan integer T[1..N],
dengan isi yang terurut membesar
 i  [1..N-1], T[i]  T[i+1]
• Tuliskanlah algoritma, yang jika diberikan sebuah X
bernilai integer akan mencari apakah harga X ada
dalam T secara sekuensial mulai dari elemen pertama
– Prosedur akan menghasilkan harga indeks IX di mana X
diketemukan pertama kalinya, IX diberi harga 0 jika
pencarian tidak ketemu
– Pencarian segera dihentikan begitu harga pertama
diketemukan

NUM/TW/IF1210 Dasar Pemrograman/sem.


2019/4/1 37
2 2014/2015
Algoritma Pencarian Sequential
Pada Tabel Terurut (2)
• Dengan memanfaatkan keterurutan, kondisi berhenti
bisa lebih efisien
• Contoh 1:
N = 8; T berisi: [1, 3, 5, 8, 12, 90, 311, 500]; X = 5
– Pemeriksaan dilakukan terhadap [1, 3, 5]
– Output : IX = 3
• Contoh 2:
N = 7; T berisi: [11, 30, 50, 83, 99, 123, 456]; X = 100
– Pemeriksaan dilakukan terhadap [11, 30, 50, 83, 99, 123]
– Output : IX = 0

NUM/TW/IF1210 Dasar Pemrograman/sem.


2019/4/1 38
2 2014/2015
Algoritma Pencarian Sequential
Pada Tabel Terurut
procedure SEQSearchSorted (T : TabInt; N : integer;
X : integer; var IX : integer);
{ Mencari harga X dalam Tabel T [1..N] secara sekuensial mulai
dari T[1]. Hasilnya adalah indeks IX di mana T[IX] = X; IX = 0
jika tidak ketemu. }
{ Kamus Lokal }
var
i : integer; { [1..NMax], indeks untuk pencarian }
{ ALGORITMA }
begin
i := 1;
while (i < N) and (T[i] < X) do
begin
i := i + 1;
end; { i = N or T[i] >= X }
if (T[i] = X) then
IX := i
else { T[i] <> X -> T[i] > X }
IX := 0;
end;
NUM/TW/IF1210 Dasar
2019/4/1 39
Pemrograman/sem. 2 2014/2015
Algoritma Pencarian Sequential
Pada Tabel Terurut
procedure SEQSearchSorted (T : TabInt; N : integer;
X : integer; var IX : integer);
{ Mencari harga X dalam Tabel T [1..N] secara sekuensial mulai
dari T[1]. Hasilnya adalah indeks IX di mana T[IX] = X; IX = 0
jika tidak ketemu. }
{ Kamus Lokal }
var
i : integer; { [1..NMax], indeks untuk pencarian }
{ ALGORITMA }
begin
i := 1;
Pencarian dihentikan jika
while (i < N) and (T[i] < X) do
begin T[i] >= X. Jika T[i] > X;
i := i + 1; sudah pasti X tidak
end; { i = N or T[i] >= X } ketemu karena tabel
if (T[i] = X) then terurut
IX := i
else { T[i] <> X -> T[i] > X }
IX := 0;
end;
NUM/TW/IF1210 Dasar
2019/4/1 40
Pemrograman/sem. 2 2014/2015
Algoritma Pencarian Sequential
Dengan Sentinel (1)
• Dengan teknik sentinel, sengaja dipasang suatu elemen
fiktif setelah elemen terakhir tabel, yang disebut
SENTINEL.
– Elemen fiktif ini harganya sama dengan elemen yang dicari
– Pencarian akan selalu ketemu; harus diperiksa lagi apakah
posisi ketemu :
• di antara elemen tabel yang sebenarnya, atau
• sesudah elemen terakhir (berarti tidak ketemu, karena elemen
fiktif)
– Penempatan sentinel disesuaikan dengan arah pencarian
• Teknik sentinel sangat efisien, terutama jika pencarian
dilakukan sebelum penyisipan sebuah elemen yang
belum terdapat di dalam tabel
NUM/TW/IF1210 Dasar Pemrograman/sem.
2019/4/1 41
2 2014/2015
Algoritma Pencarian Sequential
Dengan Sentinel (2)
• Contoh 1:
N = 8; T berisi: [1, 3, 5, 8, -12, 90, 3, 5]; X = 5
– T dijadikan [1, 3, 5, 8, -12, 90, 3, 5, 5]
– Pemeriksaan dilakukan terhadap [1, 3, 5]
– Output: IX = 3
• Contoh 2:
N = 4, T berisi: [11, 3, 5, 8]; X = 100
– Akibatnya minimal ukuran array harus 5, berarti N
dijadikan 5
– T dijadikan [11, 3, 5, 8, 100]
– Pemeriksaan dilakukan terhadap [11, 3, 5, 8, 100]
– Output: IX = 0
NUM/TW/IF1210 Dasar Pemrograman/sem.
2019/4/1 42
2 2014/2015
Algoritma Pencarian Sequential
Dengan Sentinel (3)
• Kamus umum untuk tabel dengan sentinel
harus mengandung sebuah elemen tambahan
{ KAMUS UMUM }
const
NMax = 100;
type
TabInt = array [1..NMax+1] of integer; {+1 utk sentinel}
var
{ jika diperlukan sebuah tabel, maka akan dibuat
deklarasi sebagai berikut: }
T : TabInt; { tabel integer }
N : integer; { indeks efektif, 1 <= N <= NMax }

NUM/TW/IF1210 Dasar Pemrograman/sem.


2019/4/1 43
2 2014/2015
Algoritma Pencarian Sequential
Dengan Sentinel - Algoritma
procedure SEQSearchWithSentinel (T : TabInt; N : integer;
X : integer; var IX : integer)
{ Mencari harga X dalam Tabel T[1..N] secara sekuensial
mulai dari T[1]. Hasilnya adalah indeks IX di mana T[IX] = X
(i terkecil); IX = 0 jika tidak ketemu.
Sentinel diletakkan di T[N+1]. }
{ Kamus Lokal }
var
i : integer; { [1..N+1] indeks untuk pencarian }
{ ALGORITMA }
begin
T[N+1] := X; { pasang sentinel }
i := 1;
while (T[i] <> X) do { tidak perlu test terhadap batas i, }
begin { karena pasti berhenti }
i := i + 1;
end; { T[i] = X; diperiksa apakah ketemunya di sentinel }
if (i < N+1) then
IX := i { ketemu pada elemen tabel }
else { i = N+1, ditemukan di sentinel, berarti tak ketemu }
IX := 0; NUM/TW/IF1210 Dasar
2019/4/1
end; 44
Pemrograman/sem. 2 2014/2015
Latihan Skema Searching (1)
• Dengan menggunakan definisi kamus spt. yang
diberikan pada slides sebelumnya:
• Buatlah function IsEqual yang menerima
masukan dua buah TabInt, yaitu T1 (dengan nilai
efektif N1) dan T2 (dengan nilai efektif N2) dan
menghasilkan true jika T1 dan T2 adalah TabInt
yang sama.
• TabInt sama jika banyaknya elemen yang
terdefinisi sama (N1=N2) dan jika i, T1[i] = T2[i]
• T1 dan/atau T2 mungkin kosong (N1 = 0 dan/atau
N2 = 0)
NUM/TW/IF1210 Dasar
2019/4/1 45
Pemrograman/sem. 2 2014/2015
Latihan Skema Searching (2a)
Diberikan definisi suatu tabel daftar mata kuliah sebagai
berikut (nama-nama diasumsikan dapat dipahami dengan
jelas):
const
NMax = 100;
type
MatKul = record
KodeMK : integer;
NamaMK : string;
Pengajar : string;
JmlPeserta : integer; { [1..100] }
end;
TabMatKul = record
TM : array [1..NMax] of MatKul;
NELMT : integer; { [0..NMax], nilai efektif, }
{ 0 jika tabel kosong }
end;

NUM/TW/IF1210 Dasar
2019/4/1 46
Pemrograman/sem. 2 2014/2015
Latihan Skema Searching (2b)
Buatlah fungsi IdxMK yang menerima masukan
berupa nilai kode mata kuliah, misalnya Kd, dan
sebuah TabMatKul, misalnya T, dan
menghasilkan indeks di mana Kd ditemukan
pertama kali di T, atau 0 jika Kd tidak ditemukan
di T.

NUM/TW/IF1210 Dasar
2019/4/1 47
Pemrograman/sem. 2 2014/2015
Latihan Skema Searching (2c-1)
• Buatlah prosedur InsertUnik yang memiliki
parameter input sebuah TabMatKul, misalnya T,
dan digunakan untuk menambahkan suatu
MatKul, misalnya MK, ke dalam T jika T belum
penuh atau MK.KodeMK tidak ada di T.
• Berikut adalah hal-hal yang dilakukan oleh
prosedur ini:
– Jika T sudah penuh, maka tuliskan pesan “Tabel mata
kuliah penuh” dan T tetap.
– ....

NUM/TW/IF1210 Dasar
2019/4/1 48
Pemrograman/sem. 2 2014/2015
Latihan Skema Searching (2c-2)
• Berikut adalah hal-hal yang dilakukan oleh prosedur ini:
– ...
– Jika T tidak penuh, maka prosedur meminta masukan MK
dari keyboard. Lakukan pembacaan dari keyboard satu per
satu untuk setiap komponen MK (diasumsikan semua
masukan benar, sesuai domain MatKul, sehingga tidak
perlu dilakukan validasi). Selanjutnya MK ditambahkan ke
dalam T jika MK.KodeMK belum ada di T.
• Jika MK.KodeMK sudah ada di T, maka tuliskan pesan “Mata kuliah
sudah ada di tabel mata kuliah” dan T tetap. Gunakan fungsi
IdxMK untuk menyatakan apakah MK.KodeMK sudah ada di T atau
belum.
• Jika MK.KodeMK belum ada di T, maka tambahkan MK sebagai
elemen terakhir T.
NUM/TW/IF1210 Dasar
2019/4/1 49
Pemrograman/sem. 2 2014/2015

Anda mungkin juga menyukai