Algoritma Pemrograman PDF
Algoritma Pemrograman PDF
Hendra, S.T.
BAHASA MESIN
Sesuatu hal yang harus dipahami bahwa setiap CPU hanya mengerti satu bahasa. Bahasa
ini dikenal sebagai machine language (bahasa mesin).
Indoprog
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
Hendra, S.T.
Berikut ini adalah contoh bahasa assembly dengan bahasa mesin yang berasosiasi
disampingnya.
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
Hendra, S.T.
Indoprog
Hendra, S.T.
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
Hendra, S.T.
Indoprog
Hendra, S.T.
Indoprog
Hendra, S.T.
How the customers How the Project How the Analyst How
the
explained it
Leader understood designed it
Programmer wrote
it
it
Indoprog
Hendra, S.T.
Indoprog
Hendra, S.T.
memutus
aktivitas
karena
Sub program
Indoprog
10
Hendra, S.T.
Komentar
Indoprog
11
Hendra, S.T.
Indoprog
12
Hendra, S.T.
Kombinasi
Indoprog
13
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
Hendra, S.T.
Indoprog
15
Hendra, S.T.
16
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) :
x V y - Cambridge Polish, what was used to describe the LISP program
OR(x,y) - parenthesized prefix notation, what was used in the LISP program
x OR y - standard Boolean logic
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
Hendra, S.T.
18
Hendra, S.T.
Indoprog
19
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.
Bahasa pemrograman telah berkembangan dari masa kemasa dan tetap
dikembangkan dimasa depan. Mereka dimulai dari suatu daftar langkap pengkabelan agar
komputer menjalankan tugas tertentu. Langkah-langkah ini berkembang menjadi software
dan memiliki kemampuan yang lebih baik. Bahasa umum yang pertama menekankan pada
kesederhanaan dan untuk satu tujuan saja, sedangkan bahasa dewasa ini terbagi atas
bagaimana mereka diprogram, sehingga mereka dapat digunakan untuk semua tujuan. Dan
mungkin bahasa yang akan datang lebih natural dengan penemuan pada quantum dan
komputer-komputer biologis.
Latihan 1
1.
2.
Explain what is the different between High Level Language & Low Level Language !
3.
4.
5.
6.
7.
Draw the symbols use in flowchart, and mention each symbols function !
Indoprog
20
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.
Apa itu Turbo Pascal ?
Salah satu kompiler pascal yang terkenal dan tercepat adalah Turbo PASCAL yang dibuat
oleh perusahaan Borland (http://www.borland.com). Turbo PASCAL telah membuat
pascal sebagai salah satu bahasa pemrograman yang popular dikalangan IBM PC.
Adakah versi Turbo Pascal untuk pemrograman Visual ?
Pada trend pemrograman Visual, perusahaan Borland mengeluarkan Borland Delphi
(Windows) dan Kylix (Linux) yang menggunakan dasar dialek Pascal (object Pascal) pada
lingkungan pemrograman Visual.
Apa artinya Pascal adalah bahasa pemrogram terstruktur ?
Pascal adalah suatu bahasa pemrograman terstruktur. Hal tersebut berarti semua program
yang anda buat harus terstruktur dan teratur, dalam hal ini harus menghindari pemakaian
goto dan jump.
Apakah Turbo Pascal mendukung pemrograman berorientasi object ?
Mulai versi 5.5 Turbo Pascal telah dilengkapi dengan kemampuan pemrograman
berorientasi object, dan program ini secara bebas dapat di download pada alamat
http://bdn.borland.com/article/0,1410,20803,00.html (Antique Software: Turbo Pascal
version 5.5)
Adakah compiler Pascal lainnya selain Turbo Pascal ?
Compiler Pascal lainnya yang cukup terkenal adalah Free Pascal3 yang dapat didownload
pada http://www.freepascal.org/ (Free Pascal). Free Pascal merupakan compiler yang
dikembangkan oleh komunitas open source.
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
Hendra, S.T.
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
Hendra, S.T.
Contoh :
Uses CRT;
begin
Clrscr;
Writeln('Saya sedang belajar Pascal !');
Writeln('Di STMIK IBBI');
end.
;
;
;
;
;
;
;
;
{
{
{
{
{
{
{
{
Program heading }
Uses clause }
Labels }
Constants }
Types }
Variables }
Procedures }
Functions }
{ Statements }
Program heading
Judul program dalam Turbo Pascal bersifat optional dan tidak ada pengaruhnya dalam
program. Jika ditulis akan memberikan nama program dan suatu daftar parameter optional
dimana program itu berkomunikasi. Daftar itu terdiri dari sederetan indentifier yang
diakhiri dengan tanda kurung dan dipisahkan dengan tanda koma.
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 :
Uses Crt; (*menggunakan Unit Crt *)
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 unitunit lain hanya akan disertakan bila kita pilih pada bagian uses.
Indoprog
23
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.
Bagaimana membuat keterangan ?
Untuk membuat program anda menjadi mudah dibaca dan dimengerti, maka perlu diberi
keterangan yang akan diabaikan oleh kompiler. Untuk membuat keterangan gunakan tanda
kurawal { ini adalah keterangan }, atau (* ini adalah keterangan *).
Type data apa saja yang disediakan Turbo Pascal ?
Adapun type variable yang disediakan pada TURBO PASCAL :
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 :
Type
Shortint
Integer
Longint
Byte
Indoprog
Jangkuan
-128..127
-32768..32767
-2147483648..2147483647
0..255
Ukuran
8 bit
16 bit
32 bit
8 bit
24
Hendra, S.T.
0..65535
16 bit
- 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 :
Type
Real
Single
Double
Extended
Comp
Jangkauan
2.9e-39..1.7e38
1.5e-45..3.4e38 7-8
5.0e-324..1.7e308
3.4e-4932..1.1e4932
-9.2e18..9.2e18
Ketelitian
11-12 digit
7-8 digit
15-16 digit
19-20 digit
19-20 digit
Ukuran
6 bit
4 bit
8 bit
10 bit
8 bit
Untuk pengolahan type variabel diatas di sediakan berbagai jenis operator antara lain :
Operator
+
*
/
DIV
MOD
Integer Type
Penjumlahan
Pengurangan
Perkalian
Pembagian
Hasil bagi
Sisa Bagi
Real Type
Penjumlahan
Pengurangan
Perkalian
Pembagian
Operator
NOT
AND
OR
XOR
SHL
SHR
Integer Type
Bitwise Negation
Bitwise AND
Bitwise inclusive OR
Bitwise exclusive OR
Bitwise shift-left
Bitwise shift-right
Boolean Type
Logical Negation
Logical AND
Logical inclusive OR
Logical exclusive OR
Fungsi
Menyatakan nilai
Sama dengan
Tidak sama dengan
Lebih kecil
Lebih besar
Lebih kecil atau sama dengan
Lebih besar atau sama dengan
Indoprog
25
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.
Bagaimana menampilkan tulisan ke layar ?
Pascal menyediakan perintah Write dan Writeln yang dapat anda gunakan untuk
menampilkan tulisan ke layar.
Dapatkah anda memberi contoh program yang menggunakan variabel ?
{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.
Indoprog
26
Hendra, S.T.
Latihan 1
1. What does structured programming mean ?
2. What is the line "uses" for ?
3. Pascal programs always begin with _______ and end with _______
4. What is the difference between "Write" and "Writeln" ?
5. How can we write two blank lines on the screen ?
Indoprog
27
Hendra, S.T.
6. Mention at least 5 variable type names with their range and types !
7. How can we get user's input ?
8. What is the difference between "Read" and "Readln" ?
9. Why can't we enter the value 0.75 to Word variables ?
10. How can we view and pause the screen after the program ran ?
11. How can we declare variables in Pascal ?
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?
14. Explain how can the string be limited on display.
15. Can we enter the value "1/4" to Real variables ?
16. Explain what is edit-compile-run cycle in proses of programming ?
Latihan di Laboratorium
1. Make a program to write your name and your age on screen.
2. Make a program to input user's comment and print it.
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
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.
Anda menyebutkan keputusan terprogram, apa artinya ?
Artinya komputer dapat mengambil keputusan untuk berdasarkan aliran logika yang telah
ditentukan sebelumnya yang dikenal sebagai algoritma.
Bagaimana penulisan perintah pengambilan keputusan pada Pascal ?
Salah satu perintah struktur pengambilan keputusan adalah :
If condition Then statement;
Dimana condition adalah sesuatu yang bernilai True atau False, dan statement adalah
perintah yang akan dijalankan.
Dapatkah anda memberikan sebuah contoh pemakaian perintah If ?
Baiklah, misalnya kita akan membuat program menentukan pembayaran berdasarkan
berdasarkan jumlah belanja, jika diatas 100000 (seratus ribu) mendapatkan potongan 3%,
maka programnya adalah sebagai berikut :
Uses Crt;
Var
Belanja : Real;
Begin
Clrscr;
Write('Jumlah belanja ? '); Readln(Belanja);
If Belanja > 100000 Then Belanja := Belanja * 0.97;
Writeln('Jumlah yang harus anda bayar ',Belanja:10:2);
Readln;
End.
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:
If condition Then Statement1 Else Statement2;
Indoprog
29
Hendra, S.T.
If conditon Then
Statement1
Else
Statement2;
Indoprog
30
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;
grade:='A';
grade:='B';
grade:='C';
grade:='D';
grade:='E';
Indoprog
31
Hendra, S.T.
Catatan Instruktur
Berdasarkan hasil pengamatan, kesalahan yang sering dilakukan oleh mahasiswa dalam
pemakaian struktur IfThenElse, adalah didepan Else tidak ada pemakaian titik koma
(;).
Latihan 2
1. What does Pascal provide in order to perform conditional branching ?
2. Explain briefly each syntax !
3. How could we do nested branching ? Is it legal ?
4. Determine the output if i=5 and j=3 for the following excerpt :
if i<4 then writeln('Need more experience ...')
else
begin
writeln('Yes, you have it !');
if j<=3 then writeln('But, I would prefer better ones.')
else writeln('Superb !');
writeln('Congratulations !');
end;
writeln('Thank you for using this program !');
5. Make a program to ask ages. Classify the ages into these categories :
* age < 2
Indoprog
32
2
12
18
24
40
55
to
to
to
to
to
to
age
age
age
age
age
age
* age to 65
<
<
<
<
<
<
12
18
24
40
55
65
==>
==>
==>
==>
==>
==>
Hendra, S.T.
"You are a kid !"
"You are a teenager !"
"You are a young adult !"
"You are an adult !"
"You are middle aged !"
(Give comments yourself)
Indoprog
33
Hendra, S.T.
Modul 3
Hallo, ketemu lagi, pada pertemuan ini kita akan membahas tentang Looping.
Apa itu Looping
Secara sederhana looping diartikan sebagai proses berulang terhadap statement maupun
serangkaian statement lebih dari satu kali.
Aduh, kurang jelas, dapatkah anda memberikan contoh pemakaian looping?
Tentu saja anda telah menjalankan program pada pertemuan-pertemuan sebelumnya, dan
program tersebut berjalan hanya sekali, seterusnya selesai. Pernahkan anda bayangkan
kalau anda ingin membuat program yang dapat menanyakan kepada pemakai apakah dia
ingin ulang program tersebut sekali lagi ? Kalau ya maka program akan diulang kembali,
dalam hal ini looping akan berperan.
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.
For variabel := nilai awal To nilai akhir Do Statement;
Atau
For variabel := nilai awal DownTo nilai akhir Do Statement;
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
Hendra, S.T.
STMIK IBBI');
IBBI');
Until condition;
Contoh :
I := 1;
Repeat
Indoprog
35
Hendra, S.T.
IBBI');
IBBI');
Dan
I := 11;
Repeat
Writeln(' STMIK
Inc(I);
Until I <= 10;
IBBI');
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
I := I + 1;
Break;
End;
IBBI');
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
I := I + 1;
Indoprog
IBBI');
36
Hendra, S.T.
Continue;
End;
Catatan Instruktur
Berdasarkan hasil pengamatan, kesalahan yang sering dilakukan oleh mahasiswa dalam
pemakaian struktur ForDo, dan WhileDo 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 !
2. Explain the differences between them !
3. Suppose the output is :
1
Indoprog
37
Hendra, S.T.
2
3
4
5
6
Write an excerpt using all three syntaxes !
4. Explain how to nest one syntax to another !
Latihan di laboratorium
1. Input
Output
Input
Output
:
:
:
:
5
1 2 3 4 5 4 3 2 1
1
1
3. Input : 5
Output : 1
2
3
4
5
2
3
4
5
1
5. Input : 5
Output : 1
2
3
4
5
2
3 3
4 4 4
5 5 5 5
3
4
5
1
2
4
5
1
2
3
7. Input : 5
Output :
1
1 2
1 2 2
1 1 1 1
1
2
3
2
1
1
2
3
3
2
1
1
2
3
4
3
2
1
1
2
3
4
4
3
2
1
2. Input : 5
Output : 1
1
1
1
1
4. Input : 5
Output : 1
1
1
1
1
6. Input : 5
Output : 1
2
3
4
5
5
1
2
3
4
1
2
3
4
5
4
3
2
1
1
2
3
4
4
3
2
1
1
2
3
4
3
2
1
1
2
3
3
2
1
1
2
3
2
1
2
2
2
2
2
3
3
3
3
3
4
4
4
4
4
5
5
5
5
5
2
2 3
2 3 4
2 3 4 5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2 1
2 2 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
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.
Indoprog
39
Hendra, S.T.
Input : 1001
Output :
100
/
50
/\
2
25
/\
5
Indoprog
1001
/\
7 143
/\
11 13
Input : 5
Output : 5 is a prime !
40
Hendra, S.T.
Modul 4
Hallo, ketemu lagi, pada pertemuan ini kita akan belajar tentang array.
Apa sih Array itu ?
Baiklah, array adalah variabel yang dapat menampung sejumlah data yang ditandai
dengan suatu index pada masing-masing elemennya.
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;
Dan bagaimana kalau ada elemennya ada 100. Bisa anda bayangkan.
Adakah bentuk array yang lain, selain yang anda sebutkan ?
Indoprog
41
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].
Jadi jumlah elemennya adalah 3 x 3 = 9 elemen.
Dapatkah kita buat 3 Dimensi, 4 Dimensi, dst ?
Oh, bisa, hal ini tergantung bagaimana kita mendeklarasikan variabel array tersebut.
Adakah hal-hal yang khusus dalam mendeklarasikan array pada Pascal ?
Ada, anda bisa mendeklarasikan array seperti :
x
idx
a
n
:
:
:
:
Array[3..10] of Integer;
{elemennya x[3], x[4], x[5], , x[10]}
Array['A'..'Z'] of Integer;
Array['a'..'z'] of Byte;
Array[byte] of Integer; { The same as array[0..255] of integer; }
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 ?
3. How is the declaration ?
4. Explain how to use it !
5. How can we declare two or more dimension in array and explain the usage.
6. Suppose we have n : array[char] of byte; Is it valid ? Explain.
Indoprog
42
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, maximum 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
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
Hendra, S.T.
Tetapi sebelum kita mulai dengan pengurutan data, kita akan membahas tentang pseudo
random generator (PRNG).
Apa itu PRNG ?
Pseudorandom number5 generator (PRNG) adalah algoritma yang ketika dijalankan
akan menghasilkan suatu urutan dari bilangan, dimana elemen-elemennya diperkirakan
tidak berkaitan satu sama yang lain.
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)
Bilangan Random pada Pascal
Pada Pascal telah tersedia procedure dan function untuk mengenerate bilangan random
yaitu fungsi Random, dan procedure Randomize.
Random dan randomize
Kedua berfungsi menghasilkan bilangan random, bilangan random sering digunakan untuk
mensimulasikan dunia nyata yang penuh dengan ketidakpastian.
Randomize digunakan untuk menginisialisasi suatu bibit random secara acak yang cukup
dipanggil sekali saja.
Random digunakan untuk mendapatkan bilangan random(bilangan), yang akan
menghasilkan bilangan 0 s/d bilangan-1. Misalnya num:=random(50); berarti variabel
num mungkin berisi salah satu bilangan 0 s/d 49.
Pseudorandom numbers are a critical part of modern computing, from cryptography to the Monte Carlo
method for simulating physical systems.
Indoprog
45
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.
Algoritma Sort yang dipergunakan dalam computer science diklasifikasikan sebagai
berikut :
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:
for i:= jd-1 downto 1 do
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
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
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
for gap:=(jd div 2) downto 1 do
for i:=1 to (jd - gap) do
if a[i]> a[i+gap] then
begin
t:= a[i];
a[i] := a[i+gap];
a[i+gap]:=t;
End;
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
Hendra, S.T.
randomize;
for i := 1 to jd do
arr[i] := random(1000);
jb := 0;
jg := 0;
for i := (jd-1) downto 1 do
for j := 1 to i do
begin
jb := jb + 1;
if arr[j] > arr[j+1] then
begin
jg := jg + 1;
temp := arr[j];
arr[j]:=arr[j+1];
arr[j+1]:=temp;
end;
end;
writeln('Jumlah perbandingan :',jb);
writeln('Jumlah pergantian :',jg);
readln;
end.
Indoprog
49
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 masingmasing algoritma tersebut.
Selanjutnya kita akan melihat algoritma pencarian (Search Algorithms).
Apa itu Search Algorithms ?
Search algorithms adalah algoritma untuk mencari suatu elemen dalam suatu himpunan
elemen berdasarkan key tertentu.
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
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
Hendra, S.T.
end;
if a[low] = findvalue then
writeln('data found at :',low);
else
writeln('data not found')
Latihan 6
1.
2.
3.
4.
5.
6.
7.
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;
{tanya data yang dicari}
Indoprog
52
Hendra, S.T.
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 masingmasing 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
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'.
Oh, begitu saja, jadi kita sudah selesai hari ini ?
Tunggu dulu, sebenarnya kalau kita dapat juga mendeklarasikan string dengan :
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.
Bolehkan kita memesan variabel array string ?
Boleh, anda dapat melakukannya.
Contoh :
NamaSiwa : Array[1..10] Of String[30];
Pada program Hangman, saya melihat adanya pemakaian fungsi Length, Pos, apa
fungsinya, dan adakah yang lain ?
Ya, itu adalah fungsi bantu yang disediakan oleh Pascal untuk melakukan pengolahan data
string,
Adapun fungsi bantu untuk string adalah sebagai berikut :
Length, mendapatkan panjang string
Syntax : length(s)
Contoh : : n:=length(s);
Misalnya s:='Apa kabar ?'; n akan berisi 11.
Copy, mendapatkan bagian dari suatu string.
Syntax : copy(s,from,howmuch)
Contoh : : st:=copy(s,5,5);
Indoprog
54
Hendra, S.T.
Jika anda bekerja dengan type real, anda perlu melakukan pemformatan sebelum konversi
ke string.
Indoprog
55
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.
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.
Indoprog
56
Hendra, S.T.
Latihan 7
1.
What is a string ?
2.
2.
3.
4.
5.
6.
Latihan di laboratorium
8. Make programs for serveral task like this:
a. Make all letters in a string upcase.
b. Make all letters in a string lowcase.
c. Count the number of word in a sentence
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
Hendra, S.T.
var
kalimat : string;
i : byte;
begin
write('Ketik sebuah kalimat :');
readln(kalimat);
repeat
gotoxy(13, (80-len(kalimat)) div 2);
write(kalimat);
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
temp1,temp2
val1,val2,
result
numcode
begin
: string;
: string;
: real;
: integer;
Indoprog
58
Hendra, S.T.
end.
Indoprog
59
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.
Apa itu procedure dan function ?
Procedure dan function merupakan sub-program yang memiliki bagian deklarasi dan
begin-end; tersendiri layaknya suatu program pascal. Tujuan pemakaian procedure
maupun function adalah untuk memecah program kita menjadi kesatuan logika yang lebih
kecil (sub-sub program) untuk menghindari perulangan pengetikan dan memudahkan
pembacaan.
Contoh pemakaian procedure :
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.
Indoprog
60
Hendra, S.T.
61
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;
begin
foo;
a:=15;
end.
Contoh:
var
b : byte;
{ global variabel }
procedure foo;
var a : byte;
begin
a:=10;
b:=15;
{ This is legal }
end;
begin
foo;
a:=15;
b:=5;
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;
Indoprog
62
procedure foo;
var
a : byte;
Hendra, S.T.
begin
a:=15;
writeln('foo is ',a);
end;
begin
a:=10;
writeln(a);
foo;
writeln(a);
end.
Dari tadi anda menyebutkan procedure dan function, apa sih bedanya ?
Pada prinsipnya function mengembalikan nilai.
Syntax untuk procedure :
Procedure namaprocedure (deklarasi parameter);
Deklarasi variabel local
begin
:
{ commands }
:
:
end;
Indoprog
63
Hendra, S.T.
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 :
(*Pass by value*)
procedure foo(a : byte);
begin
writeln(a); {15}
a:=10;
writeln(a); {10}
Indoprog
(*Pass by reference*)
procedure foo(var a : byte);
begin
writeln(a); {15}
a:=10;
writeln(a); {10}
64
Hendra, S.T.
end;
end;
var
x : byte;
begin
x:=15;
writeln(x);
foo(x);
writeln(x);
end.
var
x : byte;
begin
x:=15;
writeln(x);
foo(x);
writeln(x);
end.
{15}
{15}
{15}
{10}
Latihan 8
1. Explain the syntax of procedures and functions.
2. Explain the differences between them.
3. Explain the differences between pass by value and pass by reference. Give an example.
4. Can procedures nest each other ? Explain and give example !
5. Explain the differences between global variable and local variable.
6. Explain the rule of calling procedures / functions.
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.
Here are some hint :
function compare(number, guess : byte):shortint;
function advice(comparison : shortint):string;
function asknumber: byte;
function yesno : boolean;
function score(guessleft : byte):longint;
procedure writeat(x,y : byte; sentence:string);
procedure setupscreen;
Latihan di rumah
Indoprog
65
Hendra, S.T.
Indoprog
66
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.
Apa yang dimaksud dengan rekursif ?
Rekursif merupakan salah satu fasilitas pemrograman yang sangat efektif yang mana
memperbolehkan function ataupun procedure untuk memanggil dirinya sendiri. Hal ini
memungkinkan solusi pemrograman menjadi lebih baik dan efisien, serta menghindari
pemakaian looping yang membingungkan.
Dapatkan anda memberikan sebuah contoh dari pemakaian rekursif ?
Boleh, dan hal tersebut banyak ditemukan pada persamaan matematika, misalnya dalam
menghitung faktorial.
5!
4!
2!
1!
=
=
=
=
4! * 5
3! * 4
1! * 2
1
Sesuatu hal yang perlu diperhatikan dalam pembuatan fungsi rekursif adalah harus adanya
suatu titik akhir, sehingga rekursif dapat selesai.
Quick Sort
Quicksort was invented by C.A.R. Hoare in 1960, and was published in Computer Journal in 1962
Indoprog
67
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;
procedure qsort(lower, upper : integer);
var
left, right, pivot : integer;
begin
pivot:=Data[(lower+upper) div 2];
left:=lower;
right:=upper;
while left<=right do
begin
while Data[left] < pivot do left:=left+1; { Parting for
while Data[right] > pivot do right:=right-1;{ Parting for
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;
left }
right}
}
}
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;
procedure swap(var data1,data2 : integer);
var
temp : integer;
begin
temp := data1;
Indoprog
68
Hendra, S.T.
data1:= data2;
data2:= temp;
end;
procedure qsort(lower, upper : integer);
var
left, right, pivot : integer;
begin
pivot:=data[(lower+upper) div 2];
left:=lower;
right:=upper;
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;
function isearch(findvalue:integer) : integer;
var
low, high,j : integer;
begin
low := 1;
high := jd;
while (data[high] >= findvalue) and (findvalue > data[low]) do
begin
j:=trunc((findvalue-data[low])/(data[high]-data[low])*(high-low))+low;
if findvalue > data[j] then
low := j+1
else
if findvalue < data[j] then
high := j-1
else
low := j;
end;
if data[low] = findvalue then
isearch := low
Indoprog
69
Hendra, S.T.
else
isearch := -1;
end;
(*Program Utama*)
var
j,findvalue,posisi : integer;
begin
grandom; {generate 10000 bilangan random}
qsort(1,jd); {urut data dengan algoritma quick sort}
{tanya data yang dicari}
write('Nilai yang dicari 0-10000 :');
readln(findvalue);
posisi := isearch(findvalue); {cari data dengan interpolation search}
if posisi > -1 then
writeln('ditemukan diposisi ',posisi)
else
writeln('tidak ditemukan !');
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
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
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.
Apa itu Record type?
Record type adalah suatu type data terstruktur yang merupakan pengelompokan beberapa
type data lainnya.
Dapatkah anda memberi contoh suatu Record type ?
Baiklah, misalnya kita akan mengolah data nilai ujian pascal programming siswa sebagai
berikut:
Nis
02001
Nama
Hendra
Soewarno
Tugas
80
Teori
90
Praktek
90
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;
Indoprog
72
Hendra, S.T.
Indoprog
73
Indoprog
Hendra, S.T.
Write(Nis:9,' ');
Write(Nama:30,' ');
Write(Tugas:6,' ');
Write(Teori:6,' ');
Write(Praktek:6,' ');
Write(Rata:6:2);
writeln;
end;
end;
readln;
end;
function caridata(findvalue:String):integer;
var
first,last,mid : Integer;
continue : boolean;
begin
first:=1;
last :=js;
continue := true;
while (first <= last) and continue do
begin
mid := (first + last) Div 2;
if (findvalue > siswa[mid].nis) then
first := mid + 1
else
if (findvalue < siswa[mid].nis) then
last := mid - 1
else
continue := false;
end;
if first > last then
caridata := -1
else
caridata := mid;
end;
procedure prosesurutdata;
var
gap,j : integer;
t : Tsiswa;
begin
for gap := (js div 2) downto 1 do
for j := 1 to (js-gap) do
if siswa[j].nis > siswa[j+gap].nis then
begin
t := siswa[j];
siswa[j] := siswa[j+gap];
siswa[j+gap] := t;
end;
end;
procedure prosestambahdata;
var
I : Integer;
begin
repeat
I := JS+1;
bacasiswa(I);
if Siswa[I].NIS <> '' Then
Js := Js + 1;
until JS < I;
prosesurutdata;
{langsung urut data}
end;
procedure prosesperbaikidata;
74
Hendra, S.T.
if Tanya = 'Y' Then
begin
hapusdata(posisi);
Writeln('Proses hapus berhasil !');
end;
end;
end;
(*Program utama*)
var
Pilihan : Integer;
Continue: Boolean;
begin
Js := 0;
Continue := True;
Repeat
Clrscr;
Writeln('Menu Utama');
Writeln('1. Tambah Data');
Writeln('2. Perbaiki Data');
Writeln('3. Hapus Data');
Writeln('4. Daftar Nilai');
Writeln('5. Selesai');
Write('Pilihan Anda :');
Readln(Pilihan);
Case Pilihan of
1 : prosestambahdata;
2 : prosesperbaikidata;
3 : proseshapusdata;
4 : tampildaftarnilai;
5 : continue := false;
end;
Until not Continue;
end.
Latihan 10
1. Explain what is Record Type and give an example !
2. Explain what With End block function !
Latihan di Laboratoriun
3. Make a database. The record tag, TStudent consists of these fields :
Field
Length
~~~~~ ~~~~~~
Name
20
Address
40
Phone
15
Quiz
number, from 1 to 100
Midtest number, from 1 to 100
Finaltest number, from 1 to 100
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
Hendra, S.T.
Indoprog
76
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.
Dapatkah anda memberikan contoh text file dan binary file ?
Ok, sederhana saja, dan sebenarnya anda telah pernah bekerja dengan kedua jenis file
tersebut, misalnya program pascal yang anda ketik, itulah yang dimaksud dengan text file,
sedangkan file seperti program IDE Turbo Pascal (turbo.exe) adalah binary file.
Bagaimana saya dapat membedakannya ?
Untuk membedakan anda dapat menggunakan perintah TYPE pada DOS terhadap masingmasing file, kalau textfile anda dapat membacanya dengan jelas, sedangkan binary file
tidak.
Adakah contoh lain dari text file pada lingkungan Windows ?
Oh, ya, tentu saja ada, misalnya Autoexec.bat, Config.sys dan *.INI yang biasanya berada
pada folder C:\Windows.
Ok, saya cukup jelas sekarang, pelajaran bisa dilanjutkan.
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 mengasosiasikan 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 :
if EOF(F) then writeln('This is the end of text file');
Indoprog
77
Hendra, S.T.
Mudah bukan ?
Bagaimana kalau saya ingin membuat sebuah text file baru ?
Wah, pertanyaan yang baik, untuk membuat sebuah text file baru anda dapat
menggunakan perintah berikut :
rewrite(F);
Sebagai penganti dari reset, dan perintah
writeln(F,s) { s is a string variable }
Sebagai pengganti dari readln, dan untuk menutupnya tetap 'close'.
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
}
writeln('Just enter any text and followed by enter.');
writeln('To quit : Input an empty line.');
repeat
readln(s);
if s='' then break;
writeln(F,s);
until true;
close(F);
end.
Indoprog
{ close it }
78
Hendra, S.T.
{ close it }
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
Hendra, S.T.
end.
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.
program readme_file;
(*oleh : hendra soewarno*)
uses crt;
type
Tbaris = String[80];
const
jd = 400;
var
Baris : array [1..jd] of TBaris;
Jb, atas : integer;
procedure bacatextfile(fname:string);
var
ftext : text;
begin
assign(ftext,fname);
{$I-}
reset(ftext);
{$I+}
if ioresult <> 0 then
begin
writeln('error open file !');
halt;
end
else
begin
jb := 0;
while not eof(ftext) and (jb < jd) do
begin
jb := jb + 1;
readln(ftext,baris[jb]);
end;
close(ftext);
end;
end;
procedure cetaktext;
var
i,brs : integer;
begin
Indoprog
brs := 1;
for i := atas to atas+23 do
begin
gotoxy(1,brs);
clreol;
if i <= jb then
begin
write(baris[i]);
brs := brs + 1;
end
else
delline;
end;
end;
procedure readme;
var
key : char;
begin
atas := 1;
repeat
cetaktext;
key := readkey;
if key = #00 then key := readkey;
case key of
#72 :
if atas > 1 then
dec(atas);
#80 :
if atas+24 < jb then
inc(atas);
end;
until key = #27;
end;
(*Program Utama*)
begin
clrscr;
bacatextfile('c:\editor.pas');
readme;
end.
80
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.
Pada dasarnya binary file dibagi atas dua kelompok, yaitu :
1. Typed files
2. Untyped files
Apa artinya Typed file ?
Typed file artinya file yang telah memiliki format tertentu, baik ketika kita menulis
maupun membacanya. Biasanya file jenis ini digunakan untuk menyimpan data (Database)
dalam bentuk record, dengan kata lain file of records.
Kalau begitu, apa pula artinya dengan Untyped file ?
Untyped file artinya file yang tidak memiliki format tertentu, biasanya file jenis ini
digunakan untuk menyimpan executable file maupun file-file yang dibentuk oleh system
tertentu seperti gambar, sound, dll.
Baiklah, kita akan membahas Typed file untuk pertemuan ini.
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'.
Apakah cara menangani errornya juga sama ?
Ya, dalam hal ini tetap menggunakan IOResult, jadi tidak perlu diterangkan kembali.
Apakah ada perbedaan cara pengolahan file tersebut ?
Ya, ada beberapa perbedaan, yaitu sesuatu file yang dibuka dengan reset dapat
menggalami proses 'read' maupun 'write'.
Perhatikan contoh berikut :
{ A crude database recording }
Indoprog
81
Hendra, S.T.
uses crt;
type
Temployee = record
name
address
phone
age
salary
end;
:
:
:
:
:
string[20];
string[40];
string[15];
integer;
longint;
var
F
c
r
s
:
:
:
:
file of Temployee;
char;
Temployee;
string;
begin
clrscr;
write('Input file name to record databases : '); readln(s);
assign(F,s);
rewrite(F);
repeat
clrscr;
write('Name
write('Address
write('Phone
write('Age
write('Salary
write(F,r);
{ Associate it }
{ Create it
}
=
=
=
=
=
');
');
');
');
');
readln(r.name);
readln(r.address);
readln(r.phone);
readln(r.age);
readln(r.salary);
{ Input data }
Istilah pengolahan file yang dapat mengakses sembarang posisi record, dikenal sebagai
istilah "Random File Access".
Apakah saya bisa menambah data baru ke suatu file of records ?
Indoprog
82
Hendra, S.T.
yang
Indoprog
reset(FSiswa);
{$I+}
if IoResult<>0 then
rewrite(FSiswa);
end;
procedure tutupfile;
begin
close(FSiswa);
end;
procedure bacasiswa(I : integer);
begin
Writeln('Record ke-',I);
With Siswa do
begin
Nis := '';
Write('No. Induk siswa :'); Readln(Nis);
If Nis <> '' Then
83
Indoprog
Hendra, S.T.
last :=Filesize(FSiswa)-1;
continue := true;
while (first <= last) and continue do
begin
mid := (first + last) Div 2;
Seek(FSiswa,mid);
read(FSiswa,siswa);
if (findvalue > siswa.nis) then
first := mid + 1
else
if (findvalue < siswa.nis) then
last := mid - 1
else
continue := false;
end;
if first > last then
caridata := -1
else
caridata := mid;
end;
procedure prosesurutdata;
var
js,gap,j : integer;
s1,s2,t : Tsiswa;
begin
js := Filesize(FSiswa);
for gap := ((js-1) div 2) downto 0 do
for j := 0 to ((js-1)-gap) do
begin
Seek(FSiswa,j);
read(FSiswa,s1);
Seek(FSiswa,j+gap);
read(FSiswa,s2);
if s1.nis > s2.nis then
begin
Seek(FSiswa,j);
read(FSiswa,s2);
Seek(FSiswa,j+gap);
read(FSiswa,s1);
end;
end;
end;
procedure prosestambahdata;
var
I : integer;
begin
Seek(FSiswa,Filesize(FSiswa));
repeat
I := FilePos(FSiswa)+1;
bacasiswa(I);
if Siswa.Nis <> '' Then Write(FSiswa,Siswa);
until Siswa.Nis = '';
prosesurutdata;
{langsung urut data}
end;
procedure prosesperbaikidata;
var
TNis : String[9];
Posisi: integer;
begin
write('Nis yang ingin diperbaiki :');
readln(TNis);
Posisi := caridata(TNis);
If Posisi = -1 Then
Writeln('Data tidak ditemukan !')
else
84
Hendra, S.T.
end;
end;
(*Program utama*)
var
Pilihan : integer;
Continue: Boolean;
begin
Continue := True;
BukaFile('C:\Siswa.rec');
Repeat
Clrscr;
Writeln('Menu Utama');
Writeln('1. Tambah Data');
Writeln('2. Perbaiki Data');
Writeln('3. Hapus Data');
Writeln('4. Daftar Nilai');
Writeln('5. Selesai');
Write('Pilihan Anda :');
Readln(Pilihan);
Case Pilihan of
1 : prosestambahdata;
2 : prosesperbaikidata;
3 : proseshapusdata;
4 : tampildaftarnilai;
5 : continue := false;
end;
Until not Continue;
TutupFile;
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
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 masingmasing record berukuran 1 integer.
Adapun cara deklarasi suatu untyped file :
var
F : file;
Sedangkan fungsi 'Assign', 'Reset', 'Rewrite', and 'Close' adalah tetap sama. Sedangkan
perintah 'read' dan 'write' harus diganti dengan 'blockread' dan 'blockwrite'.
Adapun syntax penulisannya adalah sebagai berikut
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.
Indoprog
Blen = 1024;
(*variabel global*)
var
FSource,
FTarget : file;
Bread,Bkey : array [1..BLen] of byte;
86
: String;
procedure bukafilesource;
var
fname : string;
begin
write('Nama file asal :');
readln(fname);
assign(FSource,fname);
{$I-}
reset(FSource,1);
{$I+}
if IoResult<>0 then
begin
writeln('Tidak dapat buka ',fname);
halt;
end;
end;
procedure tutupfilesource;
begin
close(FSource);
end;
procedure buatfiletarget;
var
fname : string;
begin
write('Nama file tujuan :');
readln(fname);
assign(FTarget,fname);
{$I-}
rewrite(FTarget,1);
{$I+}
if IoResult<>0 then
begin
writeln('Tidak dapat buat ',fname);
halt;
end;
end;
procedure tutupfiletarget;
begin
close(FTarget);
end;
procedure persiapankey;
var
Hendra, S.T.
i,j : integer;
begin
write('masukkan key anda :');
readln(key);
if length(key) = 0 then
begin
writeln('key tidak sah !');
halt;
end;
i := 1;
while i <= BLen do
begin
j := 1;
while (j <= length(key)) and (i <= BLen) do
begin
BKey[i] := Ord(Key[j]);
inc(i); inc(j);
end;
end;
end;
procedure lakukanenkripsi;
var
i : integer;
begin
for i := 1 to BLen do
Bread[i] := Bread[i] xor Bkey[i];
end;
(*Program utama*)
var
Fname : string;
nRead,
nWrite : word;
begin
persiapankey;
bukafilesource;
buatfiletarget;
repeat
blockread(FSource,BRead,1024,nRead);
lakukanenkripsi;
blockwrite(FTarget,BRead,nRead,nWrite);
writeln(nRead);
writeln(nWrite);
until (nRead < 1024) or (nRead <> nWrite);
tutupfilesource;
tutupfiletarget;
end.
Latihan 13
1. Make a function to detect whether it is a text file or not. Return true if it does.
2. Make a simulation for copy command in DOS using untyped file.
3. Make a encryption/decryption utility for encrypt/decrypt a given file.
Indoprog
87
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);
Dan yang kedua adalah variabel internal dari unit CRT:
Textattr := 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);
Dalam hal ini nomor warna yang berlaku hanya 0 s/d 7.
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 :
Writeln('Sedang belajar Pascal di STMIK IBBI');
Indoprog
88
Hendra, S.T.
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.
Indoprog
89
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.
Daftar Frekuensi
Nada
Frekuensi
C
262
D
294
E
330
F
350
G
392
A
440
B
494
Sebagai programer pemula pascal, saya sering mendapatkan peringatan compiler
akan kesalahan Type Mismatch, dapatkah anda menjelaskan hal tersebut ?
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 :
Konvensi Penjumlah (+), Pengurangan (-), dan Perkalian (*) :
integer dengan integer = integer
integer dengan real = real
Indoprog
90
real
dengan real
Hendra, S.T.
= real
Latihan 14
1. What is TextColor and TextBackGround for ?
2. List the value accepted as TextColor parameter with its color !
3. The same as number 2, but for TextBackGround.
4. How can we switch between text modes ?
5. Mention values that is accepted for changing text modes.
6. How would it be if we specify X and Y parameter in GotoXY exceeds the
screen resolution ?
7. Explain shortly all about text modes in PC !
8. Why must we add Delay between Sound and NoSound ?
9. If we omit NoSound statement, what will happen ?
10. How was the formula to assign colors in TextAttr ?
Indoprog
91
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.
Apa saja fasilitas yang anda maksud tersebut ?
Pertama kita akan membahas tentang Constants, Set, dan Type.
Oh, konstanta, di sekolah kami ada belajar PI = 3.1415926513... ,
e = 2.7182818284529, apakah maksud anda seperti itu ?
Ya, benar, pengertian konstanta di pascal hampir sama dengan konstanta di dunia
matematika maupun fisika, yaitu besaran-besaran yang memiliki ketetapan-ketetapan
tertentu. Tetapi pemakaian konstanta di pascal programmer bebas membuat konstanta
sesuai dengan kebutuhan programnya.
Dapatkah anda memberi sebuah contoh program yang menggunakan konstanta ?
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.
{deklarasi konstanta}
{PPN 12.5%, tidak pakai :}
Dalam hal ini anda tidak perlu mengubah isi program, sehingga maintenance program
anda menjadi mudah.
Apakah ada kegunaan lain dari konstanta pada pascal ?
Ada, yaitu memberikan nilai awal kepada variabel, contoh yang diambil dari Hangman
Modul 2 :
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
Hendra, S.T.
Pada contoh diatas konstanta Gaji yang dideklarasikan beserta type dapat berprilaku
sebagai variabel, sehingga nilainya boleh diubah didalam program.
Ok, sekarang akan kita lanjutkan ke pembahasan tentang Set.
Set adalah sesuatu fasilitas khusus pada pascal yang tidak dimiliki oleh bahasa
pemrograman lainnya. Set pada pascal adalah merupakan himpunan seperti pada
matematika. Pemakaian Set dapat menyederhanakan algoritma program, dan memudahkan
pembacaan, contoh :
uses crt;
var
c
: char;
vowel : set of 'A','E','I','O','U';
letter : set of 'A'..'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.
Indoprog
93
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;
Dalam hal ini type ciptaan seperti ini disebut sebagai Subrange.
Dapatkah anda menjelaskan lebih lanjut kira-kira bagaimana pengertian dari
subrange tersebut!
Ok, sebenarnya subrange tersebut merupakan bagian dari range nilai type lain, misalnya
type Integer dimana nilai yang dapat ditampung berkisar 0 s/d 255, padahal deklarasi type
diatas :
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;
Sebenarnya sama saja kalau kita tulis sebagai berikut :
Var
Nama : STRING30;
Indoprog
94
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.
Latihan 15
1.
2.
3.
4.
5.
6.
7.
Indoprog
95
Hendra, S.T.
Indoprog
96
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.
An obvious modification of the 8 by 8 problem is to consider an N by N "chess board" and
ask if one can place N queens on such a board. It's pretty easy to see that this is impossible
if N is 2 or 3, and it's reasonably straightforward to find solutions when N is 4, 5, 6, or 7.
The problem begins to become difficult for manual solution precisely when N is 8.
Probably the fact that this number coincidentally equals the dimensions of an ordinary
chess board has contributed to the popularity of the problem.
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
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
program nqueen;
(*oleh : hendra soewarno*)
var
cq : array[1..1000] of integer;
function queen(r,c : integer):boolean;
var i : integer;
begin
i := 1;
while (i <= r-1) and
(c <> cq[i]) and
(c <> cq[i]+r-i) and
(c <> cq[i]+i-r) do
inc(i);
queen := i = r;
end;
(* program utama*)
var
nq,r,c,
solution,i : integer;
jbacktrack : longint;
continue : boolean;
backtrack : boolean;
begin
write('no. of queen :');
readln(nq);
solution := 0;
jbacktrack := 0;
r := 1;
backtrack := false;
repeat
while (r > 0) and (r < nq+1) do
begin
if not backtrack then
c := 1;
begin
cq[r] := c;
inc(r);
backtrack := false;
end
else
begin
dec(r);
c := cq[r]+1;
inc(jbacktrack);
backtrack := true;
end;
end;
if r = nq+1 then
begin
inc(solution);
write('solution ',solution:2,':');
for i := 1 to nq do
write(i:2,cq[i]:2,' ');
writeln;
dec(r);
c := cq[r]+1;
backtrack := true;
end;
until r = 0;
writeln('no any more');
writeln(jbacktrack);
readln;
end.
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
Hendra, S.T.
initialgraph;
solution := 0;
jbacktrack := 0;
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
begin
cq[r] := c;
inc(r);
backtrack := false;
end
else
begin
dec(r);
c := cq[r]+1;
inc(jbacktrack);
backtrack := true;
end;
end;
if r = nq+1 then
begin
inc(solution);
showresult(nq);
readkey;
dec(r);
c := cq[r]+1;
backtrack := true;
end;
until r = 0;
closegraph;
writeln('jumlah solusi :',solution);
writeln('jumlah backtrack :',jbacktrack);
readln;
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
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
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
1.
2.
3.
4.
5.
6.
7.
Of course "Move" means moving the topmost disk. For N=4 we get the following
sequence
1. Move from Src to Aux
2. Move from Src to Dst
3. Move from Aux to Dst
4. Move from Src to Aux
5. Move from Dst to Src
6. Move from Dst to Aux
7. Move from Src to Aux
8. Move from Src to Dst
9. Move from Aux to Dst
10. Move from Aux to Src
11. Move from Dst to Src
12. Move from Aux to Dst
13. Move from Src to Aux
14. Move from Src to Dst
15. Move from Aux to Dst
Indoprog
101
Hendra, S.T.
program Hanoi;
{Recursively solves the Towers of Hanoi problem. Moves disks from A to C.}
var Height: integer;
procedure Move (Height: integer; FromPeg, ToPeg, UsingPeg: char);
{Recursive procedure for determining moves. Keep this order-from,
to, using-in mind when you read the recursive calls.}
begin
if Height = 1
then begin write ('Move a disk from ');
write (FromPeg);
write (' to ');
write (ToPeg);
writeln
end
else begin Move (Height - 1, FromPeg, UsingPeg, ToPeg);
write ('Move a disk from ');
write (FromPeg);
write (' to ');
write (ToPeg);
writeln;
Move (Height - 1, UsingPeg, ToPeg, FromPeg)
end
end;
(*main program*)
begin
write ('How many disks are you going to start with? ');
read (Height);
Indoprog
102
Hendra, S.T.
103
Hendra, S.T.
Indoprog
104
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;
for i := Height downto 1 do
A^.push(i*20);
Move (Height,A, C, B);
readln;
closegraph;
end.
Indoprog
105
Hendra, S.T.
big-O notation
(definition)
Definition: A theoretical measure of the execution of an algorithm, usually the time or
memory needed, given the problem size n, which is usually the number of items.
Informally, saying some equation f(n) = O(g(n)) means it is less than some constant
multiple of g(n). The notation is read, "f of n is big oh of g of n".
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
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
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
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
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
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.
The most important characteristics of all algorithms described and implemented
here are given in the table below. The second table lists the results of actual
complexity tests obtained with the applet that is running currently in the right
frame.
Important Characteristics
Algorithm
Asymptotic Behavior
Best
Average
Bubble Sort
N2
N2
Yes
No
Selection Sort
N2
N2
N2
Yes
No
Yes
Yes
1.5
Yes
No
No
Insertion Sort
Shell Sort
Quick Sort
*
InStable
Place
Worst
N
2
1.25
N(logN)
N logN
N logN
Yes
Ascending
Random
:=
Descending
<
:=
<
<
:=
Bubble Sort
99
4940
Selection Sort
4950
300
4950
300 4950
Insertion Sort
99
198
2644
Shell Sort
342
692
765
1163 500
922
Quick Sort
552
180
880
854 676
431
300
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.
The programs' complexity is very difficult to measure or analyze. Programmers
can't help but admit that defining program simplicity in a complete and robust way
is an extremely hard task. However, every software engineer is bound to have a
rather clear intuitive notion of program simplicity. None of presently known
complexity measurement techniques give adequate and accurate results.
Nevertheless there are numerous software metrics that are used for rough
estimates of actual software effort. TotalMetric is one of static metrics analysis
tools that capture complexity and level of effort metrics for Java programs.
TotalMetric supports
McCabe's Metrics
Indoprog
111
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
Algorithm
Indoprog
Metrics
v(G) ev(G)
Bubble Sort
8470
385
22
Selection Sort
7756
357
21
Insertion Sort
9734
335
29
Shell Sort
31405 563
55
Quick Sort
33709 476
37
112
Hendra, S.T.
5
6
3
4
1
3
6
10
15
21
1
2
1
4
10
20
35
1
5
15
35
1
6
21
1
7
.
.
.
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.
Indoprog
=
=
=
=
=
=
1
+
1
+
5x
1
+
4x
+
1
1
+
x
+
2x
+
x^2
3x
+
3x^2 +
x^3
+
6x^2 +
4x^3 +
10x^2 + 10x^3 +
5x^4
x^4
+
x^5 .....
113
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
-----------------------3 * 2 * 1 * 3 * 2 * 1
20.
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
1
1
1
1
3
4
5
6
1
2
6
15
1
4
10
10
21
1
3
20
35
1
5
15
35
1
6
21
1
7
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.
Triangular Numbers, Fibonacci Numbers
The triangular numbers and the Fibonacci numbers can be found in Pascal's
triangle. The triangular numbers are easier to find: starting with the third one on
the left side go down to your right and you get 1, 3, 6, 10, etc.
1
1
1
1
1
1
1
Indoprog
10
1
5
10
20
35
1
4
15
21
1
3
3
4
1
2
15
35
1
6
21
1
7
114
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
Hendra, S.T.
Daftar Pustaka
http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html,
Demo.
Sorting
Algorithms
Indoprog
116