Algoritma Pemrograman
Algoritma Pemrograman
Bahasa Komputer
Agar suatu komputer dapat mengenali instruksi yang anda berikan, instruksi tersebut perlu
ditulis dalam bahasa yang dimengerti oleh komputer.
Sebaliknya, bahasa assembly dikategorikan sebagai low-level karena mereka sangat dekat
kepada hardware.
Keuntungan utama dari bahwa high-level dibandingkan dengan low level adalah lebih
mudah dibaca, ditulis, dan ditangani. Selanjutnya program yang ditulis dengan bahasa
high-level harus diterjemahkan menjadi bahasa mesin melalui suatu compiler atau
interpreter.
BAHASA MESIN
Sesuatu hal yang harus dipahami bahwa setiap CPU hanya mengerti satu bahasa. Bahasa
ini dikenal sebagai machine language (bahasa mesin).
Indoprog 1
Algoritma & Pemrograman Hendra, S.T.
Semua bahasa mesin adalah suatu bahasa numerik, karena memori yang berada didalam
komputer hanya dapat menyimpan data numerik. Walaupun anda bekerja dengan text
[misalnya melihat halaman web] komputer bekerja dengan bilangan binary. Oleh karena
itu menulis dalam bahasa mesin sangat sulit dan membosankan, serta sering terjadi
kesalahan
Setiap keluarga CPU yang berbeda memiliki bahasa mesin yang berbeda pula. Bahasa
mesin untuk Intel Pentium adalah berbeda sama sekali dengan bahasa mesin yang
digunakan pada Power PC ataupun Sun SPARC.
ASSEMBLY LANGUAGE
Bahasa Assembly merupakan suatu lompatan yang besar dari bahasa mesin, tetapi
sebenarnya bukanlah suatu langkah yang besar. Bahasa Assembly adalah suatu mnemonic
sederhana untuk mengantikan bahasa mesin. Dari pada menulis angka 54 24 66 9C FE
C2 84 92 kedalam memori, programmer bahasa assembly dapat menulis LDX 24,
[669C].
Indoprog 2
Algoritma & Pemrograman Hendra, S.T.
Berikut ini adalah contoh bahasa assembly dengan bahasa mesin yang berasosiasi
disampingnya.
1. Walaupun programmer menjadi lebih produktif, tetapi mereka tetap harus menulis
bahasa assembly untuk setiap perintah bahasa mesin.
• Komputer tidak mengerti bahasa assembly sama sekali, hanya bahasa mesin.
Setelah suatu program assembly dibuat, programmer harus mengkonversi program
tersebut menjadi bahasa mesin dengan suatu program yang dikenal sebagai
assembler, dan baru dapat dijalankan.
Indoprog 3
Algoritma & Pemrograman Hendra, S.T.
Orang segera menyadari bahwa komputer dapat menterjemahkan bahasa assembly mejadi
kode mesin, dan mereka mudah memikirkan bagaimana jika komputer dapat diprogram
dengan bahasa yang lebih "alamiah" [lebih alamiah untuk manusia], inilah awal dari
bahasa generasi ketiga yaitu High Level Languages.
Ketika anda menggunakan suatu interpreter, ia akan membaca perintah source code baris
perbaris, kemudian menterjemahkannya menjadi perintah mesin yang bersesuaian (kode
mesin) dan menjalankannya seketika. Kode mesin ini tidak disimpan; sehingga ketika
anda mencoba menjalankan program yang sama pada kesempatan berikutnya, anda
membutuhkan source code dan interpreter untuk menjalankannya.
Ketika anda menggunakan suatu compiler, ia akan membaca perintah source code dan
menulis kode mesin. Setelah selesai keseluruhan kode mesin akan disimpan untuk
pemakaian selanjutnya. Ketika anda ingin menjalankan program tersebut, system operasi
akan menjalankan kode mesin yang telah disimpan – dalam hal ini source code tidak
diperlukan lagi. Eksekusi menjadi lebih cepat, dan dapat dijalankan dikomputer lain
(dalam hal ini pada komputer dan system operasi yang sama)
Indoprog 4
Algoritma & Pemrograman Hendra, S.T.
Untuk membuat komputer melakukan sesuatu, anda perlu untuk menulis program
komputer. Dalam menulis suatu program komputer, kita perlu memberitahukan kepada
komputer, langkah-langkah persis apa yang harus ia lakukan. Ketika komputer
menjalankan program tersebut, ia akan melakukan setiap langkah secara mesin untuk
mencapai tujuan akhir.
Ketika anda memberitahu kepada komputer apa yang harus dilakukan, anda perlu memilih
bagaimana hal tersebut dilakukan. Dari sinilah Algoritma Komputer muncul. Algoritma
adalah teknik dasar untuk menyelesaikan suatu pekerjaan. Perhatikan contoh berikut untuk
membantu pengertian anda tentang konsep dari algoritma.
Katakanlah misalnya anda mempunyai teman yang baru tiba di airport, dan teman anda
ingin berangkat dari airport ke rumah anda. Berikut ini adalah empat algoritma yang
berbeda yang mungkin dilakukan teman anda:
Algoritma taxi:
Pergi ke pemberhentian taxi.
Masuk ke taxi.
Berikan alamat rumah anda.
Algoritma Bus:
Keluar dari tempat pengambilan bagasi, naik bus nomor 70.
Turun dan naik bus nomor 14 pada jalan utama.
Turun di jalan pada jalan AB.
Jalan kaki dua blok arah utara ke rumah anda.
Ketiga algoritma diatas memiliki tujuan yang sama, tetapi masing-masing melakukannya
dengan cara yang berbeda. Masing-masing algoritma diatas juga menghabiskan waktu dan
biaya yang berbeda. Naik taxi, adalah contoh yang paling cepat, tetapi paling mahal. Naik
bus mungkin adalah paling hemat, tetapi lambat. Tentu saja anda perlu memilih algortima
sesuai dengan situasi dan kondisi.
Dalam pemrograman komputer, juga terdapat banyak cara algoritma yang berbeda.
Masing-masing algoritma memiliki keuntungan dan kerugian untuk situasi yang berbeda.
Kata algoritma (algorithm) berasal dari nama matematikawan Persia pada abad 9
Abu Abdullah Muhammad bin Musa al-Khwarizmi. Kata aslinya algorism mengacu pada
aturan dari melakukan aritmetika menggunakan bilangan Arab dan berkembang menjadi
algoritma pada abad 18. Kata ini sekarang berevolusi untuk mencantumkan semua
prosedur-prosedur khusus untuk memecahkan masalah atau mengerjakan tugas
Kasus pertama dari algoritma yang ditulis untuk komputer adalah catatan Ada
Byron's notes pada analytical engine yang ditulis pada tahun 1842, yang mana diyakini
Indoprog 5
Algoritma & Pemrograman Hendra, S.T.
Permasalahan dalam pembuatan program yang besar tentu saja berbeda dengan program
yang kecil, pada program yang kecil umumnya dikembangkan untuk sekali pakai dan
meliputi suatu detail yang kecil, sedangkan program yang besar umumnya dikembangkan
atas permintaan dan dipakai oleh orang lain. Oleh karena itu program tersebut harus ditulis
dengan lebih hati-hati untuk mencegah segala bentuk pemakaian yang menyimpang, serta
harus disertai dengan dokumentasi dan petunjuk pemakaian.
Hal lain yang harus dinyakini adalah keterbatasan memori manusia, kebanyakan orang
dengan mudah dapat memahami program dibawah 10 baris dalam beberapa detik, dan
mereka tetap dapat mengingatnya pada saat perubahan dibutuhkan. Pada program yang
besar, programmer harus memiliki semua informasi yang tertulis untuk memahami atau
mengubah program.
Oleh karena itu, penulisan program yang besar adalah tidak mudah, bahkan untuk
programmer yang profesional. Kita sering mendengar bahwa berbagai program besar
memiliki banyak bug maupun menyebabkan crash ketika dioperasikan pada kondisi
tertentu dan beberapa lama setelah dijalankan.
Adalah tidak mungkin untuk menghasilkan program yang bebas dari kesalahan, kita sering
tidak mengetahui dengan persis. Tetapi banyak cara yang dapat kita lakukan untuk
menghasilkan program dengan bug yang lebih sedikit. Salah satunya adalah memahami
langkah-langkah pengembangan suatu program yang besar, langkah-langkah ini dikenal
sebagai Software Development Life Cycle.
Pemrograman dalam pengertian luas meliputi seluruh kegiatan yang tercakup dalam
pembuatan program, termasuk analisis kebutuhan (requirement's analysis) dan
keseluruhan tahapan dalam perencanaan (planning), perancangan (design) dan
pewujudannya (implementation). Dalam pengertian yang lebih sempit, pemrograman
merupakan pengkodean (coding atau program writing = penulisan program) dan
pengujiannya (testing) berdasarkan rancangan tertentu. Pemahaman yang lebih sempit ini
sering digunakan dalam pembuatan program-program terapan komersial yang
membedakan antara system analyst yang bertanggung jawab dalam menganalisa
kebutuhan, perencanaan dan perancangan program dengan pemrogram (programmer) yang
bertugas membuat kode program dan menguji kebenaran program.
Indoprog 6
Algoritma & Pemrograman Hendra, S.T.
1. Batasan Masalah Merencanakan sistim dan spesifikasi program: Siapa yang akan
menggunakan program dan untuk apa? dengan cara:
a. Menentukan tujuan dan hasil yang akan dicapai
b. Menentukan hal-hal yang diperlukan oleh sistim
c. Pengumpulan data
2. Pengembangan Model Pembuatan model dari sistim yang akan kita bangun, model
adalah suatu gambaran sederhana dari sistim yang kita buat. Dengan pembuatan
model akan terlihat dengan jelas hubungan antara objek-objek dalam sistim yang
akan kita bangun. Untuk penyelesaian aritmatik, biasanya model dibuat dalam
bentuk rumus matematik. Contoh: untuk membuat program luas_lingkaran kita
membuat model matematis c = a x b
3. Rancangan algoritma Pembuatan urutan instruksi yang akan ditulis pada program
(dijelaskan lebih lanjut)
4. Pemrograman Implementasi algoritma ke dalam program (algoritma sendiri dalam
komputer adalah merupakan program).
5. Uji dan Validasi Pengujian terhadap program : seperti kesalahan penulisan (syntax
error) , kesalahan saat eksekusi (runtime error) kesalahan logika program (program
berjalan tapi menghasilkan output yang salah- fatal error).
Dokumentasi Pembuatan catatan pada program terutama pada modul-modul yang rumit.
Suatu ilustrasi tentang rumitnya SDLC yang dapat menyebabkan kekacauan berikut ini :
Indoprog 7
Algoritma & Pemrograman Hendra, S.T.
How the customers How the Project How the Analyst How the
explained it Leader understood designed it Programmer wrote
it it
How the Business How the project What operations How the customer
Consultant was documented installed was billed
described it
Indoprog 8
Algoritma & Pemrograman Hendra, S.T.
Tidak ada notasi yang baku dalam penulisan teks algoritma. Algoritma bukanlah program
yang harus mengikuti aturan-aturan tertentu. Meski demikian, algoritma dituliskan
mendekati gaya bahasa pemrograman umumnya. Misal, tulis nilai X dan Y, dituliskan
dalam algoritma sebagai write(X,Y). Perhatikan dalam notasi write(X,Y) ini hanya
memerintahkan penyajian nilai X ke piranti keluaran (output). Dalam notasi itu juga tidak
memasalahkan format ataupun bentuk-bentuk tampilan lainnya, seperti dicetak dalam satu
baris X dan Y, pemakaian pemisah antara X dan Y menggunakan koma atau spasi. Hal-hal
yang bersifat teknis ini baru dipikirkan waktu penulisan program. Algoritma adalah bebas
bahasa pemrograman.
Teks Algoritma
Mengikuti alur konsep pemrograman prosedural, suatu teks algoritma disusun dalam tiga
bagian, yaitu:
Setiap bagian disertai dengan penjelasan atau dokumentasi tentang maksud pembuatan
teks. Bagian penjelasan diawali dan diakhiri dengan simbol { dan }.
Algoritma NAMA_ALGORITMA { Penjelasan tentang algoritma yang menguraikan
secara singkat hal-hal yang dilakukan oleh algoritma }
DEKLARASI { Semua nama yang digunakan, meliputi nama-nama: tipe, konstanta,
variabel. Juga nama sub-program dinyatakan di sini }
DESKRIPSI { Semua langkah atau aksi algoritma dituliskan di sini }
Contoh:
2) Deklarasi algoritma:
DEKLARASI { nama konstanta }
const PHI = 3.14; { Nilai phi = 22/7 }
{ nama peubah } var R : real; { input jejari lingkaran bilangan riil }
l_Lingkaran : real; { luas lingkaran bilangan riil }
{ nama sub program }
procedure TUKAR(input/output A:integer, input/output B:integer)
Indoprog 9
Algoritma & Pemrograman Hendra, S.T.
3) Deskripsi algoritma: Bagian ini merupakan bagian inti algoritma yang berisikan
uraian langkah-langkah penyelesaian suatu masalah. Setiap langkah algoritma dibaca dari
atas ke bawah. Urutan penulisan menentukan urutan pelaksanaan perintah.
{ Baca data jejari lingkaran R.Jika R <= 0 tulis pesan data salah, selain itu hitung luas
ingkaran. Tampilkan luas lingkaran. }
baca(R);
jika R <= 0 then tulis("Data salah !")
selain itu l_Lingkaran = PHI x R x R;
tulis(l_Lingkaran);
Flowchart
Flowchart adalah alat untuk menganalisa proses. Hal tersebut memungkinkan anda untuk
memecah proses menjadi kejadian-kejadian individual atau aktifitas untuk menunjukan
secara singkat hubungan diantaranya. Konstruksi flowchart memungkinkan pengertian
yang lebih baik kepada proses, dan pengertian yang lebih baik terhadap proses akan
membawa kepada perbaikan dan pengembangan.
Berbagai jenis flowchart telah dikembangkan pada berbagai bidang seperti pada sistem
produksi, maupun pada sistem design dan pemrograman.
Diagram Alir (Flowchart) Merupakan bentuk grafis/visual dari algoritma Bentuk umum
dari simbol-simbol dalam diagram alir:
Sub program
Indoprog 10
Algoritma & Pemrograman Hendra, S.T.
Komentar
Sequential (berurutan)
perhitungan volume dan luas permukaan silinder
Indoprog 11
Algoritma & Pemrograman Hendra, S.T.
Indoprog 12
Algoritma & Pemrograman Hendra, S.T.
Kombinasi
Indoprog 13
Algoritma & Pemrograman Hendra, S.T.
Pseudocode
Pseudocode adalah cara generik untuk menerangkan suatu algoritma tanpa menggunakan
tata cara penulisan bahasa pemrograman tertentu. Sebagaimana namanya, pseudo code —
tidak dapat dieksekusi langsung pada komputer, tetapi merupakan model dan harus diubah
menjadi kode pemrograman yang sebenarnya, dan ditulis sama detailnya.
Pseudocode, secara alamiah dapat terdiri dari berbagai bentuk, walaupun banyak
meminjam tata cara penulisan dari bahasa pemrograman popular (seperti C, Lisp, atau
Fortran). Bahasa natural digunakan pada bagian detail yang kurang penting.
Textbook computer science sering menggunakan pseudocode pada contoh sehingga semua
programmer dapat memahaminya, walaupun mereka tidak menggunakan bahasa
pemrograman yang sama. Karena bentuk pseudocode bervairasi dari pengarang yang satu
dengan pengarang yang lain, tetapi bentuk yang sering digunakan untuk pengenalan
adalah sebagai berikut :
Indoprog 14
Algoritma & Pemrograman Hendra, S.T.
Indoprog 15
Algoritma & Pemrograman Hendra, S.T.
Pada 1945, John Von Neumann yang bekerja pada Institute for Advanced Study
mengemukakan dua konsep yang secara langsung mempengaruhi masa depan dari bahasa
pemrograman komputer. Yang pertama dikenal sebagai "shared-program technique"
(www.softlord.com). Pada teknik ini dinyatakan bahwa hardware komputer haruslah
sederhana dan tidak perlu dilakukan pengkabelan dengan menggunakan tangan untuk
setiap program. Sebagai gantinya, instruksi-instruksi yang lebih kompleks harus
digunakan untuk mengendalikan perangkat keras yang lebih sederhana, hal ini
memungkinkan komputer diprogram ulang dengan cepat.
Konsep yang kedua yang juga sangat penting untuk pengembangan bahasa
pemrograman. Von Neumann menyebutnya sebagai "conditional control transfer"
(www.softlord.com). Ide ini berkembang menjadi bentuk subrutin, atau blok kode yang
kecil yang dapat panggil berdasarkan aturan tertentu, dari pada suatu himpunan tunggal
urutan kronologis yang harus dijalankan oleh komputer. Bagian kedua dari ide tersebut
menyatakan bahwa kode komputer harus dapat bercabang berdasarkan pernyataan logika
seperti IF (ekspresi) THEN, dan perulangan seperti FOR statement. "Conditional control
transfer" mengembangkan ide adanya "libraries," yang mana merupakan blok kode yang
dapat digunakan berulang kali.
Pada 1949, setelah beberapa tahun Von Neumann bekerja, bahasa Short Code
dilahirkan (www.byte.com), yang merupakan bahasa komputer yang pertama untuk
peralatan elektronik yang membutuhkan programmer untuk mengubah perintah kedalam 0
dan 1 dengan tangan.
Pada 1957, bahasa khusus yang pertama muncul dalam bentuk FORTRAN yang
merupakan singkatan dari sistem FORmula TRANslating. Bahasa ini dirancang pada IBM
untuk perhitungan scientific. Komponen-komponennya sangat sederhana, dan
Indoprog 16
Algoritma & Pemrograman Hendra, S.T.
menyediakan bagi programmer akses tingkat rendah kedalam komputer. Sampai saat ini,
bahasa ini terbatas pada hanya terdiri dari perintah IF, DO, dan GOTO, tetapi pada waktu
itu, perintah-perintah ini merupakan lompatan besar kearah depan. Type data dasar yang
digunakan sampai sekarang ini dimulai dari FORTRAN, hal ini meliputi variabel logika
(TRUE atau FALSE), dan bilangan integer, real, serta double-precision.
FORTRAN sangat baik dalam menangani angka-angka, tetapi tidak terlalu baik
untuk menangani proses input dan output, yang mana merupakan hal yang penting pada
komputasi bisnis. Komputasi bisnis mulai tinggal landas pada 1959, dengan
dikembangkannya COBOL, yang dirancang dari awal sebagai bahasa untuk para pebisnis.
Type data yang ada hanya berupa number dan text string. Hal tersebut juga
memungkinkan pengelompokan menjadi array dan record, sehingga data di telusuri dan
diorganisasikan dengan lebih baik. Sesuatu hal yang menarik untuk dicatat bahwa suatu
program COBOL dibuat menyerupai suatu essay, dengan empat atau lima bagian utama
yang membentuk keseluruhan yang tertata dengan baik. Perintah-perintah COBOL sangat
menyerupai tata bahasa English, sehingga membuatnya agak mudah dipelajari. Semua
ciri-ciri ini dikembangkan agar mudah dipelajari dan mudah diterapkan pada dunia bisnis.
Pada 1958, John McCarthy di MIT membuat bahasa LISt Processing (atau LISP).,
yang dirancang untuk riset Artificial Intelligence (AI). Karena dirancang untuk fungsi
spesialisasi yang tinggi, maka tata cara penulisannya jaring kelihatan sebelum ataupun
sesudahnya. Sesuatu perbedaan yang paling nyata dari bahasa ini dengan bahasa lain
adalah dasar dan type satu-satunya adalah list, yang ditandai dengan suatu urutan item
yang dicakup dengan tanda kurung. Program LISP sendirinya dibuat sebagai suatu
himpunan dari list, sehingga LISP memiliki kemampuan yang khusus untuk memodifikasi
dirinya, dan juga dapat berkembang sendiri. Tata cara penulisan LISP dikenal sebagai
"Cambridge Polish," sebagaimana dia sangat berbeda dari logika Boolean (Wexelblat,
177) :
LISP masih digunakan sampai sekarang karena spesialiasi yang tinggi dari sifat
abstraknya.
Bahasa Algol dibuat oleh suatu komite untuk pemakaian scientific pada tahun
1958. Kontribusi utamanya adalah merupakan akar dari tiga bahasa selanjutnya yaitu
Pascal, C, C++, dan Java. Dia juga merupakan bahasa pertama dengan suatu tata bahasa
formal, yang dikenal sebagai Backus-Naar Form atau BNF (McGraw-Hill Encyclopedia of
Science and Technology, 454). Pada Algol telah diterapkan konsep-konsep baru, seperti
rekursif pada function, bahasa berikutnya Algol 68, menjadi bahasa yang membosankan
dan sulit digunakan (www.byte.com). Hal ini mengarah kepada adopsi terhadap bahasa
yang lebih kecil dan kompak seperti Pascal.
Pascal dimulai pada tahun 1968 oleh Niklaus Wirth. Tujuan utama
Indoprog 17
Algoritma & Pemrograman Hendra, S.T.
CASE expression OF
possible-expression-value-1:
statements to execute...
possible-expression-value-2:
statements to execute...
END
Pascal juga mengembangkan variabel dinamis, dimana variabel dapat dibuat ketika suatu
program sedang berjalan, melalui perintah NEW dan DISPOSE. Tetapi Pascal tidak
mengimplementasikan suatu array dinamis, atau kelompok dari variabel-variabel, yang
mana sangat dibutuhkan, dan merupakan salah satu penyebab kekalahannya (Bergin, 101-
102). Wirth kemudian membuat lanjutan dari Pascal, Modula-2, tetapi pada saat itu
muncul C yang dengan cepat menjadi mengeser posisi Pascal.
C dikembangkan pada tahun 1972 oleh Dennis Richie ketika sedang bekerja pada
Bell Labs di New Jersey. Transisi pemakaian dari bahasa umum yang pertama ke bahasa
umum sampai hari ini yaitu transisi antara Pascal dan C, C merupakan perkembangan dari
B dan BCPL, tetapi agak menyerupai Pascal. Semua fasilitas di Pascal, termasuk perintah
CASE tersedia di C. C menggunakan pointer secara luas dan dibangun untuk kecepatan
dengan kelemahannya yaitu menjadi sulit untuk dibaca. Tetapi karena dia menghilangkan
semua kelemahan yang terdapat di Pascal, sehingga dengan cepat mengambil alih posisi
Pascal.
Ritchie mengembangan C untuk sistem Unix yang baru pada saat yang bersamaan.
Oleh karena ini, C dan Unix saling berkaitan. Unix memberikan C beberapa fasilitas besar
seperti variabel dinamis, multitasking, penanganan interrupt, forking, dan strong low-
level, input-output. Oleh karena itu, C sangat sering digunakan untuk pemrograman sistem
operasi seperti Unix, Windows, MacOS, dan Linux.
Pada akhir tahun 1970 dan awal 1980, suatu metode pemrograman yang baru telah
Indoprog 18
Algoritma & Pemrograman Hendra, S.T.
Pada awal 1990's, interaktif TV adalah teknologi masa depan. Sun Microsystems
memutuskan bahwa interaktif TV membutuhkan suatu hal yang khusus, yaitu bahasa
portable (bahasa yang dapat berjalan pada banyak jenis mesin yang berbeda). Bahasa ini
dikenal sebagai Java. Pada tahun 1994, team proyek Java mengubah fokus mereka ke web,
yang mana berubah menjadi sesuatu yang menjanjikan setelah interactive TV gagal. Pada
tahun berikutnya, Netscape menyetujui pemakaian Java pada internet browser mereka,
Navigator. Sampai titik ini, Java menjadi bahasa masa depan dan beberapa perusahaan
mengumumkan aplikasi harus ditulis dalam Java.
Java mempunyai tujuan yang besar dan merupakan bahasa yang baik menurut buku
text, pada kenyataanya "bahasa tersebut tidak". Dia memiliki masalah yang serius dalam
optimasi, dengan arti program yang ditulis dengannya berjalan dengan lambat. Dan Sun
telah membuat cacat penerimaan terhadap Java dengan pertikaian politis dengan
Microsoft. Tetapi Java telah dinyatakan sebagai bahasa untuk instruksi masa depan dan
benar-benar menerapkan object-oriented dan teknik tingkat tinggi seperti kode yang
portable dan garbage collection.
Visual Basic sering diajari sebagai bahasa pemrograman dasar yang mengacu pada
bahasa BASIC yang dikembangkan pada tahun 1964 oleh John Kemeny dan Thomas
Kurtz. BASIC adalah bahasa yang sangat terbatas dan dirancang untuk orang yang bukan
computer science. Perintah-perintah dijalankan secara berurutan, tetapi kendali program
dapat berubah berdasarkan IF..THEN, dan GOSUB yang mana menjalankan suatu blok
kode dan kembali ketitik semula didalam alur program.
Indoprog 19
Algoritma & Pemrograman Hendra, S.T.
Perl telah sering digambarkan sebagai "duct tape of the Internet," karena sering
digunakan sebagai engine untuk interface web atau pada script untuk memodifikasi file
konfigurasi. Dia memiliki fungsi text matching yang sangat baik sehingga membuatnya
menjadi hal yang ideal untuk pekerjaan tersebut. Perl dikembangkan oleh Larry Wall pada
1987 karena fasilitas pada sed dan awk pada Unix (digunakan untuk manipulasi text) tidak
mencukupi kebutuhannya. Tergantung kepada siapa anda bertanya, Perl adalah singkatan
dari Practical Extraction and Reporting Language atau Pathologically Eclectic Rubbish
Lister.
Latihan 1
1. What is a computer program ?
2. Explain what is the different between High Level Language & Low Level Language !
7. Draw the symbols use in flowchart, and mention each symbols function !
Indoprog 20
Algoritma & Pemrograman Hendra, S.T.
Modul 1
Apa itu Bahasa Pemrograman Pascal ?
Pascal merupakan suatu bahasa komputer tingkat tinggi yang dibuat sekitar tahun 1970
oleh Niklaus Wirth1 dan digunakan untuk pendidikan komputer. Bahasa Pascal
dikembangkan dari Bahasa Pemrograman ALGOL. Nama Pascal diambil dari seorang ahli
matematika yang bernama Blaise Pascal2 yang menemukan mesin hitung pertama. Bahasa
Pascal dirancang untuk menyelesaikan masalah dari berbagai kalangan pemakai, mulai
dari para mahasiswa, pendidik, dan ilmuwan dengan pendekatan terstruktur.
1
Dr. Niklaus Wirth of the Swiss Federal Institute of Technology (ETH-Zurich), a member of the original
group that created ALGOL. In 1971, he published his specification for a highly-structured language which
resembled ALGOL in many ways. He named it Pascal.
2
Blaise Pascal, a French mathematician who was a pioneer in computer development history. In 1641, at the
age of eighteen, Pascal constructed the first arithmetical machine, arguably the first computer. He would
improve upon the instrument eight years later. In 1650, Pascal left the world of geometry and physics, and
shifted his focus towards religious studies, or, as Pascal wrote, to "contemplate the greatness and the misery
of man." Pascal died in Paris on August 19, 1662.
3
Free Pascal (aka FPK Pascal) is a 32 or 64 bit (from 1.9.6) pascal compiler. It is available for different
processors Intel x86, Amd64/x86 64 (from 1.9.6), PowerPC (from 1.9.2), Sparc (from 1.9.6) and Motorola
680x0 (1.0.x only). The following operating systems are supported Linux, FreeBSD, NetBSD,
Indoprog 21
Algoritma & Pemrograman Hendra, S.T.
Sedangkan bahasa Java dan C# adalah bahasa pemrograman terkini yang menekanan
kepada pendekatan berorientasi object, padahal pendekatan tersebut adalah tidak mudah
untuk orang yang baru belajar pemrograman komputer.
uses ...;
var ...;
begin
.... {Your program is here}
end.
begin
Writeln('Saya sedang belajar Pascal !');
Writeln('Di STMIK IBBI');
end.
Bagaimana kalau saya mau membersihkan layar terlebih dahulu sebelum mencetak
tulisan ?
Untuk membersihkan layar, anda dapat menggunakan perintah Clrscr yang terdapat pada
unit CRT.
MacOSX/Darwin, MacOS classic, DOS, Win32, OS/2, BeOS, SunOS (Solaris), Netware (libc and classic),
QNX and Classic Amiga.
4
According to the Pascal Standard (ISO 7185), these goals were to a) make available a language suitable for
teaching programming as a systematic discipline based on fundamental concepts clearly and naturally
reflected by the language, and b) to define a language whose implementations could be both reliable and
efficient on then-available computers.
Indoprog 22
Algoritma & Pemrograman Hendra, S.T.
Contoh :
Uses CRT;
begin
Clrscr;
Writeln('Saya sedang belajar Pascal !');
Writeln('Di STMIK IBBI');
end.
Contoh :
Program Perhitungan(Input,Output);
Uses Clause
Bagian uses clause digunakan untuk menentukan library yang dibutuhkan saat proses
program. LIBRARY merupakan file penyimpan subroutine yang secara berulang
digunakan saat proses program. Library ini diistilahkan sebagai unit dalam Turbo
PASCAL yang terdiri dari SYSTEM, OVERLAY, GRAPH, DOS, CRT yang ditempatkan
dalam file TURBO.TPL.
Contoh :
Perhatian :
Unit system merupakan unit yang secara otomatis akan disertakan dalam setiap program,
unit inilah mengatur semua perintah dasar input dan output pada Pascal. Sedangkan unit-
unit lain hanya akan disertakan bila kita pilih pada bagian uses.
Indoprog 23
Algoritma & Pemrograman Hendra, S.T.
Declaration
Bagian ini meliputi deklarasi untuk label, const, type, var, procedure dan function.
Syarat terpenting dalam pembentukan suatu program adalah, bahwa setiap variabel, type
non-standard, label, procedure non-standard, serta function non-standard yang dipakai
didalamnya harus nyatakan (deklarasi) terlebih dahulu pada bagian deklarasi.
Setiap deklarasi tersebut harus bersifat unik (tidak boleh serupa satu sama yang lain).
Penulisan nama dalam deklarasi tersebut harus memenuhi syarat-syarat sebagai berikut :
- panjang nama maximum 63 character, diawali dengan alphabet
- tidak ada special character kecuali tanda garis bawah ("_")
- tidak boleh serupa dengan reserved word (kata tercadang)
- tidak boleh serupa dengan indentifier lainnya.
Variabel Declaration
Setiap variabel yang digunakan dalam program harus didefinisikan terlebih dahulu
sebelum digunakan. Cara penulisan ini adalah :
Var
<nama var> : <type variable>;
Statement
Bagian ini merupakan inti dari program. Seluruh perintah dan urutannya serta proses
Input/Output dalam program perlu disusun secara teratur oleh penyusun program. Segala
yang ada pada bagian uses maupun deklarasi merupakan pendukung terhadap isi program.
1. Ordinal types
Type data yang mempunyai urutan pasti, dan masih terbagi menjadi
- Integer
Type variable yang beguna untuk pengolahan data yang bulat, type ini masih terbagi atas
berberapa menurut jangkauan data dan ukurannya :
Indoprog 24
Algoritma & Pemrograman Hendra, S.T.
- Char
Type variabel yang berguna untuk pengolahan character ASCII, type character ini
penulisannya ditandai dengan dua buah petik tunggal seperti : 'A', '3','*',#7 untuk
menyatakan ' harus ditulis ''''
- Boolean
Type varibale yang berguna untuk pengolahan hal yang hanya mempunyai dua ketentuan
yaitu benar(TRUE) dan salah(FALSE) saja.
2. Real types
Type variable yang beguna untuk pengolahan data yang tidak bulat, untuk type real ini
juga terbagi atas beberapa :
Untuk pengolahan type variabel diatas di sediakan berbagai jenis operator antara lain :
Indoprog 25
Algoritma & Pemrograman Hendra, S.T.
Sebagaimana anda ketahui bahwa Pascal adalah bahasa yang dirancang untuk
pembelajaran pemrograman komputer yang terstruktur. Pada saat kompilasi, compiler
akan memeriksa pemakaian type data yang bersesuaian. Jadi setiap variabel yang
dideklarasi harus disesuaikan dengan nilai yang akan disimpan kevariabel tersebut.
{Deklarasi variabel}
var
UmurKu : Byte;
Keterangan : String;
(*Program anda*)
begin
UmurKu:=19;
Keterangan:='Hi, saya sedang belajar Pascal di STMIK IBBI';
Writeln('Saya berumur ',UmurKu,' tahun');
Writeln(Keterangan);
end.
var
UmurKu : Byte;
Keterangan : String;
begin
Write('Berapa umur anda ? '); Readln(UmurKu);
Write('Komentar anda: '); Readln(Keterangan);
Writeln;
Writeln('Saya berumur ',UmurKu,' tahun');
Writeln(Keterangan);
end.
var
Pi : Real;
Begin
Pi := 22/7;
Writeln('Bilangan Pi adalah ', Pi);
Writeln('Bilangan Pi adalah ', Pi:2:3);
end.
Indoprog 26
Algoritma & Pemrograman Hendra, S.T.
Edit
Ketika anda menulis sebuah program dalam bahasa tingkat tinggi, anda menulis perintah-
perintahnya dalam bentuk perintah bahasa pemrograman dengan menggunakan text editor.
Dokumen yang anda hasilkan pada tahap ini dikenal sebagai source code.
Compile
Setelah anda selesai menulis program anda, anda perlu meng-kompilasi-nya dengan
menggunakan suatu software yang disebut sebagai compiler. Kompiler mengubah source
code anda menjadi bahasa mesin. Jika program anda gagal di kompilasi (tejadi kesalahan
"grammatical" atau sytnax errors pada kode anda), anda harus meng-edit kembali kode
anda sampai dapat dikompilasi dengan benar.
Setelah suatu program berhasil dikompilasi artinya dia telah benar secara syntax, tetapi
masih dapat mengandung runtime error, atau logical error.
Run
Setelah program anda dikompilasi, anda dapat menjalankannya. Ketika anda menjalankan
program anda, hal yang pertama yang perlu anda lakukan adalah memeriksa apakah
programt tersebut berjalan seperti yang diharapkan, proses ini dikenal sebagai testing.
Pada tahapan ini dapat ditemui logical error ataupun runtime error.
Untuk menghilangkan runtime error atau logical error anda perlu kembali ke langkah
pertama, jadi inilah yang dikenal sebagai siklus edit-compile-run cycle sampai program
dapat berjalan dengan benar.
Latihan 1
1. What does structured programming mean ?
3. Pascal programs always begin with _______ and end with _______
Indoprog 27
Algoritma & Pemrograman Hendra, S.T.
6. Mention at least 5 variable type names with their range and types !
10. How can we view and pause the screen after the program ran ?
12. What key should we press to run a program in Borland Pascal 7.0 ?
13. How can we limit the fractional output to 3 places before and after the decimal point?
Latihan di Laboratorium
3. Make a program to calculate the area of a circle. Limit the fractional part 3 places
before decimal point and 4 places after decimal.
program menghitung_luas_lingkaran;
var
r : integer;
luas : real;
begin
write('masukkan panjang jari-jari :');
readln(r);
luas := 3.14*r*r;
writeln('luas lingkaran adalah :',luas:8:4);
readln;
end.
Indoprog 28
Algoritma & Pemrograman Hendra, S.T.
Modul 2
Pada pertemuan sebelumnya kita telah belajar membuat program dengan pascal,
apakah program yang dapat dibuat hanya untuk perhitungan matematika
sederhana?
Tentu saja tidak, salah satu tujuan kita menggunakan komputer adalah membantu dalam
pengambilan keputusan, dan tentu saja keputusan yang terprogram.
Dimana condition adalah sesuatu yang bernilai True atau False, dan statement adalah
perintah yang akan dijalankan.
Uses Crt;
Var
Belanja : Real;
Begin
Clrscr;
Write('Jumlah belanja ? '); Readln(Belanja);
Ok, saya mengerti bahwa pada prinsipnya Statement setelah Then akan dijalankan
kalau condition setelah If menghasilkan nilai True. Bagaimana kalau condition True
Statement1 dijalankan, dan sebaliknya Statement2 dijalankan ?
Untuk keputusan seperti ini, pascal menyediakan struktur pengambilan keputusan berikut:
Indoprog 29
Algoritma & Pemrograman Hendra, S.T.
If conditon Then
Statement1
Else
Statement2;
Uses Crt;
Var
Bilangan : Integer;
Begin
Clrscr;
Write('Masukan Bilangan ? '); Readln(Bilangan);
Readln;
End.
Oh, hal itu bisa dilakukan dengan merangkai beberapa struktur If, misalnya :
If condition1 Then
Statement1
Else
If condition2 Then
Statement2
Else
If condition3 Then
Statement3
Else
Statement4;
Misalnya kita akan membuat nilai huruf dari angka dengan kriteria 80 keatas mendapat A,
70 s/d 79 mendapat B, 60 s/d 69 mendapat C, 50 s/d 59 mendapat D, dan dibawah 49
mendapat E, maka dapat ditulis menjadi :
if mark>=80 then
grade:='A'
else { 79 or below goes here }
if mark>=70 then
grade:='B'
else { 69 or below goes here }
if mark>=60 then
Indoprog 30
Algoritma & Pemrograman Hendra, S.T.
grade:='C'
else { 59 or below goes here }
if mark>=50 then
grade:='D'
else { 49 or below goes here }
grade:='E';
Wah panjang banget, adakah cara lain untuk melakukan hal tersebut ?
Selain struktur kendali If, pascal juga menyediakan suatu struktur Case, yang akan
menjalankan statement berdasarkan range tertentu, adapun syntaxnya adalah sebagai
berikut :
Case variabel Of
Range1 : Statement1;
Range2 : Statement2;
Range3 : Statement3;
…
Else StatementN;
End;
Case mark of
80..100: grade:='A';
70..79 : grade:='B';
60..69 : grade:='C';
50..59 : grade:='D';
Else grade:='E';
End;
Tetapi sesuatu hal yang perlu diperhatikan bahwa variabel yang akan dievaluasi dengan
Case haruslah Ordinal type.
Opss, hampir lupa, bagaimana kalau statement yang harus dijalankan pada masing-
masing condition lebih dari 1 ?
Ya, benar, sering kita perlu menjalankan beberapa Statement pada masing-masing
condition, untuk keperluan tersebut kita dapat memblok perintah-perintah tersebut dengan
Begin … End;
Contoh :
Indoprog 31
Algoritma & Pemrograman Hendra, S.T.
Pertanyaan yang tepat sekali, untuk condition yang terdiri dari beberapa logika dapat anda
gabungkan dengan operasi AND, OR. Misalnya kita akan mencari tahun kabisat.
In the Gregorian calendar, which is the calendar used by most modern countries, the
following rules decides which years are leap years:
If ((tahun Mod 4) = 0) And Not (tahun Mod 100 = 0)) Or ((tahun Mod 400) = 0)
Then
Writeln ('Tahun Kabisat !')
Else
Writeln ('Bukan Tahun Kabisat !');
Catatan Instruktur
Berdasarkan hasil pengamatan, kesalahan yang sering dilakukan oleh mahasiswa dalam
pemakaian struktur If…Then…Else, adalah didepan Else tidak ada pemakaian titik koma
(;).
Latihan 2
1. What does Pascal provide in order to perform conditional branching ?
4. Determine the output if i=5 and j=3 for the following excerpt :
5. Make a program to ask ages. Classify the ages into these categories :
Indoprog 32
Algoritma & Pemrograman Hendra, S.T.
Indoprog 33
Algoritma & Pemrograman Hendra, S.T.
Modul 3
Hallo, ketemu lagi, pada pertemuan ini kita akan membahas tentang Looping.
Ok, sekarang saya sudah punya gambaran. Apakah hal tersebut tidak dapat
dilakukan tanpa looping ?
Tentu saja bisa, tetapi akibatnya program kita menjadi panjang dan tidak efisien, coba
bayangkan misalnya anda ingin mencetak tulisan STMIK IBBI sebanyak 10 baris di layar,
bisa saja anda menggunakan perintah Writeln(' STMIK IBBI '); sebanyak 10 kali.
Bukankah lebih baik kita memerintahkan komputer untuk secara berulang menjalankan
perintah Writeln(' STMIK IBBI '); sebanyak 10 kali.
Benar juga ya, tetapi bagaimana struktur perintah perulangan pada pascal ?
Salah satu struktur perintah perulangan pada pascal adalah yang menggunakan counter.
Atau
Contoh :
Var I : Integer;
Begin
For I := 1 To 10 Do Writeln(' STMIK IBBI ');
End.
Tapi tadi saya lihat yang satu pakai To dan yang satu lagi pakai DownTo, apa sih
bedanya ?
Kita menggunakan To kalau nilai awal < nilai akhir, dan sebaliknya pakai DownTo
Contoh :
Indoprog 34
Algoritma & Pemrograman Hendra, S.T.
Var I : Integer;
Begin
For I := 10 DownTo 1 Do Writeln(' STMIK IBBI');
End.
Contoh :
I := 1;
While I <= 10 Do
Begin
Writeln(' STMIK IBBI');
I := I + 1;
End;
Ok, sekarang saya sudah jelas dengan struktur looping pada bahasa pascal.
Tunggu dulu, masih ada satu struktur perulangan dengan condition, yaitu :
Repeat
Statement;
…
Until condition;
Contoh :
I := 1;
Repeat
Indoprog 35
Algoritma & Pemrograman Hendra, S.T.
I := 11;
While I <= 10 Do
Begin
Writeln(' STMIK IBBI');
Inc(I);
End;
Dan
I := 11;
Repeat
Writeln(' STMIK IBBI');
Inc(I);
Until I <= 10;
Pada contoh 1, tidak akan mencetak apa-apa, sedangkan pada contoh 2 akan mencetak
tulisan STMIK IBBI minimal 1 kali.
Pada prinsipnya struktur While melakukan pemeriksaan awal, dan struktur Repeat
melakukan pemeriksaan di akhir.
Bagaimana kalau kita ingin keluar dari pertengahan looping walaupun conditionnya
masih terpenuhi ?
Mudah saja, gunakan perintah Break, dan anda juga dapat menggunakan perintah
Continue untuk kembali ke While ataupun Repeat.
Contoh :
I := 1;
While I <= 10 Do
Begin
Writeln(' STMIK IBBI');
I := I + 1;
Break;
End;
Akan mencetak STMIK IBBI sekali saja, karena begitu ketemu perintah Break, maka
proses keluar dari looping. Bagaimana dengan yang berikut ini :
I := 1;
While I <= 10 Do
Begin
Writeln(' STMIK IBBI');
I := I + 1;
Indoprog 36
Algoritma & Pemrograman Hendra, S.T.
Continue;
End;
Catatan Instruktur
Berdasarkan hasil pengamatan, kesalahan yang sering dilakukan oleh mahasiswa dalam
pemakaian struktur For…Do, dan While…Do adalah adanya pemakaian titik koma
dibelakang Do, sehingga menyebabkan looping tidak menjalankan statement sebagaimana
yang diharapkan.
Contoh :
For I := 1 To 10 Do;
Writeln(' STMIK IBBI ');
Akan menyebabkan tulisan STMIK IBBI hanya dicetak satu kali, hal ini terjadi karena
looping menjalankan apa-apa.
Latihan 3
1. Explain the characteristics of all three loop syntaxes in Pascal !
Indoprog 37
Algoritma & Pemrograman Hendra, S.T.
2
3
4
5
6
Write an excerpt using all three syntaxes !
Latihan di laboratorium
1. Input : 5 2. Input : 5
Output : 1 2 3 4 5 4 3 2 1 Output : 1 2 3 4 5
Input : 1 1 2 3 4 5
Output : 1 1 2 3 4 5
1 2 3 4 5
3. Input : 5 1 2 3 4 5
Output : 1 2 3 4 5 4. Input : 5
2 3 4 5 1 Output : 1
3 4 5 1 2 1 2
4 5 1 2 3 1 2 3
5 1 2 3 4 1 2 3 4
1 2 3 4 5
5. Input : 5 6. Input : 5
Output : 1 Output : 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
7. Input : 5
Output : 1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 4 4 4 4 3 2 1
1 2 3 3 3 3 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
program jawaban_soal_no_2;
var
n,i,j : byte;
begin
write('jumlah data :'); readln(n);
for i := 1 to n do
begin
for j := 1 to n do
write (j);
writeln;
end;
readln;
Indoprog 38
Algoritma & Pemrograman Hendra, S.T.
end.
program jawaban_soal_no_5;
var
n,i,j : byte;
begin
write('jumlah data :'); readln(n);
for i := 1 to n do
begin
for j := 1 to i do
write (i);
writeln;
end;
readln;
end.
program jawaban_soal_no_6;
var
n,l,r,t,b : byte;
begin
write('jumlah data :'); readln(n);
r := n;
for l := 1 to n do
begin
b := n;
for t := 1 to n do
begin
if (l <= r) and (l <= t) and (l <= b) then
write(l)
else if (r <= l) and (r <= t) and (r <= b) then
write(r)
else if (t <= l) and (t <= r) and (t <= b) then
write(t)
else
write(b);
b := b - 1;
end;
writeln;
r := r - 1;
end;
readln;
end.
program cetak_suku_fibonacci;
var
Indoprog 39
Algoritma & Pemrograman Hendra, S.T.
Indoprog 40
Algoritma & Pemrograman Hendra, S.T.
Modul 4
Hallo, ketemu lagi, pada pertemuan ini kita akan belajar tentang array.
Contoh :
Var
Nilai : Array [1..10] of Integer;
Dalam hal ini variabel Nilai adalah suatu array yang memiliki 10 element, yaitu Nilai[1],
Nilai[2], Nilai[3], …, Nilai[10]. Pada masing-masing elemennya dapat menampung satu
nilai Integer.
Contoh :
Nilai[1] := 60;
Nilai[2] := 75;
…
Nilai[10] := 90;
Writeln(Nilai[1]);
Writeln(Nilai[2]);
…
Writeln(Nilai[10]);
Kalau begitu kita juga dapat melakukan hal yang sama dengan memesan 10
variabel, misalnya Nilai1, Nilai2, Nilai3, dst, dapatkah kira-kira anda memberikan
contoh keunggulan dari pemakaian Array ?
Ya, memang hal tersebut dapat dilakukan, tetapi sesuatu yang perlu kita perhatikan adalah
kemudahan pengolahan data Variabel tersebut, misalnya kita akan menjumlahkan total
nilai dari variabel tersebut tanpa array maka dapat ditulis :
Total :=
Nilai1+Nilai2+Nilai3+Nilai4+Nilai5+Nilai6+Nilai7+Nilai8+Nilai9+Nilai10;
Total := 0;
For I:= 1 To 10 Do Total := Total + Nilai[I];
Dan bagaimana kalau ada elemennya ada 100. Bisa anda bayangkan.
Indoprog 41
Algoritma & Pemrograman Hendra, S.T.
Ada, array yang telah kita sebutkan tersebut adalah array 1 dimensi, kita dapat juga
membuat multi dimensi sesuai dengan kebutuhan, contoh :
Var
Matrix : Array [1..3,1..3] Of Integer;
Adalah contoh array 2 dimensi, yang terdiri dari elemen Matrix[1,1], Matrix [1,2],
Matrix[1,3], Matrix[2,1], Matrix[2,2], Matrix[2,3], Matrix[3,1], Matrix[3,2], dan
Matrix[3,3].
Saya bingung dengan yang Array ['A'..'Z'] of Integer, bagaimana kira-kira cara
pemakaiannya ?
Cara pemakaiannya seperti array bisanya, Cuma indexnya ditulis sebgai character, contoh:
Idx['A'] = 100;
Latihan 4
1. What is an array ?
2. What is it for ?
5. How can we declare two or more dimension in array and explain the usage.
Indoprog 42
Algoritma & Pemrograman Hendra, S.T.
Latihan di Laboratorium
1. Make a Pascal triangle, example :
Input : 7
Output : 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
program segitiga_pascal;
var
baris_kini,
baris_lalu : array [0..99] of integer;
n,i,j : byte;
begin
write('jumlah baris :'); readln(n);
baris_lalu[0] := 0;
baris_lalu[1] := 1;
baris_lalu[2] := 0;
for i := 1 to n do
begin
for j := 1 to i do
begin
baris_kini[j] := baris_lalu[j-1]+baris_lalu[j];
write(baris_kini[j]:3);
end;
baris_lalu := baris_kini;
writeln;
end;
readln;
end.
2. Suppose you have an array 100 elements of random numbers. Find its average, maxi-
mum and minimum value of the elements.
Program mencari_nilai_minimum_dari_100_nilai_random;
const
jd = 100;
var
arr : array [1..100] of integer;
i : byte;
min : integer;
begin
randomize;
for i := 1 to jd do
arr[i] := random(1000);
min := arr[1];
for i := 2 to jd do
if arr[i] < min then min = arr[i];
writeln('Nilai minimum :', min);
readln;
Indoprog 43
Algoritma & Pemrograman Hendra, S.T.
end.
Modul 5
Pada pertemuan-pertemuan sebelumnya kita telah belajar dasar-dasar pembuat program
dengan Pascal, pada pertemuan ini kita akan membahas tentang Algortima pengurutan
data (Sort).
Salah satu masalah pengolahan data dengan menggunakan komputer adalah bagaimana
menyajikan data dalam keadaan berurut, dan tentu saja untuk pengurutan data tersebut
dibutuhkan algoritma. Dewasa ini para ahli matematika dan komputer telah
mengembangkan berbagai algoritma pengurutan data seperti :
Indoprog 44
Algoritma & Pemrograman Hendra, S.T.
Tetapi sebelum kita mulai dengan pengurutan data, kita akan membahas tentang pseudo
random generator (PRNG).
Sesuatu hal yang perlu anda ketahui bahwa PRNG bukankan bilangan random, tetapi
diperkirakan mendekati bilangan random.
Berdasarkan observasi John von Neumann 1951 bahwa "Anyone who considers
arithmetical methods of producing random digits is, of course, in a state of sin".
Mersenne Twister adalah salah satu PRNG yang dibuat pada tahun 1997 oleh Makoto
Matsumoto dan Takuji Nishimura, yang mana bilangan random dapat dihasilkan dengan
sangat cepat dan berkualitas.
Vj+1 = A · Vj + B (mod M)
Randomize digunakan untuk menginisialisasi suatu bibit random secara acak yang cukup
dipanggil sekali saja.
var
5
Pseudorandom numbers are a critical part of modern computing, from cryptography to the Monte Carlo
method for simulating physical systems.
Indoprog 45
Algoritma & Pemrograman Hendra, S.T.
i : byte;
begin
randomize;
for i:=1 to 10 do
write(random(30),' ');
end.
Coba hilangkan "randomize", dan jalankan beberapa kali, bagaimana dengan bilangan
yang dihasilkan apakah sama pada setiap percobaan ?
Jadi, selalu gunakan "randomize" untuk menjamin kerandoman bilangan yang dihasilkan
pada setiap run.
Algoritma SORT
Pada computer science dan matematika, algoritma sort adalah algoritma yang membuat
elemen dalam suatu daftar menjadi berurutan.
• Kerumitan dalam komputasi (prilaku buruk, sedang dan terbaik) dalam arti ukuran
dari elemen (n). Jelasnya, prilaku baik adalah O(n log n) dan prilaku buruk adalah
O(n2)6
• Memori yang digunakan (dan pemakain sumber daya komputer lainnya)
• Stabilitas: pengurutan yang stabil akan mempertahankan urutan relatif antar
elemen-elemen yang memiliki kunci (key) yang sama. Algoritma sort stabil jika
dua record R dan S dengan kunci yang sama dan R berada pada posisi sebelum S ,
dan R harus tetap berada sebelum S setelah di sort. (Algoritma sort yang tidak
stabil dapat dibuat stabil dengan menambah angka tambahan pada key untuk
mempertahankan posisi)
Bubble Sort
Mungkin merupakan cara yang paling sederhana untuk mengurut data dalam suatu array,
tetapi merupakan cara yang lambat ! Ide dasarnya adalah membandingkan dua objek yang
bersebelahan (neighboring), menganti posisi keduanya juga berada pada urutan yang
tidak sesuai.
Suatu array a, dengan n elemen, breikut ini adalah kode dalam Pascal untuk bubble sort:
6
Big O notation (with a capital letter O, not a zero), also called Landau's symbol, is a symbolism used in
complexity theory, computer science, and mathematics to describe the asymptotic behavior of functions. It
indicates how fast a function grows or declines.
Indoprog 46
Algoritma & Pemrograman Hendra, S.T.
for j:= 1 to i do
if a[j] > a[j+1] then
begin
t:=a[j];
a[j]:=a[j+1];
a[j+1]:=t;
end;
Sebagaimana yang kita lihat, algoritma tersebut terdiri dari dua loop bersarang (nested
loops). Index j pada looping sebelah dalam menelusuri elemen pada array,
membandingkan isi pada array (at j and j+1), sedangkan loop sebelah luar menyebabkan
loop sebelah dalam berulangan menelusuri array.
Setelah loop pertama, elemen terbesar pasti berada pada posisi akhir dari array.
Setelah loop kedua, elemen nomor dua terbesar akan berada pada posisinya, dan
seterusnya.
Hal inilah yang menyebabkan loop sebelah dalam berkurang (i) pada setiap langkah,
karena kita tidak perlu lagi memeriksa elemen yang terbesar itu berulang.
Insertion Sort
Algoritma ini bekerja dengan menyisipkan data ke posisinya pada suatu daftar yang sudah
berurut. Algoritma ini akan berprilaku terbaik pada daftar yang sudah berurut O(n).
Insertion Sort merupakan algoritma tercepat untuk jumlah elemen yang sedikit, terutama
dibawah 10 elemen.
for i:= 2 to jd do
begin
idx = I;
idxvalue = a[idx];
while idxvalue < a[idx-1] do
begin
a[idx] := a[idx-1];
idx := idx – 1;
if idx = 1 then Exit;
end;
a[idx] := idxvalue;
end;
Selection sort
Selection sort bekerja dengan mencari data yang lebih kecil dan memindahkan data
tersebut ke posisinya. Algoritma sort ini membutuhkan O(n2).
for i := 1 to n do
begin
minidx := i;
for j := (i+1) to n do
if a[j] < a[minidx] then
minidx := j;
t := a[i];
Indoprog 47
Algoritma & Pemrograman Hendra, S.T.
a[i] = a[minidx];
a[minidx] = t;
end;
Shell Sort7
Algoritma ini ditemukan oleh Donald Shell. Algoritma berprilaku baik kalau data pada
array dalam keadaan hampir berurut. Konsepnya adalah membandingkan data dengan
jarak tertentu dalam array
Misalnya kita ada 8 data, maka gap akan mulai dari 4 s/d 1.
Pada gap = 4, maka :
Bandingkan data 1 dengan 5, 2 dengan 6, 3 dengan 7, 4 dengan 8.
Pada gap =3, maka :
Bandingkan data 1 : 4, 2 : 5, 3 : 6, 4 : 7, 5 : 8
Pada gap = 2, maka :
Bandingkan data 1 : 3, 2 : 4, 3 : 5, 4 : 6, 5 : 7, 6 : 8
Pada gap = 1, maka :
Bandingkan data 1 : 2, 2 : 3, 3 : 4, 4 : 5, 5 : 6, 6 : 7, 7 : 8
Latihan 5
1. What is sort algorithm ?
2. Suppose we have an array contain 8 data (7,8.5,4,2,1,3,6), please write down step
by step data changing when sorting using Bubble Sort, Insertion Sort, Shell Sort !
3. Explain how to generate random number in Pascal !
Latihan di Laboratorium
1. Write a program to generate 10000 random number, and then sort it using Bubble
Sort, Insertion Sort, Shell Sort, and Selection Sort examine how many data
comparing and data exchange.
program analisa_jumlah_perbandingan_dan_pergantian_data_bubble_sort;
var
arr : array[1..1000] of integer;
i,j,
jb,jg,temp: integer;
begin
7
Shell sort (or Shellsort) is one of the oldest sorting algorithms, named after its inventor D.L. Shell [Sh].
Indoprog 48
Algoritma & Pemrograman Hendra, S.T.
randomize;
for i := 1 to jd do
arr[i] := random(1000);
jb := 0;
jg := 0;
readln;
end.
Indoprog 49
Algoritma & Pemrograman Hendra, S.T.
Modul 6
Saya yakin anda sudah mengerti beberapa algoritma sort, sebagai seorang sarjana
komputer, anda harus mengerti dan mengetahui kelemahan dan kelebihan dari masing-
masing algoritma tersebut.
Algoritma search yang paling sederhana adalah linier search, dimana memiliki O(n), tetapi
dapat digunakan pada daftar yang tidak berurut.
Algoritma yang lebih baik adalah binary search yang berjalan pada O(log(n)). Tentu saja
secara nyata lebih baik dari linier search untuk jumlah data yang besar, tetapi
membutuhkan kondisi data dalam keadaan berurut.
Linier Search
Pada bidang computer science, algoritma search dikenal juga sebagai sequential search.
Cara kerjanya adalah memeriksa setiap elemen dalam daftar sampai menemukan yang
dicari. Linier search berjalan secara O(n), kalau data terdistribusi secara acak, dan rata-rata
n/2 perbandingan diperlukan. Kasus terbaik adalah kalau nilai yang dicari berada diposisi
pertama, kasus yang terburuk adalah kalau nilai yang dicari tidak ada dalam daftar,
sehingga dibutuhkan n perbandingan.
Keunggulan dari linier search adalah dapat digunakan pada daftar yang tidak berurut.
i := 1;
continue := true;
while (i <= jd) and continue do
begin
if a[i] = findvalue then
continue := false;
i := i + 1;
end;
if i <= jd Then
writeln('data found at : ',i)
else
writeln('data not found');
Binary Search
Binary Search mengasumsikan data adalah dalam keadaan berurut dan mengambil
manfaat dari karakteristik tersebut. Binary search adalah algoritma logaritmik dan
Indoprog 50
Algoritma & Pemrograman Hendra, S.T.
berjalan secara O(log n). Khususnya diperlukan 1 + log2 N iterasi untuk mendapatkan
jawaban, dan lebih cepat dari linier search.
continue := true;
while (first <= last) and continue do
begin
mid := (first + last) Div 2;
if (findvalue > arr[mid]) then
begin
jb := jb + 1;
first := mid + 1;
end
else
if (findvalue < arr[mid]) then
begin
jb := jb + 1;
last := mid - 1
end
else
continue := false;
end;
if first > last then
writeln('data not found')
else
writeln('data found at :',mid);
Interpolation search
Menyerupai bagaimana orang mencari sesuatu pada buku telepon. Dari pada
membandingkan data satu persatu seperti pada linier search, tentu saja pencarian
didasarkan kepada perkiraan letak data dari posisi data sekarang.
Berbeda dengan binary search yang selalu membagi sisa data separuh. Interpolation
search membuat perbandingan yang lebih sedikit dari O(log(log(N)), tidak selamanya
interpolation search lebih cepat dari binary search.
Seperti binary search, interpolation search membutuhkan data dalam keadaan berurut, dan
interpolation search bekerja dengan asumsi data terdistribusi merata.
low := 1;
high := jd;
while (a[high] >= findvalue) and (findvalue > a[low]) do
begin
j:= trunc((findvalue-a[low])/(a[high]-a[low])*(high-low))+low;
if findvalue > a[j] then
low := j+1
else
if findvalue < a[j] then
high := j-1
else
low := j;
Indoprog 51
Algoritma & Pemrograman Hendra, S.T.
end;
if a[low] = findvalue then
writeln('data found at :',low);
else
writeln('data not found')
Latihan 6
1. What is search algorithm ?
2. Explain how linear search work !
3. Explain how binary search work !
4. Explain how interpolation search work !
5. Can we use binary search in not ordered list ? How about linier search ? Why ?
6. Explain when interpolation search is better than binary search !
7. Suppose we have an array contain 10 data (1,3,6,7,8,9,10,11,12,13), please write
down step by step data comparing data which find value is 12 using Binary Search
and Interpolation Search !
Latihan di Laboratorium
1. Write a program to generate 10000 random number, and then sort it Shell Sort,
examine how many data comparing to find a value using linier search, binary
search and interpolation search.
program analisa_binary_search;
const
jd = 10000;
var
arr : array [1..10000] of integer;
j,t,gap,
findvalue,
first,last,
mid,jb : integer;
continue : boolean;
begin
{generate 10000 bilangan random}
randomize;
for j := 1 to jd do
arr[j] := random(jd);
{urut data dengan algoritma shell sort}
for gap := (jd div 2) downto 1 do
for j := 1 to (jd-gap) do
if arr[j] > arr[j+gap] then
begin
t := arr[j];
arr[j] := arr[j+gap];
arr[j+gap] := t;
end;
Indoprog 52
Algoritma & Pemrograman Hendra, S.T.
first:=1;
last :=jd;
jb := 0;
continue := true;
while (first <= last) and continue do
begin
mid := (first + last) Div 2;
if (findvalue > arr[mid]) then
begin
jb := jb + 1;
first := mid + 1;
end
else
if (findvalue < arr[mid]) then
begin
jb := jb + 1;
last := mid - 1
end
else
continue := false;
end;
if first > last then
writeln('data not found')
else
writeln('data found at :',mid);
writeln('jumlah perbandingan data :',jb);
readln;
end.
Modul 7
Pada contoh maupun tugas modul-modul sebelumnya kita telah banyak
menggunakan string (pada saat writeln), apakah sebenarnya string pada Pascal ?
Sebenarnya string adalah suatu array dari char, maksudnya anda dapat mengambil masing-
masing character dari suatu string dengan memperlakukannya sebagai elemen dari array.
Contoh :
Var
Nama : String;
Begin
Nama := 'Computer';
Writeln(Nama[1]);
Writeln(Nama[8]);
Nama[1] := 'K';
Writeln(Nama);
Indoprog 53
Algoritma & Pemrograman Hendra, S.T.
End.
Maka Nama[1] adalah huruf 'C', dan Nama[8] adalah huruf 'r'.
Sedangkan Nama[1] := 'K'; akan menyebabkan string nama berubah menjadi 'Komputer'.
Var
Nama : String;
Alamat : String[40];
Dalam hal ini variabel Nama dapat menampung maksimal 255 character, sedangkan untuk
variabel Alamat dapat menampung maksimal 40 character.
Jadi kita dapat mendeklarasikan variabel string dengan panjang tertentu, berapa
panjang maksimal yang diperbolehkan ?
Sebenarnya kalau kita tidak menentukan panjang string ketika deklarasi, maka otomatis
pascal menyediakan 255 character untuk string kita, dalam hal ini merupakan panjang
maksimal yang diperbolehkan untuk suatu type data string.
Syntax : length(s)
Contoh : : n:=length(s);
Misalnya s:='Apa kabar ?'; n akan berisi 11.
Syntax : copy(s,from,howmuch)
Contoh : : st:=copy(s,5,5);
Indoprog 54
Algoritma & Pemrograman Hendra, S.T.
Syntax : Pos(substr,s)
Contoh : : n:=pos('kabar','Apa kabar ?'); { n:=5; }
Jika substring tidak ditemukan, maka akan mengembalikan 0.
Syntax : val(strvar,numvar,errorcode)
Contoh : :
Var
s : string;
e : integer;
r : real;
Begin
Write('Enter a number : '); readln(s);
val(s,r,e);
if e<>0 then
writeln('Error at position : ',e);
else
writeln('That was : ',r:4:3);
end.
Contoh : :
var
s : string;
i : integer;
begin
write('Input an integer : '); readln(i);
str(i,s);
writeln('That was : ',s);
end.
Jika anda bekerja dengan type real, anda perlu melakukan pemformatan sebelum konversi
ke string.
Indoprog 55
Algoritma & Pemrograman Hendra, S.T.
Contoh : :
var
s : string;
r : real;
begin
write('Input a real : '); readln(r);
str(r:4:3,s);
writeln('That was : ',s);
end.
Syntax : concat(s1,s2,...,sn)
Contoh : st:=concat(s1,s2);
Insert, menyisip suatu string kedalam string lain dari posisi tertentu
Syntax : insert(source,target,index)
Contoh : :
var
s1, s2 : string;
begin
s1:='not ';
s2:='I do love you';
insert(s1,s2,6);
writeln(s2); { I do not love you }
end.
var
s : string;
begin
s:='I am not responsible for that !';
delete(s,6,3);
writeln(s); { I am responsible for that }
end.
Indoprog 56
Algoritma & Pemrograman Hendra, S.T.
Latihan 7
1. What is a string ?
Latihan di laboratorium
program ubah_kalimat_menjadi_huruf_kecil;
var
kalimat : string;
i : byte;
begin
write('Ketik sebuah kalimat :');
readln(kalimat);
for i := 1 to length(kalimat) do
if kalimat[i] in ['A'..'Z'] then
kalimat[i] := chr(ord(kalimat[i])+32);
writeln(kalimat);
readln;
end.
9. Make a text animation. Display a sentence in the center of the screen. And scroll it Left
To Right !
program putar_kiri_ke_kanan;
Uses CRT;
Indoprog 57
Algoritma & Pemrograman Hendra, S.T.
var
kalimat : string;
i : byte;
begin
write('Ketik sebuah kalimat :');
readln(kalimat);
repeat
kalimat:=copy(kalimat,length(kalimat),1) +
copy(kalimat,1,length(kalimat)-1);
until keypressed;
readln;
end.
10. Make a text animation. Display a sentence in the center of the screen. And scroll it
Right To Left !
Latihan di rumah
Make a simple calculator that can perform addition, substraction User input the equation
then press enter. You should give the answer. Example :
Input : 5+10
Output : 15
program kalkulator_ekspresi;
var
ekspresi : string;
temp1,temp2 : string;
val1,val2,
result : real;
numcode : integer;
begin
Indoprog 58
Algoritma & Pemrograman Hendra, S.T.
end.
Indoprog 59
Algoritma & Pemrograman Hendra, S.T.
Modul 8
Hallo, masihkah anda ingat bahwa pascal adalah bahasa pemrograman yang terstruktur,
yang artinya program yang kita buat harus terstruktur dan teratur. Salah satu usaha untuk
usaha kearah sana adalah memecah program kita menjadi sub-sub program dengan
menggunakan procedure dan function.
uses crt;
begin
clrscr;
writeln('ABC');
writeln('Press any key when ready ...');
readkey;
writeln('Hey, let''s pause !');
writeln('Press any key when ready ...');
readkey;
writeln('Pause again !');
writeln('Press any key when ready ...');
readkey;
end.
uses crt;
procedure pause;
begin
writeln('Press any key when ready ...');
readkey;
end;
begin
clrscr;
writeln('ABC');
pause;
writeln('Hey, let''s pause !');
pause;
writeln('Pause again !');
pause;
end.
Indoprog 60
Algoritma & Pemrograman Hendra, S.T.
(* Main program*)
Var
I : Byte; (*local variable*)
Begin
Writeln(Upper('Prime number from 1 to 100');
Writeln(Replicate('-',30);
For I := 1 To 100 do
If IsPrima(I) Then
Write(I : 4);
End.
Indoprog 61
Algoritma & Pemrograman Hendra, S.T.
Pada program utama, procedure maupun function dapat memiliki variabel masing-masing,
dimana ruang lingkup pemakaiannya hanya berlaku pada program utama, procedure
maupun function dimana variabel tersebut dideklarasi.
Contoh :
procedure foo;
var a : byte;
begin
a:=10;
writeln(a);
end;
Contoh:
var
b : byte; { global variabel }
procedure foo;
var a : byte;
begin
a:=10;
b:=15; { This is legal }
end;
Jadi variabel global harus dideklarasi diatas semua procedure maupun function.
Bagaimana kalau ada variabel local dan variabel global yang sama namanya ?
Global variabel tersebut akan di override. Pada suatu program yang terstruktur dengan
baik, usahakan untuk menggunakan variabel Global seminimal mungkin.
Contoh :
uses crt;
var
a : byte; { This is the global variable }
Indoprog 62
Algoritma & Pemrograman Hendra, S.T.
procedure foo;
var
a : byte; { This is local variable }
begin
a:=15;
writeln('foo is ',a); { Will print 15}
end;
begin
a:=10;
writeln(a); { Will print 10}
foo;
writeln(a); { Still print 10}
end.
Dari tadi anda menyebutkan procedure dan function, apa sih bedanya ?
Pada prinsipnya function mengembalikan nilai.
Indoprog 63
Algoritma & Pemrograman Hendra, S.T.
begin
makewin(1,1,30,8);
makewin(10,10,60,18);
end.
var
x : byte;
begin
writeln('Enter a value : '); readln(x);
writeln(x,'! is ',factorial(x));
end.
Kalau kita bisa mengirim nilai kedalam procedure maupun function, apakah bisa
juga sebaliknya ?
Pada contoh diatas nilai parameter dikirim secara PASS BY VALUE. Kita dapat juga
mengirim parameter secara PASS BY REFERENCE dengan menambah Var pada saat
deklarasi masing-masing parameter, dalam hal ini yang dikirim kedalam procedure
maupun function adalah alamat dari variabel tersebut.
Contoh :
Indoprog 64
Algoritma & Pemrograman Hendra, S.T.
end; end;
var var
x : byte; x : byte;
begin begin
x:=15; x:=15;
writeln(x); {15} writeln(x); {15}
foo(x); foo(x);
writeln(x); {15} writeln(x); {10}
end. end.
Latihan 8
1. Explain the syntax of procedures and functions.
3. Explain the differences between pass by value and pass by reference. Give an example.
Latihan di laboratorium
7. Make a guessing number game using functions and procedures. You hold a random
number between 1 to 100, and user have to guess. If the guess is smaller than it suppose
to be, you should say "lower". If the guess is higher, say "higher". If it is the same, then
user wins. User has 8 chances to guess. If chances are used up, game over. Score is
number of chances left times 10. If user wins, get another number and go on. Don't
forget to restore the chances back to 8. If game over, ask him/her to play again.
Latihan di rumah
Indoprog 65
Algoritma & Pemrograman Hendra, S.T.
Input : 1537000
Output : Satu juta lima ratus ribu tiga puluh tujuh ribu rupiah.
program baca_bilangan_sampai_ratusan;
(*program utama*)
begin
writeln(BacaBilangan(200));
readln;
end.
Indoprog 66
Algoritma & Pemrograman Hendra, S.T.
Modul 9
Pada modul-modul sebelumnya kita telah membahas algoritma sort, yaitu bubble sort,
selection sort, insertition sort, dan shell sort. Sebenarnya masih banyak algoritma sort
yang telah diciptakan oleh para ahli. Pada pertemuan ini kita akan membahas algoritma
Quick sort8 yang mana diakui sebagai yang tercepat didunia.
Tetapi sebelum kita akan membahas fasilitas rekursif yang tersedia pada bahasa Pascal.
5! = 4! * 5
4! = 3! * 4
2! = 1! * 2
1! = 1
var
x : byte;
begin
writeln('Enter a value : '); readln(x);
writeln(x,'! is ',factorial(x));
end.
Sesuatu hal yang perlu diperhatikan dalam pembuatan fungsi rekursif adalah harus adanya
suatu titik akhir, sehingga rekursif dapat selesai.
Quick Sort
8
Quicksort was invented by C.A.R. Hoare in 1960, and was published in Computer Journal in 1962
Indoprog 67
Algoritma & Pemrograman Hendra, S.T.
Algoritma ini merupakan metode pengurutan data yang tercepat didunia (n log n), yang
ditemukan oleh E. Hoare. Algoritma ini menggunakan metode rekursif.
Prinsip kerjanya adalah membagi data menjadi dua bagian dengan data ditengah sebagai
titik pivot (divide-and-conquer algorithm). Pindahkan data sisi kiri yang lebih besar dari
pada pivot dengan data sisi kanan yang lebih kecil dari pada pivot.
procedure swap(var data1,data2 : integer);
var
temp : integer;
begin
temp := data1;
data1:= data2;
data2:= temp;
end;
while left<=right do
begin
while Data[left] < pivot do left:=left+1; { Parting for left }
while Data[right] > pivot do right:=right-1;{ Parting for right}
if left<=right then { Validate the change }
begin
swap(Data[left],Data[right]);
left:=left+1;
right:=right-1;
end;
end;
if right>lower then qsort(lower,right); { Sort the LEFT part }
if upper>left then qsort(left ,upper); { Sort the RIGHT part }
end;
Pemakaian : qsort(1,NumberOfData);
Contoh program menggunakan procedure dan function dengan implementasi Quick Sort
dan Interpolation Search.
program urut_data_qsort_dan_cari_data_interpolation_search;
(*oleh : hendra soewarno*)
const
jd = 10000;
var
Data : array[1..jd] of integer;
Indoprog 68
Algoritma & Pemrograman Hendra, S.T.
data1:= data2;
data2:= temp;
end;
while left<=right do
begin
while data[left] < pivot do left:=left+1; { Parting for left }
while data[right] > pivot do right:=right-1;{ Parting for right}
if left<=right then { Validate the change }
begin
swap(data[left],data[right]);
left:=left+1;
right:=right-1;
end;
end;
if right>lower then qsort(lower,right); { Sort the LEFT part }
if upper>left then qsort(left ,upper); { Sort the RIGHT part }
end;
procedure grandom;
var
i : integer;
begin
randomize;
for i := 1 to jd do
data[i] := random(jd);
end;
Indoprog 69
Algoritma & Pemrograman Hendra, S.T.
else
isearch := -1;
end;
(*Program Utama*)
var
j,findvalue,posisi : integer;
begin
readln;
end.
Latihan 9
1. Explain how recursive.
2. Suppose we have an array contain 8 data (7,8.5,4,2,1,3,6), please write down step
by step data changing when sorting using Quick Sort!
Latihan di Laboratorium
1. Make a recursive algorithm of fibonacci series !
program mencari_suku_fibonacci_dengan_rekursif;
function fibo(n:integer):longint;
begin
if n < 3 then
fibo := 1
else
fibo := fibo(n-1)+fibo(n-2);
end;
begin
writeln(fibo(3));
readln;
end.
Indoprog 70
Algoritma & Pemrograman Hendra, S.T.
2. Write a program to generate 10000 random number, and then sort it using Quick
sort examine how many data comparing and data exchange.
Indoprog 71
Algoritma & Pemrograman Hendra, S.T.
Modul 10
Hallo, kita akan melanjutkan pembahasan tentang type ciptaan yang akan membuat
program anda lebih terstruktur didalam pengolahan data yang dikenal dengan istilah
Record type.
Dari tabel diatas kita dapat menyusun variabel data sebagai berikut :
NIS : String[9];
NAMA : String[30];
Tugas, Teori, Praktek : Byte;
Misalnya jumlah siswa adalah 10 orang, maka kita perlu mendeklarasikan variabel
tersebut menjadi array:
Var
NIS : Array [1..10] Of String[9];
NAMA : Array [1..10] Of String[30];
Tugas, Teori, Praktek : Array [1..10] Of Byte;
Type
TSiswa = Record
NIS : String[9];
NAMA : String[30];
Tugas, Teori, Praktek : Byte;
End;
Var
Siswa : Array [1..10] of TSiswa;
Indoprog 72
Algoritma & Pemrograman Hendra, S.T.
Siswa[1].Nis := "02001";
Siswa[1].Nama := "Hendra Soewarno";
Siswa[1].Tugas := 80;
Siswa[1].Teori := 90;
Siswa[1].Praktek := 90;
Contoh :
For I := 1 To 10 Do Begin
Write('No. Induk siswa :'); Readln(Siswa[I].Nis);
Write('Nama siswa :'); Readln(Siswa[I].Nama);
Write('Tugas :'); Readln(Siswa[I].Tugas);
Write('Teori :'); Readln(Siswa[I].Teori);
Write('Praktek :'); Readln(Siswa[I].Praktek);
End;
For I := 1 To 10 Do Begin
With Siswa[I] Do Begin
Rata := (Tugas+Teori+Praktek)/3;
Write(Nis:9,' ');
Write(Nama:30,' ');
Write(Tugas:6:2,' ');
Write(Teori:6:2,' ');
Write(Praktek:6:2,' ');
Write(Rata:6:2);
End;
End;
Indoprog 73
Algoritma & Pemrograman Hendra, S.T.
Indoprog 74
Algoritma & Pemrograman Hendra, S.T.
Latihan 10
1. Explain what is Record Type and give an example !
2. Explain what With … End block function !
Latihan di Laboratoriun
User could : add new student, edit existing student, view student in a
list, delete the record, sort the record according to :
* Quiz
* Midtest
* Finaltest
* Overall value
(Overall value = 0.1*Quiz + 0.4*Mid + 0.5*Final)
You must :
* Make simple menu.
* At least be able to handle 200 students.
Indoprog 75
Algoritma & Pemrograman Hendra, S.T.
Indoprog 76
Algoritma & Pemrograman Hendra, S.T.
Modul 11
Hallo, bagaimana apakah masih semangat belajar ? Pada pertemuan hari ini dan
selanjutnya kita akan membahas tentang File. Pada dasarnya pengolahan file pada pascal
dibagi atas dua yaitu text file dan binary file.
Baiklah, pada pascal sebelum kita mulai bekerja dengan file, kita perlu mendeklarasikan
suatu variable untuk file tersebut, misalnya untuk text file kita dapat mendeklarasikannya
sebagai berikut :
var
F : text;
Dalam hal ini F adalah sebuah variable untuk text file, selanjutnya adalah kita perlu meng-
asosiasikan variable tersebut dengan suatu nama file, contoh:
assign(F,'README');
Apakah setelah itu kita dapat langsung bekerja dengan file tersebut ?
Oh, belum-belum, selanjutnya anda perlu membuka file tersebut dengan menggunakan
perintah reset, contoh :
reset(F);
Dan selanjutnya anda dapat membaca dari file tersebut baris-perbaris ke variable string,
seperti :
readln(F, s);
Dalam hal ini s adalah variable string yang akan menampung pembacaan tersebut.
Apakah kita dapat menentukan baris nomor berapa yang akan dibaca ?
Dalam hal ini tidak dapat dilakukan, karena text file hanya dapat diolah secara sequential,
artinya kita hanya dapat membaca baris ketiga, setelah membaca baris pertama dan kedua.
Kalau begitu, bagaimana saya bisa tahu bahwa pembacaan telah selesai ?
Untuk keperluan tersebut telah disediakan fungsi bantu EOF, dimana fungsi ini akan
bernilai True kalau pembacaan telah mencapai akhir dari file, contoh :
Indoprog 77
Algoritma & Pemrograman Hendra, S.T.
close(F);
Jadi contoh kongkrit membaca suatu text file dari awal sampai akhir dari file adalah :
uses crt;
var
F : text;
s : string;
begin
clrscr;
write('Input file name to read : '); readln(s);
assign(F,s); { associate it }
reset(F); { open it }
while not EOF(F) do { read it until it's done }
begin
readln(F,s);
writeln(s);
end;
close(F); { close it }
end.
Mudah bukan ?
rewrite(F);
Berikut ini adalah contoh menyimpan apa yang anda ketik ke sebuah text file :
uses crt;
var
F : text;
s : string;
begin
clrscr;
write('Input file name to create : '); readln(s);
assign(F,s); { associate it }
rewrite(F); { create it }
repeat
readln(s); { write it until done }
if s='' then break;
writeln(F,s);
until true;
close(F); { close it }
end.
Indoprog 78
Algoritma & Pemrograman Hendra, S.T.
Mengenai close, apakah wajib dilakukan pada setiap akhir operasi file ?
Ya, hal itu harus dilakukan, terutama pada proses penulisan file, pada dasarnya system
operasi menyediakan suatu buffer untuk proses I/O file, tujuan pemakaian buffer adalah
untuk mempercepat proses I/O. Jadi kalau kita menulis data ke file, hal tersebut tidak
secara otomatis dilakukan oleh system operasi, jadi pastikan penulisan isi buffer ke file
dengan close.
Jika saya perhatikan, kalau kita membuka suatu file, dan file tersebut belum ada,
maka akan terjadi runtime error, bagaimana caranya menangani masalah ini ?
Ha-ha-ha, jangan takut, turbo pascal telah mengantisipasi masalah ini dengan mematikan
sementara I/O checking, dan selanjutnya kita dapat memeriksanya dengan Ioresult, jika
bernilai 0, artinya tidak ada error.
Contoh :
uses crt;
var
F : text;
s : string;
begin
clrscr;
write('Input file name to read : '); readln(s);
assign(F,s); { associate it }
{$I-}
reset(F); { open it }
{$I+}
if IOresult<>0 then
begin
writeln('Error encountered in reading file ',s);
halt;
end;
Sebenarnya, selain 0, IOResult dapat berisi nilai lain yang memiliki arti, perhatikan contoh
berikut :
uses crt;
var
F : text;
s : string;
begin
clrscr;
write('Input file name to read : '); readln(s);
assign(F,s); { associate it }
{$I-}
reset(F);
{$I+}
n:=IOResult;
if n<>0 then
begin
writeln('Error encountered in reading file ',s);
case n of
2: writeln('File not found');
3: writeln('Path not found');
4: writeln('Too many open files');
Indoprog 79
Algoritma & Pemrograman Hendra, S.T.
Latihan 11
1. Make a program to convert the content of a text file to uppercase, lowercase, and
Sentence case.
2. Make a program to count number of word and line in a text file.
Tantangan:
Write a 'readme' program that could access just every text file. You may limit the
maximum number of lines of the file say 400 lines.
Indoprog 80
Algoritma & Pemrograman Hendra, S.T.
Modul 12
Hallo, kali ini masih tentang file, pada pertemuan sebelumnya kita telah bekerja dengan
text file, dan saya yakin anda telah cukup memahaminya, dan kali ini kita akan membahas
tentang binary file.
Untuk bekerja dengan Typed file, anda perlu mendeklarasikan record yang berlaku
sebagai format untuk file tersebut, contoh :
type
Temployee = record
name : string[20];
address : string[40];
phone : string[15];
age : integer;
salary : longint;
end;
Selanjutnya kita dapat mendeklarsikan variable untuk file dengan format tersebut :
var
F : file of Temployee;
Selanjutnya langkah pengolahan Typed file menyerupai pemakaian pada text file :
1. Meng-asosiasikan variable file ke nama file tertentu dengan perintah assign
2. Buka file tersebut dengan 'reset', atau buat yang baru dengan 'rewrite'.
3. Untuk membacanya gunakan perintah 'read', dan menulisnya dengan 'write'
4. Tutup file tersebut dengan 'close'.
Indoprog 81
Algoritma & Pemrograman Hendra, S.T.
uses crt;
type
Temployee = record
name : string[20];
address : string[40];
phone : string[15];
age : integer;
salary : longint;
end;
var
F : file of Temployee;
c : char;
r : Temployee;
s : string;
begin
clrscr;
write('Input file name to record databases : '); readln(s);
assign(F,s); { Associate it }
rewrite(F); { Create it }
repeat
clrscr;
write('Name = '); readln(r.name); { Input data }
write('Address = '); readln(r.address);
write('Phone = '); readln(r.phone);
write('Age = '); readln(r.age);
write('Salary = '); readln(r.salary);
close(F);
end.
seek(F,recordno);
Contoh pemakaiannya :
Istilah pengolahan file yang dapat mengakses sembarang posisi record, dikenal sebagai
istilah "Random File Access".
Indoprog 82
Algoritma & Pemrograman Hendra, S.T.
Kalau begini, saya perlu mengetahui jumlah record yang telah ada, dan bagaimana
caranya ?
Jangan takut, pascal ada menyediakan sebuah fungsi yaitu filesize, contoh :
totalrecord := filesize(f);
n:=filepos(F);
program data_record_terstruktur;
(*oleh : hendra soewarno*)
uses crt; reset(FSiswa);
{$I+}
Type if IoResult<>0 then
rewrite(FSiswa);
TSiswa = Record end;
NIS : String[9];
NAMA : String[30]; procedure tutupfile;
Tugas, Teori, Praktek : integer; begin
End; close(FSiswa);
end;
(*variabel global*)
var procedure bacasiswa(I : integer);
Siswa : TSiswa; begin
FSiswa : File of TSiswa; Writeln('Record ke-',I);
With Siswa do
procedure bukafile(fname : string); begin
begin Nis := '';
assign(FSiswa,fname); Write('No. Induk siswa :'); Readln(Nis);
{$I-} If Nis <> '' Then
Indoprog 83
Algoritma & Pemrograman Hendra, S.T.
Indoprog 84
Algoritma & Pemrograman Hendra, S.T.
begin end;
tampilsiswa(Posisi); end;
Writeln('Diubah menjadi');
bacasiswa(Posisi); (*Program utama*)
Seek(FSiswa,Posisi); var
Write(FSiswa,Siswa); Pilihan : integer;
end; Continue: Boolean;
end; begin
Continue := True;
procedure proseshapusdata; BukaFile('C:\Siswa.rec');
var Repeat
TNis : String[9]; Clrscr;
Posisi: integer; Writeln('Menu Utama');
Tanya : Char; Writeln('1. Tambah Data');
begin Writeln('2. Perbaiki Data');
write('Nis yang ingin dihapus :'); Writeln('3. Hapus Data');
readln(TNis); Writeln('4. Daftar Nilai');
Posisi := caridata(TNis); Writeln('5. Selesai');
If Posisi = -1 Then Write('Pilihan Anda :');
Writeln('Data tidak ditemukan !') Readln(Pilihan);
else Case Pilihan of
begin 1 : prosestambahdata;
Write('Apakah yakin dihapus [Y/T] :'); 2 : prosesperbaikidata;
repeat 3 : proseshapusdata;
Tanya := Upcase(Readkey); 4 : tampildaftarnilai;
until Tanya in ['Y','T']; 5 : continue := false;
if Tanya = 'Y' Then end;
begin Until not Continue;
hapusdata(posisi); TutupFile;
Writeln('Proses hapus berhasil !'); end.
end;
Latihan 12
1. Give explanation what is the different between Text file and File of records.
2. Extended program_data_terstruktur which only can store unique data for Nis, and
use Quick Sort algorithm.
3. Write a program to store your friend name, address, telephone number in a Typed
file. Provide it add, edit, delete, sort, and search function.
Indoprog 85
Algoritma & Pemrograman Hendra, S.T.
Modul 13
Akhirnya kita sampai juga pada pembahasan tentang Untyped file.
Sebenarnya cara pengolahan Untyped file mirip dengan Typed file, dalam hal ini masing-
masing record berukuran 1 integer.
var
F : file;
Sedangkan fungsi 'Assign', 'Reset', 'Rewrite', and 'Close' adalah tetap sama. Sedangkan
perintah 'read' dan 'write' harus diganti dengan 'blockread' dan 'blockwrite'.
blockread (f,buffer,count,actual);
blockwrite(f,buffer,count,actual);
dimana :
f , adalah variable file.
Buffer, adalah variable buffer dalam bentuk array.
count , adalah jumlah integer yang akan dibaca/tulis.
Actual, adalah jumlah integer yang berhasil dibaca/tulis.
var
buffer : array[1..2048] of integer;
count, actual : word;
f : file;
count:=sizeof(buffer);
blockread(f,buffer,count,actual);
Variabel actual, akan berisi jumlah integer yang benar-benar berhasil dibaca dari file,
demikian juga untuk proses 'blockwrite' :
count:=sizeof(buffer);
blockwrite(f,buffer,count,actual);
Contoh berikut ini akan mencoba membaca 512 integer dari file.
blockread(f,buffer,512,actual);
Contoh kongkrit :
Indoprog 86
Algoritma & Pemrograman Hendra, S.T.
Latihan 13
1. Make a function to detect whether it is a text file or not. Return true if it does.
Indoprog 87
Algoritma & Pemrograman Hendra, S.T.
Modul 14
Unit apa yang perlu saya cantumkan pada bagian uses, kalau saya ingin melakukan
pengaturan layar ?
Turbo Pascal menyediakan suatu unit CRT, yang berisi perintah-perintah pengaturan layar
seperti membersihkan layar, mengatur warna tulisan, warna background, memindahkan
posisi cursor, mode layar, dan membuat window
Ok, saya sudah tahu perintah Clrscr, apa perintah untuk mengatur warna tulisan ?
Pada prinsipnya ada dua cara untuk mengatur warna tulisan yang dicetak dengan perintah
Write dan Writeln, yang pertama adalah perintah :
TextColor(nomor warna);
Hallo, anda belum memberitahukan kepada saya nomor warna yang dapat saya
gunakan !
Baiklah, berikut ini adalah nomor warna yang mewakili masing-masing warna: 0 (black),
1 (blue), 2 (green), 3 (cyan), 4 (red), 5 (magenta), 6 (brown), 7 (lightgray), 8 (darkgray),
(9) lightblue, 10 (lightgreen), 11 (lightcyan), 12 (lightred), 13 (lightmagenta), 14 (yellow),
15 (White).
Saya pernah melihat tulisan warna berkedip-kedip, dapatkah hal tersebut dilakukan
?
Anda dapat saja melakukan hal tersebut dengan menambahkan angka 128 pada nomor
warna yang anda inginkan, misalnya :
TextColor(4 + 128);
Writeln('Merah dan berkedip-kedip');
Atau :
TextColor(Red + Blink);
Writeln('Merah dan berkedip-kedip');
Pada prinsipnya anda dapat menggunakan konstanta dari masing-masing nomor warna
seperti black, blue, green, dll, untuk menggantikan pemakaian nomor.
Ok, saya sudah mengerti, bagaimana pula dengan warna latar belakang ?
Pengaturan warna latarbelakang dapat menggunakan perintah :
TextBackground(nomor warna);
Tadi anda ada menyinggung tentang memindahkan posisi cursor, apa gunanya dan
apa perintahnya ?
Pada lingkungan dos, posisi tulisan dilayar dicetak berdasarkan posisi cursor yang sedang
aktif, misalnya sekarang posisi cursor berada di kolom 10, baris 5, maka perintah :
Indoprog 88
Algoritma & Pemrograman Hendra, S.T.
Jadi misalnya anda ingin mencetak tulisan tersebut pada kolom 20, baris 13, maka anda
harus memindahkan cusor keposisi kolom 20, baris 13, diikuti dengan perintah pencetakan
tulisan tersebut, contoh :
GotoXY(20,13);
Writeln('Tulisan ini dicetak mulai kolom 20, di baris 13);
GotoXY(5,5);
Write('Turbo');
GotoXY(WhereX+10,3);
Write('Pascal');
Ngomong-ngomong, berapa sih jumlah kolom dan baris pada layar normal ?
Normalnya 80 kolom, 25 baris.
Saya pernah melihat tulisan layar komputer di bandara Polonia yang lebih besar
dari tulisan normal, bagaimana hal tersebut dapat dilakukan ?
Oh, ya. Hal tersebut dapat dilakukan dengan mengatur Mode layar dengan perintah :
TextMode(CO40);
Dan
TextMode(CO80);
Untuk menormalkannya.
Contoh :
Uses CRT;
begin
TextMode(CO40);
Writeln('A Real BIG Characters on screen !');
Readln;
TextMode(CO80);
Writeln('Back to normal');
Readln;
end.
Dimana x1, y1 adalah koordinat kiri atas dan x2, y2 adalah koordinat kanan bawah.
Contoh :
uses Crt;
begin
ClrScr;
WriteLn('Creating a window from 30,10 to 50,20');
Window(30,10,50,20);
WriteLn('We are now writing in this small window we just created, we'+
'can''t get outside it when writing long lines like this one');
Write('Press any key to clear the window');
Indoprog 89
Algoritma & Pemrograman Hendra, S.T.
ReadKey;
ClrScr;
Write('The window is cleared, press any key to restore to fullscreen');
ReadKey;
{Full Screen is 80x25}
Window(1,1,80,25);
Clrscr;
Writeln('Back in Full Screen');
end.
Sound(frekuensi);
Delay(milidetik);
NoSound;
Contoh :
Sound(500);
Contoh :
Sound(500);
NoSound;
Contoh :
Sound(500);
Delay(1000);
NoSound;
Daftar Frekuensi
Nada Frekuensi
C 262
D 294
E 330
F 350
G 392
A 440
B 494
Ok, masalah ini sering saya dengar dari orang yang baru belajar pascal. Memang pascal
adalah bahasa yang sangat ketat dalam variabel dan type data. Berikut ini saya akan
menerangkan konvensi perhitungan dan type data yang dihasilkan :
Indoprog 90
Algoritma & Pemrograman Hendra, S.T.
Latihan 14
1. What is TextColor and TextBackGround for ?
Indoprog 91
Algoritma & Pemrograman Hendra, S.T.
Modul 15
Hallo, ketemu lagi, apakah anda telah siap ? Ok saya rasa siap, pada hari ini kita akan
membahas beberapa fasilitas yang tersedia pada pascal dan akan membantu membuat
program anda menjadi lebih terstruktur dan mudah di maintenance.
Kalau begitu artinya, walaupun tidak mengunakan fasilitas kita tetap dapat membuat
program ?
Benar, tetapi sebagai programmer yang baik, tentu saja anda harus mampu menghasilkan
program yang terstruktur dan mudah dimaintenance.
Contoh :
Uses crt;
Const {deklarasi konstanta}
PPN = 0.1; {PPN 10%}
Var
Penjualan, SetelahPPN : Real;
Begin
Write('Nilai penjualan :') Readln(Penjualan);
SetelahPPN = NilaiPenjualan * (1+PPN);
Writeln('Nilai penjualan setelah PPN adalah ', SetelahPPN:10:2);
End.
Kalau begitu bukankan sama saja dengan menulis langsung Setelah PPN =
NilaiPenjualan * (1+0.1); dan apa hubungannya dengan membuat program kita
lebih mudah di maintenance ?
Pada prinsipnya sama, tetapi coba anda bayangkan, misalnya terjadi perubahan nilai PPN
menjadi 12.5%, berdasarkan contoh diatas kita tinggal mengubah
Dalam hal ini anda tidak perlu mengubah isi program, sehingga maintenance program
anda menjadi mudah.
const
havetry=10;
s: array[0..18] of string=
('hello', 'mouse', 'hacher', 'programmer', 'killer', 'teacher',
'splotchier',
'butcher', 'computer', 'pascal', 'house', 'poor', 'children', 'museum',
'security', 'spillway', 'stupidity', 'corrigenda', 'freebooter');
Indoprog 92
Algoritma & Pemrograman Hendra, S.T.
Pada contoh diatas konstanta Gaji yang dideklarasikan beserta type dapat berprilaku
sebagai variabel, sehingga nilainya boleh diubah didalam program.
uses crt;
var
c : char;
vowel : set of 'A','E','I','O','U'; {deklarasi variabel Set}
letter : set of 'A'..'Z'; {range A s/d Z}
begin
write('Enter a vowel');
repeat
c:=upcase(readkey);
until c in vowel;
write('Enter a letter');
repeat
c:=upcase(readkey);
until c in letter;
end.
uses crt;
var
c : char;
begin
write('Yes or no (Y/N) ?');
repeat
c:=upcase(readkey);
until c in ['Y','N'];
end.
Dapatkah anda menjelaskan lebih lanjut apa itu type ciptaan dari sisi penerapan
pada program, dan kalau bisa kasih contoh dong !
Indoprog 93
Algoritma & Pemrograman Hendra, S.T.
Sebagaimana kita ketahui, pascal menyediakan beberapa ordinal type seperti shortint,
integer, longint, integer, char dan boolean. Didalam pemakaian type ini kadang-kadang
kurang sesuai dengan kebutuhan, misalnya kita ingin mengolah data nilai siswa yang
kemungkinan nilainya berkisar 0 s/d 100. Pada prinsipnya kita dapat menggunakan type
integer untuk keperluan tersebut.
Contoh :
Var
Fisika : Integer;
Type
Nilai = 0..100;
Var
Fisika : Nilai;
Dalam hal ini type ciptaan seperti ini disebut sebagai Subrange.
Type
Nilai = 0 .. 100;
Dalam hal ini sebenarnya type nilai merupakan subrange dari type ordinal yang telah ada.
Adakah type ciptaan lain yang dapat membuat program kita menjadi lebih
terstruktur ?
Ya, masih ada, salah satunya adalah type substitusi, sesuai dengan namanya, type ini
sebenarnya adalah pemberian nama terhadap type berstruktur seperti array dan string,
sehingga selanjutnya kita dapat menggunakan nama tersebut dalam deklarasi variabel.
Contoh :
Type
STRING30 = String[30];
Var
Nama : STRING30;
Var
Nama : STRING30;
Contoh :
Indoprog 94
Algoritma & Pemrograman Hendra, S.T.
Var
Today : Integer;
Begin
Today := 7;
If Today = 4 then Writeln('Jangan lupa sembayang DATUK');
End.
Bandingkan dengan :
Type
DOW = (senin, selasa, rabu, kamis, jumat, sabtu, minggu);
Var
Today : DOW;
Begin
Today := minggu;
If Today = kamis then Writeln('Jangan lupa sembayang DATUK');
End.
Contoh :
Type
DOW = (senin, selasa, rabu, kamis, jumat, sabtu, minggu);
Var
Today : DOW;
Begin
Today := minggu;
Today := Pred(Today); {sabtu}
Inc(Today); {minggu}
End.
Latihan 15
1. Explain what is constants in pascal ?
Indoprog 95
Algoritma & Pemrograman Hendra, S.T.
ROUND(Real)
FUNCTION untuk menghasilkan data type INTEGER dari suatu REAL dengan
memperhatikan aturan pembulatan.
TRUNC(REAL)
FUNCTION untuk mengambil bagian INTEGER dari suatu REAL.
ORD(Char);
FUNCTION untuk menghasilkan data type Integer dari suatu Character.
CHR(Integer);
FUNCTION untuk menghasilkan data type Character dari suatu Integer.
ABS(Numerik);
FUNCTION untuk mengambil harga mutlak suatu nilai
FRAC(Real);
FUNCTION untuk mengambil bagian pecahan dari suatu REAL
INT(Real);
FUNCTION untuk mengambil bilangan bulat dari suatu REAL
SQR(Real);
FUNCTION untuk menghasilkan nilai kuadrat suatu bilangan
SQRT(Real)
FUNCTION untuk menghasilkan akar kwadrat suatu bilangan
COS(Real)
FUNCTION untuk menghasilkan Cosinus suatu sudut
SIN(real);
FUNCTION untuk menghasilkan Sinus suatu sudut (dalam radian PI/180)
ARCTAN(real);
FUNCTION untuk menghasilkan sudut yang diketahui nilai tangennya
PI;
FUNCTION untuk menghasilkan nilai pi (3.1415926...)
LN(Real);
FUNCTION untuk menghasilkan logaritma natural dari suatu nilai
EXP(real);
FUNCTION untuk menghasilkan eksponensial dari suatu nilai.
Indoprog 96
Algoritma & Pemrograman Hendra, S.T.
Lampiran
The N by N Queens Problem
In chess, a queen can move as far as she pleases, horizontally, vertically, or diagonally. A
chess board has 8 rows and 8 columns. The standard 8 by 8 Queen's problem asks how to
place 8 queens on an ordinary chess board so that none of them can hit any other in
one move.
Besides being an amusing puzzle this problem is interesting because kids love it
and it's a great teaching tool in the upper grades of Elementary School. It also provides
great programming exercises.
One solution - the prettiest in my opinion - is given in the figure nearby. It turns out that
there are 12 essentially distinct solutions. (Two solutions are not essentially distinct if you
can obtain one from another by rotating your chess board, or placing in in front of a
mirror, or combining these two operations.)
Even though the solution shown here looks pretty natural and straightforward, it is not that
simple to find any others, or even this one if I hadn't displayed it here. As an exercise you
may want to find the other solutions. If you are impatient, you can look them up by
clicking here. Our particular solution is configuration 10.
The interactive applet on this page let's you find solutions of the N by N Queen's Puzzle
for arbitrary values of N. You may find it interesting to watch your computer find the
solutions.
The Algorithm
The program finds solutions by starting with a queen in the top left corner of the chess
board. It then places a queen in the second column and moves it until it finds a place
where it cannot be hit by the queen in the first column. It then places a queen in the third
column and moves it until it cannot be hit by either of the first two queens. Then it
continues this process with the remaining columns. If there is no place for a queen in the
current column the program goes back to the preceding column and moves the queen in
that column. If the queen there is at the end of the column it removes that queen as well
and goes to the preceding column. If the current column is the last column and a safe
place has been found for the last queen, then a solution of the puzzle has been found. If the
current column is the first column and its queen is being moved off the board then all
Indoprog 97
Algoritma & Pemrograman Hendra, S.T.
possible configurations have been examined, all solutions have been found, and the
algorithm terminates.
When a solution has been found it can be displayed in its own window. Currently the
program does not eliminate solutions that can be obtained from previous ones by rotations
or reflections.
A measure of the difficulty of the problem is given by the number of moves the
above algorithm takes to find the first solution. This number of course tends to go
up as as N increases, but it does not increase monotonically. The Table nearby gives
the required number of steps. It is ordered by increasing difficulty. So the easiest board to
find a solution on is the 5 by 5 board, and the 22 by 22 board is about 65 times as hard as
the 23 by 23 board, and about 41,000 times as hard as the 8 by 8 board.
Contoh Program
begin until r = 0;
write('no. of queen :');
readln(nq); writeln('no any more');
writeln(jbacktrack);
solution := 0; readln;
jbacktrack := 0; end.
r := 1;
backtrack := false;
repeat
while (r > 0) and (r < nq+1) do
begin
if not backtrack then
c := 1;
continue := true;
while (c < nq+1) and continue do
begin
if queen(r,c) then
continue := false
else
inc(c);
end;
if c < nq+1 then
Indoprog 98
Algoritma & Pemrograman Hendra, S.T.
program nqueen_visual_grafik;
(*oleh hendra soewarno*) initialgraph;
uses graph,crt;
solution := 0;
var jbacktrack := 0;
cq : array[1..1000] of integer; r := 1;
backtrack := false;
procedure initialgraph; repeat
var while (r > 0) and (r < nq+1) do
graphdriver : integer; begin
graphmode : integer; if not backtrack then
begin c := 1;
detectgraph (graphdriver, graphmode);
initgraph (graphdriver, graphmode, continue := true;
'EGAVGA.BGI'); while (c < nq+1) and continue do
end; begin
if queen(r,c) then
procedure drawchessboard(n :byte); continue := false
var else
i,j,k : byte; inc(c);
begin end;
cleardevice; if c < nq+1 then
k := 0; begin
for i := 1 to n do cq[r] := c;
for j := 1 to n do inc(r);
begin backtrack := false;
setfillstyle(1,(i+j) mod 2); end
bar((j-1)*(200 div n),(i-1)*(200 div n), else
j*(200 div n), i*(200 div n)); begin
k:=k+1; dec(r);
end; c := cq[r]+1;
end; inc(jbacktrack);
backtrack := true;
function queen(r,c : integer):boolean; end;
var end;
i : integer;
begin
i := 1; if r = nq+1 then
while (i <= r-1) and begin
(c <> cq[i]) and inc(solution);
(c <> cq[i]+r-i) and showresult(nq);
(c <> cq[i]+i-r) do readkey;
inc(i); dec(r);
queen := i = r; c := cq[r]+1;
end; backtrack := true;
end;
procedure showresult(n : byte);
var until r = 0;
i : integer;
begin closegraph;
drawchessboard(n);
for i := 1 to n do writeln('jumlah solusi :',solution);
circle((cq[i]-1)*(200 div n)+(200 div (n*2)), writeln('jumlah backtrack :',jbacktrack);
(i-1)*(200 div n)+(200 div (n*2)), readln;
200 div (n*3)); end.
end;
(* program utama*)
var
nq,r,c,
solution,i : integer;
jbacktrack : longint;
continue : boolean;
backtrack : boolean;
begin
write('no. of queen :');
readln(nq);
Indoprog 99
Algoritma & Pemrograman Hendra, S.T.
Tower of Hanoi
The Tower of Hanoi puzzle was invented by the French mathematician Edouard Lucas in
1883. We are given a tower of eight disks (initially four in the applet below), initially
stacked in increasing size on one of three pegs. The objective is to transfer the entire
tower to one of the other pegs (the rightmost one in the applet below), moving only one
disk at a time and never a larger one onto a smaller.
The puzzle is well known to students of Computer Science since it appears in virtually
any introductory text on data structures or algorithms. Its solution touches on two
important topics discussed later on:
The applet has several controls that allow one to select the number of disks and observe
the solution in a Fast or Slow manner. To solve the puzzle drag disks from one peg to
another following the rules. You can drop a disk on to a peg when its center is sufficiently
close to the center of the peg. The applet expects you to move disks from the leftmost peg
to the rightmost peg.
Recursive solution
Let call the three pegs Src (Source), Aux (Auxiliary) and Dst (Destination). To better
understand and appreciate the following solution you should try solving the puzzle for
small number of disks, say, 2,3, and, perhaps, 4. However one solves the problem, sooner
or later the bottom disks will have to be moved from Src to Dst. At this point in time all
the remaining disks will have to be stacked in decreasing size order on Aux. After moving
the bottom disk from Src to Dst these disks will have to be moved from Aux to Dst.
Therefore, for a given number N of disks, the problem appears to be solved if we know
how to accomplish the following tasks:
1. Move the top N-1 disks from Src to Aux (using Dst as an intermediary peg)
2. Move the bottom disks from Src to Dst
3. Move N-1 disks from Aux to Dst (using Src as an intermediary peg)
Assume there is a function Solve with for arguments - number of disks and three pegs
(source, intermediary and destination - in this order). Then the body of the function might
look like
Indoprog 100
Algoritma & Pemrograman Hendra, S.T.
This actually serves as the definition of the function Solve. The function is recursive in
that it calls itself repeatedly with decreasing values of N until a terminating condition (in
our case N=0) has been met. To me the sheer simplicity of the solution is breathtaking.
For N=3 it translates into
Of course "Move" means moving the topmost disk. For N=4 we get the following
sequence
Indoprog 101
Algoritma & Pemrograman Hendra, S.T.
program Hanoi;
{Recursively solves the Towers of Hanoi problem. Moves disks from A to C.}
(*main program*)
begin
write ('How many disks are you going to start with? ');
read (Height);
Indoprog 102
Algoritma & Pemrograman Hendra, S.T.
program Hanoi_visual_grafik;
{Recursively solves the Towers of Hanoi problem. Moves disks from A to C.}
uses crt,graph;
(*modify by hendra soewarno*)
Type
PPeg = ^Peg;
Peg = object
private
stack : array [1..100] of byte;
nstack : byte;
public
stackname : string;
midpoint : integer;
constructor initial(name:string;mid:integer);
procedure push(size : byte);
procedure pop(var size : byte);
function height:byte;
end;
var
A,B,C : PPeg;
procedure initialgraph;
var
graphdriver : integer;
graphmode : integer;
begin
detectgraph (graphdriver, graphmode);
initgraph (graphdriver, graphmode, 'EGAVGA.BGI');
end;
procedure printdisk(height,size,mid:integer);
begin
setfillstyle(1,1);
bar(mid - size div 2,300 - 20*height,
mid + size div 2,319 - 20*height);
setcolor(15);
rectangle(mid - size div 2,300 - 20*height,
mid + size div 2,319 - 20*height);
end;
procedure erasedisk(height,size,mid:integer);
begin
setfillstyle(1,0);
Indoprog 103
Algoritma & Pemrograman Hendra, S.T.
constructor Peg.initial(name:string;mid:integer);
begin
nstack := 0;
stackname := name;
midpoint := mid;
end;
function Peg.height:byte;
begin
height := nstack;
end;
procedure Move(Height:byte;FromPeg,ToPeg,UsingPeg:PPeg);
var
disk : byte;
begin
if Height = 1 then
begin
FromPeg^.pop(disk);
ToPeg^.push(disk);
end
else
begin
Move (Height-1,FromPeg, UsingPeg, ToPeg);
FromPeg^.pop(disk);
ToPeg^.push(disk);
Delay(1000);
Move (Height-1,UsingPeg, ToPeg, FromPeg);
end
end;
Indoprog 104
Algoritma & Pemrograman Hendra, S.T.
(*main program*)
var
Height, i,disk : byte;
begin
new(A,initial('A',100));
new(B,initial('B',320));
new(C,initial('C',540));
write ('How many disks are you going to start with? ');
readln (Height);
initialgraph;
Indoprog 105
Algoritma & Pemrograman Hendra, S.T.
big-O notation
(definition)
Formal Definition: f(n) = O(g(n)) means there are positive constants c and k, such that 0
f(n) cg(n) for all n k. The values of c and k must be fixed for the function f and
must not depend on n.
Also known as O.
See also (n), (n), (n), , little-o notation, asymptotic upper bound, asymptotically
tight bound, NP, complexity, model of computation.
Note: As an example, n2 + 3n + 4 is O(n2), since n2 + 3n + 4 < 2n2 for all n > 10. Strictly
speaking, 3n + 4 is O(n2), too, but big-O notation is often misused to mean equal to rather
than less than. The notion of "equal to" is expressed by (n).
The importance of this measure can be seen in trying to decide whether an algorithm is
adequate, but may just need a better implementation, or the algorithm will always be too
slow on a big enough input. For instance, quicksort, which is O(n log n) on average,
running on a small desktop computer can beat bubble sort, which is O(n2), running on a
supercomputer if there are a lot of numbers to sort. To sort 1,000,000 numbers, the
quicksort takes 20,000,000 steps on average, while the bubble sort takes
1,000,000,000,000 steps!
Any measure of execution must implicitly or explicitly refer to some computation model.
Usually this is some notion of the limiting factor. For one problem or machine, the
number of floating point multiplications may be the limiting factor, while for another, it
may be the number of messages passed across a network. Other measures which may be
important are compares, item moves, disk accesses, memory used, or elapsed ("wall
clock") time.
Indoprog 106
Algoritma & Pemrograman Hendra, S.T.
Strictly, the character is the upper-case Greek letter Omicron, not the letter O, but who
can tell the difference?
Indoprog 107
Algoritma & Pemrograman Hendra, S.T.
Introduction
Sorting is one of the problems in computer science that seems to have the most
algorithms developed for it. Indeed, computers are used so extensively to
process data collections that in many installations, a great deal of their time is
spent maintaining that data in sorted order in the first place. In today's computing
age, sorting became an ideal method for many applications to gain better
performance.
Usually sorting is performed on either arrays, or on linked lists. The basic premise
behind sorting an array is that its elements start out in some (presumably)
random order and need to be arranged from lowest to highest
In real life, it is usually required to sort records, not just a bunch of numbers.
Records are sorted according to the values of their keys. If the records are very
large, moving around the records themselves every time the keys must be moved
may be inefficient. Instead it's possible to move around pointers to the records,
and not move the records until sorting is complete (if even then).
There are two basic category of sorting techniques: internal sorting and external
sorting.
• Internal sorting methods are applied when the entire collection of data to
be sorted is small enough that the sorting can take place within main
memory. The time required to read and write records is not considered to
be significant in evaluating the performance of internal sorting techniques.
• External sorting methods are applied to larger collections of data where
some (frequently most) of the collection resides on an auxiliary memory
device such as a magnetic tape or disk. Here read and write times are
major concern in determining sort performance.
Indoprog 108
Algoritma & Pemrograman Hendra, S.T.
"bubble" up to their final resting place, one position per sort-pass. If a complete
pass is made without any exchanges being made, the data must already be
sorted. This is easily checked. Thus it is possible to halt the algorithm without
going through all passes.
Bubble sort may be speeded up by doing two iterations on each pass. The the
first iteration is done as is standard bubble sort and the second iteration moves
upwards, starting at the bottom of the list and ending at the top. An upward
iteration allows a large element to sink only one place, but a small element to
bubble up many places. Thus, in the worst case, fewer iterations are required
because no element requires a full set of iterations to bubble up to the top. This
approach is called bidirectional bubble sort.
Bubble sort uses about N2/2 comparisons and N2/2 exchanges on the average
and in the worst case.
Selection Sorts
The idea behind selection sort is that each shift of data moves an item directly
into its final, correct place. This is done by finding the smallest element in the
array and swapping it with the element in the first position, then finding the
second smallest element and exchanging it with the element in the second
position, and doing in this way until the entire array is sorted. This method is
called selection sort because it repeatedly selects the smallest element in the yet
unsorted part of the array. Because selection sort involves accessing the list at
various points in a more-or-less random fashion, it is not a good algorithm to use
with data stored as a linked list, since a great deal of time will be used traversing
the list trying to locate the correct elements at each step, and then reassigning
the pointers.
Shaker sort is a simple variation of selection sort, which finds both the smallest
and the largest items on each pass and then moves them to their final correct
places. This algorithm is called shaker sort because it continuously finds small
and large elements and moves them far apart, just like a shaker separates
different substances. Sometimes this method is also called bidirectional selection
sort.
Selection sort uses about N2/2 comparisons and N exchanges on the average,
twice as many in the worst case. Selection sort is linear for files with large records
and small keys.
Insertion Sort
The insertion sort algorithm is copied directly from a commonly used technique
for hand-sorting objects, such as index cards or forms. Beginning with the second
element, one compares it with the last element in the sorted list. If it is less than
this element, it must be shifted backwards into the sorted list. It is saved in
temporary storage, and then compared with each element in the sorted list in
turn. As long as it is less than the current element in the sorted list, that element
Indoprog 109
Algoritma & Pemrograman Hendra, S.T.
is shifted one space to the right the search is continued. When an element that is
less than the new element is found, or when the top of the sorted list is reached,
the search stops and the new element is inserted in the correct place.
Insertion sort uses about N2/4 comparisons and N2/8 exchanges and is linear for
"almost sorted" files.
Shell Sort
This sorting algorithm is conceived by D. L. Shell, and is inspired by the Insertion
Sort's ability to work very fast on an array that is almost in order. It is also called
diminishing increment sort. Unlike Insertion Sort, Shell Sort does not sort the
entire array at once. Instead, it divides the array into noncontiguous segments,
which are separately sorted by using Insertion Sort. Once all of the segments are
sorted, Shell Sort re-divides the array into less segments and repeat the the
algorithm until at last that the number of segment equals one, and the segment is
sorted.
There are many variations of Shell Sort depending on the method of arranging
segments. The best separation sequence is ... 364, 121, 40, 13, 4, 1; for this
sequence Shell sort never does more than N1.5 comparisons.
Quick Sorts
The Quicksort was invented by C.A.R. Hoare in 1960, and was published in
Computer Journal in 1962. This divide-and-conquer algorithm first partitions the
sequence into two parts (working in-place) such that all of the elements in the first
part are less than or equal to all of the elements in the second part (this is done
by selecting a midpoint, or pivot element, and forcing all data below or above the
midpoint to its respective side). It then repeats the partitioning in recursive
manner. The algorithm achieves high efficiency because the partitioning step is
fast and usually breaks its input into two parts of roughly equal size.
In addition to the basic Quicksort algorithm, there are some improvements that
can increase the performance of Quicksort by approximately 30% and can help to
prevent a worst case situation. First, a "Median-of-Three" approach can be used
to select the pivot element. This helps to avoid the worst case situation. Second,
one of the two recursive calls of Quicksort can be removed and replaced with
iteration. If the smaller of the two partitions is used for the recursive call, the
number of recursive levels can be reduced to lg N, avoiding a stack overflow
situation. Finally, Quicksort can be replaced with the insertion, bubble or selection
sort for small partitions. Quicksort is most efficient for large amounts of data.
Comparison of Methods
There are many criterion that may be used in selecting an algorithm and its
implementation. The most important of them are efficiency, time complexity,
space complexity and implementation difficulty. However, the most important
Indoprog 110
Algoritma & Pemrograman Hendra, S.T.
thing to learn is how quickly the algorithm's time requirement grows as a function
of the problem. Algorithm analysis should be independent of specific
implementation, computers, and data. But in practice, computer scientists often
use some combination of theoretical analysis of algorithms and empirical results.
Important Characteristics
Asymptotic Behavior In-
Algorithm Stable
Best Average Worst Place
Bubble Sort N N2 N2 Yes No
Selection Sort N2 N2 N2 Yes No
2 2
Insertion Sort N N N Yes Yes
2 1.25 1.5
Shell Sort N(logN) N N Yes No
2 *
Quick Sort N logN N logN N Yes No
*
Uses stack for recursion
Computational Complexity (Comparisons and Assignments)
Initial Array Content
Algorithm Ascending Random Descending
< := < := < :=
Bubble Sort 99 0 4940 8115 4950 14850
Selection Sort 4950 300 4950 300 4950 300
Insertion Sort 99 198 2644 2745 4950 5148
Shell Sort 342 692 765 1163 500 922
Quick Sort 552 180 880 854 676 431
Simplicity is traditionally considered the least important issue, but some attention
must be paid to it. Simpler algorithms are less error-prone, easier to implement
and result in more reliable and easy-to-maintain programs.
• McCabe's Metrics
Indoprog 111
Algoritma & Pemrograman Hendra, S.T.
All sorting algorithms in the applet that is running in the right frame were
implemented as separate classes. Major metrics produced by TotalMetric for all
methods of these classes are listed in the tables below.
Average in Class
Metrics
Algorithm
v(G) ev(G) E V D
Bubble Sort 6 6 8470 385 22
Selection Sort 5 5 7756 357 21
Insertion Sort 4 5 9734 335 29
Shell Sort 7 9 31405 563 55
Quick Sort 5 6 33709 476 37
Indoprog 112
Algoritma & Pemrograman Hendra, S.T.
Pascal's Triangle is an arithmetical triangle you can use for some neat things in
mathematics. Here's how you construct it:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
.
.
.
You start out with the top two rows: 1, and 1 1. Then to construct each entry in the next
row, you look at the two entries above it (i.e. the one above it and to the right, and the one
above it and to the left). At the beginning and the end of each row, when there's only one
number above, put a 1. You might even think of this rule (for placing the 1's) as included
in the first rule: for instance, to get the first 1 in any line, you add up the number above
and to the left (since there is no number there, pretend it's zero) and the number above and
to the right (1), and get a sum of 1.
When people talk about an entry in Pascal's Triangle, they usually give a row number and
a place in that row, beginning with row zero and place zero. For instance, the number 20
appears in row 6, place 3.
Pascal's Triangle is more than just a big triangle of numbers. There are two major areas
where Pascal's Triangle is used, in Algebra and in Probability / Combinatorics.
Algebra
Let's say you have the polynomial x+1, and you want to raise it to some powers,
like 1,2,3,4,5,.... If you make a chart of what you get when you do these power-
raisings, you'll get something like this:
(x+1)^0 = 1
(x+1)^1 = 1 + x
(x+1)^2 = 1 + 2x + x^2
(x+1)^3 = 1 + 3x + 3x^2 + x^3
(x+1)^4 = 1 + 4x + 6x^2 + 4x^3 + x^4
(x+1)^5 = 1 + 5x + 10x^2 + 10x^3 + 5x^4 + x^5 .....
Indoprog 113
Algoritma & Pemrograman Hendra, S.T.
If you just look at the coefficients of the polynomials that you get, you'll see
Pascal's Triangle! Because of this connection, the entries in Pascal's Triangle are
called the binomial coefficients.
There's a pretty simple formula for figuring out the binomial coefficients:
n!
[n:k] = --------
k! (n-k)!
6 * 5 * 4 * 3 * 2 * 1
For example, [6:3] = ------------------------ = 20.
3 * 2 * 1 * 3 * 2 * 1
Probability/Combinatorics
The other main area where Pascal's Triangle shows up is in Probability, where it
can be used to find Combinations. Let's say you have five hats on a rack, and you
want to know how many different ways you can pick two of them and wear them.
It doesn't matter to you which hat is on top, it just matters which two hats you
pick. So this problem amounts to the question "how many different ways can you
pick two objects from a set of five objects?"
The answer? It's the number in the second place in the fifth row, i.e. 10.
(Remember that the first number in the row, 1, is always place 0.)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
Because of this choosing property, the binomial coefficient [6:3] is usually read
"six choose three." If you want to find out the probability of choosing one
particular combination of two hats, then that probability is 1/10.
In about 1654 Blaise Pascal started to investigate the chances of getting different
values for rolls of the dice, and his discussions with Pierre de Fermat are usually
considered to have laid the foundation for the theory of probability.
Indoprog 114
Algoritma & Pemrograman Hendra, S.T.
The Fibonacci numbers are harder to locate. To find them you need to go up at an
angle: you're looking for 1, 1, 1+1, 1+2, 1+3+1, 1+4+3, 1+5+6+1.
Indoprog 115
Algoritma & Pemrograman Hendra, S.T.
Daftar Pustaka
Indoprog 116