Anda di halaman 1dari 214

PEMROGRAMAN MODULAR

adalah suatu teknik pemrograman di mana program yang biasanya cukup besar dibagi-bagi menjadi beberapa bagian program yang lebih kecil . Dalam beberapa bahasa pemrograman disebut : sub-rutin, modul, prosedur, atau fungsi.

STRUKTUR POHON
PROGRAM A

SUBPROGRAM A1

SUBPROGRAM A2

SUBPROGRAM A3

SUBPROGRAM A21

SUBPROGRAM A22

ILUSTRASI
DEKLARASI A, B, Temp : integer ALGORITMA
{ baca nilai A dan B}

read(A) read(B)
{proses pertukaran}

temp A AB B temp
{ tulis nilai A dan B setelah pertukaran }

output(A) output(B)

Dipecah subprogram
DEKLARASI A, B : integer Baca(A,B:Integer) ALGORITMA: read(A) read(B) Tukar(A, B:integer) DEKLARASI temp : integer {peubah bantu} ALGORITMA temp A AB B temp Tulis(A,B : integer) ALGORITMA output(A) output(B) ALGORITMA Baca(A,B) Tukar(A,B) Tulis(A,B)

KEUNTUNGAN Pemrogram Modular

1. Program lebih pendek 2. Mudah menulis (banyak programer) 3. Mudah dibaca dan dimengerti (bandingkan dg nonmodular dg banyak instruksi) 4. Mudah didokumentasi 5. Mengurangi kesalahan dan mudah mencari kesalahan(debug) program 6. Kesalahan yang terjadi bersifat lokal

Dua bentuk pemrogram modular : PROSEDUR dan FUNGSI


Struktur setiap subprogram tersebut pada hakekatnya sama , yaitu :
Nama modul (subprogram) Bagian deklarasi Algoritma (intruksi yg akan dilaksanakan)

Perbedaan penggunaannya dalam bahasa pemrograman Pascal :


Prosedur merupakan modul(subprogram) yg melakukan aktifitas tertentu tanpa adanya pengembalian nilai Fungsi terdapat pengembalian nilai

PROSEDUR
Dalam bahasa pemrograman Prosedur adalah modul program yang mengerjakan tugas/aktifitas yg spesifik dan menghasilkan suatu efek netto
(membandingkan keadaan awal dan keadaan akhir dari suatu aktifitas prosedur)

Setiap prosedur perlu mendefinisikan keadaan awal sebelum rangkaian instruksi di dalam prosedur dilaksanakan, dan keadaan akhir yg diharapkan setelah instruksi di dalam prosedur dilaksanakan

STRUKTUR PROSEDUR
JUDUL (header) nama prosedur dan deklarasi parameter(kalau ada) DEKLARASI mengumumkan namanama dan tipe data ALGORITMA badan prosedur (instruksi)

*sama dengan struktur ALGORITMA

Nama Prosedur
Nama yang unik Sebaiknya diawali dengan kata kerja karena prosedur berisi suatu aktifitas
Misalnya: HitungLuas, Tukar, CariMaks, Tulis, dll.

Parameter
Adalah nama-nama peubah (variabel) yang dikdeklarasikan pada bagian header (judul) prosedur dan titik dimana dia dipanggil. Penggunaan parameter menawarkan mekanisme pertukaran informasi (antara yg memanggil (program/algoritma utama) dg prosedur itu sendiri)

Parameter dibedakan menjadi dua :


Parameter aktual (argumen) :
Parameter yg disertakan pada waktu pemanggilan prosedur (parameter yg ada pada program/algoritma utama).

Parameter formal :
Parameter yg dideklarasikan di dalam bagian header prosedur itu sendiri.

Ketika prosedur dipanggil, parameter aktual menggantikan parameter formal. Tiap-tiap parameter aktual berpasangan dengan parameter formal yg bersesuain (berkorespondasi satu satu)

Notasi algoritma untuk PROSEDUR


Procedure NamaProsedur(deklarasi parameter, jika ada)
{spesifikasi prosedur, berisi penjelasan tentang apa yg dilakukan oleh prosedur ini. K.awal : keadaan sebelum prosedur dilaksanakan. K. akhir : keadaan setelah prosedur dilaksanakan}

DEKLARASI
{semua nama yg dipakai di dalam prosedur dan hanya berlaku lokal di dalam prosedur ini}

ALGORITMA
{badan prosedur, berisi urutan instruksi}

Pendeklarasian Parameter dalam prosedur bukanlah keharusan


Contoh : Procedure HitungLuasSegitiga
{menghitung luas segitiga dengan rumus : L = (alas x tinggi)/2} {K.awal : sembarang} {K.akhir : luas segitiga tercetak}

DEKLARASI
Alas, tinggi, luas : real

ALGORITMA
Read(alas, tinggi) Luas (alas * tingg) / 2 Write(luas)

Pemanggilan Prosedur
Prosedur bukan program yg beridiri sendiri Prosedur tidak dapat dieksekusi secara langsung. Instruksi-instruksi di dalam prosedur dapat dilaksanakan bila prosedur itu diakses. Prosedur diakses dg cara memanggil namanya dari program pemanggil (misalnya dari program utama atau modul program lainnya) Jika prosedur tanpa parameter, maka pemanggilannya cukup dg nama prosedurnya saja, contoh : HitungLuasSegitiga

Notasi Algoritma :
PROGRAM Segitiga
{menghitung luas segitiga}

DEKLARASI Procedure HitungLuasSegitiga


{menghitung luas segitiga dengan rumus : L = (alas x tinggi)/2} {K.awal : sembarang} {K.akhir : luas segitiga tercetak}

DEKLARASI
Alas, tinggi, luas : real

ALGORITMA
Read(alas, tinggi) Luas (alas * tinggi) / 2 Write(luas)

ALGORITMA HitungLuasSegitiga

KUIS
BUATLAH NOTASI ALGORITMA UNTUK MELAKUKAN PEMANGGILAN PROSEDUR LUASSEGITIGA SEBANYAK 3 X

Nama Global dan Nama Lokal


Nama Lokal :
Nama-nama (Konstanta, peubah(variabel), tipe, dll) yang dideklarasikan di dalam prosedur (termasuk parameter, jika ada). (hanya dikenal/digunakan dalam lingkup (scope) prosedur tersebut

Nama Global :
Nama-nama (Konstanta, peubah(variabel), tipe, dll) yang dideklarasikan di dalam program utama. (dapat dikenal/digunakan dibagian manapun dalam program (progam utama maupun prosedur).

PROGRAM Segitiga
{menghitung luas N buah segitiga}

DEKLARASI I, N : integer alas, tinggi : real Procedure HitungLuasSegitiga


{menghitung luas segitiga dengan rumus : L = (alas x tinggi)/2} {K.awal : sembarang} {K.akhir : luas segitiga tercetak}

DEKLARASI
luas : real

ALGORITMA
Luas (alas * tinggi) / 2 Write(luas)

ALGORITMA read(N) { tentukan banyaknya segitiga } for I 1 to N do read(alas, tinggi HitungLuasSegitiga endfor _______________________________________________________________ Nama Peubah (variabel) I, N, alas, tinggi variabel GLOBAL Nama Peubah (variabel) luas variabel LOKAl

Menggunakan variabel Global atau variabel Lokal Bila suatu peubah (variabel) digunakan di seluruh bagian program (baik program utama maupun prosedur), maka deklarasikanlah peubah tsb secara Global. Bila suatu peubah (variabel) hanya digunakan di dalam prosedur, maka deklarasikanlah peubah tsb secara Lokal. Gunakan peubah global sedikit mungkin Penggunaan variabel lokal membuat program lebih elegan Penggunaan variabel lokal dapat meminimumkan usaha pencarian kesalahan yg disebabkan oleh nama-nama tsb.

Parameter
Prosedur yg baik adalah prosedur yg independen dari program utama/ program yg memanggilnya. Prosedur yg baik tidak menggunakan peubah-peubah global di dalam prosedur. Jika program utama perlu mengomunikasikan nilai peubah Global ke dalam prosedur, maka gunakanlah PARAMETER.

Parameter - next
Penggunaan parameter adalah mekanisme pertukaran informasi antara prosedur dengan yang memaggilnya (program utama maupun subprogram lainnya). Prosedur dengan parameternya (Parameter Formal) dapat diakses dg cara memanggil namanya dari program yg memanggilnya yg disertai dg parameter dari program yg memanggil tsb (Parameter Aktual). Contoh: NamaProsedur(parameter aktual)

Tiap parameter aktual berpasangan dg paramater formal yg bersesuaian

Parameter - next
Ketika prosedur dipanggil, parameter aktual berkoresponden satu-satu dengan parameter formal (parameter yg dideklarasikan pada bagian header prosedur)

Aturan korespondensi satu satu


Jumlah parameter aktual harus sama dengan jumlah parameter formal. Tiap parameter aktual harus bertipe sama dengan tipe parameter formal yg sesuai. Tiap parameter aktual harus diekspresikan dalam cara yg taat azas dg parameter formal yg bersesuaian, bergantung pada jenis parameter formal.

Jenis parameter formal yg disertakan di dalam prosedur :


Parameter Masukan (input parameter) :
Parameter yg nilainya berlaku sebagai masukan untuk prosedur.

Parameter Keluaran (Output parameter):


Parameter menampung keluaran yg dihasilkan oleh prosedur.

Parameter masukan/keluaran (input/output parameter) :


Parameter yg berfungsi sebagai masukan sekaligus keluaran bagi prosedur tsb.

Parameter masukan
Nilai parameter aktual diisikan ke dalam parameter formal yg sesuai. Perubahan nilai parameter di dalam badan prosedur tidak mengubah nilai parameter aktual. Nama parameter aktual boleh berbeda dg nama parameter formal yg sesuai

Contoh : paramater masukan


Procedure HitungLuasSegitiga(input alas, tinggi : real)
{menghitung luas segitiga dengan rumus : L = (alas x tinggi)/2} {K.awal : alas dan tinggi sudah terdefinisi nilainya} {K.akhir : luas segitiga tercetak}

DEKLARASI
luas : real

ALGORITMA
Luas (alas * tinggi) / 2 Write(luas)

Program utama yg memanggil nama prosedur: harus mendeklarasikan nama prosedur dan memanggilnya dg parameter aktual yg sesuai
PROGRAM Segitiga
{menghitung luas N buah segitiga}

DEKLARASI I, N : integer alas, tinggi : real Procedure HitungLuasSegitiga(input alas, tinggi : real)
{menghitung luas segitiga dengan rumus : L = (alas x tinggi)/2} {K.awal : alas dan tinggi sudah terdefinisi nilainya } {K.akhir : luas segitiga tercetak}

DEKLARASI
luas : real

ALGORITMA
Luas (alas * tinggi) / 2 Write(luas)

ALGORITMA read(N) { tentukan banyaknya segitiga } for I 1 to N do read(alas, tinggi HitungLuasSegitiga(alas,tinggi) endfor

nama parameter aktual tidak harus sama dengan nama parameter formal : yg dipentingkan adalah nilainya
PROGRAM Segitiga
{menghitung luas N buah segitiga}

DEKLARASI I, N : integer a, t : real Procedure HitungLuasSegitiga(input alas, tinggi : real)


{menghitung luas segitiga dengan rumus : L = (alas x tinggi)/2} {K.awal : alas dan tinggi sudah terdefinisi nilainya } {K.akhir : luas segitiga tercetak}

DEKLARASI
luas : real

ALGORITMA
Luas (alas * tinggi) / 2 Write(luas)

ALGORITMA read(N) { tentukan banyaknya segitiga } for I 1 to N do read(a, t) HitungLuasSegitiga(a,t) endfor

Parameter aktual boleh berupa ekspresi atau konstanta


Contoh : HitungLuasSegitiga(a*0.2, t*0.1) HitungLuasSegitiga(12, 6)

Parameter keluaran
Parameter keluaran dideklarasikan di dalam header prosedur, sebagaimana parameter masukan Parameter keluaran dideklarasikan dengan keyword OUTPUT. Ketika prosedur yg mengandung parameter keluaran dipanggil, maka nama parameter aktual menggantikan (substitute) nama parameter formal yg bersesuaian.

Contoh : parameter keluaran-next


PROGRAM Segitiga
{menghitung luas N buah segitiga}

DEKLARASI I, N : integer a, t, L : real Procedure HitungLuasSegitiga(input alas, tinggi : real, output luas:real)
{menghitung luas segitiga dengan rumus : L = (alas x tinggi)/2} {K.awal : alas dan tinggi sudah terdefinisi nilainya } {K.akhir : luas segitiga tercetak}

ALGORITMA
Luas (alas * tinggi) / 2

ALGORITMA read(N) { tentukan banyaknya segitiga } for I 1 to N do read(a, t) HitungLuasSegitiga(a, t, L)


Write(L)

endfor

Parameter masukan/keluaran
Prosedur harus dapat mengakomodasi baik masukan dari dan keluaran ke blok program pemanggil Maka gunakan parameter masukan/ keluaran Bila parameter aktual diubah nilainya di dalam badan prosedur, maka sesudah pemanggilan prosedur nilai parameter aktual di titik pemanggilan juga berubah Parameter masukan/keluaran dideklarasikan di dalam header prosedur dengan keyword INPUT/OUTPUT Parameter aktual harus berupa peubah, tidak boleh berupa ekspresi atau konstanta

Contoh : parameter masukan/keluaran


PROGRAM Cetak0Sampai10 { mencetak nilai dari 0 sampai 10 }
DEKLARASI x : integer procedure Inc(input/output x : integer) {menaikan nilai x sebesar 1} {K.Awal : x sudah terdefinisi nilainya} {K.Akhir : nilai x bertambah 1} DEKLARASI ALGORITMA xx+1 ALGORITMA X0 repeat write(x) inc(x) until x > 10

Parameter masukan

parameter masukan/keluaran
PROGRAM xyz DEKLARASI a, b : integer Procedure tambah(input/output x,y:integer) Deklarasi Algoritma xx+4 Y y +4 write(nilai x dan y di akhir prosedur tambah:) Write( x=, x) Write( y=, y) ALGORITMA a 15 B 10 Write(nilai a dan b sebelum panggil prosedur tambah:) Write( a=, a) Write( b=, b) Tambah(a,b) Write(nilai a dan b sesudah panggil prosedur tambah:) Write( a=, a) Write( b=, b)

PROGRAM xyz DEKLARASI a, b : integer Procedure tambah(input x,y:integer) Deklarasi Algoritma xx+4 Y y +4 write(nilai x dan y di akhir prosedur tambah:) Write( x=, x) Write( y=, y) ALGORITMA a 15 B 10 Write(nilai a dan b sebelum panggil prosedur tambah:) Write( a=, a) Write( b=, b) Tambah(a,b) Write(nilai a dan b sesudah panggil prosedur tambah:) Write( a=, a) Write( b=, b)

Program dg prosedur atau tanpa prosedur


Dianjurkan menulis program yg modular Program yg dipecah menjadi beberapa prosedur menunjukkan teknik pemrograman yg baik dan terstruktur

Prosedur dg parameter atau tanpa parameter


Dianjurkan menulis prosedur dg parameter Parameter dapat mengurangi kebutuhan penggunaan peubah (variabel) global

Parameter masukan atau parameter keluaran


Bila prosedur menghasilkan keluaran yg digunakan oleh program pemanggil, gunakan parameter keluaran untuk menampung keluaran tsb. Bila prosedur tidak menghasilkan keluaran, atau kalaupun menghasilkan keluaran tapi keluaran tsb hanya digunakan di dalam prosedur itu saja, maka gunakan parameter masukan. Bila prosedur menerima masukan sekaligus keluaran pada parameter yg sama, gunakan parameter masukan/keluaran.

Analisa kasus :menentukan jam berikutnya setelah ditambah satu detik


1. Tambah detik dengan 1, jika jumlah detik <60, tetapi jika jumlah detik = 60 maka set detik kembali menjadi nol(0) dan tambahkan 1 ke menit. 2. pertambahan menit dengan 1,jika jumlah menit <60, tetapi jika jumlah menit = 60, maka set menit kembali menjadi 0(nol) dan tambahkan 1 ke jam. 3. Pertambahan jam dengan 1, jika jumlah jam <24, tetapi jika jumlah jam = 24, maka set jam kmbali menjadi 0(nol). Contoh : 14:27:31 +1detik 14:27:(31+1)=14:27:32 15:36:59 +1detik 5:36:(59+1)=15:(36+1):00=15:37:00 10:59:59 +1deti 10:59+(59+1)= 10:(59+1):00 =(10+1):00:00=11:00:00 23:59:59 +1detik 00:00:00

Notasi Algoritma: menentukan jam berikutnya


Program jamberikutnya Deklarasi Type jam : record <hh:integer {0..23} mm:integer {0..59} ss : integer {0..59} J :jam ALGORITMA Read(j.hh, j.mm, j.ss) {baca jam} if J.ss +1 < 60 then J.ss j.ssm +1 else J.ss 0 if J.mm + 1 < 60 then J.mm J.mm + 1 else J.mm 0 If J.hh + 1 < 24 then J.hh J.hh + 1 else j.hh 0 endif endif endif Write(J.hh, J.mm, J.ss) {jam yang baru}

Notasi Algoritma : mencetak perjalan waktu terus menerus dg prosedur paramater masukan/keluaran
Program JamHidup
{membuat jam hidup yg selalu bertambah 1 detik terus menerus sampai jam 00:00:00. Masukan jam dibaca dari piranti masukan (keyboard). Setiap pertambahan 1 detik, jam yg baru ditampilkan sebagai keluaran}

Deklarasi Type jam : record <hh:integer {0..23} mm:integer {0..59} ss : integer {0..59} J :jam Procedure JamBerikutnya(input/output J : Jam)
{Menaikkan jam J dengan satu detik }

ALGORITMA Read(J.hh, J.mm, J.ss) {baca jam awal} Repeat write(J.hh, J.mm, J.ss) {cetak jam sekarang} JamBerikutnya(J) Until (J.hh = 0) and (J.mm =0) and (J.ss = 0) write(J.hh, J.mm, J.ss) {cetak jam 00:00:00}

FUNGSI
Sub Program yg mempunyai tujuan/tugas spesifik Fungsi dan prosedur adalah merupakan sub program yang ekivalen Dalam beberapa masalah penggunaan salah satunya adalah hal yg lebih tepat.

FUNGSI-next
Adalah sub program yg memberikan/mengembalikan (return) sebuah nilai dari tipe tertentu (tipe dasar atau tipe bentukan) Fungsi di dalam program bersesuain dengan definisi fungsi di dalam matematika
Contoh : a.f(x) = 2X2 + 5X 8 b. h(x,y) = 3x y +xy Dimana: f dan h adalah nama fungsi, sedangkan x dan y adalah parameter fungsi yg bersangkutan. Nilai yg diberikan oleh fungsi bergantung pada masukan parameter Misal : x=2, maka f(2) = 2*22 + 5*2 = 10 x=1, y=2, maka h(1,2) = 3*1 2+1*2=3 Nilai 10 dan 3 adalah nilai yang diberikan (return) oleh masing fungsi f dan fungsi h.

FUNGSI - next
Parameter pada fungsi disebut juga dengan parameter formal Parameter pada fungsi selalu merupakan sebagai parameter masukan yg digunakan oleh fungsi tsb untuk menghasilkan nilai. Fungsi tidak mempunyai parameter keluaran atau parameter masukan/ keluaran

FUNGSI - next
Struktur fungsi sama dengan Struktur prosedur (Header(judul), deklarasi, algoritma(badan fungsi)) Fungsi diakses dengan memanggil nama fungsi tsb.dari program yg memanggilnya. (sama dengan prosedur).

Struktur fungsi
Function NamaFungsi(input deklarasi parameter, jika ada) tipe ( tipe nilai yg diberikan oleh fungsi)
{spesifikasi fungsi, menjelaskan apa yang dilakukan dan yang dikembalikan oleh fungsi}

DEKLARASI
{semua yg dipakai di dalam fungsi dan hanya berlaku di dalam fungsi didefinisikan di sini}

ALGORITMA
{badan fungsi, berisi instruksi-instruksi untuk menghasilkan nilai yg akan dikembalikan oleh fungsi}

return ekspresi

{ pengembalian nilai yg dihasilkan fungsi }

Catatan : parameter formal selalu berjenis parameter masukan, sehingga parameter formal selalu diawal dengan keyword INPUT Ekspresi : dapat berupa konstanta, peubah(variabel) atau sebuah rumus

Struktur fungsi
Fungsi untuk menghasilkan nilai f(x)=2x2+5x-8, x R

Function f(input x : real) real {mengembalikan nilai f(x) = 2x2+5x-8, x R Deklarasi { tidak ada } Algoritma return 2*x*x + 5*x 8
______________________________________________

Catatan : f adalah nama fungsi dengan tipe real x adalah paramater formal dengan tipe real 2*x*x + 5*x 8 : nilai yg dihasilkan oleh fungsi Return : mengembalikan hasil dari ekspresi 2*x*x + 5*x 8

Kuis
Buatlah contoh fungsi untuk meghitung nilai dengan dua parameter formal dengan tipe bilangan bulat

Fungsii untuk menentukan bilangan genap atau ganjil Function Genap(input n : integer) boolean
{ true jika n adalah bilangan genap, atau false jika tidak genap }

Deklarasi
{ tidak ada }

Algoritma : return ( n mod 2 = 0 )

{ ekspresi BOOLEAN }

Fungsi nama hari


menggunakan peubah
Function NamaHari(input har : integer) string { mengembalikan nama hari berdasarkan nomor har} DEKLARASI nama : string Algoritma: case har 1: nama Senin 2: nama Selasa 3: nama Rabu 4: nama Kamis 5: nama Jumat 6: nama Sabtu 7: nama Minggu endcase return nama

tanpa peubah
Function NamaHari(input har : integer) string { mengembalikan nama hari berdasarkan nomor har} DEKLARASI { tidak ada } Algoritma: case har 1: return Senin 2: return Selasa 3: return Rabu 4: return Kamis 5: return Jumat 6: return Sabtu 7: return Minggu endcase

Fungsi untuk memeriksa kebenaran sandi

Function valid(input p : string) boolean


{ true jika password p benar, atau false jika salah }

Deklarasi const password = abc123 Algoritma: return (p=password)

{ sandi-lewat yg benar }

Pemanggilan FUNGSI
Fungsi di akses dengan cara memanggil namanya diikuti dengan parameter aktual (kalau ada)
Peubah NamaFungsi(parameter aktual, jika ada)

Pemanggilan FUNGSI : next


Karena fungsi menghasilkan nilai, maka:
Nilai yang dikembalikan oleh fungsi ditampung di dalam sebuah peubah (variabel) yng bertipe sama dengan tipe fungsi Contoh : y F(5) { y harus bertipe real } hh < Genap(m) {hh harus bertipe boolean; m harus
sudah terdefinisi nilainya

Nilai yang dikembalikan oleh fungsi dapat langsung dimanipulasi. Contoh : write(F(5)) If Genap(m) then

Contoh : pemanggilan fungsi


Untuk menampilkan tabel yang berisi nilai x dan f(x) di dalam selang[10,15] dengan delta X =0.2 : Dimana f(x)=2x2+5x-8, x R

output : ----------------------------x f(x) ----------------------------10.0 242.0 10.2 251.08 10.4 14.8 15.0 ------------------------------

Contoh : pemanggilan fungsi - next


Program TabelFungsi
{program utama yg memperagakan cara pemanggilan fungsi f. program ini menampilkan tabel nilainilai x dan f(x) di dalam selang [10,15] dengan deltax = 0.2}

Deklarasi x : real function f(input x : real) real


{ mengembalikan nilai f(x)=2x2+5x-8, x R}

Deklarasi
{ tidak ada }

Algoritma return 2*x*x + 5*x 8 Algoritma:


{buat header tabel}

write(------------------------------) write( x f(x) ) write(------------------------------) x 10.0 while x < 15.0 do write(x, ,f(x)) x x + 0.2 endwhile
{buat garis penutup}

write(----------------------------)

Contoh : pemanggilan fungsi - next


Program PeriksaSandi
{memeriksa kebenaran sandi, dimana sandi dibaca dari keyboard, bil sandi salah, pemasukan sandi dapat diulang lagi maksimal 3 kali }

Deklarasi Sandi : string { kata sandi yg dibaca dari keyboard } sah : boolean { true jika password benar, false jika password salah} i : integer { pencatat jumlah pembacaan sandi } function valid(input p : string) boolean { true jika password p benar, atau false jika salah } Deklarasi const password = abc123 { sandi-lewat yg benar } Algoritma: return (p=password) Algoritma: i1 sah < false repeat read(sandi) if valid(sandi) then sah true else ii+1 endif until (sah) or ( i > 3) if not sah then write(password salah, anda tidak punya hak mengakses sistem) endif

PROSEDUR atau FUNGSI


FUNGSI digunakan apabila modul program mengembalikan sebuah nilai PROSEDUR digunakan apabila modul program menghasilkan efek netto dari satu atau sekumpulan aksi

Mengubah fungsi menjadi prosedur:


Menyatakan nilai yg dikembalikan (return value) oleh fungsi tsb dikonfersikan sebagai parameter keluaran pada prosedur
Fungsi
Function Maks(input a,b:integer)integer Deklarasi Algoritma if a b then return a else return b endif

Prosedur
Function TentukanMaks(input a,b:integer, output maks :integer) Deklarasi Algoritma if a b then maks a else maks b endif

Mengubah prosedur menjadi fungsi:


Prosedur yg mempunyai satu buah parameter keluaran dapat ditulis sebagai fungsi dengan menyatakan parameter keluaran sebagai nilai yg dikembalikan oleh fungsi
Prosedur Fungsi

Procedure hitungrata2(input ndata:integer, output u: real) Deklarasi x: integer I : integer jumlah : integer Algoritma: jumlah 0 for I 1 to Ndata do read (x) jumlah jumlah + x endfor U jumlah/Ndata

Procedure Rata2(input ndata:integer) real Deklarasi x: integer I : integer jumlah : integer Algoritma: jumlah 0 for I 1 to Ndata do read (x) jumlah jumlah + x endfor return jumlah/Ndata

Rekursif
Fungsi Rekursif Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Fungsi ini akan terus berjalan sampai kondisi berhenti terpenuhi. oleh karena itu dalam sebuah fungsi rekursif perlu terdapat 2 blok penting :
BASIS : yaitu blok yang menjadi titik berhenti dari sebuah proses rekursi (memberi nilai yang terdefinisi pada fungsi rekursif) REKURENT: yaitu blok yang memanggil dirinya sendiri.

Pengertian REKURSIF
Suatu proses dari suatu subprogram (prosedur atau fungsi) yang memanggil dirinya sendiri

Proses rekursif
Suatu algoritma yg baik dan dapat membuat pemecahan masalah menjadi lebih mudah. Proses rekursif pengggunaan memori akan sangat besar, karena setiap kali suatu subprogram dipanggil, maka akan diperlukan sejumlah memori tambahan

Penulisan fungsi dan prosedur dengan rekursif :


Algoritma rekursif harus dinyatakan dalam prosedur atau fungsi, karena hanya prosedur dan fungsi yg dapat dipanggil dalam sebuah program Perlu diperhatikan adalah fungsi atau prosedur tsb harus mengandung suatu kondisi akhir dari suatu proses rekursi Kondisi akhir diperlukan untuk mencegah terjadinya proses rekursif yg tidak akan ada hentinya (proses rekursif akan berjalan terus menerus tanpa berhenti). Contoh: Procedure rekursif Deklarasi Algoritma: Write(Informatika UHAMKA) rekursif

Kondisi pengakhiran suatu proses rekursif dapat dilakukan dengan memberikan konstruksi penyeleksian kondisi sehingga proses rekursif akan berhenti jika kondisi yg ditetapkan telah terpenuhi Contoh: Procedur rekursif Deklarasi Algoritma: If batas < 7 then Write (Informatika UHAMKA) Batas batas + 1 Rekursif endif

Notasi algoritma :
Program rekursi Deklarasi
Batas : word Prosedur rekursif Deklarasi Algoritma:
If batas < 7 then
Write(Informatika UHAMKA) Batas batas + 1 Rekursif

Endif

Algoritma:
Batas 0 Rekursif

Contoh: untuk menampilkan suatu deret bilangan bulat positif N dari 0 sd. 10
Prosedur deret(input n word) Deklarasi Algoritma: Write(N:3) If N < 10 then Deret(N+1) endif Program urut Deklarasi
N:word

Prosedur deret(input n word) Deklarasi Algoritma: Write(N:3) If N < 10 then Deret(N+1) endif Algoritma: N0 Deret(N)

Ide dasar dalam memecahkan suatu masalah dengan rekursif adalah sebagai berikut: 1. Tentukan kasus penyetop atau kasus dasar di mana pemanggilan rekursif tidak lagi diperlukan (karena solusinya sudah diperoleh) 2. Terapkan suatu langkah untuk menggiring kasus kompleks ke kasus penyetopnya dengan metode yang mencerminkan fungsinya

contoh : Masalah yang akan dipecahkan adalah memotong roti tawar tipistipis sampai habis. Jika masalah ini akan dipecahkan secara rekursif, maka solusinya adalah:
1. Jika roti sudah habis atau potongannya sudah paling tipis, pemotongan roti selesai 2. Jika roti masih bisa dipotong, potong tipis dari tepi roti tersebut, lalu
lakukan prosedur 1 dan 2 untuk sisa potongannya.

Contoh fungsi rekursif misalnya adalah fungsi pangkat, faktorial, dan barisan fibonacci. Dalam fungsi pangkat xy , kita tahu bahwa semua bilangan selain 0, jika dipangkatkan dengan 0 nilainya sama dengan 1. Jika x dipangkatkan dengan y, dengan y lebih dari 0, maka hasilnya sama dengan x dikalikan dengan x dipangkatkan y 1. Jika dituliskan dalam notasi matematika definisinya adalah sebagai berikut: xy = 1, jika y=0 xy = x * xy-1, jika y > 0 Kita lihat di atas pada definisi y > 0, bentuk pemangkatan muncul kembali di sisi kanan. Itulah yang disebut rekursif

Definisi rekursif selalu dimulai dengan kasus penyetop, penghenti, atau kasus dasar dari suatu permasalahan, dalam hal ini terjadi ketika nilai y = 0. Definisi rekursif yang lebih kompleks mengandung inti dari permasalahan yang akan dipecahkan, namun lebih sederhana. Dalam hal ini yang tadinya x dipangkatkan dengan y, kini bentuk pemangkatan menjadi lebih sederhana, yaitu y 1. Hal ini dimaksudkan untuk menggiring masalah kompleks ke kasus dasar atau penyetop rekursinya

Untuk x = 10 dan y = 0, hasil dari xy adalah 1. Untuk x = 10 dan y = 3 hasilnya dapat digambarkan sebagai berikut:

xy = 1, jika y=0 xy = x * xy-1, jika y > 0

Algoritma Pangkat
Fungsi PangkatRekursif(input x, y: integer): integer
{mengembalikan nilai xy, y > 0 basis : xy = 1 jika y = 0 rekurens : xy = a x xy-1 }

Deklarasi Algoritma: if y = 0 then return 1 else return x*PangkatRekursif(x, y-1) endif

Pangkat dalam Bahasa Pascal


program pangkatrekursif; uses wincrt;

var a, n: integer;
Function pangkat(a, n : integer ) : integer; Begin If n = 0 then pangkat:= 1 Else pangkat:=a*pangkat(a,n-1); End; begin a:=10; write('masukan pangkat:'); readln(n); writeln(a, pangkat ',n,' adalah: ',pangkat(a,n):10); end.

Procedure rekursif Deklarasi Algoritma: Write(Informatika UHAMKA) rekursif

Program rekursi Deklarasi Batas : word Prosedur rekursif Deklarasi Algoritma: If batas < 7 then Write(Informatika UHAMKA) Batas batas + 1 Rekursif Endif Algoritma: Batas 0 Rekursif

Program urut Deklarasi N:word Prosedur deret(input n word) Deklarasi Algoritma: Write(N:3) If N < 10 then Deret(N+1) endif Algoritma: N0 Deret(N)

Menghitung nilai FAKTORIAL


Faktorial (0) = 1 : Nilai awal Faktorial (n) = n * faktorial(n-1) : Rekurent faktorial (4) = 4 * faktorial (3) 3 * faktorial (2) 2 * faktorial (1) 1 * faktorial (0) 1 =4*3*2*1*1 = 24 __________________________________________________ function faktorial (input nilai : integer) : integer DEKLARASI

ALGORITMA: if nilai <= 0 then return 1 else return nilai*faktorial (nilai-1) endif

Menghitung nilai FAKTORIAL-dalam bahasa PAscal function faktorial (nilai : integer) : integer; begin if nilai <= 0 then faktorial := 1 else faktorial := nilai * faktorial (nilai-1) end;

Var N : integer; Begin Write(Berapa faktorial ? ); Readln(N); Writeln(N, faktorial = ,faktorial(N)); End.

Pseudo-code
function faktorial (input nilai : integer) : integer DEKLARASI ALGORITMA: if nilai <= 0 then return 1 else return nilai*faktorial (nilai-1) endif

- Bahasa Pascal
function faktorial (nilai : integer) : integer; begin if nilai <= 0 then faktorial := 1 else faktorial := nilai*faktorial (nilai-1) end;

Proses hitung faktorial dengan Prosedur


program rekursiffaktorial; uses wincrt; var n:byte; f:longint; procedure faktorial(N:byte; var hasil:longint); begin

if n <= 1 then hasil:=1 else begin faktorial(n-1, hasil); hasil:= N*hasil; end; end; begin write('Faktorial yg dihitung ?'); readln(N); faktorial(N,f); writeln('faktorial ',N,' adalah:', f); end.

Fungsi
function faktorial (nilai : integer) : integer; begin if nilai <= 0 then faktorial := 1 else faktorial := nilai * faktorial (nilai-1) end; Var N : integer; Begin Write(Berapa faktorial ? ); Readln(N); Writeln(N, faktorial = ,faktorial(N)); End.

- Prosedur
procedure faktorial(N:byte; var hasil:longint); begin if n <= 1 then hasil:=1 else begin faktorial(n-1, hasil); hasil:= N*hasil; end; end; begin write('Faktorial yg dihitung ?'); readln(N); faktorial(N,f); writeln('faktorial ',N,' adalah:', f); end.

Barisan FIBONANCI
Barisan Fibonanci: F (0) = 0
F (1) = 1 F (n) = F ( n-1 ) + F (n-2); untuk n >1 ____________________________________________ Function fibonacci ( input n : integer ) : integer Deklarasi Algoritma: If n 0 then return 0 Else If n 1 then return 1 Else return fibonacci (n-1) + fibonacci (n-2) Endif endif

Bahasa pascal
Function fibonacci ( n : integer ) : integer; Begin If n = 0 then fibonacci := 0 Else If n := 1 then fibonacci := 1 Else fibonacci := fibonacci (n-1) + fibonacci (n-2); End;

Pseudo-code
Function fibonacci ( input n : integer ) : integer Deklarasi Algoritma: If n 0 then return 0 Else If n 1 then return 1 Else return fibonacci (n-1) + fibonacci (n-2) Endif endif

- Bahasa Pascal
Function fibonacci ( n : integer ) : integer;

Begin If n = 0 then fibonacci := 0 Else If n := 1 then fibonacci := 1 Else fibonacci := fibonacci (n-1) + fibonacci (n-2); End;

Latihan
1. Buat Algoritma untuk menghitung deret S = 1+2+3+4+5+...+n menggunakan function rekursif 2. Buatkanlah program dengan bahasa pascal lengkap untuk Algoritma di atas.

Array (Larik)
Array yaitu yang berbaris-baris atau berderet-deret. Dalam pemrograman : deretan data yang mempunyai jenis atau tipe data yang sama. Nama Array mewakili deret data dia miliki.
Contoh: A:array[1..5] of integer
A adalah nama array

Definisi Array
Adalah sebuah peubah (variabel) yang mempunyai struktur data yang dapat menyimpan lebih dari satu nilai yang sejenis (tipe data yang sama), setiap elemen diacu melalui indeksnya. Elemen array tersusun di memori secara berurutan (sekuensial), oleh sebab itu indeks array(larik) haruslah tipe data yang menyatakan keterurutan, misalnya integer atau karakter.

Elemen Array
I n d e k s I n d e k s

1 2 3 4 5
Elemen Array kosong

A 1 158 2 157 3 162


4 170 5 163
Elemen Array yg sudah disi nilai

A[1], A[2], A[3], A[4], A[5]

Variabel array vs variabel biasa


Variabel array Dapat menyimpan lebih dari satu nilai yg sejenis Contoh: Deklarasi: A:array[1..5] of integer Variabel biasa Hanya dapat menyimpan satu nilai walaupun sejenis Contoh : Deklarasi: A1 : integer A2 : integer A3 : integer A4 : integer A5 : integer

Deklarasi Array
Sesuatu yang akan digunakan/dipakai dalam suatu program terlebih harus dideklarasikan Array (Larik) adalah struktur(susunan) data yg statis, artinya elemen larik harus sudah diketahui sebelum program dieksekusi. Jumlah elemen larik tidak dapat diubah (ditambah/dikurangi) selama pelaksanaan program (program running). Mendeklarasikan larik di dalam bagian deklarasi berarti :
mendefinisikan banyaknya elemen larik (memesan tempat di memori) mendefinisikan tipe elemen larik (menetapkan tipe nilai yg dapat disimpan oleh larik (array).--> tipe data dapat berupa : tipe dasar/sederhana (integer, real, char, string, Boolean), tipe bentukan (tipe terstruktur :record)

Deklarasi Array -next


Array dari tipe data dasar :
DEKLARASI : A : array[1.50] of integer NamaMhs : array[1..10] of string NilaiUjian : array[1..75} of real

Sebagai tipe bentukan :


membuat/medefinisikan tipe dasar dengan nama sebuah tipe baru DEKLARASI : Type LarikInt : array[1..100] of integer { nama tipe baru} A:LarikInt {A adalah sebuah variable (peubah) array dg 100 elemen
dan bertipe integer}

Deklarasi Array -next


Sebagai sebuah konstanta : Mendefinisikan ukuran array (larik) sebagai sebuah konstanta DEKLARASI:
Const max= 10 N: array[1..max] of real I: integer

ALGORITMA :
For i:=1 to max do read(n[i]) Endfor

Deklarasi Array -next


Sebagai tipe bentukan terstruktur (RECORD) :
Tipe yang berbentuk rekaman (record), rekaman disusun oleh satu atau lebih field. Setiap field menyimpan data dari tipe dasar tertentu. DEKLARASI :
Const NMaks = 100 Type Mahasiswa : record< NIM : integer NAMA : String IPK : real > Type tabmhs : array[1..maks] of mahasiswa Mhs : TabMhs Penulisan elemen mhs : Mhs[2] {elemen kedua dari array mhs} Mhs[2].NIM {mengacu field NIM dari elemen kedua dari array Mhs} Mhs[2].IPK {mengacu field IPK dari elemen kedua dari array Mhs}

Pengsian Nilai per field : Mhs[i].NIM 102131002 Mhs{i].NAMA BUDI UTOMO Mhs[i].IPK 3.6
Menampilkan hasil per field : Output([Mhs[i].NIM, Mhs[i].NAMA, Mhs[i].IPK)

Acuan Elemen Array(Larik)


Elemen Array diacu melalui indeksnya, Nilai Indeks harus terdefinisi.
A[4] mengacu elemen ke 4 dari larik A NamaMhs[2] mengacu elemen ke 2 dari larik namaMhs A[i] mencau elemen ke-I dari larik A, asalkan nilai I sudah terdefinisi.

Memanipulasi elemen array (larik) :


A[4] 10 NamaMhs[i] Achmad
Read(A[i]) If A[i] < 10 then A[i] A[i] + 10 Else .

Pemrosesan Array (Larik)


Elemen array diproses secara beruntun melalu indeks yang terurut mulai dari elemen pertama sampai elemen terakhir. Skema umum pemrosesan array: PROGRAM ProsesArray DEKLARASI:
Const max= 10 Type LarikInt : array[1..max] of integer A : LarikInt I: integer

{indeks Array}

ALGORITMA :
For i:=1 to max do pemrosesan terhadap A[i]) Endfor

Pemrosesan pengisian nilai, pembacaan, penulisan, komputasi, dan manipilasi lainnya.

Pengisian Elemen Array (Larik) :


Secara Lansung :
Contoh
A[i] 10 Inisialisasi :
For I 1 to n do A[i] I Endfor

Dengan pembacaan (dari keyboard) :


Contoh :
For I 1 to n do read(A[i]) Endfor

Ukuran efektif Array (Larik)


Jumlah elemen larik sudah ditentukan (statis), tapi belum tentu semua digunakan/dipakai Jumlah elemen yang dipakai itulah yang disebut dengan ukuran/jumlah efektif array. Ukuran efektif dapat dicatat di dalam peubah (variabel) tertentu, misalnya n.

tiga cara untuk menentukan jumlah elemen efektif dari array(Larik) :


1. Jika Jumlah elemen efektif ditentukan di awal 2. Jika Jumkah elemen efektif diketahui di akhir pembacaan 3. Jika Jumlah elemen efektif baru diketahui di akhir pembacaan (variasi dari versi 2)

Jumlah elemen efektif ditentukan di awal


Procedure BacaLarik(Output A : LarikInt, input n : integer) {Mengisi elemen-elemen larik A[1..n] dengan pembacaan}
{K. Awal : n adalah jumlah elemen efektif larik, nilainya terdefinisi} { K. Akhir : setelah pembacaan, seluruh elemen larik A berisi nilai-nilai yang dibaca dari piranti masukan (keyboard)}

DEKLARASI i : integer {pencatat indeks larik } ALGORITMA for i 1 to n do read(A[i]) endfor

Jumlah elemen efektif diketahui di akhir pembacaan


Setiap kali selesai pembacaan satu buah elemen, akan dilakukan konfirmasi apakah masih ada lagi elemen larik yang akan dimasukkan, seperti statement di bawah ini : Write(Lagi? (y/t)) JIka jawabnya y maka pembacaan dilanjutkan, jika t maka proses pembacaan dihentikan. Jumlah elemen yang dibaca di catat di dalam suatu variabel (peubah)

Procedure BacaLarik2(Output A: Larikint, Output n: integer) {K. Awal : sembarang} {K. Akhir : sebanyak n buah elemen larik A berisi nilai-nilai yang dibaca; n berisi jumlah elemen larik yang diisi} DEKLARASI Jawab : char ALGORITMA N0 Repeat nn+1 Read(A[n]) Write(Lagi? (y/t)) Read(jawab) Until jawab = t

Jumlah elemen efektif baru diketahui di akhir pembacaan (variasi dari versi 2)
Proses pembacaan dianggap selesai jika nilai yang dibaca adalah suatu tanda, misalnya 9999.

Procedure BacaLarik3(output A, LArikint, output n : integr)


{mengisi elemen-elemen larik A[1..n] dg cara pembacaan. Akhir pembacaan ditandai jika nilai yang dibaca adalah 9999} {K.Awal : sembarang } K. Akhit : sebanyak n buah elemen larik A berisi nilai-nilai yang dibaca; n berisi jumlah larik yang diisi.}

DEKLARASI x : integer {menyimpan sementara nilai yang di baca} ALGORITMA n0 read(x) while x 9999 do n n +1 A[n] x read(x) endwhile
{x = 9999}

Menghitung Nilai Rata-rata


Data yang sudah disimpan di dalam Larik, selanjutnya data tersebut dapat dimanipulasi

Procedure hitungRataRata(input A:Larikint, input n:integer) DEKLARASI


I : integer Jumlah : real

ALGORITMA
I 1 {dimulai dari elemen pertama} Jumlah 0 {jumlah total nilai mula mula} For i 1 to n do jumlah jumlah + A[i] Endfor U jumlah/n

Notasi Algoritma hitung rata rata


PROGRAM Rerata
DEKLARASI const NMaks = 100 type LarikInt : array[1..NMaks] of integer A : LArikInt n : integer u : integer { nilai rata-rata }
procedure BacaLarik1(output A : Larikint, input n :integer)
{ mengisi elemen larik A[1..n] dengan pembacaan }

procedure HitungRataRata(input A : LArikint, input n : integer. Output u : real)


{menghitung nilai rata-rata larik A}

ALGORITMA read(n) {tentukan jumlah elemen larik yang akan digunakan } BacaLarik1(A, n) HitungRataRata(A, n, u) write(u)

Kapan menggunakan Larik (array):


Untuk menyimpan sejumlah data yang bertipe sama. Untuk menghindari penggunaan namanama peubah(variabel) yang banyak. Agar penulisan program lebih efisien dalam penulisan kode programnya.

latihan
Buatlah algoritma tanpa menggunakan prosedur (sub program) untuk menghitung nilai-nilai rata-rata dari data yang tersimpan pada elemen array(larik) yang bertipe integer. Konversikan algoritma tersebut ke dalam bahasa pascal.

ARRAY KONSTAN :
Nilai yang terkandung di dalam sebuah array dapat bernilai konstan, artinya nilai-nilai tersebut tidak dapat diubah. mendeklarasikan array bersangkutan dengan kata kunci CONST. Bentuk umumnya adalah sbb: Const NamaArray : array[IndekAwal..IndekAkhir] of tipe_data = (nilai1, nilai2, ...);

Bentuk umum array konstan


Const NamaArray : array[IndekAwal..IndekAkhir] of tipe_data = (nilai1, nilai2, ...)
Contoh : Const A: array[1..5] of char = (A, B, C, D, E)

Array A di atas bersifat konstan, maka nilai yang ada tidak digantikan dengan nilai lainnya. Contoh : A[1] V { SALAH, Karena elemen A[1] selalu bernilai A} A[2] W {SALAH, Karena elemen A[2] selalu bernilai B} A[3] X { SALAH, Karena elemen A[3] selalu bernilai C} A[4] Y {SALAH, Karena elemen A[4] selalu bernilai D} A[5] Z { SALAH, Karena elemen A[5] selalu bernilai E}

Algoritma penggunaan Array konstan


Program ArrayKonstan DEKLARASI : Const BULAN : array[1..12] of string = (Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, Nopember, Desember) noBulan : integer;

ALGORITMA : read(noBulan) write(BULAN[noBulan]);

MENCARI NILAI MAKSIMUM ARRAY :


Nilai maksimum pada sebuah variabel Array adalah elemen array yang mempunyai nilai terbesar diantara elemen array lainnya.

158 157 162 169 172 155 170 163


1 2 3 4 5 6 7 8

Nilai maksimum adalah : 172 ada pada elemen A[5]

Kalau elemen larik sudah terurut baik secara ascending maupun descending, maka nilai maksimum langsung bisa diperoleh : Ascending pada elemen terakhir, Descending pada elemen pertama
Permasalahan muncul bila nilai elemen array tesusun secara acak, maka untuk mencari nilai maksimumnya harus mengunjungi seluruh elemen array.

Tiga versi algoritma untuk mencari nilai maksimum


Cara 1 : 1. Mengasumsikan nilai maksimum sementara (maks) adalah yang sangat kecil (misal: -9999). 2. Selanjutnya array dikunjungi mulai dari elemen pertama, 3. setiap kali mengunjungi elemen array, bandingkan elemen tersebut dengan nilai maksimum sementara. 4. Jika elemen array yang sedang dintinjau lebih besar dari nilai maksimum sementara, maka (maks) diganti dengan elemen tersebut. 5. pada akhir kunjungan (setelah seluruh elemen array dikunjungi), nilai maksimum semntara menjadi nilai maksimum sebenarnya.

Ilustrasi untuk maks : -999


A `
158 157 162 169 172 155 170 163

Asumsi : maks = -9999 (nilai maksimum sementara) A[1] > maks? Ya A[2] >maks? Tidak A[3] > maks? Ya A[4] > maks? Ya A[5] >maks? Ya A[6] > maks? tidak A[7] > maks? tidak A[8] >maks? Tidak maks A[1] (maks=158) maks tidak berubah maks A[3] (maks=162) maks A[4] (maks=169) maks A[5] (maks=172) maks tidak berubah maks tidak berubah maks tidak berubah

(proses pembandingan selesai) Didapat : maks = 172 (nilai maksimum array yang ditemukan)

Algoritma untuk maks = -999


Program NilaiMaksimum DEKLARASI : Const N = 8 A : array[1..N] of integer = (158, 157, 162, 169, 172, 155, 170, 163) I, maks : integer

ALGORITMA : Maks -9999 {nilai maksimum sementara} For i 1 to N do If A[i] > maks then Maks A[i] endif endfor Write(maks)

Cara 2: Mencari nilai Maksimal


1. Nilai maksimum sementara diinisialisasikan dengan elemen pertama array. 2. selanjutnya, arrray dikunjungi mulai dari elemen kedua 3. setiap kali mengunjungi elemen array, bandingkan elemen tersebut dengan nilai maksimum sementara. 4. jika elemen array yang sedang dintinjau lebih besar dari nilai maksimum sementara, maka (maks) diganti dengan elemen tersebut. 5. pada akhir kunjungan (setelah seluruh elemen array dikunjungi), nilai maksimum sementara menjadi nilai maksimum sebenarnya.

Ilustrasi untuk maks : elemen pertama


A `
158 157 162 169 172 155 170 163

Asumsi : maks = A[1] (nilai maksimum sementara, maks=158) A[2] >maks? Tidak A[3] > maks? Ya A[4] > maks? Ya A[5] >maks? Ya A[6] > maks? tidak A[7] > maks? tidak A[8] >maks? Tidak maks tidak berubah maks A[3] (maks=162) maks A[4] (maks=169) maks A[5] (maks=172) maks tidak berubah maks tidak berubah maks tidak berubah

(proses pembandingan selesai) Didapat : maks = 172 (nilai maksimum array yang ditemukan)

Algoritma untuk maks = Elemen pertama


Program NilaiMaksumum DEKLARASI : Const N = 8 A : array[1..N] of integer = (158, 157, 162, 169, 172, 155, 170, 163) I, maks : integer

ALGORITMA : Maks A[1] {nilai maksimum sementara} For i 2 to N do If A[i] > maks then Maks A[i] endif endfor Write(maks)

Cara 3: Mencari nilai Maksimal


Mencari nilai maksimal berdasarkan nomor indeks array. Algoritma : idxMaks 1 for I 2 to n do if A[i] > A[idxMaks] then idxMak I endif endfor

Mencari Nilai Minimum Array (Larik)


Mencari elemen larik yang mempunyai nilai terkecil di antara elemen larik lainnya. Konsepnya sama dengan Mencari nilai maksimum array

Latihan
Buatlah algoritma untuk mencari nilai terbesar dari data yang sudah tersimpan pada elemen array, dimana nilai yang tersimpan pada elemen array tersebut di baca dari inputan eksternal (keyboard). Konversikan algoritma di atas ke dalam Bahasa Pascal

Menyalin Larik (Array)


A ` B `
1 2 3 4 5 6 7 8

158

157

162

169

172

155

170

163

Algoritma Menyalin Larik


Program Salin DEKLARASI: Const maks=100 A:array[1..maks] of integer B:array[1..maks] of integer I,n : integer ALGORITMA: Read(n) {menentukan jumlah elemen yang akan digunakan} {membaca nilai dari inputan eksternal (keyboard)} For I 1 to n do read(A[i]) Endfor {menyalin Larik A ke Larik B} for I 1 to n do B[i] A[i] endfor {Menampilkan nilai elemen array B setelah dilakukan penaylinan dari elemen array A} For I 1 to n do write(B[i]) endfor

Menguji kesamaan dua buah Larik


Dilakukan dengan membandingkan setiap elemen yang berpadanan pada ke dua larik tersebut Jika ditemukan satu saja elemen yang tidak sama, maka dapat dipastikan dua buah larik tersebut tidak sama. Apabila semua elemen dari larik itu sama, maka dapat dikatakan dua buah larik itu sama.

Menguji kesamaan dua buah Larik - next


123 130 140 160 180

A `

B `

123 130 140

160

180

Algoritma menguji kesamaan larik


Program uji DEKLARASI Const maks=5 A:array[1..maks] of integer=(123,130,140,160,180) B:array[1..maks] of integer=(123,130,140,160,180) I : integer Sama : boolean ALGORITMA: I 1 Sama true While (I maks) and (sama) do if A[i] = B[i] then I I + 1 {tinjau elemen berikutnya} else sama false endif Endwhile { I > maks or sama=false } {tampilkan hasil} If sama true then write(dua larik sama) Else write(dua larik berbeda) endif

ARRAY DUA DIMENSI (MATRIKS) Pengertian array dua dimensi :


Array dua dimensi dapat dipandang sebagai gabungan array satu dimensi. Ilustrasi :Pandanglah tiga buah array satu dimensi yang dibuat dengan: A1[4], A2[4], A3[4] : dengan tipe data yang sama

ARRAY DUA DIMENSI (MATRIKS)-next


Ketiga buah array satu dimensi di atas, dapat digabung menjadi satu, sehingga terbentuk sebuah array yang disebut array dua dimensi, yang dapat diilustrasikan sebagai berikut :

Dari ilustrasi diatas, terlihat array tersebut terdiri dari 3 baris, dan 4 kolom, dan jumlah elemennya = 3 x 4 = 12 elemen, karena terdiri dari baris (row) dan kolom (column) maka arrray dua dimensi sering disebut MATRIX. Karena sudah menjadi satu buah array, maka nama array hanya satu buah, Misalnya A[3] [4] yang maksudnya adalah terdiri barisnya ada 3, dan kolomnya ada 4.

Bentuk Umum Array Dua Dimensi

Array konstan untuk array dua dimensi (matriks) Cotoh: Array Dua Dimensi dengan matriks : 3 x 5, dengan tipe data integer dan char :

Mengisi Elemen Array Dua Dimensi (MATRIKS) Diketahui array dua dimensi : A : array[1..3, 1..4] of integer

Untuk keperluan praktis dan keragaman, indeks untuk baris dan kolom menggunakan variabel. Misal : i untuk baris dan J untuk kolom

Algoritmanya : I 2 J3 A[i, j] 17

Isi Elemen Matriks per baris atau per kolom

Pengisian semua elemen Matriks secara baris perbaris :

Algoritmanya : N 1 I1 While (i<=3) J 1 While ( j<= 4) A[i, j] N N++ J++ Endwhile I++ Endwhile

Pengisian semua elemen Matriks secara kolom perkolom :

Algoritmanya : X 1 NX J1 While (J <= 4) i 1 While ( i <= 3) A[i, j] N N+4 i++ Endwhile X++ NX J++ Endwhile

Mengisi Elemen Array Dua Dimensi, dengan Nilai yang diinput dari Keyboard :
Misalnya Array Dua Dimensi dengan Matrik 3 x 5. isikan nilai kedalam elemen matrik tersebut.

Algoritmanya : I1 While (i<=3) J 1 While ( j<= 5) Read(nilai) A[i, j] nilai J++ Endwhile I++ endwhile

Latihan 1:
diketahui matriks 3 x4 untuk array dua dimensi, Buatlah algoritma untuk melakukan inisialisasi nilai (nilai konstan) pada array dua dimensi tersebut dengan tipe data integer. Dan cetak/tampilkanlah nilai dari masing-masing elemen dari matriks tersebut di atas. Transformasikanlah Algoritma di atas ke dalam bahasa pemrogaram PASCAL.

Latihan 2:
diketahui matriks 3 x4 untuk array dua dimensi, Buatlah algoritma dengan menginputkan nilai dari inputan eksternal (keyboard) ke dalam masing elemen matriks di atas dengan tipe data integer. Dan cetak/tampilkanlah nilai dari masingmasing elemen dari matriks tersebut. Transformasikanlah Algoritma di atas ke dalam bahasa pemrogaram PASCAL.

MENYALIN ISI ARRAY DUA DIMENSI

Algoritmanya : For i=1 to i<= 3 do For j=1 to j <=4 do B[i,j] A[i,j] Endfor Endfor

MENGHITUNG TOTAL ISI ARRAY DUA DIMENSI Algoritmanya : TOT 0 I1 While (i<=3) do J1 While (J <= 4) do TOT TOT + A[i,j] J++ Endwhile I++ Endwhile Write (TOT )

MENAMBAH ISI DUA BUAH ARRAY DUA DIMENSI


Dua buah array Dua Dimensi yang dibuat A[3,4], dan B[3,4] dengan tipe data integer.

Algoritmanya : I 1 While (i <= 3 ) do J 1 While ( J <= 4 ) do C[i,j] A[i,j] + B[i,j] J++ Endwhile I++ Endwhile

MENGALIKAN ISI DUA BUAH ARRAY DUA DIMENSI :


Dua buah array Dua Dimensi A[2,3] dan B[3,4] yang dibuat dengan tipe data integer :

Catatan : Syarat dua buah matriks dapat dikalikan adalah : Jumlah kolom matriks ke 1 harus sama dengan jumlah baris matriks ke 2. Sedangkan hasilnya adalah matriks ke 3, yaitu jumlah baris matriks ke 3 (matriks hasil) sama dengan jumlah baris matriks ke 1, dan jumlah kolomnya (matriks 3) sama dengan jumlah kolom matriks ke 2.

Perkalian matriks - next


Contoh : A[2,3] x B[3,4] = c[2,4]

Ilustrasi proses : 2x3+4x2+3x3 = 2x2+4x4+3x3 = 2x5+4x6+3x2 = 2x7+4x3+3x5 =


3x3+2x2+5x3 3x2+2x4+5x3 3x5+2x6+5x2 3x7+2x3+5x5 = = = =

Secara umum 8 persamaan di atas, dapat ditulis sebagai berikut : C[i,j] = (A[i,k] * b[k,j] ) Dimana : K dipakai untuk : COL pada array A dan ROW pada array B, dan untuk suatu nilai i dan j, nilai k bergerak 1 sd. 3

Latihan 1:
diketahui matriks 3 x4 untuk array dua dimensi, Buatlah algoritma untuk menghitung nilai total dari matriks tersebut sedang nilai didapat dengan melakukan inisialisasi nilai (nilai konstan) pada array dua dimensi tersebut dengan tipe data integer. Dan cetak/tampilkanlah nilai total dari matriks di atas. Transformasikanlah Algoritma di atas ke dalam bahasa pemrogaram PASCAL.

Latihan 2:
diketahui matriks A=2 x3 dan matrisk B=3x4, Buatlah algoritma untuk menghitung hasil perkalian dua buah matriks. Sedang nilai dari dua buah matriks tersebut didapat dengan melakukan inisialisasi nilai (nilai konstan) pada dua matriks tersebut dengan tipe data integer. Dan cetak/tampilkanlah hasil perkalian dua matriks tersebut. Transformasikanlah Algoritma di atas ke dalam bahasa pemrogaram PASCAL.

TUGAS

(dikumpulkan minggu depan, 20 april 2011)


Buatlah tiga jenis algoritma untuk menentukan hasil perkalian dari dua buah matriks. Dengan ketentuan sebagai berikut :
Silahkan tentukan sendiri ukuran dari dua buah matriks tersebut. Tentukanlah nilai dari dua buah matriks tersebut dengan menggunakan inisialisasi atau inputan dari keyboard. Tipe data ke dua matriks tersebut adalah integer.

Konversikanlah tiga jenis algoritma di atas ke dalam bahasa pemrograman Pascal.

Algoritma Pencarian
Proses pencarian adalah menemukan nilai (data) tertentu dalam sekumpulan data yang bertipe sama (tipe dasar atau tipe bentukan) larik (array) Pencarian (searching) merupakan proses yg mendasar dalam pengelohana data.
Contoh: UPDATE, INSERT.

Spesifikasi Masalah Pencarian :


Hasil/keluaran dari persoalan pencarian bergantung pada spesifikasi rinci dari persolan tersebut, seperti hasil/keluaran: Sebuah pesan (message) : ditemukan atau tidak ditemukan di dalam Larik. Contoh : write(ditemukan) atau write( tidak ditemukan) Indeks emelen Larik dari data/nilai yg ditemukan, jika tidak ditemukan indeks diisi dg harga khusus, misal:-1 Contoh: x= 76 idx=3, x=100 idx=-1 Nilai boolean yg menyatakan status hasil pencarian : jika ada data/nilai ditemukan, maka peubah/variabel yg bertipe boolean diisi dg true, dan kalau tidak ketemu diisi dengan false. Contoh: x= 76 ketemu=true, x=100 ketemu= false

Pencarian untuk duplikasi data :


Apabila data yang dicari terdapat lebih dari satu banyaknya, maka hanya data yang pertama kali ditemukan yang diacu, dan algoritma pencarian selesai. Contoh :

Larik A mempunyai dua buah nilai 42, maka algoritma selesai ketika nilai 42 pertama ditemukan, yaitu pada elemen ke-6, dan hasilnya adalah idx = 6, atau ketemu = true. Nilai 42 lainnya tidak dipertimbangkan lagi dalam pencarian.

metode pencarian data di dalam array diklasifikasikan menjadi dua, yaitu :


1. Metode pencarian beruntun (sequantial search) 2. Metode pencarian bagi dua/pencarian biner (binary search)

Metode pencarian beruntun (sequantial search)


Disebut juga dengan pencarian lurus (linear search) Proses membandingkan setiap elemen larik(array) satu persatu beruntun, mulai elemen pertama sampai elemen yg dicari ditemukan, atau seluruh elemen sudah diperiksa

Contoh : Metode pencarian beruntun (sequantial search)

Misalkan nilai yang dicari adalah 42 Pemeriksaaan dilakukan terhadap elemen 60, 12, 76, 23, 11, 42 (ditemukan) Ternyata nilai ditemukan pada elemen ke 6 : Indek larik yang dikembalikan : idx 6 Proses pencarian dihentikan. Misalkan nilai yang dicari adalah 20 Pemeriksaan dilakukan terhadap elemen 60, 12, 76, 23, 11, 42, 18, 42 (tidak ditemukan) Ternyata nilai tidak ditemukan di dalam array, Indeks larik yang dikembalikan : idx -1 Proses pencarian dihentikan.

Dua Versi algoritma pencarian beruntun ( sequential search)


Aksi pembandingan dilakukan sebagai kondisi pengulangan :
Tidak menggunakan peubah (variabel) boolean dalam proses pencarian.

Aksi pembandingan dilakukan di dalam badan pengulangan :


menggunakan peubah (variabel) boolean dalam proses pencarian.

Versi 1: Aksi pembandingan dilakukan sebagai kondisi pengulangan :


Hasil pencarian yg diinginkan: sebuah peubah boolean yg bernilai true bila nilai ditemukan atau bernilai false bila data/nilai tidak ditemukan Algoritma : Setiap elemen array dibandingkan dengan nilai/data yg dicari mulai dari elemen pertama Aksi pembandingan dilakukan selama indeks array belum melebihi banyaknya elemen array (n) dan A[i] tidak sama dengan nilai/data yg dicari. Aksi pembandingan dihentikan, bila A[i] = nilai/data yang dicari atau i=n. Elemen terakhir A[i] diperiksa secara khusus. Keluaran yg dihasilkan adalah sebuah peubah boolean bernilai true jika data ditemukan, atau false jika data tidak ditemukan.

Algoritma versi 1: hasil pencarian sebuah variabel boolean


Prosedur : Fungsi :

Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output ketemu:boolean) Deklarasi : I : integer Algoritma : I1 While(i<n) and (A[i] x) do I I +1 Endwhile If A[i] = x then ketemu true {x ditemukan} Else ketemu false {x tidak ada dalam larik A} endif

Function cariberuntun(input A:Larikint, input n:integer, input x :integer) boolean Deklarasi: I : integer Algoritma: I1 While(i<n) and (A[i] x) do I I +1 Endwhile If A[i] = x then return true {x ditemukan} Else return false {x tidak ada dalam larik A} endif

Algoritma lengkap u/ panggil prosedur : versi 1


Program Pencarian Deklarasi: const Nmaks = 100 type LarikInt : array[1..Nmaks] of integer A: LarikInt x:integer found : boolean n : integer Procedure bacalarik(output A:LarikInt, input Deklarasi : I : integer Algoritma: for I 1 to n do read(A[i]) endfor

n:integer)

Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output ketemu:boolean) Deklarasi : I : integer Algoritma : I1 While(i<n) and (A[i] x) do I I +1 Endwhile If A[i] = x then ketemu true {x ditemukan} Else ketemu false {x tidak ada dalam larik A} Endif ALGORITMA : read(n) bacaLarik(A,, n) read (x) cariberuntun(A, n, x, found) if found = true then write(x, ditemukan) else write(x, tidak ditemukan) endif

Versi 1: Aksi pembandingan dilakukan sebagai kondisi pengulangan :


Hasil pencarian yg diinginkan: indeks elemen array (larik) yang mengandung nilai/data yang dicari. Algoritma : Setiap elemen array dibandingkan dengan nilai/data yg dicari mulai dari elemen pertama Aksi pembandingan dilakukan selama indeks array belum melebihi banyaknya elemen array (n) dan A[i] tidak sama dengan nilai/data yg dicari. Aksi pembandingan dihentikan, bila A[i] = nilai/data yang dicari atau i=n. Elemen terakhir A[i] diperiksa secara khusus. Keluaran yg dihasilkan adalah sebuah peubah index (misal: idx) yang berisi indeks larik tempat data/nilai yang dicari ditemukan. jika data data tidak ditemukan, idx diisi dengan nilai -1.

Algoritma versi 1: hasil pencarian sebuah Indeks elemen array


Prosedur : Fungsi :

Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output idx: integer) Deklarasi : I : integer Algoritma : I1 While(i<n) and (A[i] x) do I I +1 Endwhile If A[i] = x then idx i {x ditemukan} Else idx -1 {x tidak ada dalam larik A} endif

Function cariberuntun(input A:Larikint, input n:integer, input x :integer) integer Deklarasi: I : integer Algoritma: I1 While(i<n) and (A[i] x) do I I +1 Endwhile If A[i] = x then return i {x ditemukan} Else return -1 {x tidak ada dalam larik A} endif

Kasus : versi 1
menambah (append) nilai/data ke dalam larik (array)

Tentukan atau lakukan pencarian apakah data/nilai tersebut sudah ada dalam array. Jika belum ada, maka nilai/data tersebut ditambahkan pada elemen ke n+1. Penambahan satu elemen baru tidak melampaui ukuran maksimal larik(array) (Nmaks). Setelah penambahan elemen baru, ukuran larik(array) efektif menjadi n+1.

Algoritma : penambah (append) nilai/data ke dalam larik (array)


Program Tambahelemenlarik Deklarasi: const Nmaks = 100 type LarikInt : array[1..Nmaks] of integer L: LarikInt x, idx, n :integer Procedure bacalarik(output A:LarikInt, input Deklarasi : I : integer Algoritma: for I 1 to n do read(A[i]) endfor n:integer)

Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output idx:integer) Deklarasi : I : integer Algoritma : I1 While(i<n) and (A[i] x) do I I +1 Endwhile If A[i] = x then idx i {x ditemukan} Else idx -1 {x tidak ada dalam larik A} Endif ALGORITMA : read(n) bacaLarik(A,, n) read (x) cariberuntun(A, n, x, idx) if idx -1 then write(x, sudah terdapat di dalam larik) else n n + 1 { naikkan ukuran larik } A[n] x { tambahkan nilai x} endif

Versi 2: Aksi pembandingan dilakukan di dalam badan


pengulangan : (bukan di awal pengulangan)

Hasil pencarian yg diinginkan: sebuah peubah boolean yg bernilai true bila nilai ditemukan atau bernilai false bila data/nilai tidak ditemukan Algoritma : Diperlukan sebuah peubah boolean untuk menyatakan apakah nilai sudah ditemukan. Peubah boolean (misal. Ketemu) diinisialisasi dg nilai false. Setiap elemen array dibandingkan dengan nilai/data yg dicari mulai dari elemen pertama Jika A[i] = nilai/data yang dicari, peubah Ketemu diisi dengan nilai true, pengulangan dihentikan. Sebaliknya, jika A[i] nilai yg dicari, pembandingan dilanjutkan untuk elemen berikutnya. Keluaran yg dihasilkan adalah nilai yg disimpan di peubah(variabel) ketemu.

Algoritma versi 2: hasil pencarian sebuah variabel boolean


Prosedur : Fungsi :

Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output ketemu:boolean) Deklarasi : I : integer Algoritma : Ketemu false I1 While(I n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I I +1 endif Endwhile { I > n or ketemu }

Function cariberuntun(input A:Larikint, input n:integer, input x :integer) boolean Deklarasi: I : integer Algoritma: Ketemu false I1 While(I n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I I +1 endif Endwhile { I > n or ketemu } return ketemu

Algoritma versi 2: hasil pencarian sebuah indeks elemen larik


Prosedur : Fungsi :

Procedure cariberuntun(input A:larikint, input n: integer, input x:integer, output idx: integer) Deklarasi : I : integer ketemu : boolean Algoritma : Ketemu false I1 While(I n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I I +1 endif Endwhile { I > n or ketemu } if ketemu true then idx 1 else idx -1 endif

Function cariberuntun(input A:Larikint, input n:integer, input x :integer) integer Deklarasi: I : integer ketemu : boolean Algoritma: Ketemu false I1 While(I n) and (not ketemu) do if A[i] = x then ketemu true {x ditemukan} else I i +1 endif Endwhile { I > n or ketemu } if ketemu true then return 1 else return -1 endif

Kinerja Algoritma Pencarian Beruntun (Sequential search)

Data yg belum terurut :


Secara umum pencarian Lambat Waktu pencarian sebanding dengan jumlah elemen larik

Data yg sudah terurut :


Dapat meningkatkan kinerja pencarian Karena dapat segera menyimpulkan bahwa data yg dicari tidak terdapat di dalam larik bila ditemukan elemen larik yg lebih besar dari data yg dicari

Pencarian beruntun data yg terurut

Metode pencarian bagidua (binary search)


Algoritma pencarian pada data terurut yang paling efisien (data harus sudah terurut) Digunakan untuk kebutuhan pencarian dg waktu yang cepat (tidak membaca dari awal sampai akhir) Mencari data dg cara membagi larik menjadi dua Dalam proses pencarian diperlukan dua buah indeks larik, yaitu indeks terkecil (indeks ujung kiri larik) dan indeks terbesar (indeks ujung kanan larik).

Langkah-langkah pencarian bagidua


Misal indeks kiri = I, indeks kanan j : 1. Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah indeks k = ( I + j ) div 2
Elemen tengah A[k] membagi larik menjadi dua bagian : bagian kiri A[i..k-1] dan bagian kanan A[k+1..j]

2. Periksa apakah A[k] = x(data yg dicari),


Jika ya pencarian selesai (x sudah ditemukan) Jika A[k] x, harus ditentukan apakah pencarian sebelah kiri atau kanan Jika A[k] < x, maka pencarian dilakukan pada larik sebelah kanan Jika A[k] > x, maka pencarian dilakukan pada larik sebelah kiri.

3. Ulangi langkah 1

Ilustrasi pencarian bagidua :


Misal data yang dicari adalah 22 :

Algoritma pencarian bagidua :

Penerapan pencarian bagidua dalam bahasa pascal


Program CariBagiDua; Uses wincrt; Const A:array[1..14] of integer = (10, 12, 14, 15, 16, 18, 19, 20, 22, 24, 25, 26, 28, 29); Var Idxawal, idxakhir, k, x : integer; Ketemu : boolean; Begin Write('Masukkan nilai yang akan dicari : '); readln(x); {melakukan pencarian} Idxawal := 1; Idxakhir := 14; Ketemu := false; While (not ketemu) and (idxawal <= idxakhir) do begin K := (idxawal + idxakhir) div 2; If A[k] = x then Ketemu := true else If A[k] < x then Idxawal := k+1 else Idxakhir := k-1; End; {memeriksa, ketemu atau tidak } If ketemu then Writeln(x, 'ditemukan pada indeks ke-', k) else begin Writeln(x, ' tidak ditemukan'); End.

Kinerja pencarian bagidua :


Untuk kasus terburuk: x tidak diketemukan, atau x ditemukan setelah ukuran larik tinggal 1 elemen). ,misal banyaknya elemen larik=256, maka menghasilkan pembagian larik sebanyak 8 kali, sedang dengan pencarian beruntun melakukan pembandingan sebanyak 256 kali. Untuk larik yang terurut, algoritma pencarian bagi dua (binary search) jauh lebih cepat daripada algoritma pencarian beruntun (sequential search).

Algoritma pencarian beruntun atau pencarian bagidua?

Sequential Search

Binary Search

1. Dapat digunakan baik untuk data yg belum terurut maupun data terurut 2. Kinerja lebih lambat

1. Hanya dapat digunakan untuk data yg terurut saja.


2. Kinerja lebih cepat

ALGORITMA PENGURUTAN (SORTING)


Pengurutan (sorting) adalah proses mengatur sekumpulan objek menurut urutan atau susunan tertentu.
Tersusun secara menurun (ascending): Misal : Array A dengan elemen N A[1] A[2] A[3] A[N] Tersusun secara menaik (descending) : Misal : Array A dengan elemen N A[1] A[2] A[3] A[N]

Jenis Metode Algoritma Pengurutan :


Pengurutan Apung (Bubble Sort)
Pertukaran elemen

Pengurutan Seleksi (Selection Sort)


Pertukaran elemen

Pengurutan Sisip (Insertion Sort)


Geser dan sisip elemen

Pengurutan Shell (Shell Sort)


Geser dan sisip elemen

Semua algoritma pengurutan selalu melakukan operasi perbandingan elemen larik untuk mendapatkan urutan yg tepat.

Klasifikasi pengurutan :
Pengurutan internal :
Pengurutan untuk data yg disimpan di dalam memori komputer ( pengurutan Array / larik )

Pengurutan eksternal :
Pengurutan untuk data yg disimpan di dalam disk storage ( pengurutan arsip / file )

Pengurutan Apung (Bubble Sort)


Terinspirasi dari gelembung sabun (berat jenis gelembung lebih ringan dari berat jenis air) Dalam array yg terurut menaik, maka elemen larik yang paling kecil diapungkan dengan cara diletakan keujung kiri larik melalui proses pertukaran.

Algoritma pengurutan Apung (bubble sort)


For I 1 to n-1 do for k n downto i+1 do if A[k] < A[k-1] then {pertukarkan A[k] dengan A[k-1]} temp A[k] A[k] A[k-1] A[k-1] temp endif endfor endfor

Penarapan bubble sort dg Pascal :


Program UrutBubble; Uses wincrt; Const N=6; A:array[1..N] of integer = (25, 27, 10, 8, 76, 21); Var i, k, temp : integer; Begin {menampilkan data sebelum proses pengurutan } Writeln(Data sebelum diurutkan); For i:=1 to N do begin Writeln(A[, i, ] = , A[i]); End; { melakukan proses pengurutan } For i:= 1 to N-1 do begin For k:=n downto i+1 do begin If A[k] < A[k-1] then begin Temp := A[k]; A[k] := A[k-1]; A[k-1] := temp; End; End; End; {menampilkan data setelah proses pengurutan} Writeln; Writeln(Data setelah diurutkan); For i := 1 to N do begin Writeln(A[, i, ] = , A[i]); End; End.

Kinerja pengurutan apung (bubble sort)


Algoritma pengurutan yg tidak efisien Karena, banyaknya operasi pertukaran yg dilakukan setiap langkah pass (pengapungan) Waktu lama, maka jarang digunakan Kelebihan, kesederhanaan dan mudah dipahami.

Pengurutan Seleksi (Selection Sort)


Adalah memilih elemen maksimum/ minimum dari Larik Menempatkan elemen maksimum/ minimum tersebut pada awal/akhir larik (elemen ujung) Elemen terujung tersebut diisolasi dan tidak disertakan pada proses selanjutnya. Proses yg sama diulang untuk elemen larik yg tersisa Memilih elemen maksimum/minimum berikutnya dan mempertukarkannya dengan elemen terujung larik sisa.

Algoritma pengurutan seleksi (selection sort)


For i n downto 2 do {cari elemen maksimum pada A[1..i]} imaks 1 {indeks elemen pertama diasumsikan sebagai maks A[1] {elemen maksimum} for j 2 to I do if A[j] > maks then imaks j maks A[j] endif endfor
{pertukaran maks dengan A[i]} elemen maks sementara}

temp A[i] A[i] maks A[imaks] temp endfor

Penarapan Selection sort dg Pascal :


Program Urut_seleksi; Uses wincrt; Const N=6; A:array[1..N] of integer = (25, 27, 10, 8, 76, 21); Var i, j, imaks,maks, temp : integer; Begin {menampilkan data sebelum proses pengurutan } Writeln('Data sebelum diurutkan'); For i:=1 to N do begin Writeln('A[', i, '] = ', A[i]); End; { melakukan proses pengurutan } For I := n downto 2 do begin {cari elemen maksimum pada A[1..i]} imaks := 1; {indeks elemen pertama diasumsikan sebagai elemen maks sementara} maks := A[1]; {elemen maksimum} for j := 2 to I do begin if A[j] > maks then begin imaks := j; maks := A[j]; end; end;

{pertukaran maks dengan A[i]} temp := A[i]; A[i] := maks; A[imaks] := temp; end; {menampilkan data setelah proses pengurutan} Writeln; Writeln('Data setelah diurutkan'); For i := 1 to N do begin Writeln('A[', i, '] = ', A[i]); End; End.

Kinerja selection sort


Dibanding pengurutan apung (bubble sort) pengurutan seleksi memiliki kinerja lebih baik. Karena, pertukaran elemen hanya dilakukan sekali setiap pass (seleksi). Sehingga lama pengurutannya berkurang dibanding pengurutan gelembung (bubble sort).

Pengurutan sisip (insertion sort)


Adalah metode pengurutan dengan cara menyisipkan elemen larik pada posisi yang tepat. Pencarian posisi yg tepat dilakukan dengan menyisir larik (array). Selama penyisiran dilakukan pergeseran elemen larik. Metode penyusutan ini cocok untuk persoalan menyisipkan elemen baru ke dalam sekumpulan elemen larik yg sudah terurut.

Deklarasi : I : integer { pencacah pass (melewati 1 kali larik) } J : integer { pencacah untuk penelusuran/penyisiran larik } Y : integer { peubah bantu agar A[k] sebagai posisi yg tepat untuk disisipkan tidak ditimpa selama pergeseran} Ketemu : boolean { untuk menyatakan posisi penyisipan ditemukan } Algoritma : { elemen A[1] dianggap sudah terurut} For I 2 to n do { mulai dari pass 2 sampai pass N } y A[i] { cari posisi yg tepat untuk y di dalam A[1..i-1] sambil menggeser } j j -1 ketemu false while ( j 1 ) and (not ketemu) do if y < A[j] then A[ j + 1] A [ j ] { geser } jj1 else ketemu true endif endwhile { J < 1 or ketemu } A[ j + 1 ] y { sisipkan y pada tempat yang sesuai } endfor

Algoritma pengurutan Sisip (insertion sort)

Contoh :
Diketahui Larik dengan n=5 dibawah ini yg belum terurut, larik (array) ini akan diurut menaik (Ascending) dengan metode pengurutan sisip (insertion sort) :

Langkah - langkah: Asumsikan : elemen y = A[1] = 29 dianggap sudah terurut


Pass 2 : ( I = 2) Y = 27 (angka yg akan disisipkan) J = i-1 (mulai penyisiran) J = 2-1= 1 Y < A[J] (bandingkan) 27 < 29 yes A[J+1] = 29 (geser) A[2] = 29 J = J 1 ( penyisiran ) J = 1-1 = 0 (batas penyisiran) A[j+1] = y A[1] = 27 (menempatkan angka yg akan disisipkan di tempat yg sesuai)
Hasil sortir setelah Pass 2 adalah:

Langkah langkah - next:

Pass 3 : ( I = 3) Y = 10 (angka yg akan disisipkan) J = i-1 (mulai penyisiran) J = 3-1= 2 Y < A[J] (bandingkan) 10 < 29 yes A[J+1] = A[j] (geser) A[3] = A[2] A[3] = 29 J = J 1 ( penyisiran ) J = 2-1 = 1 Y < A[j] (bandingkan) 10 < A[1] 10 < 27 yes A[j+1] = A[j] A[2] =A[1] A[2] = 27 J = j 1 (penyisiran) J = 1 1 = 0 (batas penyisiran) A[j+1] = y A[1] = 10 (menempatkan angka yg akan disisipkan di tempat yg sesuai)

Pass 4 : ( I = 4) Y = 8 (angka yg akan disisipkan) J = i-1 (mulai penyisiran) J = 4-1= 3 Y < A[J] (bandingkan) 8 < 29 yes A[J+1] = A[j] (geser) A[4] = A[3] A[4] = 29 J = J 1 ( penyisiran ) J = 3-1 = 2 Y < A[j] (bandingkan) 8 < A[2] 8 < 27 yes A[2+1] = A[2] A[3] =A[2] A[2] = 27 J = j 1 (penyisiran) J=21=1 Y < A[j] (bandingkan) 8 < A[1] 8 < 10 yes A[J+1] = A[j] (geser) A[2] = A[1] A[2] = 10 J = j 1 (penyisiran) J = 1 1 = 0 (batas penyisiran) A[j+1] = y A[1] = 8 (menempatkan angka yg akan disisipkan di tempat yg sesuai)

Langkah langkah - next:

Pass 5 : ( I = 5)

Langkah langkah - next:

Y = 76 (angka yg akan disisipkan) J = i-1 (mulai penyisiran) J = 5-1= 4 Y < A[J] (bandingkan) 76 < 29 no Ketemu = true (posisi penyisipan ditemukan) L[j+1] = y A[5] = 76 (menempatkan angka yg akan disisipkan di tempat yg sesuai)

Kinerja insertion sort


Banyaknya operasi pergeseran yg diperlukan dalam mencari posisi yg tepat untuk elemen larik.(kelemahan) Pengrutan sisip kurang bagus untuk larik yg berukuran besar atau volume data yg besar. Metode penyusutan ini cocok untuk persoalan menyisipkan elemen baru ke dalam sekumpulan elemen larik yg sudah terurut.

Arsip Beruntun (Sequential File)


Pendahuluan : Rekaman atau record adalah data yang bertipe sama Misalnya : ada beberapa data yg terdiri dari bagian-bagian tertentu seperti data nilai mahasiswa pada satu mata kuliah yg terdiri dari NIM, NAMA, NILAI

Contoh :

Gambar di atas ada tiga buah rekaman yg memiliki kolom nim, nama, dan nilai Sebuah baris dari setiap kolom disebut dg rekaman (record). Dalam sebuah arsip beruntun (sequential file) biasanya terdiri dari banyak rekaman. Sebuah rekaman (record) dapat terdiri dari beberapa kolom data tergantung dari kebutuhan.

Pengertian Arsip Beruntun (Sequential File)


Adalah sebuah arsip (file) yang berisi kumpulan rekaman (record) dengan kolom-kolom data tertentu sesuai dg kebutuhan. Dalam arsip beruntun nama-nama kolom tidak ikut disimpan di dalam file File hanya berisi kumpulan rekaman saja

Contoh :

EOF (end of file) : akhir dari sebuah file (contoh : xxxxxxx xxx x). Merupakan akhir dari sebuah arsip (File). Rekaman penanda akhir file disebut dg dummy artinya elemen data yg ditambahkan tapi sebenarnya bukan bagian dari data. Dummy biasa digunakan untuk memudahkan suatu proses.

Operasi pada Arsip Beruntun


Pada dasarnya Arsip beruntun adalah file yg dapat ditulisi untuk menyimpan data. Operasi yg dilakukan terhadap file yaitu : menulisi file dan
membaca file.

Membuat Arsip Beruntun


Yg perlu diperhatikan untuk membuat sebuah arsip beruntun adalah :
Menulis rekaman yg ingin ditulis
( sebuah arsip beruntun yg tidak kosong harus berisi satu atau lebih rekaman yg memiliki tipe nilai sama).

Menulis rekaman dummy sebagai akhir pembacaan.


Jika sebuah arsip beruntun diangap sebagai arsip kosong maka minimal ada satu buah rekaman dummy sebagai akhir rekaman.

Pendeklarasian Arsip dalam Algoritma


Sebelum melakukan pemrosesan arsip beruntun, arsip tersebut harus dideklarasikan terlebih dahulu. DEKLARASI arsip : file of tipe rekaman Tipe rekaman dapat berupa tipe dasar (integer, real, char, boolean, string) atau tipe terstruktur (record). Setiap rekaman di dalam arsip beruntun harus bertipe sama, baik tipe dasar maupun tipe betukan. Tipe bentukan :

DEKLARASI type nama tipe arsip : file of tipe rkaman arsip : nama tipe arsip

Contoh-contoh pendeklarasian arsip beruntun

Arsip (file) Bil yg berisi sekumpulan bilangan bulat. Setiap rekaman adalah bilangan bulat DEKLARASI Bil : file of integer

Contoh-contoh pendeklarasian arsip beruntun - next


Arsip Mhs yg berisi data mahasiswa (nim, nama, nilai). Setiap rekaman di dalam arsip Mhs bertipe terstruktur (record).

DEKLARASI { tipe rekaman} Type Datamhs : record < nim : integer nama : string nilai : char > { arsip } Mhs : file of Datamhs

Fungsi Pustaka untuk arsip beruntun Untuk pemrosesan arsip perlu mendefinisikan beberapa intruksi baku (fungsi yg sudah tersedia). Instruksi baku itu dinyatakan sebagai fungsi/prosedur pustaka (library function). Sejumlah intruksi baku untuk pemrosesan arsip beruntun adalah: open, fread, fwrite, close, eof.

open
Fungsi : Membuka asip beruntun untuk siap dibaca/ ditulis. Setelah memanggil fungsi ini, penunjuk arsip (file pointer) akan menunjuk ke karakter pertama di awal arsip Sebuah arsip beruntn yg dibuka (open) hanya bisa untuk masukan (dibaca) saja atau sebagai keluaran (ditulis) saja, tidak sekaligus keduanya (dibaca dan ditulis). Contoh : open(Mhs, 1) { arsip Mhs dibuka untuk dibaca } open(Bil, 2) { arsip Bil dibuka untuk ditulis } open(Kar, 1) { arsip Kar dibuka untuk dibaca }

Fread
Fungsi : Membaca rekaman yang sekarang sedang ditunjuk oleh pointer. Contoh : Fread(Mhs, RekMhs) { RekMhs bertipe DataMhs } Fread(Bil, I) { I bertipe integer }

Fread(Kar, ch) { ch bertipe karakter

Andai pointer pembacaan sekarang sedang menunjuk ke awal rekaman ke-2, maka hasil perintah Fread adalah : RekMhs berisi <004,Shalahudin,B> Selanjutnya, pointer akan menunjuk ke awal rekaman ke-3, dan siap untuk membaca rekaman tersebut.

Fwrite
Fungsi : Menulis rekaman ke dalam arsip beruntun. Contoh : RekMhs.Nim 456087 RekMhs.Nama Andi RekMhs.Nilai A Fwrite(Mhs, RekMhs) {simpan RekMhs ke arsip Mhs}

Fwrite(Bil, 765) {menuliskan nilai 765 ke arsip Bil} Fwrite(Kar, B) { menuliskan karakter B ke arsip Kar }

Close
Fungsi : Menutup Arsip yang sudah dibuka. Contoh : close(Mhs) { menutup arsip Mhs } close(Bil) close(Kar) Arsip sudah ditutup, tidak dapat diproses lagi.

EOF (end of file)


Fungsi : Mendeteksi akhir arsip.

Membuat Arsip Beruntun


Arsip hanya dapat diproses jika sudah terdefinisi isinya. Langkah pembuatan arsip beruntun :
Menyiapkan arsip untuk perekaman (menggunakan perintah open dg kode=2) Membaca data yg akan direkam (misalnya dari piranti masukan (keyboard)) Menuliskan data tersebut ke dalam arsip (perintah Fwrite). Jika sebuah arsip sudah selesai diisi, arsip tersebut ditutup dengan perintah Close

Contoh Algoritma membuat arsip beruntun


Program BuatArsipBilanganBulat { contoh program yg memperagakan ara menyimpan data ke dalam arsip, data dibaca dari papan ketik, tanda akhir arsip adalah 9999} DEKLARASI Bil : File of integer {arsip bilangan bulat} N : integer {banyaknya bilangan bulat} I : integer { pencacah penguangan } X : integer { variabel bilangan bulat yg dibaca dari keyboard} ALGORITMA : open(Bil, 2) {buka arsip Bil untuk perekaman} read(n) For I 1 to n do read(x) Fwrite(Bil, x) { rekam bilangan bulat ke arsip Bil } Endfor Close(Bil)

{tutup arsip Bil}

Contoh Algoritma membuat arsip beruntun - next


Program BuatArsipMahasiswa { mebuat arsip data mahasiswa, data mahasiwadari papan ketik, pembacaan data diakhiri bila NIM yg dimasukkan adalah 9999} DEKLARASI Type DataMhs : record <Nim :Integer, Nama : String, Nilai : Char> Msiswa : DataMhs { variabel untuk menampung pembacaan data mahasiswa} Mhs : file of DataMhs { arsip data mahasiswa } ALGORITMA : open(Mhs, 2) {buka arsip Mhs untuk perekaman} read(Msiswa.NIM) { baca NIM mahasiswa pertama, mungkin 9999} While (Msiswa.NIM 9999) do read(Msiswa.Nama, Msiswa.Nilai) Fwrite(Mhs, Msiswa) { rekam Msiswa ke dalam arsip Mhs } read(Msiswa.NIM) Endwhile { Msiswa.NIM = 9999} Close(Mhsl) {tutup arsip Mhs}

Membaca Arsip beruntun


Langkah-langkah :
Menyiapkan arsip untuk pembacaan (perintah Open dengan kode=1). Setiap kali akan membaca suatu rekaman (record) harus dipastikan bahwa tanda akhir arsip (eof) belum dicapai. Rekaman (record) dibaca satu per satu dari rekaman pertama hingga rekaman yg diinginkan atau seluruh rekaman selesai dibaca. Karena jumlah data dalam arsip tidak diketahui, maka gunakanlah konstruksi while-do

Skema umum membaca arsip beruntun


Program pembacaan arsip DEKLARASI : type rekaman : TipeRekaman Arsip : file of rekaman rek : rekaman AlGORITMA: Inisialisasi Open(Arsip, 1) {buka arsip untuk dibaca} While not EOF(arsip) do fread(Arsip, rek) proses rek Endwhile { EOF(arsip) } Terminasi Close(arsip)

Contoh : pembacaan data dari arsip


PROGRAM BacaArsipBilanganBulat DEKLARASI : bil : File of integer x : integer { peubah rekaman } ALGORITMA : open(bil, 1) {baca arsip bil untuk pembacaan} while not EOF(bil) do fread(arsip, x) {baca rekaman pertama} Write(x) endwhile { EOF(bil) } Close(bil) {tutup arsip bil}

Contoh pembacaan : menghitung jumlah mahasiswa yang mempunyai IP > 2.0


PROGRAM BacaArsipIP DEKLARASI : Type DataMhs : record <NIM : integer Nama : string IP : real > RekMhs : DataMhs Mhs : File of DataMhs Jumlah : integer {variabel (peubah) untuk menampung jumlah IP >2.0} ALGORITMA : jumlah 0 open(Mhs, 1) {buka arsip Mhs untuk pembacaan} while not EOF(mhs) do fread(Mhs, RekMhs) { baca data }

if RekMhs.IP > 2.0 then Jumlah Jumlah + 1 endif endwhile { EOF (Mhs) } Close(Mhs) { tutup arsip Mhs}

Contoh pembacaan : mencari data mahasiswa yg mempunyai IP tertinggi


PROGRAM cariIPTertinggi DEKLARASI : Type DataMhs : record <NIM : integer Nama : string IP : real > RekMhs : DataMhs Mhs : File of DataMhs Maks : real {variabel (peubah) untuk menampung IP tertinggi} ALGORITMA : Maks -9999 open(Mhs, 1) {buka arsip Mhs untuk pembacaan} while not EOF(mhs) do fread(Mhs, RekMhs) { baca data } if RekMhs.IP > maks then maks RekMhs.IP endif endwhile { EOF (Mhs) } Close(Mhs) { tutup arsip Mhs} {cetak data mahasiswa yang mempunyai IP tertinggi} Write(NIM :, RekMhs.NIM) Write(NAMA :, RekMhs.Nama) Write(IP :, RekMhs.IP)

Manyalin Arsip (file)


Menggandakan Arsip (file) backup file Penyalian (copy) dapat dilakukan terhadap
seluruh rekaman (record) atau hanya rekaman (record) tertentu saja.

Menyalin seluruh rekaman


ALGORITMA : Open (Mhs1, 1) { buka arsip Mhs1 untuk pembacaan } Open (Mhs2, 2) { buka arsip Mhs2 untuk penulisan } While not EOF(Mhs1) do fread(Mhs1, RekMhs) { baca rekaman dari arsip Mhs1 } Fwrite(Mhs2, RekMhs) { salin Rekmhs ke arsip Mhs2} Endwhile Close(Mhs1) Close(Mhs2)

Menyalin sebagian data dari arsip (menyalin data mahasiswa yang IP-nya di atas 2.0
ALGORITMA : Open (Mhs1, 1) { buka arsip Mhs1 untuk pembacaan } Open (Mhs2, 2) { buka arsip Mhs2 untuk penulisan } While not EOF(Mhs1) do fread(Mhs1, RekMhs) { baca rekaman dari arsip Mhs1 } if RekMhs.IP > 2.0 then Fwrite(Mhs2, RekMhs) { salin Rekmhs dg IP > 2.0 ke arsip Mhs2} endif Endwhile Close(Mhs1) Close(Mhs2)

Manggabung (merge) dua Arsip


Menyalin isi dua buah arsip ke dalam sebuah arsip baru Dilakukan dg cara penyambungan (concatenation), yaitu menyalin isi arsip yg kedua setelah isi arsip pertama.

Contoh :

Algoritma Penggabungan Arsip


ALGORITMA : Open(Mhs1, 1) Open(Mhs2, 1) Open(Mhs3, 2) While not EOF(Mhs1) do fread (Mhs1, RekMhs) Fwrite(Mhs3, RekMhs) Endwhile While not EOF(Mhs2) do fread(Mhs2, RekMhs) fwrite(Mhs3, RekMhs) Endwhile Close(Mhs1) Close(Mhs2) Close(Mhs3)

Penerapan dg Pascal (cari IP tertinggi dalam Arsip)


Program CariIPTertinggi; Uses wincrt; Type DataMhs : record NIM : integer; Nama : string; IP : real; end; var RekMhs : DataMhs; mRekMhs : DataMhs; Mhs : File of DataMhs; Maks : real; Begin assign(Mhs, data.dat); rewrite(Mhs); write(NIM : ); readln(RekMhs.NIM); while (RekMhs .nim <> 9999) do begin write(Nama :); readln(RekMhs.nama); write(IP :); readln(RekMhs.IP); write(Mhs, RekMhs); write(NIM :); readln(RekMhs.NIM); end; close(Mhs); Assign(Mhs, data.dat); reset(Mhs); Maks :=0.0; While not EOF(Mhs) do begin read(Mhs, RekMhs); if RekMhs.IP > maks then begin maks :=RekMhs.IP; mRekmhs := RekMhs; end; end; Close(Mhs); { tutup arsip Mhs} {cetak data mahasiswa yang mempunyai IP tertinggi} Assign(Mhs, data.dat); Reset(Mhs); Write(NIM :, mRekMhs.NIM); Write(NAMA :, mRekMhs.Nama); Write(IP :, mRekMhs.IP:4:2); Close(mhs); end.

Tugas
dikumpulkan minggu depan (29 Juni 2011)
Buatlah Algoritma lengkap untuk penggabungan 2 buah Arsip (File) data Mahasiswa dengan ketentuan :
Arsip (File) pertama berisi 5 Rekaman (record). Arsip (File) kedua berisi 3 rekaman (record) Data Mahasiswa tersebut terdiri dari NIM, NAMA dan IPK Arsip (File) Gabungan disimpan pada Arsip (File) ketiga

Buatlah Program Komputer dengan Bahasa Pascal untuk Algoritma di atas.

Anda mungkin juga menyukai