DIKTAT KULIAH
LOGIKA ALGORITMA Disusun oleh: Candra Mecca Sufyana
LOGIKA ALGORITMA I.
Pendahuluan Algoritma adalah jantung ilmu komputer atau informatika, karena banyak cabang
ilmu komputer yang diacu dalam terminologi algoritma. Oleh karena itu, alangkah baiknya kita mengetahui karakteristik komputer dan hubunganya dengan algoritma secara umum. Karateristik komputer secara umum: •
Komputer terdiri dari rangkaian elektronik IC, Kawat Tembaga, mainboard, dll
•
Terdiri dari ribuan transistor (tergabung dalam IC) yang berisikan gerbang-gerbang logika (AND,OR, NAND, NOR, dll)
•
Eksekusi dipicu dari adanya masukan (input) listrik berkisar 5 volt dan berupa TRUE / FLASE
•
Aliran data berupa digit biner 1 dan 0, yang tersusun sesuai instruksi
•
Instruksi dibuat secara sistematis dan hirarkis, serta masuk akal (sesuai logika) Agar instruksi dapat dimengerti dan bisa menghasilkan keluaran (output) sesuai
keinginan maka terdapat beberapa hal yang harus diperhatikan, yaitu: – Harus ada instruksi yang dimengerti oleh komputer – Komputer hanya terdiri dari rangkaian elektronik, karena itu hanya mengerti nilai 1 dan 0 – Nilai 1 dan 0, dapat berupa rangkaian instruksi jika disusun dengan susunan yang sistematis dan masuk akal untuk menyelesaikan masalah tertentu – Susunan masuk akal dikenal dengan istilah urutan instruksi bahasa yang dikenal oleh komputer. – Karena itu pasti komputer punya bahasa, dan kita harus membuat bahasa yang dimengerti oleh komputer. – Bahasa tersebut dikenal dengan istilah bahasa pemrograman. – Program komputer harus dibuat dengan urutan logika yang benar dan sesuai dengan masalah yang ingin diselesaikan.
Istilah
Urutan logika untuk menyelesaikan masalah tertentu
Algoritma Diterjemahkan oleh bahasa pemrograman Contoh : PASCAL, C, DELPHI, dll
Instruksi yang dikenal oleh komputer
II. Definisi Logika & Algoritma Logika dan algoritma merupakan kedua kata yang saling berhubungan satu dengan yang lainya. Algoritma adalah sebuah istilah yang diadakan untuk menyelesaikan masalah yang logis artinya masalah yang diuntai dalam bentuk pernyataan-pernyataan logika. Sehingga, seyogyanya dengan hanya menyebutkan algoritma, secara implisit kita juga sudah berbicara mengenai logika. Walaupun algoritma adalah jantung ilmu komputer, namun, jangan beranggapan algoritma selalu identik dengan ilmu komputer saja. Dalam kehidupan sehariharipun banyak terdapat proses yang dinyatakan dalam suatu algoritma. Seperti contoh sederhana ialah membuat mie rebus dan menjalankan motor. Susunan : Cara Membuat mie rebus
Cara menjalankan sepeda motor
•
Ambil Mie
•
Masukkan kunci
•
Nyalakan kompor
•
Nyalakan starter motor
•
Ambil wadah dan isi air
•
Panaskan mesin terlebih dahulu
•
Panaskan air hingga mendidih
•
Masukkan gigi
•
Masukkan Mie kedalam wadah
•
Tancap gas perlahan-lahan
•
Aduk hingga matang
•
Motor berjalan
•
Angkat dan sajikan
Contoh tersebut memperlihatkan suatu masalah, masalah adalah pertanyaan atau tugas yang kita cari jawabanya, yakni dalam hal ini adalah bagaimana cara membuat mie dan menjalankan sepeda motor, kemudian kita mencari solusi berupa berbagai langkah pernyataan yang masing-masing pernyataan disebut dengan parameter, dan keseluruhan dari parameter tersebut disebut dengan instansi masalah. Sedangakan jawaban dari instansi masalah tersebut, kita sebut dengan solusi. Jadi, dari pengertian diatas, kita dapat menyimpulkan bahwa algoritma secara luas adalah prosedur yang berisi langkah-langkah penyelesaian masalah. Kita lihat contoh selanjutnya:
Bagaimana caranya agar mobil dan pengemudi sampai di tujuan Dari gambar ilustrasi – Berapa kemungkinan penyelesaian jalan yang dilalui ? – Anggap satu kemungkinan yang dipilih, tuliskan tahapan yang harus dilalui – Dari tahapan yang dibuat apakah menyelesaikan masalah ? Dari pertanyaan yang diajukan, ada suatu hipotesa : – Untuk menyelesaikan suatu permasalahan pasti harus memiliki alur yang jelas dan tepat. – Dari alur yang dibuat pasti susunan / tahapan tersusun secara sistematis dan hirarkis – Susunan sistematis dan hirarkis pasti dapat menyelesaikan masalah tertentu Keyakinan yang didapat : – Setiap menyelesaikan masalah harus menggunakan cara-cara sistematis dan terstruktur. – Cara-cara tersebut harus bisa dituliskan secara benar dan masuk akal. (Metode Ilmiah)
•
Simpulan :
– Algoritma : urutan-urutan logis dari suatu pernyataan untuk menyelesaikan kasus / masalah tertentu Beberapa contoh diatas diharapkan memberikan pengertian tentang definisi algoritma secara luas dalam kasus kehidupan sehari-hari, yang berhubungan dengan masalah, parameter, instansi masalah yang berupa prosedur berisi langkah-langkah logis untuk menghasilkan solusi sebagai jawaban atas permasalahan. Secara spesifik, algoritma yang akan dibahas dalam mata kuliah ini adalah algoritma yang berhubungan dengan komputer atau mesin yang sering disebut algoritma pemograman. Kalau kita berbicara tentang algoritma pemograman maka terdapat dua pembelajaran penting yang mesti dipahami yaitu memprogram dan bahasa pemograman. Belajar Memprogram Belajar memprogram ≠ belajar bahasa pemrograman Belajar memprogram: belajar tentang strategi pemecahan masalah, metodologi dan sistematikanya kemudian menuliskannya dalam notasi yang disepakati bersama Belajar memprogram: bersifat pemahaman persoalan, analisis dan sintesis Belajar memprogram, titik berat: designer program Belajar Bahasa Pemrograman Belajar bahasa pemrograman : belajar memakai suatu bahasa pemrograman, aturan sintaks, tatacara untuk memanfaatkan instruksi yang spesifik untuk setiap bahasa Belajar bahasa pemrograman , titik berat : coder Jenjang bahasa pemrograman •
Bahasa mesin (bahasa yang dikenal oleh mesin)
•
Bahasa assembler (bahasa yang disusun oleh bahasa mesin)
•
Bahasa menengah (bahasa yang disusun oleh kumpulan bahasa assembler atau bahasa mesin)
•
Bahasa tingkat tinggi (bahasa terstruktur yang disusun oleh bahasa menengah dan assembler)
•
Bahasa berorientasi objek (bahasa yang disusun menurut objek-objek, setiap objek dibuat oleh suatu bahasa pemrograman tertentu)
Bahasa bertujuan sebagai alat komunikasi dengan lawan bicara, sehingga dalam bahasa pemograman berarti bagaimana cara kita (manusia) berkomunikasi dengan mesin (komputer).
Nah, dalam menciptakan komunikasi yang baik diperlukan adanya pengertian dan pemahaman tentang bagaimana cara berpikir lawan bicara kita dalam hal ini adalah komputer. Bagaimana komputer berpikir ?
Komputer tidak dapat berfikir secara simultan terhadap sejumlah perintah
Komputer membaca kumpulan perintah secara serial mulai dari baris pertama hingga baris terakhir yang prioritasnya tidak dapat dipertukarkan
Variabel tidak dapat dipergunakan secara terbalik
Sebagai contoh, silakan simak dan jawab kasus-kasus aritmetik berikut ini: x = 10
x = 10
10 = x
x = 10
x = 10
y=x+z
x = 20
z = 20
z = 20
z = 20
z = 20
y=x
y=x+z
x+z=y
y = x + z*2 - x*x
y=x*2
Berapakah y menurut anda (berfikir simultan) ?
Berapakah y menurut komputer (berfikir serial) ?
Dari berbagai contoh konsep diatas dapat disimpulkan bahwasanya algoritma pemograman adalah Aliran pemikiran manusia yang simultan dituangkan ke dalam aliran
pemikiran komputer yang serial dalam bentuk tahap-tahap pemikiran yang sistematis dan logis. Sstematis berarti teratur menurut sstem untuk menyelesaikan masalah. Logis berarti sesuai dengan logika atau masuk akal. Perhatikan contoh berikut: Ada 2 buah teko masing-masing berkapasitas 4 galon (teko A) dan 3 galon (teko B). Tidak ada tanda yang menunjukkan batas ukuran pada kedua teko tersebut. Ada sebuah pompa air yang akan digunakan untuk mengisikan air pada kedua teko tersebut. Permasalahannya: Bagaimanakah kita dapat mengisikan tepat 2 galon air ke dalam teko yang berkapasitas 4 galon?
4 galon (teko A)
Air tak terbatas 3 galon (teko B)
Penyelesaian: masalah ini mempunyai banyak kemungkinan penyelesaian. Salah satu penyelesaian secara algoritmanya adalah: 1. Isi penuh teko A dengan air ( teko A berisi 4 galon air ) 2. Tuangkan air dari teko A ke dalam teko B ( teko A berisi 1 galon air dan teko B berisi 3 galon air ) 3. Buang seluruh air yang ada pada teko B ( teko B kosong ) 4. Tuangkan air sisa yang berisi 1 galon pada teko A ke teko B ( teko A kosong dan teko B berisi 1 galon air) 5. Isi penuh kembali galon A ( teko A terisi penuh 4 galon ) 6. Tuangkan ke teko B yang sedang berisi 1 galon air hingga penuh ( sehingga teko A dapat berisi 2 galon ) Contoh diatas adalah sebuah kasus logika yang dapat diselesaikan dengan algoritma yang sistematis artinya urutanya benar dan sesuai, selain itu juga logis, artinya berbagi parameternya mewujudkan instansi masalah yang memberikan solusi yang tepat
III. Sejarah Algoritma Ditinjau dari asal usul katanya kata Algoritma sendiri mempunyai sejarah yang aneh. Orang hanya menemukan kata Algorism yang berarti proses menghitung dengan angka arab. Anda dikatakan Algorist jika anda menghitung menggunakan Angka Arab. Para ahli bahasa berusaha menemukan asal kata ini namun hasilnya kurang memuaskan. Akhirnya para ahli sejarah matematika menemukan asal kata tersebut yang berasal dari nama penulis buku arab yang terkenal yaitu Abu Ja’far Muhammad Ibnu Musa Al-Khuwarizmi. Al-Khuwarizmi dibaca orang barat menjadi Algorism. Al-Khuwarizmi menulis buku yang berjudul Kitab Al Jabar Wal Muqabala yang artinya “Buku pemugaran dan pengurangan” (The book of restoration and reduction). Dari judul buku itu kita juga memperoleh akar kata “Aljabar” (Algebra). Perubahan kata dari Algorism menjadi
Algorithm muncul karena kata Algorism sering dikelirukan dengan Arithmetic, sehingga akhiran –sm berubah menjadi–thm. Karena perhitungan dengan angka Arab sudah menjadi hal yang biasa. Maka lambat laun kata Algorithm berangsur-angsur dipakai sebagai metode perhitungan (komputasi) secara umum, sehingga kehilangan makna kata aslinya. Dalam Bahasa Indonesia, kata Algorithm diserap menjadi Algoritma. Algoritma pertama kali digunakan (1950) oleh Euclid seorang matematikawan Yunani, dalam bukunya yang berjudul Element yang didalamnya terdapat “algoritma Euclidean” (Euclid algorithm), yang menuliskan langkah-langkah untuk menemukan common great divisor (gcd), atau kita lebih mengenalnya dengan istilah faktor persekutuan terbesar (FPB), dari dua buah bilangan bulat positif, m dan n. Misalnya, m = 80 dan n =12. Semua faktor pembagi 80 adalah: 1, 2, 4, 5, 8, 10, 16, 20, 40, 80 Semua faktor pembagi 12 adalah 1, 2, 3, 4, 6, 12 Maka gcd (80,12) = 4. Langkah-langkah dengan menggunakan algoritma Euclidean adalah: 80 dibagi 12 hasilnya = 6, sisa 8 12 dibagi 8 hasilnya = 1, sisa 4 8 dibagi 4 hasilnya = 2, sisa 0 Pengertianya yaitu, karena pembagian terakhir menghasilkan 0, maka sisa pembagian terakhir sebelum 0, yaitu 4, menjadi nilai gcd nya, yakni gcd(80,12). ALGORITMA Euclidean:
{ Diberikan dua buah bilangan bulat positif, m dan n, (m ≥ n). algoritma Euclidean mencari gcd dari kedua bilangan tersebut } 1.
Jika n = 0 maka m adalah jawabanya; stop. tetapi jika n ≠ 0 lanjutkan ke langkah 2
2.
Bagilah m dengan n dan misalkan r adalah sisanya.
3.
Ganti nilai m dengan nilai n dan nilai n dengan nilai r, lalu kembali ke langkah 1
Menurut Donald E. Knuth dalam bukunya yang berjudul The Art of Computer Programming, sebauah algoritma harus mempunyai lima unsur penting, yakni: 1. Finiteness: algoritma harus memiliki titik berhenti (stopping role). 2. Definiteness: Setiap langkah harus didefinisikan secara tepat, tidak boleh membingungkan (ambiguous) 3. Input: Sebuah algoritma memiliki nol atau lebih input yang diberikan kepada algoritma sebelum dijalankan 4. Output: Sebuah algoritma memiliki satu atau lebih output, yang biasanya bergantung kepada input 5. Effectiveness: Setiap algoritma diharapkan miliki sifat efektif. STUDI TENTANG ALGORITMA Hal-hal yang akan dipelajari mengenai studi algoritma yaitu :
Bagaimana Merencanakannya: Merupakan suatu studi tentang teknik variasi design.
Bagaimana Menyatakannya: Menyatakannya dengan singkat, dibuat dalam bahasa pemrograman yang terstruktur, misalnya Pascal, Bahasa C
Bagaimana Validitasnya: Memenuhi kebutuhan yang diinginkan, dan perhitungannya / solusinya selalu benar untuk semua kemungkinan input yang legal.
Bagaimana Menganalisisnya: Perbandingan dari waktu perhitungan dan banyaknya storage / memori yang digunakan (efisiensi)
Bagaimana Menguji suatu program : dilakukan pengujian terhadap kebenaran algoritma
Pemrograman Prosedural Algoritma berisi urutan langkah-langkah penyelesaian masalah. Ini berarti Algoritma adalah proses yang prosedural. Definisi Prosedural menurut Kamus Besar Bahasa Indonesia : 1. Tahap-tahap kegiatan untuk menyelesaikan suatu aktivitas. 2. Metode langkah demi langkah secara eksak dalam memecahkan suatu masalah. Pada pemrograman prosedural, program dibedakan antara bagian data dengan bagian instruksi. Bagian instruksi terdiri atas runtutan (sequence) instruksi yang dilaksanakan satu per satu secara berurutan oleh pemroses. Alur pelaksanaan instruksi dapat berubah karena adanya pencabangan kondisional. Data yang disimpan di dalam memori dimanipulasi oleh
instrusi secara beruntun atau prosedural. Paradigma pemrograman seperti ini dinamakan pemrograman prosedural. Bahasa-bahasa tingkat tinggi seperti Cobol, Basic, Pascal, Fortran dan C mendukung kegiatan pemrograman procedural, karena itu mereka dinamakan juga bahasa procedural. Selain paradigma pemrograman procedural, ada lagi paradigma yang lain yaitu pemrograman berorientasi objek (Object Oriented Programming). Paradigma pemrograman ini merupakan trend baru dan sangat populr akhir-akhir ini. Paradigma pemrograman yang lain adalah pemrograman fungsional, pemrogramn deklaratif dan pemrograman konkuren. Pada kesempatan ini penulis hanya menyajikan paradigma pemrograman procedural saja.
IV. Struktur Dasar Algorima Seperti yang dijelaskan sebelumnya, algoritma berisi tahapan-tahapan pemikiran yang sistematis dan logis. tahapan-tahapan pemikiran tersebut dideskripsikan dalam bentuk langkah-langkah pelaksanaan suatu proses. Setiap langkah di dalam algoritma tersebut dinyatakan dalam sebuah bentuk pernyataan (statement) atau istilah lainya adalah instruksi. Dan program adalah kumpulan instruksi atau perintah yang disusun sedemikian rupa sehingga mempunyai urutan nalar yang tepat untuk menyelesaikan suatu persoalan. (Menurut P. Insap Santosa). Sebuah pernyataan berisi aksi (action) yang dilakukan, artinya bila pernyataan dieksekusi (run) oleh pemroses, maka aksi yang bersesuaian dengan pernyataan akan dikerjakan. Sebagai contoh, misalkan dalam algoritma terdapat pernyataan: Tulis ”Piksi Ganesha is good” Maka pernyataan tesebut dalam bentuk instruksi ’ Tulis ’ yang menggambarkan aksi menulis pesan ”Piksi Ganesha is good”. Contoh lainya: Jika kamu = ‘menarik’ maka tulis “ saya tertarik” Terdiri dari dua aksi, yaitu membandingkan nilai variable kamu dengan ‘menarik’, dan aksi tulis pesan “ saya tertarik “, jika perbandingan itu benar. Di dalam algoritma pun dikenal banyak bentuk pernyataan, seperti pernyataan ekspresi, pernyataan pemilihan, pernyataan pengulangan, pernyataan prosedur, dll.
Konstruksi Dasar Sebuah algoritma dapat dibangun dari tiga buah konstruksi dasar, yaitu runtunan, pemilihan, dan pengulangan.
Runtunan
1.
Pemilihan
Pengulangan
Runtunan (Sequence). Sebuah runtunan terdiri dari satu atau lebih 'instruksi'. Tiap-tiap instruksi
dilaksanakan secara berurutan sesuai dengan urutan penulisannya. Sebuah instruksi baru bisa
dilaksanakan setelah instruksi sebelumnya selesai dilaksanakan. Urutan instruksi menentukan keadaan akhir algoritma. Kalau urutannya diubah, kemungkinan besar hasil akhirnya akan berubah.
Misal:
Seorang ibu berbelanja di mall. Dia melewati beberapa tokoyaitu toko perhiasan, took baju, toko sepatu, dan toko tas. Ketika itu dia iseng! belilah dia satu set perhiasan mas. Namun setelah berjalan beberapa meter dia berjumpa dengan toko tas. Karena dia sadar kalau dirinya membutuhkan tas baru, dia akan menyesal dengan mengatakan "seandainya toko perhiasan tadi ada setelah toko tas" Itulah runtunan/runtutan yang menentukan keadaan akhir dari suatu proses
algoritma (contoh diatas ibu itu akhirnya beli perhiasan mas), jika runtunan tersebut dirubah bias menyebabkan hasil tidak sama (ibu itu bisa tidak beli perhiasan mas).
Ada dua buah bejana, A dan B; bejana A berisi larutan kopi, bejana B berisi larutan susu. Pertukarkan kedua isi bejana itu, sehingga A berisi larutan susu, dan B berisi larutan kopi. Tidak boleh jadi kopi susu.
Bagaimana Algoritmanya? Jawabannya: ada tiga langkah, yaitu:
1. Tuangkan larutan dari bejana A ke dalam bejana C. (cuci bersih dulu bejana A kalo bisa) 2. Tuangkan larutan dari bejana B ke dalam bejana A. (cuci juga bejana B) 3. Tuangkan larutan dari bejana C ke dalam bejana B. Selesai..... Maka tidak jadi kopi susu, kecuali di minum isi kedua bejana itu dan mencampurnya di perut.Dari langkah diatas diperlukan suatu bejana bantu yaitu bejana C, dalam Algoritma variabel bantu tersebut diperbolehkan dan sangat dianjurkan untuk mempermudah suatu penyelesaian proses.
2.
Pemilihan ( Selection ) Dalam sebuah instruksi dikerjakan setelah 'kondisi' tertentu terpenuhi. Dalam
peristiwa sehari-hari sering disebut JIKA …. MAKA ….. , Misal :
JIKA mengantuk MAKA tidur
JIKA lapar MAKA makan
JIKA nilai jelek MAKA tidak lulus
Dalam bahasa pemrograman, ini dikenal dengan "if" dan "then". Kondisi adalah persyaratan yang dapat dinilai benar atau salah sehingga akan memunculkan 'aksi' yang berbeda dengan 'kondisi' yang berbeda. Misal :
'if' Widi memperoleh juara kelas 'then' ayah akan memberi hadiah
'if' Jalan Dago macet 'then' ambil alternatif Jalan Dipati Ukur
Struktur pemilihan 'if-then' hanya memberikan satu pilihan aksi bila kondisi dipenuhi atau bernilai benar dan tidak memberikan aksi lain bila kondisi salah. Bentuk pemilihan yang lebih umum adalah memilih satu dari dua aksi bergantung pada nilai kondisinya, seperti: 'if' hari hujan 'then' pergilah dengan naik taxi 'else' pergilah dengan naik motor Bisa di jelaskan JIKA hari hujan MAKA pergilah dengan naik taksi JIKA TIDAK pergilah dengan naik motor. Di sini secara logika jika kondisi 'hari hujan' benar, maka aksi 'pergi naik taxi' dilakukan. Sebaliknya jika kondisi 'hari hujan' bernilai salah, maka aksi 'pergi naik motor' akan dilaksanakan. Secara garis besar struktur pemilihan ini adalah : IF kondisi THEN Proses1 ELSE Proses2 END IF
3.
Pengulangan (Repetition) Salah satu kegunaan pemrograman adalah untuk memudahkan pekerjaan yang harus
dilakukan berulang-ulang tanpa lelah. Ada cerita yang dialami oleh seorang anak SMA yang, pernah suatu hari dihukum guru karena tertidur dikelas pada jam pelajaran terakhir. Dimana hukumannya menulis kalimat "saya berjanji tidak akan tidur di kelas lagi" sebanyak 300 kali. Tapi untungnya guru tersebut ini tidak menjelaskan dimana harus menulisnya. Kesokan harinya terpaksa merengek ke kakanya untuk dibolehkan membawa laptop kesayangan saya ke sekolah. Sebelumnya pada malam harinya sudah membuat program kecil untuk mengulang tulisan "saya berjanji tidak akan tidur di kelas lagi" sebanyak apapun yang di inginkan. Akhirnya guru tersebut itu cuman bisa geleng kepala. Algoritma pengulangan tersebut dapat dianalogikan dengan kalimat ULANG proses…SAMPAI kondisi tertentu.. atau
SAMPAI kondisi tertentu Lakukan proses PENGULANGAN Dalam contoh cerita diatas bias di tuliskan algoritmanya sbb :
repeat 300 times Tulis: ”saya berjanji tidak akan tidur di kelas lagi” Atau : for i = 1:100 Tulis: ”saya berjanji tidak akan tidur di kelas lagi”
Paradigma pemograman
Pemrograman Prosedural •
Berdasarkan urutan-urutan, sekuensial
•
Program adalah suatu rangkaian prosedur untuk memanipulasi data. Prosedur merupakan kumpulan instruksi yang dikerjakan secara berurutan.
•
Harus mengingat prosedur mana yang sudah dipanggil dan apa yang sudah diubah.
Pemrograman Fungsional •
Berdasarkan teori fungsi matematika
•
Fungsi merupakan dasar utama program.
Pemrograman Terstruktur •
Secara berurutan dan terstrukrtur.
•
Program dapat dibagai-bagi menjadi prosedur dan fungsi.
•
Contoh: PASCAL dan C
Pemrograman Modular •
Pemrograman ini membentuk banyak modul.
•
Modul merupakan kumpulan dari prosedur dan fungsi yang berdiri sendiri
•
Sebuah program dapat merupakan kumpulan modul-modul.
•
Contoh: MODULA-2 atau ADA
Pemrograman Berorientasi Obyek •
Pemrograman
berdasarkan
prinsip
obyek,
dimana
obyek
memiliki
data/variabel/property dan method/event/prosedur yang dapat dimanipulasi •
Contoh: C++, Object Pascal, dan Java.
Pemrograman Berorientasi Fungsi •
Pemrograman ini berfokus pada suatu fungsi tertentu saja. Sangat tergantung pada tujuan pembuatan bahasa pemrograman ini.
•
Contoh: SQL (Structured Query Language), HTML, XML dan lain-lain.
Pemrograman Deklaratif •
Pemrograman ini mendeskripsikan suatu masalah dengan pernyataan daripada memecahkan masalah dengan implementasi algoritma.
•
Contoh: PROLOG
Klasifikasi Algoritma 1.
Ditinjau dari Implementasi : •
Recursion or iteration: merupakan algoritma yang dapat memanggil dirinya sendiri sampai kondisi yang ditentukan dipenuhi, dikenal dengan functional programming
•
Logical: suatu algoritma yang dapat dilihat sebagai deduksi lojik terkontrol.
•
Serial atau parallel atau distributed: algoritma yang biasanya dieksekusi dengan asumsi satu instruksi pada suatu waktu.
•
Deterministic or non-deterministic: algoritma deterministik menyelesaikan masalah dengan keputusan yang tepat pada setiap tahapannya, sedangkan algoritma non-deterministic menyelesaikan masalah dengan perkiraan.
•
Exact atau approximate: mencari suatu perkiraan yang bisa menghampiri solusi yang benar. Biasa digunakan pada deterministik atau strategi random.
2.
Ditinjau dari Paradigma perancangan: Divide and conquer, Dynamic programming, The greedy method, Linear programming, Reduction, Search and enumeration, The probabilistic and heuristic paradigm (Probabilistic algorithms, Genetic algorithms, Heuristic algorithms)
3.
Ditinjau dari Kajian Studi : search algorithms, sorting algorithms, merge algorithms, numerical algorithms, graph algorithms, string algorithms, computational geometric
algorithms,
combinatorial algorithms, machine learning, cryptography, data compression algorithms parsing techniques 4.
Ditinjau dari Kompleksitas: Algoritma efesien
5.
Ditinjau dari Computing Power : polynomial time , primitive recursive functions
V.
Notasi Algoritmik French,C.S. (1984) menyatakan sejumlah konsep yang mempunyai relevansi dengan
masalah rancangan program yaitu kemampuan komputer, kesulitan dan ketepatan. Penerapan dari konsep tersebut biasanya digunakan dalam rancangan algoritma. Dalam merancang sebuah algoritma, Fletcher (1991) memberikan beberapa cara atau metode yaitu kumpulan perintah, ekspresi, tabel instruksi, program komputer, kode semu dan flow chart, sedangkan Knuth (1973) menyarankan algoritma fundamental. Sebenarnya, tidak ada notasi yang standar untuk menuliskan notasi algoritma sebagaimana pada notasi bahasa pemograman. Namun, terdapat beberapa notasi algorima berikut ini: 1. Bahasa Natural : digunakan untuk membuat algoritma yang komplek atau algoritma teknik. 2. Pseudocode Pseu : menyerupai, code : kode. Susunan yang padat dan merupakan algoritma informal untuk deskripsi high-level dengan menggunakan struktur konvensi bahasa pemrograman, tetapi dalam penulisan tidak memperhatikan pemakaian subrutin (prosedur) , deklarasi varabel dan kode sistem khusus. Artinya, sudah lebih dekat ke bahasa pemrograman, namun sulit dimengerti oleh orang yang tidak mengerti pemrograman. Tidak ada aturan standar penulisan pseudocode. Contoh: menghitung luas segitiga yang diketahui alas dan tingginya o
input alas
o
input tinggi
o
luas ← ½ * (alas * tinggi)
o
write ( ‘luas’)
3. flow chart (diagram alir) representasi algoritma dengan skema atau langkah proses yang ditunjukan dengan berbagai macam bentuk dan dikaitkan dengan arah panah. Dapat membantu programmer maupun orang lain dalam memahami alur program (apa saja input, proses dan output dari program). Bagus secara visual akan tetapi repot kalau algoritmanya panjang.
Selalu dimulai dengan
Input / Output
BEGIN:
Begin
Begin
Jangan lupa garis Input/output Mungkin anda ingin berkomunikasi dengan pemakai
End
Proses
Begin
Begin
Input
Input Anda dpt melakukan perhitungan di dlm proses Proses
Anda dapat menampilkan hasil di output
Proses
Output
End
Contoh flowchart dalam menuliskan algoritma menghitung luas segitiga:
Start input alas input tinggi luas ½ * (alas * tinggi)
Algoritma luas segitiga Menghitung luas segitiga bila diketahui alas dan tingginya input alas input tinggi luas ½ * (alas * tinggi) print luas
print luas End
Notasi Algoritma Independen Terhadap Bahasa Pemrograman Dan Mesin Komputer Notasi Algoritma dapat diterjemahkan ke dalam berbagai bahasa pemrograman. Analoginya sama dengan resep membuat kue. Sebuah resep dapat ditulis dalam bahasa apapun. Bahasa Jepang, Inggris, Perancis, Indonesia, dan lain sebagainya. Apapun bahasanya, kue yang dihasilkan tetap sama asalkan semua aturan pada resep diikuti. Mengapa demikian ? Karena setiap juru masak (sebagai pemroses) dapat melakukan operasi dasar yang sama, seperti mengocok telur, menimbang berat gula, dan lain sebagainya.
Demikian juga halnya dengan komputer. Meskipun setiap komputer berbeda teknologinya, tetapi secara umum semua komputer dapat melakukan operasi-operasi dasar dalam pemrograman seperti operasi pembacaan data, operasi perbandingan, operasi aritmatika, dan sebagainya. Perkembangan teknologi komputer tidak mengubah operasioperasi dasar it, yang berubah hanyalah kecepatan, biaya, atau tingkat ketelitian. Pada sisi lain setiap program dalam bahasa tingkat tinggi selalu diterjemahkan kedalam bahasa mesin sebelum akhirnya dikerjakan oleh CPU. Setiap instruksi dalam bahasa mesin menyajikan operasi dasar yang sesuai, dan menghasilkan efek netto yang sama pada setiap komputer.
Struktur Teks Algoritma
Judul algoritma Bagian yang terdiri atas nama algoritma dan penjelasan (spesifikasi) tentang algoritma
tersebut. Nama sebaiknya singkat dan menggambarkan apa yang dilakukan oleh algoritma tersebut. Sebagai contoh: PROGRAM menghitung_luas_segitiga { Program untuk menghitung luas sebuah segitiga dari masukkan berupa alas dan tinggi }
Deklarasi Bagian untuk mendefinisikan semua nama yang digunakan di dalam program. Nama
tersebut dapat berupa nama tetapan, peubah, tipe, prosedur dan fungsi. Contoh: DEKLARASI { nama konstanta } Const Npeg = 100 {jumlah pegawai} Const phi = 3.14
{nilai π}
{ nama tipe } type Titik : record < x: int, y: int > { absis, ordinat } { nama peubah } c
: char
Q : titik
{karakter yang dibaca} {titik koordinat}
Deskripsi (Algoritma) Bagian ini berisi uraian langkah-langkah penyelesaian masalah yang ditulis dengan
menggunakan notasi yang akan dijelaskan selanjutnya yaitu instruksi-instruksi algoritmik yang biasanya ditulis dalam notasi pseudecode. Sebagai contoh secara keseluruhan membuat luas dan keliling lingkaran: PROGRAM Luas_Kell_Lingkaran {<- ini judul algoritma}
{menghitung luas dan keliling lingkaran untuk ukuran jari-jari tertentu. Algoritma menerima masukan jari-jari lingkaran, menghitung luas dan kelilingnya, dan mencetak luas dan keliling lingkaran ke piranti keluaran} DEKLARASI : const phi = 3.14 R : real {jari-jari lingkaran} Luas : real {luas lingkaran} Keliling : real {keliling lingkaran} DESKRIPSI : read (R) Luas = phi * R *R Keliling = 2 * phi * R write(luas, keliling)
VI. Tipe, Operator, dan Ekspresi Pada dasarnya, suatu program komputer ialah memanipulasi objek (data) di dalam memori. Objek tersebut terdiri dari Peubah (variable) dan konstanta (constant). Operator menspesifikasikan operasi apa yang dapat dilakukan terhadap Peubah dan konstanta. Ekspresi mengkombinasikan peubah dan konstanta untuk menghasilkan nilai baru. Tipe sebuah objek akan menentukan himpunan nilai yang dapat dimilikinya dan operasi yang dilakukan pada objek tersebut. Tipe dibedakan atas tipe dasar dan tipe bentukan.
Tipe Dasar 1. Bilangan Lojik (Logic) Nama tipe: boolean Ranah nilai: hanya mengenal dua buah nilai: benar (true) da salah (false). Atau dinyakan bernilai ‘1’ jika pernyataan benar dan bernilai ‘0’ jika pernyataan salah. Konstanta: True dan False Operasi Operasi yang dilakukan adalah operasi boolean yang menghasilkan nilai true dan false. Operator yang digunakan adalah not, and, or, dan xor. • Hubungan DAN (AND) Merupakan hubungan antar kondisi yang mensyaratkan kedua kondisi terpenuhi. Bernilai benar jika kedua pernyataan bernilai benar Contoh : Untuk menentukan penerimaan calon pegawai ditentukan kriteria sebagai: Umur dibawah 30 tahun Nilai test lebih besar dari 60
Umur < 30 dan nilai > 60
T Capeg diterima
F Capeg tidak diterima
• Hubungan Atau (OR) Merupakan hubungan antar kondisi yang mensyaratkan hanya salah satu kondisi yang terpenuhi. Bernilai salah jika kedua pernyataan bernilai salah Contoh: Tunjangan pensiun diberikan kepada pegawai yang berusia lebih dari 60 tahun. Untuk pegawai yang mempunyai masa kerja lebih dari 25 tahun juga mendapat tunjangan tersebut.
Usia>60 Atau MK>25
T
Mendapat tunjangan pensiun
F Tidak mendapat tunjangan pensiun
xor akan bernilai benar bila kedua pernyataan saling berlawanan.
2. Bilangan Bulat Bilangan bulat adalah bilangan yang tidak mengandung pecahan desimal. Nama tipe: Integer Ranah nilai: Secara teoritis, rentang nilainya adalah dari minus tak hingga sampai plus tidak berhingga. Namun, di dalam komputer tipe integer ini mempunyai nilai yang terbatas bergantung pada mesin (komputer) dan kompilator yang digunakan. Kompilator menyediakan lima macam tipe untuk integer, yaitu byte, shortint, word, integer, dan longint. Tipe
Rentang Nilai
Format
Byte
0 ... 255
Unsigned 8-bit
shortint
-128 ... 127
signed 8-bit
word
0 … 65535
Unsigned 16-bit
integer
-32768 … 32767
signed 16-bit
longint
-2147483648 … 2147483647
signed 32-bit
Pemilihan implementasi bilangan bulat ke dalam tipe-tipe integer yang berbeda lebih disebabkan pada faktor penghematan memori. Sebagai contoh, tipe word hanya membutuhkan 2 byte memori, sedangkan integer membutuhkan 4 byte memori. Tipe bilangan bulat adalah tipe yang memiliki keterurutan, artinya nilai sebelumnya (predecessor) dan nilai sesudahnya (successor) dapat ditentukan. Contohnya predecessor 9 (a) adalah 8 (a-1), dan successornya adalah 10 (a+1).
Konstanta: konstanta bertipe bilangan bulat harus ditulis tanpa mengandung pecahan desimal. Misalnya
77
-33
1986
10
1
Operasi: Operasi yang dilakukan adalah operasi aritmetika dan operasi perbandingan. a. Operasi aritmetika Operasi aritmetika terhadap bilangan bulat dengan sembarang operator aritmetika menghasilkan nilai yang bertipe bilangan bulat pula. Operator aritmetika yang didefinisikan pada bilangan bulat adalah: Operator
Operation
+
Addition (tambah)
-
Subtraction (kurang)
*
Multiplication (kali)
/
Division (bagi)
div
Integer division
mod
Remainder (sisa hasil bagi)
Objek yang dioperasikan disebut operand. Misalnya, pada x + y, masing-masing x dan y adalah operand. b. Operasi perbandingan Operasi perbandingan terhadap salah satu operator relasional menghasilkan nilai bolean (true atau false). Operador perbandingan untuk bilangan bulat adalah: Operator
Operation
=
Sama dengan
<
Lebih kecil
≤
Lebih kecil atau sama dengan
>
Lebih besar
≥
Lebih besar atau sama dengan
1
Tidak sama dengan
3. Bilangan Riil Bilangan bulat adalah bilangan yang mengandung pecahan desimal. Nama tipe: real ( beberapa literatur juga menyebutnya folating point ) Ranah nilai: Secara teoritis, rentang nilainya adalah dari minus tak hingga sampai plus tidak berhingga. Namun, di dalam komputer tipe integer ini mempunyai nilai yang terbatas bergantung pada mesin (komputer) dan kompilator yang digunakan. Kompilator menyediakan empat macam tipe yaitu real, single, double, dan extended. Tipe
Rentang Nilai
Format
real
2.9 x 10-39 … 1.7 x 1038
6 byte
single
1.5 x 10-45 … 3.4 x 1038
4 byte
double
5.0 x 10-324 … 1.7 x 10308
8 byte
extended
3.4 x 10-4932 … 1.1 x 104932
10 byte
Konstanta: konstanta bertipe bilangan riil harus ditulis dengan pecahan desimal. Misalnya
0.77
-33.99
1986.101
8.12+E3
.2
Operasi: Operasi yang dilakukan adalah operasi aritmetika dan operasi perbandingan. a. Operasi aritmetika Operasi aritmetika terhadap bilangan riil dengan sembarang operator aritmetika menghasilkan nilai yang bertipe bilangan riil pula. Operator aritmetika yang didefinisikan pada bilangan riil adalah: Operator
Operation
+
Addition (tambah)
-
Subtraction (kurang)
*
Multiplication (kali)
/
Division (bagi)
b. Operasi perbandingan Operasi perbandingan terhadap salah satu operator relasional menghasilkan nilai bolean (true atau false). Operador perbandingan untuk bilangan bulat adalah:
Contoh: 0.0007 < 0.7
Operator
Operation
=
Sama dengan
<
Lebih kecil
≤
Lebih kecil atau sama dengan
>
Lebih besar
≥
Lebih besar atau sama dengan
≠
Tidak sama dengan
(hasil : false)
812.03 > 11.01986 8.9 ≠ 89.0
(hasil: true)
(hasil: true)
4. Karakter Nama tipe: char Ranah nilai: Ranah karakter adalah semua alfabet (‘a’ ... ‘z’, ‘A’ ... ‘Z’), angka (‘0’ ... ‘9’), karakter khusus (‘.^’, ‘@’, ‘#’, ‘$’, ‘%’, ‘&’ dll), tanda baca (‘!’, ‘?’, ‘.’, ‘:’ dll), operator aritmetika (‘*’, ‘/’, ‘+’, ‘-‘). Daftar yang lengkap terdapat pada tabel ASCII. Konstanta: konstanta karakter harus diapit oleh tanda petik tunggal. Contoh: ‘M’ ‘e’
‘c’
‘C’ ‘a’
‘7’
‘$’
Harus diperhatikan yaitu ‘7’ adalah karakter sedangkan 7 adalah integer! Operasi: Operasi yang dilakukan adalah operasi perbandingan. Yang berlaku yaitu: Operator
Operation
=
Sama dengan
<
Lebih kecil
≤
Lebih kecil atau sama dengan
>
Lebih besar
≥
Lebih besar atau sama dengan
≠
Tidak sama dengan
Contoh: ‘c’ = ‘c’
(True) ;
‘T’ = ‘t’ (false) ;
‘m’ < z (true
Tipe karakter adalah tipe yang memiliki keterurutan, artinya nilai sebelumnya (predecessor) dan nilai sesudahnya (successor) dapat ditentukan.
5. String String adalah untaian karakter dengan panjang tertentu. String sebenarnya bukan tipe dasar murni, namun karena sering digunakan dalam pemograman, maka string diperlakukan sebagai tipe dasar. Nama tipe: string Ranah nilai: Ranah nilai untuk tipe string adalah deretan karakter yang telah didefinisikan pada ranah karakter. Konstanta: Semua konstanta string harus diapit oleh tanda petik tunggal. Contoh: ‘ logika algoritma’, ‘BANDUNG’, ‘PIKSI GANESHA’, ‘D5709um’ String kosong adalah string yang panjangnya nol, antara lain, string kosong sama dengan karakter kosong. Operasi: Operasi terhadap data bertipe string didefinisikan dua macam: a. Operasi penyambungan Operator: +, yang dimaksudkan disini yaitu penyambungan. Contoh: ‘Manajemen’ + ‘informatika = ‘Manajemen informatika’ ‘1’ + ‘2’ = ‘12’ dan
‘110’ + ‘1986’ = ‘1101986’
b. Operasi Perbandingan Contoh: ‘pqrs’ = ‘pqr’ ‘ simkuring’
(false) < ‘SIMKURING’
(true)
String yang disusun atas gabungan numerik dan abjad disebut alfanumerik. Misalnya: ‘D5709UM’ .
Tipe Bentukan Tipe bentukan adalah tipe yang didefinisikan sendiri oleh pemogram. Tipe bentukan disusun oleh satu atau lebih tipe dasar. Ada dua macam tipe bentukan: 1.
Tipe dasar yang diberi nama dengan nama tipe baru.
2.
Tipe terstruktur
1.
Tipe dasar yang diberi nama dengan nama tipe baru
Pemberian nama baru biasanya digunakan oleh pemogram dengan alasan agar lebih familiar dan lebih mudah diintrepertasi oleh orang yang membaca teks algoritma. Kata kunci untuk pembuatan nama baru ini adalah type. Aspek ranah nilai, konstanta, dan operasi beserta operatornya terhadap tipe baru tersebut tidak berubah, tetap sama dengan tipe dasar aslinya. Contoh
:
type BilanganDesimal : real
BilanganDesimal adalah tipe bilangan riil yang sama saja dengan tipe real. Apabila kita mempunyai sebuah peubah yang bernama p dan bertipe BilanganDesimal, peubah p tersebut sama saja dengan bertipe real. 2.
Tipe terstruktur
Tipe terstruktur adalah tipe yang berbentuk rekaman (record). Rekaman disusun oleh satu atau lebih field. Tiap field menyimpan data dari tipe dasar tertentu atau dari tipe bentukan lain yang sudah didefinisikan sebelumnya. Nama rekaman ditentukan oleh pemrogram. field 1
field 2
field 3
...................
field N
Contoh: 1. Bilangan kompleks adalah bilangan yang terdiri dari bilangan riil dan bilangan imaginer yang dinyatakan dengan a+bi, dengan a dan b riil sedangkan i = − 1 . Misalnya 7.0 + 2.6 i. Bilangan kompleks itu dapat dinyatakan sebagai tipe rekaman dengan a dan b sebagai nama fieldnya. a
b
Cara menuliskan tipe kompleks: type Kompleks : record
jika dideklarasikan m adalah peubah bertipe kompleks, maka cara mengacu tiap field pada m adalah: m.a ; m.b Secara keseluruhan dapat didefinisikan sebagai berikut: Nama tipe
: Kompleks
Ranah nilai
: (real, real)
Contoh konstanta
: <7.0 , 2.6> yang menandakan 7.0 + 2.6 i.
Operasi
: operasi aritmetika bilangan riil terhadap a dan b Operasi perbandingan terhadap masing-masing field.
2. NilMhs adalah nama tipe terstruktur yang menyatakan nilai ujian seorang mahasiswa untuk suatu mata kuliah (MK) yang ia ambil. Data setiap mahasiswa adalah NIM (Nomor Induk Mahasiswa), nama mahasiswa, kode mata kuliah yang ia ambil, dan nilai mata kuliah. NIM
NamaMhs
KodeMK
Nilai
Cara menuliskan tipe NilaiMhs: Type NilaiMhs : record < NIM
: integer ,
{ Nomor Induk Mahasiswa }
NamaMhs : string ,
{ nama mahsiswa }
KodeMK
: string ,
{ kode mata kuliah }
Nilai
: char ,
{ indeks nilai }
>
Aturan Penamaan: 1. Nama harus dimulai dengan huruf alfabet, tidak boleh dimulai dengan angka, spasi, atau karakter khusus lainya. 2. Huruf besar atau kecil tidak dibedakan. 3. Karakter penyusun nama hanya boleh huruf alfabet, angka, dan “_”. 4. Nama tidak boleh mengandung operator aritmetika, operator relasional, tanda baca, dan karakter khusus lainya. 5. Karakter dalam nama tidak boleh dipisah dengan spasi.
6. Panjang nama tidak dibatasi. Ekspresi 1. Ekspresi Aritmetik adalah ekspresi yang baik operand-nya bertipe numerik dan hasilnya juga bertipe numerik. Contoh: f ← g * h atau l = ( u + v ) div 7. 2. Ekspresi Relasional adalah ekspresi dengan operator =, <, >, ≥, ≤, ≠ dan not, or, and, dan xor. Contoh: not ada (hasil : false) , x < 7 ( hasil: false), dll
3. Ekspresi String adalah ekspresi dengan operator ‘+’ (operaor penyambungan).
VII. Runtunan Algoritma merupakan runtunan (sequence) satu ataulebih instruksi, yang berarti bahwa: 1. Tiap instruksi dikerjakan satu per satu 2. Tiap instruksi dilaksanakan tepat sekali, tidak ada yang diulang 3. Urutan instruksi yang dilaksanakan pemroses sama dengan urutan instruksi sebagaimana yang tertulis di dalam teks algoritma. 4. Akhir dari instruksi terakhir merupakan akhir algoritma. Contoh kasus runtunan: Tulislah algoritma yang membaca nama karyawan dan gaji pokok bulananya dan menghitung gaji bersih karyawan tersebut. Gaji bersihnya tersebut adalah: Gaji bersih = gaji pokok + tunjangan - pajak Tunjangan karyawan dihitung 20 % dari gaji pokok, sedangkan pajak adalah 15 % dari gaji pokok ditambah tunjangan. Nama karyawan dan gaji bersih sebagai outputnya. Penyelesaian PROGRAM Gaji_Bersih_Karyawan { Menghitung gaji bersih karyawan dengan masukkan nama karyawan dan gaji pokok bulananya. Gaji bersih = gaji pokok + tunjangan - pajak. Tunjangandihitung 20 % dari gaji pokok, sedangkan pajak adalah 15 % dari gaji pokok ditambah tunjangan } DEKLARASI const PersenTunjangan = 0.2 const PersenPajak = 0.15 NamaKaryawan = string GajiPokok,tunjangan,pajak,GajiBersih : real DESKRIPSI read (NamaKaryawan, GajiPokok) tunjangan ← PersenTunjangan * GajiPokok pajak ← PersenPajak * (GajiPokok + tunjangan) GajiBersih ← GajiPokok + tunjangan - pajak write(NamaKaryawan, GajiBersih)
VIII. Pemilihan Seringkali suatu instruksi hanya bisa dikerjakan jika ia memenuhi suatu persyaratan tertentu. Oleh karena itu, komputer tidak lagi mengerjakan instruksi secara sekuensial seperti pada runtunan, namun berdasarkan syarat yang dipenuhi yang terdapat pada struktur pemilihan. Mari kita lihat contoh demi contoh pada setiap kasusnya. Satu kasus
then
Pernyataan atau aksi akan dikerjakan jika kondisi bernilai benar dan jika salah maka aksi atau pernyataan tidak dikerjakan
Contoh: Menentukan bilangan genap Program genap Deklarasi x : integer Deskripsi read (x) if x mod 2 = 0 then write (‘genap’) endif Atau contoh lainya: IF nilai = “A” OR nilai = “B” THEN write (Dapat mengikuti tes asisten) ENDIF
Dua Kasus
” Aksi 1 akan dikerjakan jika kondisi dalam keadaan benar/true dan sebaliknya jika kondisi salah/false maka pernyataan-2 atau aksi 2 yang akan dikerjakan.”
Contoh: Menentukan tahun kabisat Program : TahunKabisat Deklarasi tahun = integer Deskripsi read (tahun) if tahun mod 4 = 0 then write (‘ tahun kabisat’ ) else write (‘ bukan tahun kabisat’ ) endif Tiga Kasus atau lebih
” Aksi 1 akan dikerjakan jika kondisi1 dalam keadaan benar/terpenuhi, jika kondisi2 maka aksi 2 akan dikerjakan dan jika tidak ada kondisi yang memenuhi maka aksi3 yang dikerjakan”
Contoh: Untuk proses jual beli dengan diskon dan hadiah sebagai berikut:
IF beli>=100000 THEN Output(Diskon 10%) ELSE IF beli>=50000 THEN Output(Bonus piring) ELSE IF beli>=10000 THEN Output(Bonus gelas) ELSE Output(Tak ada bonus) ENDIF ENDIF ENDIF
Struktur case ◊ Struktur kondisi Case digunakan untuk penyeleksian kondisi dengan kemungkinan yang terjadi cukup banyak. Penyederhanaan bentuk if-then-else. ◊ Struktur ini akan melaksanakan salah satu dari beberapa pernyataan ‘case’ tergantung nilai kondisi yang ada ◊ Struktur ini Alternatif penggunaan nested conditional
IX.
Pengulangan Perulangan (iterasi) adalah proses yang berulang. Iterasi selalu ada dalam bahasa
pemrograman apapun, karena disinilah letak kelebihan komputer dibanding manusia, yaitu mampu melakukan hal yang sama berulang kali tanpa kesalahan akibat bosan atau lelah. Dengan perulangan, program menjadi lebih pendek dan sederhana. Dalam Pascal dikenal tiga macam perintah (statement) perulangan, yaitu statement for…do, repeat…until dan while…do. Perulangan for…do adalah perulangan dengan penghitung (counter), perulangan repeat…until adalah perulangan dengan syarat akhir sedang perulangan while…do adalah perulangan dengan syarat awal. Didalam algoritma, pengulangan (repetition/loop) dapat dilakukan sejumlah kali, atau sampai kondisi berhenti pengulangan tercapai. Struktur pengulangan terdiri atas dua bagian : •
Kondisi pengulangan, yaitu ekspresi boolean yang harus dipenuhi untuk melaksanakan pengulangan.
•
Badan pengulangan, yaitu satu atau lebih aksi yang akan diulang.
Bagian lain yang menyertai pengulangan yaitu : •
Inisialisasi, yaitu aksi yang dilakukan sebelum pengulangan dilakukan pertama kali.
•
Terminasi, yaitu aksi yang dilakukan setelah pengulangan selesai dilaksanakan.
Struktur WHILE – DO
Bentuk umum struktur WHILE – DO adalah : While do AKSI Endwhile Penjelasan : Aksi (atau runtunan aksi) akan dilaksanakan berulangkali sepanjang boolean masih tetap bernilai true. Jika bernilai false, badan pengulangan tidak akan dilaksanakan. Pengulangan selesai. Contoh : Misalkan kita ingin mencetak tulisan “PIKSI” sebanyak 3 kali. Maka algoritmanya adalah : Algoritma Cetak_Banyak_Hallo {Mencetak kata “PIKSI” sebanyak 3 kali}
DEKLARASI k : integer {pencacah pengulangan} DESKRIPSI k ← 1 {inisialisasi} While k ≤ 3 do write(‘PIKSI’) k←k+1 endwhile {kondisi berhenti : k > 3} Keterangan : Pada mulanya, k diisi dengan nilai 1. Sebelum memasuki badan pengulangan, kondisi k ≤ 3 diperiksa apakah bernilai true. Karena 1 ≤ 3 bernilai true, maka pernyataan write(‘PIKSI’) dilaksanakan, sehingga keluaran yang tercetak PIKSI Demikian seterusnya sebanyak 3 kali. Setiap kali badan pengulangan dimasuki, nilai k bertambah 1 sampai nilai k = 4. karena 4 > 10 maka kondisi pengulangan k ≤ 3 bernilai false. Pengulangan dihentikan. Jadi keluaran algoritma tersebut adalah : PIKSI PIKSI PIKSI
Struktur REPEAT – UNTIL
Bentuk umum struktur REPEAT – UNTIL adalah : Repeat AKSI until Penjelasan : Notasi ini mendasarkan pengulangan pada kondisi berhenti. Aksi didalam badan pengulangan diulang sampai kondisi boolean bernilai true, dengan kata lain, jika kondisi berhenti masih salah, pengulangan masih terus dilakukan. Karena pengulangan harus berhenti, maka di dalam badan pengulangan harus ada aksi yang mengubah harga kondisi. Perbedaan mendasar dengan struktuw WHILE – DO adalah aksi dilaksanakan minimal 1 kali, karena kondisi pengulangan diperiksa pada akhir struktur.
Contoh : Misalkan kita ingin mencetak tulisan “PIKSI” sebanyak 3 kali. Maka algoritmanya adalah : Algoritma Cetak_Banyak_Hallo {Mencetak kata “PIKSI” sebanyak 3 kali} DEKLARASI k : integer {pencacah pengulangan} DESKRIPSI k ← 1 {inisialisasi} Repeat write(‘PIKSI’) k←k+1 endwhile k > 3 {kondisi berhenti : k > 3}
Struktur FOR Struktur for digunakan untuk menghasilkan pengulangan sejumlah kali tanpa
penggunaan kondisi apapun. Struktur ini menyebabkan aksi diulangi sejumlah kali (tertentu) Bentuk umum struktur FOR ada 2 macam yaitu : a. FOR menaik (ascending) For peubah ← nilai_awal to nilai_akhir do AKSI Endfor Keterangan : •
Peubah haruslah bertipe sederhana kecuali tipe real
•
Nilai_awal harus lebih kecil atau sama dengan nilai_akhir. Jika nilai_awal lebih besar dari nilai_akhir, maka badan pengulangan tidak dimasuki.
•
Pada awalnya peubah diinisialisasi dengan nilai_awal. Nilai peubah secara otomatis bertambah satu setiap kali aksi pengulangan dimasuki, sampai akhirnya nilai peubah sama dengan nilai_akhir.
•
Jumlah pengulangan yang terjasi adalah nilai_akhir – nilai_akhir + 1.
Algoritma Cetak_Banyak_Hallo {Mencetak kata “HALLO” sebanyak 3 kali} DEKLARASI k : integer {pencacah pengulangan} DESKRIPSI k ← 1 {inisialisasi} for k: 1 to 3 do write(‘PIKSI’) endfor {kondisi berhenti} b. FOR menurun (descending) For peubah ← nilai_akhir downto nilai_awal do AKSI Endfor Keterangan : •
Peubah haruslah bertipe sederhana kecuali tipe real
•
Nilai_akhir harus lebih besar atau sama dengan nilai_awal. Jika nilai_akhir lebih besar dari nilai_awal, maka badan pengulangan tidak dimasuki.
•
Pada awalnya peubah diinisialisasi dengan nilai_akhir. Nilai peubah secara otomatis berkurang satu setiap kali aksi diulangi, sampai akhirnya nilai peubah sama dengan nilai_awal.
•
Jumlah pengulangan yang terjadi adalah nilai_awal – nilai_akhir + 1.
Algoritma Cetak_Banyak_Hallo {Mencetak kata “HALLO” sebanyak 3 kali} DEKLARASI k : integer {pencacah pengulangan} DESKRIPSI k ← 1 {inisialisasi} for k : 3 downto 0 do write(‘HALLO’) endfor {kondisi berhenti}
X.
Pengantar Pemograman Modular Dalam suatu pengembangan perangkat lunak, pemrograman adalah salah satu tahap
untuk mengimplementasikan penyelesaian masalah tertentu dengan suatu bahasa pemrograman. Penyusunan program yang terstruktur merupakan salah satu syarat program yang baik. Terstruktur berarti memiliki rancangan yang sistematis, mudah dibaca, dan mudah dibetulkan jika ada kesalahan serta mempunyai alur yang jelas. Salah satu metode penyusunan program terstruktur adalah pemrograman modular Jadi, Pemrograman Modular adalah suatu teknik pemrograman di mana program yang biasanya cukup besar dibagi-bagi menjadi beberapa bagian program yang lebih kecil. dan sederhana. Keuntungannya yaitu, program lebih pendek, mudah dibaca dan dimengerti, mudah, didokumentasi, mengurangi kesalahan dan mudah mencari kesalahan, kesalahan yang terjadi bersifat “lokal”. Terdapat dua bentuk teknik pemograman modular (sub-program / upa-program) yaitu prosedur dan fungsi. 1.
PROSEDUR Prosedur adalah modul program yang mengerjakan tugas atau aktivitas yang spesifik
dan menghasilkan efek netto dengan membandingkan keadaan awal dan keadaan akhir pada pelaksanaan sebuah prosedur. Mendefinisikan Prosedur Pada dasarnya, struktur prosedur sama dengan struktur algoritma. Setiap prosedur mempunyai nama unik dan sebaiknya nama prosedur diawali dengan keta kerja. Notasi algoritmik yang digunakan untuk mendefinisikan struktur prosedur (tanpa parameter) adalah: Procedure Nama_Prosedur {Spesifikasi prosedur, berisi penjelasan tentang yang dilakukan prosedur} {K.awal : keadaan sebelum prosedur dilaksanakan} {K.akhir : keadaan setelah prosedur dilaksanakan } DEKLARASI {semua nama yang dipakai dalam prosedur dan hanya berlaku lokal di dalam prosedur didefinisikan} DESKRIPSI {badan prosedur berisi kumpulan instruksi}
Contoh: Buat prosedur untuk mencetak string “GANESHA” ke piranti keluaran : Procedure Cetak_ GANESHA {mencetak string “GANESHA” ke piranti keluaran} {K.awal : sembarang} {K.akhir : string “GANESHA” tercetak} DEKLARASI {tidak ada} DESKRIPSI Write(‘GANESHA’) Pemanggilan Prosedur Prosedur bukan program yang berdiri sendiri, ia tidak dapat dieksekusi secara langsung tetapi harus diakses dengan cara memanggil namanya dari program pemanggil (program utama atau modul program lain). Didalam program pemanggil, kita harus mendeklarasikan purwarupa (prototype) prosedur di dalam bagian DEKLARASI. Purwarupa prosedur hanya berisi bagian header prosedur. Tujuan pendeklarasian purwarupa prosedur adalah supaya program pemanggil mengenal nama prosedur tersebut serta cara mengaksesnya. Contoh : Program utama untuk memanggil prosedur Cetak_ GANESHA Algoritma Hallo {Program utama untuk mencetak string “GANESHA”} DEKLARASI Procedure Cetak_ GANESHA {mencetak string “GANESHA” ke piranti keluaran} DESKRIPSI Cetak_ GANESHA {panggil prosedur Cetak_ GANESHA } Nama Global dan Nama Lokal Nama-nama (tetapan, peubah, tipe, dll) yang dideklarasikan di dalam bagian DEKLARASI prosedur hanya dikenal di dalam nama prosedur yang bersangkutan yang disebut bersifat lokal. Sedangkan nama-nama yang dideklarasikan di dalam program utama dikatakan bersifat global. Nama yang dideklarasikan di dalam prosedur dan di dalam program utama mungkin
saja sama, namun sifat lokal dan globalnya tetap tidak berubah. Nama peubah yang dideklarasikan di dalam program utama dan juga dideklarasikan di dalam prosedur, maka di dalam prosedur nama tersebut adalah peubah lokal, dan di luar prosedur ia berlaku sebagai peubah global. Parameter Penggunaan parameter menawarkan mekanisme pertukaran informasi, tiap item data ditransfer antara parameter aktual dan parameter formal yang bersesuaian. Parameter aktual adalah parameter yang disertakan pada waktu pemanggilan, sedangkan parameter formal adalah parameter yang dideklarasikan di dalam bagian header prosedur itu sendiri. Notasi algoritmik yang digunakan untuk mendefinisikan struktur prosedur dengan parameter adalah: Procedure Nama_Prosedur(daftar parameter format) {spesifikasi prosedur, berisi penjelasan tentang yang dilakukan oleh prosedur ini} {K.awal : keadaan sebelum prosedur dilaksanakan} {K.akhir : keadaan setelah prosedur dilaksanakan } DEKLARASI {semua nama yang dipakai dalam prosedur dan hanya berlaku lokal di dalam prosedur didefinisikan} DESKRIPSI {badan prosedur berisi kumpulan instruksi} Aturan penting yang harus diamati adalah : •
Jumlah parameter aktual pada pemanggilan prosedur harus sama dengan jumlah parameter formal pada deklarasi prosedurnya.
•
Tiap parameter aktual harus bertipe sama dengan tipe parameter formal yang bersesuaian.
•
Tiap parameter aktual harus diekspresikan dalam cara yang taat asas dengan parameter formal yang bersesuaian, bergantung pada jenis parameter formal. Berdasarkan maksud penggunaannya, terdapat tiga jenis parameter formal yang disertakan dalam prosedur yaitu :
Parameter Masukan Pada parameter masukan, nilai (value) parameter aktual akan diisikan (assign) ke
dalam parameter formal yang bersesuaian. Nilai ini digunakan di dalam badan prosedur yang bersangkutan yang dinyatakan oleh parameter masukan tidak dapat dikirim dalam arah sebaliknya. Perubahan nilai parameter di dalam badan prosedur tidak mengubah nilai parameter aktual, Karena yang dipentingkan adalah nilainya, maka nama parameter aktual boleh berbeda dengan nama parameter formal yang bersesuaian.
Parameter Keluaran Bila prosedur menghasilkan satu atau lebih nilai yang digunakan oleh program
pemanggil, maka nilai keluaran ditampung di dalam parameter keluaran. Bila prosedur yang mengandung parameter keluaran dipanggil, maka nama parameter aktual didalam program pemanggil menggantikan nama parameter formal yang bersesuaian di dalam prosedur. Parameter keluaran dideklarasikan di dalam header prosedur, sebagaimana paramater masukan, tetapi parameter keluaran harus dideklarasikan dengan kata kunci output seperti contoh berikut : Procedure Satu(input x : integer, output y : real) {contoh prosedur dengan parameter formal berjenis parameter masukan} {K.awal : nilai x sudah terdefinisi} {K.akhir : di dalam prosedur, nilai x ditambah satu, lalu hasilnya dikalikan 10, disimpan ke dalam y} DEKLARASI {tidak ada} DESKRIPSI x←x+1 y ←x * 10
Parameter Masukan/Keluaran Pada kebanyakan aplikasi, informasi harus dikirim dalam dua arah, sehingga prosedur
juga harus dapat mengakomodasi baik masukan dari dan keluaran ke blok program pemanggil.
Untuk
menghadapi
hal
itulah
kita
bisa
menggunakan
parameter
masukan/keluaran. Dengan menggunakan parameter masukan/keluaran, bila parameter aktual diubah nilainya di dalam badan prosedur, maka sesudah pemanggilan prosedur nilai parameter aktual di titik pemanggilannya juga berubah.
Deklarasi parameter masukan/keluaran di dalam header prosedur, tetapi harus dideklarasikan dengan kata kunci input/output. Perhatikan contoh dibawah ini: Procedure Dua(input/output x,y : integer) {menambahkan nilai x dengan 2 dan mengurangi nilai y dengan 2} {K.awal : x dan y sudah berisi nilai} {K.akhir : nilai x bertambah2, nilai y berkurang 2, lalu dicetak ke piranti keluaran} DEKLARASI {tidak ada} DESKRIPSI x←x+3 y←y–2 write(‘nilai x dan y diakhir prosedur dua : ‘) write(‘ x = ‘, x) write(‘ y = ‘, y)
Algoritma ABC {program yang memperlihatkan efek penggunaan parameter masukan} DEKLARASI a, b : integer Procedure Dua(input/output x,y : integer) {menambahkan nilai x dengan 2 dan mengurangi nilai y dg 2} DESKRIPSI a ← 15 b ←10 write(‘nilai a dan b sebelum pemanggilan : ‘) write(‘ a = ‘, a) write(‘ b = ‘, b) Dua write(‘nilai a dan b sesudah pemanggilan : ‘) write(‘ a = ‘, a)
write(‘ b = ‘, b) Hasil dari algoritma tersebut adalah : nilai a dan b sebelum pemanggilan : a = 15 b = 10 nilai x dan y diakhir prosedur tiga: a = 17 b=8 nilai a dan b sesudah pemanggilan : a = 17 b=8 2.
FUNGSI Fungsi adalah modul program yang memberikan/mengambalikan sebuah nilai yang
bertipe sederhana (integer, real, boolean, dan string). Sebagaimana halnya dengan prosedur, fungsi diakses dengan memanggil namanya. Selain itu, fungsi juga dapat mengandung daftar parameter formal. Jenis parameter pada fungsi adalah paramater masukan. Jenis parameter masukan pada fungsi disebabkan oleh kenyataan bahwa parameter pada fungsi merupakan masukan yang digunakan oleh fungsi tersebut untuk menghasilkan nilai. Mendefinisikan Fungsi Struktur fungsi sama saja dengan struktur algoritma biasanya berikut ini : Function Nama_Fungsi(input daftar parameter format) ← tipe hasil {spesifikasi fungsi, menjelaskan apa yang dilakukan dan yang dikembalikan oleh fungsi ini} DEKLARASI {semua nama yang dipakai dalam algoritma fungsi dideklarasikan disini. Nama yang dideklarasikan di dalam DEKLARASI lokal hanya dikenal dan dipakai di dalam fungsi ini saja} DESKRIPSI {badan fungsi berisi kumpulan instruksi-instruksi untuk menghasilkan nilai yang akan dikembalikan oleh fungsi}, Return hasil {pengembalian nilai yang dihasilkan fungsi}
Pemanggilan Fungsi Fungsi diakses dengan cara memanggil namanya dari program pemanggil diikuti dengan daftar parameter aktual, karena fungsi menghasilkan nilai maka nilai tersebut dapat ditampung dalam sebuah peubah yang bertipe sama dengan tipe fungsi, atau nilai yang diberikan oleh fungsi langsung dimanipulasi. Parameter aktual dapat berupa tetapan, nama tetapan, atau nama peubah asalkan sudah terdefinisi tipe dan harganya. Contoh : Buatkan fungsi untuk menentukan apakah sebuah bilangan bulat merupakan bilangan genap atau ganjil ? Function Genap(input n : integer) ← boolean {mengembalikan niai true jika n adalah bilangan genap dan false jika sebaliknya} DEKLARASI DESKRIPSI return (n mod 2 = 0) Program Pemanggil : Algoritma Genap_Ganjil {program utama menentukan apakah sebulah bilangan genap atau ganjil ?} DEKLARASI bil : integer Function Genap(input n : integer) � boolean {mengembalikan niai true jika n adalah bilangan genap dan false jika sebaliknya} DESKRIPSI read(bil) if Genap (bil) then write(n, ‘ adalah bilangan genap’) else write(n, ‘ adalah bilangan ganjil’) endif
Contoh lain: Diketahui bahwa s = ln r, sehingga r = eS , Tulislah ekspresi aritmetika tersebut dalam bentuk function, yang didefinisikan sebagai berikut :
es =
s 0 s1 s 2 s 3 sk + + + + ....... + 0! 1! 2! 3! k!
Hampiri nilai e-w dengan deret sampai 15 buah suku ( k = 15 ). Penghampiran nilai exp (x) membutuhkan perhitungan pangkat pada bagian pembilang dan faktorial pada bagian penyebut. Tiap suku dapat dinyatakan dalam bentuk Jadi, jumlah deret adalah N ← N +
sr , r = 0, 1, 2, …., n r!
sr , yang dalam hal ini: r!
N diinisialisasi dengan 0 sr dihitung dengan fungsi Pangkat r! dihitung dengan fungsi Faktorial function Pangkat(input a : real, input n: integer) ← real { Mengembalikan nilai perpangkatan sr } DEKLARASI P : real i : integer ALGORITMA P←1 for i ← 1 to n do p←p*a endfor return p function Fak(input a : real, input n: integer) ← integer { Mengembalikan nilai r! } DEKLARASI i,f : integer ALGORITMA f←1 for i ← 1 to n do f←f*i endfor return f
function Exp(input x : real) ← real { Mengembalikan nilai exp(x) } DEKLARASI const n : integer = 10 s : real r : integer function Pangkat(input a : real, input n: integer) ← real { Mengembalikan nilai perpangkatan sr } function Exp(input x : real) ← real { Mengembalikan nilai exp(x) } ALGORITMA N←0 for r ← 0 to n do N ← N + Pangkat (s,r)/Fak (r) endfor return N Buatlah algoritma yang meniru mekanisme pembacaan sandi-lewat (password) untuk masuk ke sebuah sistem (ATM, server, reaktor nuklir, dsb). Apabila sandi-lewat yang dibaca salah, maka pembacaan sandi-lewat hanya boleh diulang maksimum 3 kali. Sandi lewat yang benar disimpan di dalam algoritma sebagai konstanta. PROGRAM PemeriksaanKebenaranSandiLewat { Memeriksa kebenaran sandi-lewat. sandi-lewat dibaca di piranti keluar. Pemasukan sandilewat dapat diulang lagi sampai maksimal 3 kali } DEKLARASI SandiLewat : string Sah : Boolean i : integer function Valid(input p : string) ← Boolean { true jika password p benar, atau false jika tidak } ALGORITMA i←1 sah ← Boolean repeat read(SandiLewat) if Valid(SandiLewat) then sah ← true else i←i+1 endif until (sah) or ( i>3 ) if not sah then write ( ‘sandi lewat salah’) endif
PEMROSESAN TEKS Tiap-tiap data dalam runtunan diakses satu per satu dari awal sampai akhir. Diakses artinya data tersebut dicapai lalu diproses bergantung pada proses yang diinginkan. Model pengaksesan data yang tersusun secara beruntun dinamakan model pengaksesan beruntun. SUSUNAN TEKS Arsip teks untuk selanjutnya kita sebut saja teks adalah arsip yang terdiri dari deretan karakter. Untaian karakter itu dapat membentuk sebuah kata. Yang dimaksud dengan kata adalah kelompok karakter yang dipidahkan dengan kelompok lain dengan satu atau lebih spasi. Dalam meninjau model pengaksesan beruntun pada teks, kita tidak memandang sebuah teks disusun oleh baris-baris teks tetapi lebih condong menyerupai sebuah pita yang birisi runtunan karakter-karakter. Suatu teks P didefinisikan di dalam bagian deklarasi yaitu: DEKLARASI P : text {P adalah peubah teks} TANDA AKHIR TEKS Pemrosesan teks yang sama adalah proses pembacaan. Karena teks berisi runtunan karakter, maka pembacaan teks adalah membaca karakter demi karakter secara beruntun, mulai dari awal teks sampai akhir teks. Akhir teks ditandai dengan sebuah karakter khusus (kita definisikan karakter “.”), bila pembacaan teks bertemu dengan titik maka proses pembacaan teks dihentikan. DEFINISI TEKS KOSONG Pemrosesan teks selalu mempertimbangkan keadaan awal teks, yaitu kosong atau tidak kosong. Sebuah teks mungkin saja kosong. Sebuah arsip yang hanya berisi spasi tidak dapat disebut kosong, karena kita telah membuat perjanjian bahwa sembarang tekas harus diakhiri dengan karakter titik, maka teks kosong adalah teks yang hanya berisi karakter titik. PEMBACAAN TEKS Pembacaan teks dimulai dari awal teks, dengan mengaikan ada sebuah pointer yang menunjuk ke karakter yang akan dibaca. Setiap kali karakter yang ditunjuk oleh pointer selesai dibaca, pointer berpindah secara otomatis ke karakter berikutnya. Karakter yang sedang ditunjuk oleh pointer selesai dibaca, pointer berpindah secara otomatis ke karakter berikutnya. Karakter yang sedang ditunjuk oleh pinter dinyatakan di dalam peubah C. Nama peubah C didefinisikan di dalam bagian DEKLARASI program utama, sehingga ia dikenal di seluruh bagian algoritma termasuk prosedur dan fungsi yang dipakai oleh algoritma.
DEKLARASI C : char {karakter yang sedang ditunjuk oleh pointer baca} Didefinisikan Reset_Teks adalah prosedur universal untuk teks. Reset_Teks menyebabkan pointer akan menunjuk pada karakter pertama di teks. Jika teks kosong, pointer menunjuk karakter titik. Procedure Reset_Teks {Menyiapkan teks pada posisi awal} {K.awal : sembarang} {K.akhir : pointer menunjuk pada karakter pertama di dalam teks. Akibat pemanggilan prosedur ini, pointer menunjuk ke karakter pertama teks. Karakter yang ditunjuk mungkin ‘.’}. Notasi yang digunakan untuk membaca karakter dari teks P adalah : Read(P;C) {membaca karakter yang ditunjuk oleh pointer baca dari teks P. Karakter yang dibaca disimpan di dalam pubah C} Contoh : Menghitung banyaknya karakter di dalam pita (tidak termasuk karakter ‘.’). Buatkan prosedur untuk persoalan diatas ! Solusi : Procedure Hitung_Banyak_Karakter(output n : integer) {Menghitung banyaknya karakter di dalam teks} {K.awal : sembarang} {K.akhir : n berisi banyaknya karakter di dalam teks } DEKLARASI {tidak ada} DESKRIPSI n←0 Reset_Teks Read(P;C) While C ≠ ‘.’ do n←n+1 Read(P,C) {baca karakter berikutnya} Endwhile {C = ‘.’}
L A R I K (ARRAY) Sebuah peubah atau tetapan hanya menyimpan sebuah nilai dari tipe tertentu. Ia tidak dapat menyimpan beberapa buah nilai yang bertipe sejenis. Dalam kegiatan pemrograman, sekumpulan data yang bertipe sama perlu disimpan sementara di dalam memori komputer untuk sewaktu-waktu dimanipulasi. Bila kumpulan data disimpan secara beruntun di dalam memori, maka tiap elemen data dapat diacu dengan menggunakan indeks. Indeks menyatakan posisi data relative di dalam kumpulannya struktur penyimpanan data seperti itu dinamakan dengan larik (array), atau sering disebut juga tabel, vektor atau peubah majemuk. DEFINISI LARIK Larik adalah struktur data yang menyimpan sekumpulan elemen yang bertipe sama, setiap elemen diakses langsung melalui endeksnya. Indeks larik haruslah tipe data yang menyatakan keterurutan, misalnya integer atau karakter. Misalnya larik yang bernama A dengan delapan buah elemen dapat dibayangkan secara lojik sebagai sekumpulan kota yang terurut (vertika atau horizontal). Tiap kotak pada larik tersebut diberi indeks integer 1, 2, 3, .... 8. Tiap elemen larik ditulis dengan notasi : A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[8] Angka didalam kurung siku menyatakan indeks larik. Setiap elemen larik menyimpan sebuah nilai. Karena seluruh elemen larik bertipe sama, maka nilai yang disimpan oleh setiap elemen juga harus bertipe sama. Bentuk umum : Nama _larik:array[tipe indeks] of tipe larik Ciri-ciri Array : -
setiap elemen data array diacu melalui indeksnya
-
karena elemen disimpan secara berurutan , indek array harus lah suatu tipe yang mempunyai keterurutan (ada suksesor dan predecessor). Contoh bertipe data : integer, karakter atau tipe data enumerasi. Jika indeks integer maka keterturutan indeks sesuai dengan urutan integer (0,1,2,3,4,5,6,..) Jika indeks Karakter maka keterturutan indeks sesuai dengan urutan karakter (a,b,c,d,e ….).
contoh :
x:array[1..11] of integer; var gaji:array[5..10] of char;
20 1
11 2
12 3
11 4
1 5
1 6
m 5
a 6
u 7
$ 8
* 9
1 10
0 7
3 8
2 9
6 10
9 11
Elemen array Indeks array
MENDEFINISIKAN LARIK DALAM DEKLARASI Larik adalah struktur data yang statik, artinya jumlah elemen larik harus sudah diketahui sebelum program dieksekusi. Jumlah elemen larik tidak dapat diubah, ditambah, atau dikurangi selama pelaksanaan program. Mendefinisikan larik di dalam bagian DEKLARASI berarti : •
Mendefinisikan banyaknya elemen larik
•
Mendefinisikan tipe elemen larik
Mendefinisikan banyaknya elemen larik berarti memesan sejumlah tempat di memori. Memori mengalokasikan sejumlah lokasi memori sebanyak elemen larik yang bersangkutan. Tipe elemen larik dapat bertipe sederhana (integer, real, char, boolean, string), tipe terstruktur (tipe bentukan seperti record) atau bahkan bertipe larik. Contoh mendefinisikan larik di dalam bagian deklarasi :
Sebagai Peubah
DEKLARASI L : array[1..50] of integer Nama_mhs : array[‘a’..’j’] of string Nilai_ujian : array[0..74] of real
Sebagai Tipe Baru
DEKLARASI Type TabInt : array[1..100] of integer P : TabInt
Mendefinisikan Ukuran Maksimum Elemen Larik Sebagai Sebuah Tetapan
DEKLARASI Const Nmaks = 1000 Type TabInt : array[1..Nmaks] of integer P : TabInt DEKLARASI Harga_barang : array[1..N] of real DEKLARASI Const N = 15 Harga_barang : array[1..N] of real CARA MENGACU ELEMEN LARIK Cara mengacu elemen larik diacu melalui indeksnya. Nilai indeks harus terdefinisi. Dengan mengacu pada larik yang sudah didefinisikan sebelum ini, maka contoh-contoh cara mengacu elemen larik adalah : L[4] {mengacu elemen keempat dari larik L} Nama_mhs[‘b’] {mengacu elemen kedua dari larik nama_mhs} P[k] {mengacu elemen ke k dari larik P, asalkan nilai k sudah terdefinisi} Harga_barang[i+1] {mengacu elemen ke i dari larik harga_kompuetr, asalkan nilai I sudah terdefinisi} Contoh memanipulasi atau menggunakan elemen larik : L[4] ←10 {mengisi elemen ke 4 dari larik L dengan nilai 10} Read(P[k]) {membaca elemen ke k dari larik P} If harga_barang[t] < 10000 then Write(‘harga’ murah’) Else PEMROSESAN LARIK Elemen larik tersusun secara beruntun, karena itu elemennya diproses secara beruntun melalui indeks yang terurut, asalkan indeks tersebut sudah terdefinisi. Pemrosesan beruntun pada larik adalah pemrosesan mulai dari elemen pertama larik. Skema umum algoritma memproses larik disebut juga skema mengunjungi (transversal) larik, berikut : Procedure Skema_Umum_Pemrosesan_Larik
{Memproses setiap elemen larik secara beruntun, mulai dari indeks terkecil sampai indeks terbesar} DEKLARASI Const Nmaks = 100 {banyak elemen larik} Type larik : array[1..Nmaks] of integer A : larik K : integer {indeks larik} DESKRIPSI for i ← 1 to N do proses a[i] Endfor Proses adalah aksi yang dilakukan terhadap elemen larik. Proses dapat berupa aksi pengisian nilai, pembacaan, penulisan atau manipulasi lainnya. Menginisialisasi Larik Menginisialisasi larik adalah memberikan harga awal untuk seluruh elemen larik. Inisialisasi kadang-kadang diperlukan misalnya mengosongkan elemen larik sebelum dipakai untuk proses tertentu. Mengosongkan larik bertipe numerik dapat berupa pengisian elemen larik dengan nol, sedangkan pada larik karakter, mengosongkan larik berarti mengisi elemen larik dengan spasi atau karakter kosong. Nol atau spasi bukanlah satu-satunya nilai yang dipakai untuk inisialisasi. Contoh : a. menginisialisasi elemen larik A[1], A[2], ...A[N] dengan nilai nol Procedure InisialisasiA(output A : larik) {menginisialisasi setiap elemen larik A dengan nol} {K.awal : larik A belum terdefinisi nilai elemen-elemennya} {K.akhir : seluruh elemen larik A bernilai nol} DEKLARASI K : integer {pencatat indeks larik} DESKRIPSI for K ← 1 to Nmaks do A[K] ← 0 Endfor
b. menginisialisasi elemen larik A[1], A[2], ...A[N] masing-masing dengan nilai 1, 2, ..N Procedure inisialisasiB(output A : larik) {menginisialisasi setiap elemen larik A[K] dengan nilai k = 1 , 2 ...N} {K.awal : larik A belum terdefinisi nilai elemen-elemennya} {K.akhir : setelah inisialisasi A[1]=1, A[2]=2,..., A[N]=N } DEKLARASI K : integer {pencatat indeks larik} DESKRIPSI for K ← 1 to Nmaks do A[K] ← K Endfor Mengisi Elemen Larik dari Piranti Masukan Selain dengan pengisian nilai, elemen larik dapat diisi nilai yang dibaca dari piranti masukan dengan perintah read seperti contoh berikut : Procedure Baca_Larik(output A : larik) {mengisi elemen larik A[1..N] dengan nilai yang dibaca dari piranti masukan} {K.awal : larik A belum terdefinisi nilai elemen-elemennya, N sudah berisi jumlah elemen efektif} {K.akhir : setelah pembacaan, sebanyak N buah elemen larik A berisi nilai-nilai yang dibaca dari piranti masukan} DEKLARASI K : integer {pencatat indeks larik} DESKRIPSI for K ← 1 to N do read(A[K]) Endfor Menulis Elemen Larik ke Piranti Keluaran Menulis elemen larik dapat dicetak ke piranti keluaran dengan perintah print, seperti pada contoh prosedur berikut : Procedure Tulis_larik(input A : larik, input N : integer)
{mencetak elelemen larik A[1..N] ke piranti keluaran} {K.awal : N sudah terdefinisi ukuran larik yang terpakai. Elemen larik A[1..N] sudah terdefinisi nilai elemen-elemennya} {K.akhir : diakhir prosedur, sebanyak N buah elemen larik A tersetak nilainya ke piranti keluaran} DEKLARASI K : integer {pencatat indeks larik} DESKRIPSI for K ← 1 to N do write(A[K]) Endfor LARIK BERTIPE TERSTRUKTUR Contoh : TabMhs adalah sebuah larik yang elemennya menyatakan nilai ujian seorang mahasiswa untuk suatu mata kuliah (MK) yang ia ambil. Data setiap mahasiswa adalah NIM, nama mahasiswa, mata kuliah yang diambil dan nilai mata kuliah. Maka algoritmanya sebagai berikut : Algoritma Baca_Larik_Mahasiswa {mengisi elemen larik mahasiswa dengan data yang dibaca dari piranti masukan} DEKLARASI Const Nmaks = 100 Type mahasiswa : record TabMhs : array[1..Nmaks] of mahasiswa K : integer N : integer DESKRIPSI Read(N) for K ← 1 to N do
read(TabMhs[K].NIM) read(TabMhs[K].NamaMhs) read(TabMhs[K].KodeMK) read(TabMhs[K].Nilai) Endfor
MATRIKS Definisi dan Notasi Matriks Untuk deklarasi Array 2 dimensi: nama array=array[tipeindeks1,tipeindeks2] of tipe array contoh : A : array[1..3,1..2] of byte; Salah satu implemantasi array 2 dimensi ini digunakan untuk membuat program MATRIK. Beberapa pengertian tentang matriks : 1. Matriks adalah himpunan skalar (bilangan riil atau kompleks) yang disusun atau dijajarkan secara empat persegi panjang menurut baris-baris dan kolom-kolom. 2. Matriks adalah jajaran elemen (berupa bilangan) berbentuk empat persegi panjang. 3. Matriks adalah suatu himpunan kuantitas-kuantitas (yang disebut elemen), disusun dalam bentuk persegi panjang yang memuat baris-baris dan kolom-kolom. Notasi yang digunakan: Matrix A berukuran (ordo) m x n
a11 a A = 21 : a m1
..... a1n .... a 2 n : : .... a mn
a12 a 22 : am2
Contoh Matrik dengan ordo 2 x 2
A=
1
5
2
4
Matrik A diatas adalah matrik dengan ordo 2x2 sehingga matrik tersebut memiliki elemen : A[1,1] = 1, A[1,2] = 5, A[2,1]= 2 dan A[2,2]=4. Untuk membuat deklarasi tipe array dari kasus diatas (dalam Bahasa Pascal) : Var A : array [1..2,1..2] of integer;
Untuk mengisi elemen matrik A diatas : A[1,1] := 1; A[1,2] := 5; A[2,1] := 2; A[2,2] := 4; Jenis-jenis Matriks: (i) MATRIKS NOL, adalah matriks yang semua elemennya nol. Sifat-sifat : A+0=A, jika ukuran matriks A = ukuran matriks 0 A*0=0, begitu juga 0*A=0. (ii) MATRIKS BUJURSANGKAR, adalah matriks yang jumlah baris dan jumlah kolomnya sama. Barisan elemen a11, a22, a33, ….ann disebut diagonal utama dari matriks bujursangkar A tersebut. (iii) MATRIKS DIAGONAL, adalah matriks bujursangkar yang semua elemen diluar diagonal utamanya nol.
2 0 0 0 5 0 0 0 3
iv) MATRIKS SATUAN/IDENTITY, adalah matriks diagonal yang semua elemen diagonalnya adalah 1.
1 0 0 0 1 0 0 0 1
Menulis Matriks Menulis matriks artinya mencetak elemen-elemen matriks ke piranti keluaran (misalnya ke layar peraga/printer) dengan asumsi bahwa elemen matriks sudah terdefinisi nilainya. Procedure TulisMatriks (input M : MatriksInt, input Nbar, Nkol : integer) { Mencetak elemen matriks M[ 1…Nbar, 1…Nkol ] ke piranti keluaran. } { K. Awal : elemen-elemen matriks sudah terdefinisi harganya } { K. Akhir : seluruh elemen matriks tertulis di piranti keluaran } DEKLARASI i : integer (indeks baris) j : integer (indeks kolom) ALGORITMA for i ← 1 to Nbar do for j ← 1 to Nkol do write (M[i,j]) endfor endfor
Penjumlahan dua Matriks Syarat : Dua matriks berordo sama dapat dijumlahkan. Contoh: a b e + c d g
f a+e b+ f = h c + g d + h
1 6 3 1 4 7 + = 3 5 4 1 7 6 Contoh algoritmanya: Buatlah procedure pengurangan dua buah matriks M dan N yang menghasilkan matriks L, hanya dapat dilakukan bila ukuran matriks M dan N sama dan kedua matriks tersebut telah terdefinisi nilai-nilainya. Matriks L akan berukuran sama dengan matriks M dan N Pengurangan tersebut didefinisikan sebagai berikut : L[i,j] = M[i,j] + N[i,j] , untuk semua i dan j Procedure JumlahDuaMatriks (input A, B : MatriksInt, input Nbar, Nkol : integer) output: C : Matriks { Menjumlahkan matriks A dan B, yaitu A + B = C } { K. Awal : elemen-elemen matriks sudah terdefinisi elemen-elemenya } { K. Akhir : seluruh elemen matriks C tertulis di piranti keluaran } DEKLARASI i : integer (indeks baris) j : integer (indeks kolom) ALGORITMA for i ← 1 to Nbar do for j ← 1 to Nkol do C [ i , j ] ← A[ i , j ] + B[ i , j ] endfor endfor
ALGORITMA PENCARIAN (SEARCHING) Dalam kehidupan sehari-hari sebenarnya kita sering melakukan pencarian data. Sebagai contoh, jika kita menggunakan Kamus untuk mencari kata-kata dalam Bahasa Inggris yang belum diketahui terjemahannya dalam Bahasa Indonesia. Contoh lain saat kita menggunakan buku telepon untuk mencari nomor telepon teman atau kenalan dan masih banyak contoh yang lain. Pencarian data sering juga disebut table look-up atau storage and retrieval information adalah suatu proses untuk mengumpulkan sejumlah informasi di dalam pengingat komputer dan kemudian mencari kembali informasi yang diperlukan secepat mungkin. Algoritma pencarian (searching algorithm) adalah algoritma yang menerima sebuah argumen kunci dan dengan langkah-langkah tertentu akan mencari rekaman dengan kunci tersebut. Setelah proses pencarian dilaksanakan, akan diperoleh salah satu dari dua kemungkinan, yaitu data yang dicari ditemukan (successful) atau tidak ditemukan (unsuccessful). Metode pencarian data dapat dilakukan dengan dua cara yaitu pencarian internal (internal searching) dan pencarian eksternal (external searching). Pada pencarian internal, semua rekaman yang diketahui berada dalam pengingat komputer sedangakan pada pencarian eksternal, tidak semua rekaman yang diketahui berada dalam pengingat komputer, tetapi ada sejumlah rekaman yang tersimpan dalam penyimpan luar misalnya pita atau cakram magnetis. Selain itu metode pencarian data juga dapat dikelompokaN menjadi pencarian statis (static searching) dan pencarian dinamis (dynamic searching). Pada pencarian statis, banyaknya rekaman yang diketahui dianggap tetap, pada pencarian dinamis, banyaknya rekaman yang diketahui bisa berubah-ubah yang disebabkan oleh penambahan atau penghapusan suatu rekaman. Ada dua macam teknik pencarian yaitu pencarian sekuensial dan pencarian biner. Perbedaan dari dua teknik ini terletak pada keadaan data. Pencarian sekuensial digunakan apabila data dalam keadaan acak atau tidak terurut. Sebaliknya, pencarian biner digunakan pada data yang sudah dalam keadaan urut.
Pencarian Berurutan (Sequential Searching) Pencarian berurutan sering disebut pencarian linear merupakan metode pencarian
yang paling sederhana. Pencarian berurutan menggunakan prinsip sebagai berikut : data yang ada dibandingkan satu per satu secara berurutan dengan yang dicari sampai data tersebut ditemukan atau tidak ditemukan. Pada dasarnya, pencarian ini hanya melakukan pengulangan dari 1 sampai dengan jumlah data. Pada setiap pengulangan, dibandingkan data ke-i dengan
yang dicari. Apabila sama, berarti data telah ditemukan. Sebaliknya apabila sampai akhir pengulangan tidak ada data yang sama, berarti data tidak ada. Pada kasus yang paling buruk, untuk N elemen data harus dilakukan pencarian sebanyak N kali pula. Contoh: 13
16
14
21
76
21
Nilai yang dicari: 21 Maka elemen yang diperiksa : 13 16 14 21 Index ketemu : 4 Nilai yang dicari: 13 Maka elemen yang diperiksa : 13 Index ketemu : 1 Nilai yang dicari: 15 Maka elemen yang diperiksa : 13 16 14 21 76 21 Index ketemu : 0 Algoritma pencarian berurutan dapat dituliskan sebagai berikut : 1.
i←0
2.
ketemu ← false
3.
Selama (tidak ketemu) dan (i <= N) kerjakan baris 4
4.
Jika (Data[i] = x) maka ketemu ← true, jika tidak i ← i + 1
5.
Jika (ketemu) maka i adalah indeks dari data yang dicari, jika tidak data tidak ditemukan
Di bawah ini merupakan fungsi untuk mencari data menggunakan pencarian sekuensial. int SequentialSearch(int x) { int i = 0; bool ketemu = false; while ((!ketemu) && (i < Max)){ 81 if(Data[i] == x) ketemu = true; else i++; } if(ketemu) return i; else return -1; }
Fungsi diatas akan mengembalikan indeks dari data yang dicari. Apabila data tidak ditemukan maka fungsi diatas akan mengembalikan nilai –1.
Pencarian Biner (Binary Search) Salah satu syarat agar pencarian biner dapat dilakukan adalah data sudah dalam
keadaan urut. Dengan kata lain, apabila data belum dalam keadaan urut, pencarian biner tidak dapat dilakukan. Dalam kehidupan sehari-hari, sebenarnya kita juga sering menggunakan pencarian biner. Misalnya saat ingin mencari suatu kata dalam kamus Prinsip dari pencarian biner dapat dijelaskan sebagai berikut : Konsep Pencarian Binary/Bagi Dua • Pilih Indek Kiri (Low) dan Indek Kanan (High) • Langkah 1: Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indek middle=(low+high) div 2. Elemen tengah (middle), akan membagi array menjadi 2 bagian yaitu: Bagian kiri, dengan index LARIK[Low .. middle-1] Bagian Kanan, dengan index LARIK[middle+1..High] • Langkah 2: Periksa apakah LARIK[middle] = X , pencarian akan dihentikan sebab X sudah ditemukan Jika LARIK[middle] <> X, maka kita tentukan pencarian akan dilakukan disebelah kiri atau kanan. Jika LARIK[middle] < X, maka pencarian dilakukan dibagian kiri LARIK Jika LARIK[middle] > X, maka pencarian dilakukan di bagian kanan LARIK • Langkah 3: Ulangi langkah 1 sampai dengan X ditemukan, atau low > high (menentukan ukuran larik sudah 0).
Ilustrasi Pencarian Bagi Dua. 81
76
21
18
16
13
10
7
1
2
3
4
5
6
7
8
Low
High
1. Misalkan elemen yang dicari adalah X=18. Langkah 1: Low = 1 dan High = 8 Elemen tengah Middle = (1+8) div 2 = 9 div 2 = 4
81
76
21
18
16
13
10
7
1
2
3
4
5
6
7
8
Low
Middle
High
Langkah 2: Larik[4] = X ? (18 = 18) true X ditemukan, pencarian dihentikan. 2. Misalkan elemen yang dicari adalah X=16. ITERASI 1 Langkah 1: Low = 1 dan High = 8 Elemen tengah Middle = (1+8) div 2 = 9 div 2 = 4 81
76
21
18
16
13
10
7
1
2
3
4
5
6
7
8
Low
Middle kiri
High kanan
Langkah 2: Larik[4] = X ? (18 = 16) FALSE, sehingga diputuskan pencarian di kiri atau dikanan. Jika Larik[4] > 16 ?, (18 > 16) TRUE, lakukan pencarian disebelah kanan dengan Low = middle+1 4+1 = 5 dan High = 8, Tetap. 16
13
10
7
5
6
7
8
low
High
ITERASI 2 Langkah 1: Low = 5 dan High=8 Elemen tengah Middle = (5+8) div 2 = 13 div 2 = 6 16
13
10
7
5
6
7
8
low middle
High
Langkah 2: Larik[6] = X ? (13 = 16) FALSE, sehingga diputuskan pencarian di kiri atau dikanan. Jika Larik[6] > 16 ?, (13 > 16) FALSE, lakukan pencarian disebelah KIRI dengan Low = 5 (TETAP) dan High = middle-1 = 5 16 5 Low/high ITERASI 3 Langkah 1: Low = 5 dan High=5 Elemen tengah Middle = (5+5) div 2 = 10 div 2 = 5 16 5 middle Langkah 2: Larik[5] = X ? (16 = 16) TRUE (X ditemukan , pencarian dihentikan) 3. Misalkan elemen yang dicari X=100. Gambarkan langkah-langkah penyelesaiannya? Dari ilustrasi diatas dapat dibuat algoritma sebagai berikut: (dengan data urut descending) 1. Masukan Bil yang dicari X 2. tentukan low=1 dan high = N 3. Tentukan nilai tengah : middle = (low + high) div 2 4. Cek, jika LARIK[middle] = X maka Nilai X yang dicari ditemukan, kelangkah 8 5. jika LARIK[middle] > X maka low=middle+1, kelangkah 7 6. jika LARIK[middle] < X maka high=middle-1, kelangkah 7 7. Jika low > high, “bil X tidak ditemukan” dan kelangkah 8, jika tidak kelangkah 3. 8. selesai.
Di bawah ini merupakan fungsi untuk mencari data menggunakan pencarian biner. int BinarySearch(int x) { int L = 0, R = Max-1, m; bool ketemu = false; while((L <= R) && (!ketemu)) { m = (L + R) / 2; if(Data[m] == x) ketemu = true; else if (x < data[m]) R = m - 1; else L = m + 1; } if(ketemu) return m; else return -1; } Fungsi diatas akan mengembalikan indeks dari data yang dicari. Apabila data tidak ditemukan maka fungsi diatas akan mengembalikan nilai –1. Jumlah pembandingan minimum pada pencarian biner adalah 1 kali, yaitu apabila data yang dicari tepat berada di tengah-tengah. Jumlah pembandingan maksimum yang dilakukan dengan pencarian biner dapat dicari menggunakan rumus logaritma, yaitu : C = 2log(N) Tehnik Pencarian Nilai MAXMIN : Tehnik StaritMAXMIN Tehnik D and C Teknik yangt digunakan untuk mencari nilai maksimum dan minimum dari sekumpulan nilai. 1. Tehnik Pencarian MAXMIN Searching dengan Tehnik STRAITMAXMIN Waktu
tempuh
yang
digunakan
untuk
mendapatkan solusi yang optimal terbagi atas : a. Best Case b. Average Case c. worst Case
menyelesaikan
pencarian
hinggan
Algoritma dari Proses Pencarian adalah (ada pada slide): 1. Masukan N, tentukan i=1. 2. Tentukan max dan min = A[i] 3. i = 2 4. Jika i<= N maka kelangkah 5, jika tidak kelangkah 8 5. jika A[i] > max maka max=A[i] dan kelangkah 7 6. jika tidak maka (jika A[i] < min maka min = A[i]. 7. i = i+1, ulangi langkah 4. 8. cetak max dan min program straitmaxmin;
masukan N = 5
var
2
i,N:integer;
5
max,min : integer;
1
A : array[1..10] of integer;
6
begin
4
write('masukan N = '); readln(N); for i:=1 to N do readln(A[i]);
nilai max min = 6 1 ----------------masukan N = 6
max := A[1]; min := A[1];
7 5
for i:=2 to N do
3
if A[i] > max then max:=A[i]
9
else if A[i] < min then min := A[i];
6 2
writeln; writeln('nilai max min= ',max:3, min:3); end. Searching dengan teknik D and C.
nilai max min = 9 2
METODE GREEDY Metode Greedy digunakan untuk memecahkan persoalan optimasi. Persoalan optimasi adalah persoalan mencari solusi optimum Persoalan optimasi ada 2 Maksimasi Minimasi Contoh Masalah Optimasi: Penukaran Uang Diberikan uang senilai A. Tukar A dengan koin-koin uang yang ada. Berapakah jumlah minimum koin yang diperlukan untuk penukaran uang tersebut. Persoalan Minimasi. Contoh 1: tersedia banyak koin 1, 5, 10, 25 32 = 1 + 1 + … + 1
(32 koin)
32 = 5 + 5 + 5 + 5 + 10 + 1 + 1
(7 koin)
32 = 10 + 10 + 10 + 1 + 1
(5 koin)
Minimum: 32 = 25 + 5 + 1 + 1
(4 koin)
Greedy = rakus, tamak Algoritma greedy membentuk solusi langkah per langkah (step by step). Pada setiap langkah terdapat banyak pilihan yang perlu dieksplorasi. Sehingga, pada setiap langkah harus dibuat keputusan yang terbaik dalam menentukan pilihan. (keputusan yang telah diambil pada suatu langkah tidak dapat diubah lagi pada langkah selanjutnya). Pada setiap langkah membuat pilihan optimum lokal Dengan harapan bahwa langkah sisanya mengarah kesolusi optimum global. Metode Greedy digunakan dalam menyelesaikan masalah Optimal Storage on Tapes Problem Knapsack Problem Minimum Spanning Tree Problem Shortest Path Problem
Penjelasan Storage on Tape Problen ada pada SLIDE. Knapsack Problem •
Knapsack dapat diartikan sebagai karung, kantung, atau buntilan.
•
Karung digunakan untuk memuat sesuatu.
•
Dan tentunya tidak semua objek dapat ditampung di dalam karung. Karung tersebut hanya dapat menyimpan beberapa objek dengan total ukurannya (weight) lebih kecil atau sama dengan ukuran kapasitas karung.
•
Setiap objek itupun tidak harus kita masukkan seluruhnya. Tetapi bisa juga sebagian saja.
•
knapsack 0/1, yaitu suatu objek diambil seluruh bagiannya atau tidak sama sekali.
•
Setiap objek mempunyai nilai keuntungan atau yang disebut dengan profit.
•
Tujuan ingin mendapatkan profit maksimal Belum
tentu
yang
maksimal. Untuk
menggunakan banyak
objek
mendapatkan profit yang
masuk akan
menguntungkan. Bisa saja hal yang sebaliknya yang terjadi. Cara terbaik agar menguntungkan : bukan hanya dari hasilnya optimal tetapi juga banyaknya langkah yang dibutuhkan Knapsack 0/1 Diberikan n buah objek dan sebuah knapsack dengan kapasitas bobot W. Setiap objek memiliki properti bobot (weigth) wi dan keuntungan(profit) pi. persoalan adalah memilih memilih objek-objek
yang
dimasukkan
memaksimumkan keuntungan. Total
bobot
ke
dalam objek
knapsack sedemikian sehingga yang
dimasukkan
ke dalam
knapsack tidak boleh melebihi kapasitas knapsack. Solusi persoalan dinyatakan sebagai vektor n-tupel: X = {x1, x2, … , xn} xi = 1 jika objek ke-i dimasukkan ke dalam knapsack, xi = 0 jika objek ke-i tidak dimasukkan. Persoalan 0/1 Knapsack dapat kita pandang : sebagai mencari himpunan bagian (subset)
dari keseluruhan objek yang muat ke dalam knapsack dan memberikan total
keuntungan terbesar. Penyelesaian dengan Greedy:
1. Greedy by Profit Pada setiap langkah Knapsack diisi dengan obyek yang mempunyai keuntungan terbesar. Strategi ini mencoba memaksimumkan keuntungan dengan memilih objek yang paling menguntungkan
terlebih dahulu. Pertama kali dilakukan adalah menurutkan secara
menurun obyek-obyek berdasarkan profitnya .
Kemudian obyek-obyek yang dapat
ditampung oleh knapsack diambil satu persatu sampai knapsack penuh atau (sudah tidak ada obyek lagi yang bisa dimasukan). Data awal : w1 = 2;
p1 = 12
w2 = 5;
p2 = 15
w3 = 10; p3 = 50 w4 = 5;
p4 = 10
Kapasitas knapsack W = 16
2. Greedy by Wight Pada setiap langkah, knapsack diisi dengan objek yang mempunyai berat paling ringan. Strategi ini mencoba memaksimumkan keuntungan dengan memasukan sebanyak mungkin objek kedalam knapsack. Pertama kali yang dilakukan adalah mengurutkan secara menaik objek-objek berdasarkan weight-nya. Kemudian obyek-obyek yang dapat ditampung oleh knapsack diambil satu persatu sampai knapsack penuh atau (sudah tidak ada obyek lagi yang bisa dimasukan). Data awal : w1 = 6;
p1 = 12
w2 = 5;
p2 = 15
w3 = 10; p3 = 50 w4 = 5;
p4 = 10
Kapasitas knapsack W = 16
3. Greedy By Density Pada setiap langkah, knapsack diisi dengan obyek yang mempunyai densitas terbesar (perbandingan nilai dan berat terbesar). Strategi ini mencoba memaksimumkan keuntungan dengan memilih objek yang mempunyai keuntungan per unit berat terbesar. Pertama kali yang dilakukan adalah mencari nilai profit per unit/ density dari tiap-tiap objek. Kemudian obyek-obyek diurutkan berdasarkan densitasnya. Kemudian obyekobyek yang dapat ditampung oleh knapsack diambil satu persatu sampai knapsack penuh atau (sudah tidak ada obyek lagi yang bisa dimasukan).
Perbandingan hasil:
Penggunaan 3 strategi diatas tidak menjamin akan memberikan solusi optimal.
CONTOH 2: Kapasitas M=20, dengan jumlah barang =3 Berat Wi masing-masing barang (W1,W2,W3) (18,15,,10) Nilai Profit masing-masing barang (P1,P2,P3) (25,24,15) Pilih Barang dengan nilai profit maksimal P1=25 x1=1. batas atas nilai P2=24 x2=2/15. P3=15 x3 =0. batas bawah nilai. Pilih barang dengan berat minimal W1 = 18 x1=0. batas bawah W2=15 x2 = 2/3 W3=10 x3=1. batas atas. Pilih barang dengan menghitung perbandingan yang terbesar dari profit dibagi Berat (Pi/Wi) diurut secara tidak naik. P1/w1=25/18 (1.38) x1=0. karena terkecil x1=0 P2/w2=24/ 15 (1.6) x2=1. karena terbesar x2=1 P3/w3=15/10 (1.5) x3=1/2
dicari dengan fungsi pembatas x3=1/2.
Buat Tabel Solusi
(x1,x2,x3)
Σwixi
Σpixi
Pi max
1,2/15,0
20
28.2
Wi min
0,2/3,1
20
31.0
Pi/Wi max
0,1,1/2
20
31.5
Nilai profit maksimal = 31.5.
METODE DEVIDE AND CONQUER Pengurutan (Sorting). •
proses mangatur sekumpulan obyek/data menurut urutan atau susunan tertentu.
•
Urutan obyek/data tersebut dapat menaik (ascending) atau menurun (desencending).
•
Data yang diurutkan dapat berupa data bertipe dasar atau data bertipe struktur
•
Data yang sudah terurut memiliki keuntungan yaitu Mempercepat proses pencarian data.
Metode Pengurutan Algoritma pengurutan / sorting bermacam-macam dan setiap algoritma ini memiliki kinerja yang berbeda-beda. Berikut ini macam-macam algoritma pengurutan: 1. Metode Selection Sort 2. Metode Buble Sort 3. Metode Merge Sort 4. Metode Quick Sort 5. Metode Insertion Hal yg mempengaruhi Kecepatan Algoritma Sorting adalah Jumlah Operasi Perbandingan & Jumlah OperasiPemindahan Data 1. Selection Sort (Metode Seleksi). Tehnik pengurutan dengan cara pemilihan elemen dgn memilih elemen data terkecil utk kemudian dibandingkan & ditukarkan dgn elemen pd data awal, dst s/d seluruh elemen shg akan menghasilkan pola data yg telah disort. •
Merupakan kombinasi antara sorting dan searching
•
Untuk setiap proses, akan dicari elemen-elemen yang belum diurutkan yang memiliki nilai terkecil atau terbesar akan dipertukarkan ke posisi yang tepat di dalam array.
•
Misalnya untuk putaran pertama, akan dicari data dengan nilai terkecil dan data ini akan ditempatkan di indeks terkecil (data[0]), pada putaran kedua akan dicari data kedua terkecil, dan akan ditempatkan di indeks kedua (data[1]).
Ilustrasi Algoritma Selection Sort 29
27
10
8
76
21
1
2
3
4
5
6
8
27
10
29
76
21
1
2
3
4
5
6
8
10
27
29
76
21
1
2
3
4
5
6
8
10
21
29
76
27
1
2
3
4
5
6
8
10
21
27
76
29
1
2
3
4
5
6
8
10
21
27
29
76
1
2
3
4
5
6
29
27
10
8
2. data pertama ditukar dengan elemen yang paling kecil.
76
Set Index awal = 1 Index terkecil = 4 8 Tukar index 1dengan 4
Set Index awal = 2 index terkecil = 3 10 Tukar index 2 dengan 3
Set Index awal = 3 index terkecil = 6 21 Tukar index 3 dengan 6
Set Index awal = 4 index terkecil = 6 27 Tukar index 4 dengan 6
Set Index awal = 5 index terkecil = 6 29 Tukar index 5 dengan 6
Index awal = 6 Selesai Data sudah terurut secara ascending
21
1. memilih elemen terkecil, membandingkan dan menukarkan dengan dengan data awal yang bernilai lebih besar.
ALGORITMA SELECTION SORT. 1. Pengecekan dimulai data ke-1 sampai dengan data ke-n 2. Tentukan bilangan dengan Index terkecil dari data bilangan tersebut 3. Tukar bilangan dengan Index terkecil tersebut dengan bilangan pertama ( I = 1 ) dari data bilangan tersebut 4. Lakukan langkah 2 dan 3 untuk bilangan berikutnya ( I= I+1 ) sampai didapatkan urutan yg optimal PENULISAN ALGORITMA KE DALAM PROGRAM Algoritma metode seleksi : -
langkah 0 : Baca vector yang akan diurutkan (dalam program utama)
-
langkah 1 : Kerjakan langkah 2 sampai 4 untuk i = 1 sampai N -1
-
langkah 2 : Tentukan awal = i , kerjakan langkah 3 untuk j = i +1 sampai N
-
langkah 3 : (Mencari data terkecil) Tes : apakah A[awal] > A[j], jika ya maka ubah awal = j
-
langkah 4 : Tukarkan nilai A[awal] dengan A[i]
-
langkah 5 : selesai
program pascal; uses crt; VAR Data : array[1..10] of integer; i,j,n,bantu : integer; BEGIN clrscr; Writeln('Masukkan data anda !');writeln; Write('jumlah data anda ? ');readln(n); writeln('Mulai memasukan data '); for i:=1 to n do begin Write('Data ke-',i,' = '); readln(data[i]); end; for i:=1 to N-1 do for j := i+1 to N do begin if data[i] > data[j] then begin Bantu := data[i]; data[i] := data[j]; data[j] := Bantu;
end; end; for i:=1 to n do write('(',data[i],'),'); readln; end. Hasil program Masukkan data anda ! jumlah data anda ? 5 Mulai memasukan data Data ke-1 = 4 Data ke-2 = 6 Data ke-3 = 2 Data ke-4 = 8 Data ke-5 = 5 (2),(4),(5),(6),(8), 2. Metode Bubble Sort (Gelembung) Teknik yang diinspirasi oleh gelembung sabun yang berada dipermukaan air. Karena berat jenis gelembung lebih ringan dari pada air, maka gelembung akan naik keatas. (benda yang berat akan terbenam, benda ringan terapung). Elemen data yang paling kecil diapungkan “diangkat
keatas”
melalui
proses
pertukaran. Bubble Sort mengurutkan data dengan cara membandingkan elemen sekarang dengan elemen berikutnya Algoritma Bubble Sort 1. Pengecekan mulai dari data ke-1 sampai data ke-n 2. Bandingkan data ke-n dengan data sebelumnya (n-1) 3. Jika lebih kecil maka pindahkan bilangan tersebut dengan bilangan yg ada didepannya ( sebelumnya ) satu persatu (n-1,n-2,n-3,....dst) 4. Jika lebih besar maka tidak terjadi pemindahan 5. Ulangi langkah 2 dan 3 s/d sort optimal. Analogi : Larik dengan urut menaik, elemen larik yang berharga paling kecil ‘diapungkan’, artinya diangkat ke atas (atau ke ujung kiri larik) melalui proses pertukaran.
Proses pengapungan ini dilakukan sebanyak N-1 langkah dengan N adalah ukuran larik. Pada akhir setiap langkah ke-I, larik L[1..N] akan terdiri atas dua bagian yaitu bagian yang sudah terurut, yaitu L[1..I] dan bagian yang belum terurut L[I+1..N]. Setelah langkah terakhir, diperoleh larik L[1..N] yang terurut menaik. 25
27
10
8
76
21
1
2
3
4
5
6
Langkah 1: Index ke n = 6 sampai ke 2. Index 6 Index (n-1) = 5 Index = 4 Index = 3 Index = 2 8
8 25
8 27 27
8 10 10 10
8
25
27
10
21
76
1
2
3
4
5
6
Langkah 2: Index ke n = 6 sampai ke 3 Index 6 Index (n-1) = 5 Index = 4 Index = 3
10 25
10
10 27 27
8
10
25
27
21
76
1
2
3
4
5
6
Langkah 3: Index ke n = 6 sampai ke 4. Index 6 Index (n-1) = 5 Index = 4
21
21 25
21 21 21 21 21
76 76 76 76 76
21 21 21 21
76 76 76 76
21 27 27
76 76 76
8
10
21
25
27
76
1
2
3
4
5
6
Langkah 4: Index ke n = 6 sampai ke 5. Index 6 Index (n-1) = 5
25
8
10
21
25
27
76
1
2
3
4
5
6
Langkah 5: Index ke n = 6 . Index 6
8
10
21
25
27
76
1
2
3
4
5
6
27 27
76 76
27
76
Elemen sudah urut dan proses sorting selesai Contoh 2 :
Contoh 3 :
Bubble Sort Disebut juga dengan metode Penukaran (Exchange Sort), yaitu metoda yang mendasarkan pada penukaran elemen untuk mencapai keadaan urut yang diinginkan. Algoritma Metode gelembung : -
langkah 0 : Baca vector yang akan diurutkan (dalam program utama)
-
langkah 1 : Kerjakan langkah 2 untuk i = 1 sampai N-1
-
langkah 2 : Kerjakan langkah 3 untuk j = 1 sampai N- i
-
langkah 3 : Tes apakah A[j] > A[j +1] ? Jika ya, tukarkan nilai kedua elemen ini
-
langkah 4 : Selesai
Contoh Program Buble Sort program pascal; uses crt; VAR Data : array[1..10] of integer; i,j,n,bantu : integer; BEGIN clrscr; Writeln('Masukkan data anda !');writeln; Write('jumlah data anda ? ');readln(n); writeln('Mulai memasukan data '); for i:=1 to n do begin Write('Data ke-',i,' = '); readln(data[i]); end; for i:=1 to N-1 do for j := 1 to N-i do begin
if data[j] > data[j+1] then begin Bantu := data[j]; data[j] := data[j+1]; data[j+1] := Bantu; end; end; for i:=1 to n do write('(',data[i],'),'); readln; end. Hasil : Masukkan data anda ! jumlah data anda ? 5 Mulai memasukan data Data ke-1 = 5 Data ke-2 = 3 Data ke-3 = 6 Data ke-4 = 2 Data ke-5 = 3 (2),(3),(3),(5),(6), 3. Metode INSERTION SORT (Sisip) Algoritma ini dianalogikan seperti
mengurutkan kartu,
selembar demi selembar kartu diambil dan disisipkan (insert) ke tempat yang seharusnya. Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan data yang lebih kecil, maka akan ditempatkan (diinsert) diposisi yang seharusnya. Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang Analogi : mengurutkan satu set kartu dari kartu yang bernilai paling kecil hingga yang paling besar. Seluruh kartu diletakkan pada meja, kita sebut meja pertama, disusun dari kiri ke kanan dan atas ke bawah.
Kemudian pada meja kedua tempat meletakkan kartu yang diurutkan. Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama dan letakkan pada meja kedua. Ambil kartu kedua dari meja pertama, bandingkan dengan kartu yang berada pada meja kedua, kemudian letakkan pada urutan yang sesuai setelah perbandingan. Proses tersebut akan berlangsung hingga seluruh kartu pada meja pertama telah diletakkan berurutan pada meja kedua. Contoh : Jika
sudah
terurut
3,6,9,
dan
selanjutnya
belum
terurut
5,7,2,....
menjadi
3,5,6,7,9.
5 akan disisipkan di antara 3 dan 6, sehingga menjadi 3,5,6,9. 7
akan
disisipkan
di
antara
6
dan
9,
sehingga
2 akan disisipkan sebelum 3, sehingga menjadi 2,3,5,6,7,9. Contoh :
METODE DEVIDE AND CONQUER Devide and Qonquer adalah metode pemecahan masalah yang bekerja dengan membagi masalah/problem menjadi beberapa sub-masalah/sub-problem yang lebih kecil, kemudian menyhelesaikan
masing-masing
sub-masalah
secara
independen
dan
akhirnya
menggabungkan solusi masing-masing sub masalah sehingga menjadi solusi masalah semula. Masalah sub masalah 1
Sub solusi 1
Sub masalah 2 sub solusi 2 Sub-masalah 3 Sub solusi 3
Solusi masalah
Algortima devide and conquer menawarkan penyederhanaan masalah dengan pendekatan 3 langkah masalah: •
pembagian masalah menjadi sekecil mungkin
•
penyelesaian masalah-masalah yang dikecilkan
•
penggabungan solusi untuk mendapatkan solusi optimal secara keseluruhan.
tipe algoritma yang mengimplementasikan/kategori D&C antara lain merge sort 4. Metode Merge Sort Merge sort adalah algoritma yang digunakan untuk menyusun list yang diberikan dengan cara membagi list yang diberikan menjadi dua bagian yang lebih kecil. Kedua list yang baru ini kemudian akan disusun secara terpisah. Setelah kedua buah list tersusun, maka akan dibentuk list baru yang merupakan hasil penggabungan dua buah list sebelumnya Konsep : 1). Array yang belum terurut, dibagi menjadi separuh – Proses diulang terus sampai ditemukan bagian terkecil 2). Hasil dari setiap proses digabungkan : – membandingkan elemen pertama dari setiap bagian – hapus elemen terkecil dan letakan pada hasil – Ulangi semua proses sampai semua elemen terurut 394152 List diatas dibagi menjadi dua bagian: list 1: | list 2: 394 | 152 Kedua list yang baru disusun sendiri-sendiri menjadi: list 1: | list 2: 349 | 125 Setelah itu dubentuk list baru yang merupakan gabungan kedua list tadi: List baru: 1 list 1: | list 2: 349 | 25 List baru: 12 list 1: | list 2: 349 | 5 List baru: 123 list 1: | list 2: 49 | 5
List baru: 1234 list 1: | list 2: 9 | 5 List baru: 12345 list 1: | list 2: 9 | kosong List baru: 123459 list 1: | list 2: kosong | kosong Dan akhirnya akan didapat list yang sudah tersusun: List: 123459 Contoh 2 Contoh : data berikut ini akan diurutkan
1).
Divide/membagi data yang tidak terurut menjadi dua bagian
2).
Ulangi sampai setiap array hanya memiliki sebuah data
3).
Lakukan merge untuk memperoleh data terurut
1).
2).
3).
4).
5).
6).
7).
8).
9).
10).
11).
12).
13).
14).
15).
16).
17).
18).
19).
20).
21).
22).
23).
24).
25).
26).
27).
28).
29).
30).
31).
32).
33).
34).
35).
36).
37).
38).
39).
LATIHAN -LATIHAN:
Di Negara kita (Indonesia) warga Negara berumur 17 tahun sudah diharuskan mempunyai KTP, ada anak bernama Dina dimana 2 hari lagi dia berumur 17 tahun dan dia akan mencari KTP yang akan digunakan juga untuk mencari SIM A. Maka secara algoritma dengan bantuan notasi-notasi pemrograman , bagaimana/langkah apa supaya Dina bias mendapatkan KTP dan SIM.
Menghitung banyaknya komisi yang diterima seorang salesman berdasarkan jumlah penjualan yang dicapainya. Salesman itu mendapat komisi 10% dari hasil penjualannya. Masukan algoritma adalah nama salesman dan jumlah penjualan yang dicapainya. Tampilkan ke piranti keluaran nama salesman dan besar komisi yang diperolehnya.
Misalkan kita ingin mencetak angka 1, 2, ..., 50 di layar, dengan satu angka pada setiap baris. Buatkan algoritmanya dengan struktur pengulangan while – do, repeat – until dan for. Misalkan kita ingin mencetak angka 1, 2, ..., N di layar, dengan satu angka pada setiap baris, yang dalam hal ini N dibaca dari piranti masukkan. Buatkan algoritmanya dengan struktur pengulangan while – do, repeat – until dan for. Hitung jumlah angka dari 1 sampai N. nilai N dibaca dari papan kunci. Misalkan N = 5, maka 1 + 2 + 3 + 4 + 5 = 15. Buatkan algoritmanya dengan struktur pengulangan while – do, repeat – until dan for. Data bilangan dibaca dari papan kunci. Nilai rat-rata adalah jumlah seluruh bilangan debagi dengan banyak bilangan. Misalkan ada 5 buah data bilangan, yaitu 12, 10, 6, 2, 4 maka rata-ratanya adalah (12 + 10 + 6 + 2 + 4 )/5 = 34/5 = 6,8. Hitung rata-rata dari sejumlah data bilangan bulat tersebut. Buatkan algoritmanya dengan struktur pengulangan while – do, repeat – until dan for.
Buatkan prosedur dan program pemanggilnya untuk menukarkan dua buah nilai di dalam peubah A dan B !
Buatkan fungsi dan program pemanggilnya untuk menentukan nilai terbesar antara dua buah peubah bilangan bulat A dan B ! Nilai terbesar merupakan keluaran dari prosedur.
Buatkan fungsi dan program pemanggilnya untuk menentukan sebuah tahun kabisat atau bukan kabisat !
Buatkan fungsi dan program pemanggilnya untuk mengembalikan angka romawi untuk angka arab yang diberikan ( hanya untuk angka arab dari 1 sampai 10) !
Buatlah fungsi untuk menampilkan tulisan “Algoritma dan Pemrograman” sebanyak 30 kali! Ubahlah menjadi sebanyak n kali!
Buatlah fungsi untuk menjumlahkan dua buah bilangan Tambahkanlah: mengurangi, membagi, mengkali dua buah bilangan
Buatlah fungsi untuk menentukan bilangan terkecil dari 3 buah bilangan yangdiinputkan
Buatlah fungsi untuk mengubah nilai ke huruf (A,B, C, D, dan E)
Buatlah fungsi untuk mengubah bilangan pecahan ke bilangan bulat!
Buatlah fungsi untuk menjumlahkan deret: 1+3+5+7+… +n
Buatlah algoritma untuk menghitung konversi suhu.dari Celcius menjadi Reamurdan Farenheit. Input: suhu dalam Celcius Proses: R = 4/5 * C dan F = 9/5 * C + 32 Output: suhu dalam Reamur dan Farenheit
Buatlah algoritma untuk mencari sisi miring dari suatu segitiga siku-siku, jika diketahui panjang sisi yang membentuk sudut siku-siku. Input: a dan b, yaitu panjang sisi pembentuk sudut siku-siku Proses: c = a2 + b2 Ouput: sisi miring (c)
Buatlah algoritma untuk menentukan suatu bilangan adalah bilangan prima.
Buatlah fungsi algoritma pencarian berurutan dengan menggunakan struktur data single linked list. Sebutkan keuntungan dari penggunaan struktur data single linked list ini dibandingkan dengan menggunakan array
Buatlah fungsi untuk menyisipkan (insert) data pada algoritma pencarian berurutan apabila data tersebut tidak ditemukan. Data baru diletakkan pada posisi terakhir. Implementasikan fungsi ini dengan menggunakan struktur data array dan single linked list.
Buatlah fungsi algoritma pencarian biner dengan menggunakan struktur data single linked list
Buatlah fungsi untuk menyisipkan (insert) data pada algoritma pencarian biner apabila data tersebut tidak ditemukan. Data baru disisipkan pada posisi yang tepat sehingga kumpulan data tersebut tetap terurut. Implementasikan fungsi ini dengan menggunakan struktur data array dan single linked list.
Daftar Pustaka dan Referensi yang bisa digunakan Antonie Pranata, Algoritma dan Pemrograman, J&J Learning Yogyakarta, 2000 Donald Knuth, The Art Of Computer Programming, Volume 1 / Fundamental Algorithms, 2nd edition, Addison Wesley Iwan Binanto, Konsep Bahasa Pemrograman, Penerbit Andi Yogyakarta, 2005 Jogianto H.M, Konsep Dasar Pemrograman Bahasa C, Penerbit Andi, 2000 Rinaldi Munir, Algoritma dan Pemograman dengan bahasa pascal dan C, Penerbit informatika, 2009 Moh. Sjukani, Algoritma dan Struktur Data dengan C, C++, dan Java, Mitra Wacana Media, 2005 Simon Harris and James Ross, Beginning Algorithms, Willey Publishing Inc, 2006 Thomas H. Cormen et.al, Introduction to Algorithms Second Edition, MIT Press, McGraw-Hill Book Company, 2001 Thompson Susabda Ngoen, Pengantar Algoritma dengan Bahasa C, Penerbit Salemba Teknika, 2004 Pengantar Algoritma dan Pemrograman, www.ilmukomputer.com,Alex Budiyanto