PARADIGMA PEMROGRAMAN DAN
MEKANISME EKSEKUSI PROGRAM
Bab ini akan memperkenalkan paradigma pemrograman dan mekanisme eksekusi program. Di sini
akan dijelaskan secara singkat apa itu paradigma pemrograman, beberapa contoh paradigma yang
ada, serta sekilas mengenai paradigma prosedural. Di bagian berikutnya dibahas mengenai
bagaimana suatu program dieksekusi di komputer, serta peran interpreter, kompilator, dan debugger
dalam pembuatan program.
1.1 Paradigma Pemrograman
Paradigma pemrograman adalah bagaimana cara pandang kita terhadap penyelesaian masalah
pemrograman (atau sudut “serang” kita dalam menyelesaikan suatu masalah pemrograman). Ada
banyak cara untuk menyelesaikan suatu masalah, sehingga ada banyak paradigma yang ada.
Beberapa contoh paradigma pemrograman yang ada saat ini adalah: prosedural, fungsional,
deklaratif, dan objek. Secara singkat dapat dikatakan bahwa:
• paradigma prosedural memandang penyelesaian masalah sebagai hasil dari serangkaian langkah
yang menyelesaikan sub masalah
• paradigma fungsional memandang penyelesaian masalah sebagai komposisi dan aplikasi fungsi
yang memetakan masalah ke jawaban
• paradigma deklaratif memandang penyelesaian masalah sebagai hasil inferensi terhadap fakta
dan aturan yang diberikan
• paradigma objek memandang penyelesaian masalah sebagai hasil interaksi dari kelas yang
membentuk objek (objek dalam konsep ini merupakan representasi objek di dunia nyata)
Buku ini tidak akan membahas secara detail masing-masing paradigma, paradigma yang telah
disebutkan sekilas di atas hanya untuk memberikan gambaran bahwa solusi untuk suatu masalah
2 Konsep Dasar Pemrograman Prosedural
tidak harus dilakukan secara prosedural. Beberapa paradigma juga boleh digabung atau dipakai
bersama untuk menyelesaikan masalah.
Paradigma prosedural merupakan paradigma yang biasanya diajarkan pertama karena sangat dekat
dengan mekanisme eksekusi mesin (secara hardware, komputer bekerja secara sekuensial atau
berurutan). Dalam paradigma prosedural masalah diselesaikan dengan menggunakan langkahlangkah
yang berurutan yang disebut sebagai suatu algoritma
1.2 Mekanisme Eksekusi Program
Komputer merupakan benda yang “bodoh” yang hanya bisa menjalankan instruksi dalam bahasa
mesin, bukan bahasa manusia. Komputer yang pertama diprogram langsung dengan menuliskan
bahasa mesin ke dalam komputer, seiring berlalunya waktu, hal itu dirasakan tidak efisien sehingga
diciptakanlah bahasa assembly, berupa kata-kata singkat yang lebih mudah diingat dibanding dengan
kode yang harus dimasukkan langsung. Bahasa assembly sebenarnya tidak jauh dari bahasa mesin
namun sudah cukup untuk membantu pemrogram menulis program dengan lebih mudah. Bahasa
assembly ini disebut sebagai bahasa tingkat rendah.
Pada tahun enampuluhan, para ahli mulai banyak membuat bahasa yang lebih mudah dimengerti
oleh manusia, bahasa tersebut disebut sebagai bahasa tingkat tinggi. Ada banyak bahasa yang
diciptakan, bahkan sangat banyak, namun sedikit yang bertahan hingga saat ini. Tapi semua bahasa
tersebut memiliki kesamaan yaitu bahwa mereka tidak bisa langsung dimengerti oleh komputer
sehingga perlu diterjemahkan ke dalam bahasa mesin.
Penerjemahan dapat dilakukan dengan menggunakan program (yang pada awalnya dulu ditulis
dengan bahasa assembly) yang bisa berupa sebuah interpreter atau sebuah kompilator (atau gabungan
dari keduanya). Program penerjemah tersebut akan memeriksa sintaks (format penulisan) apakah
benar atau tidak, lalu menerjemahkan program tersebut ke dalam bahasa mesin.
1.2.1 Interpreter
Interpreter adalah suatu program komputer yang mampu menerjemahkan program dari bahasa
tingkat tinggi yang dimengerti oleh manusia dan langsung menjalankan program tersebut. Kerja
interpreter seperti penerjemah untuk turis yang langsung menerjemahkan kalimat demi kalimat yang
dikatakan oleh sang turis.
Tim Olimpiade Komputer Indonesia
Konsep Dasar Pemrograman Prosedural 3
Setiap kali kita membutuhkan program tersebut, maka interpreter akan bekerja menerjemahkan
program dari bahasa tingkat tinggi ke bahasa mesin untuk dieksekusi. Jadi siklus kerja ketika kita
membuat program dengan interpreter adalah: tulis/edit program, eksekusi.
1.2.2 Kompilator
Kompilator adalah suatu program komputer yang membaca seluruh program dari bahasa tingkat
tinggi yang dimengerti oleh manusia dan kemudian menerjemahkan keseluruhan program tersebut
dalam bahasa mesin. Program yang sudah diterjemahkan tersebut akhirnya akan dijalankan oleh
komputer. Kerja kompilator seperti penerjemah buku yang akan menerjemahkan seluruh buku
sekaligus, sehingga setiap orang bisa mengerti makna buku dalam bentuk terjemahannya.
Kompilator hanya perlu bekerja sekali saja menerjemahkan bahasa tingkat tinggi ke bahasa mesin,
dan jika kita membutuhkan kembali program tersebut, kita hanya perlu menjalankannya, kompilator
tidak perlu bekerja lagi. Jadi siklus kerja jika kita memakai kompilator adalah: tulis/edit program,
kompilasi, eksekusi
1.2.3 Pemeriksaan Kesalahan oleh Kompilator dan Interpreter
Kompilator dapat melakukan pemeriksaan kesalahan pada program saat kompilasi, kesalahan ini
hanya berupa kesalahan yang bisa diketahui secara statik (misalnya kesalahan penggunaan tipe data),
pemeriksaan ini umumnya disebut dengan compile time error checking. Tidak semua kesalahan
program bisa dideteksi saat kompilasi.
Kompilator juga bisa menyisipkan kode untuk melakukan pemeriksaan kesalahan pada saat program
berjalan, misalnya jika pengguna memasukkan bilangan nol sebagai pembagi maka program bisa
dihentikan karena pembagian dengan nol tidak mungkin dilakukan. Pemeriksaan kesalahan yang
pada saat program berjalan disebut dengan run time error checking. Pemeriksaan run time ini
tergantung pada kompilator, ada kompilator yang melakukan banyak pemeriksaan pada saat run
time, ada juga yang tidak.
Sebagian besar interpreter menerjemahkan kode satu persatu, sehingga pemeriksaan kesalahan selalu
dilakukan saat run time meskipun ada juga yang melakukan pemeriksaan awal sebelum kode mulai
diinterpretasi.
Tim Olimpiade Komputer Indonesia
4 Konsep Dasar Pemrograman Prosedural
1.2.4 Kompilator vs Interpreter
Apakah suatu bahasa diinterpretasi atau dikompilasi bergantung pada ketersediaan interpreter atau
kompilator untuk bahasa tersebut. Sebagai contoh, kita tidak dapat mengatakan bahwa bahasa BASIC
adalah bahasa yang diinterpretasi karena ada juga kompilator untuk bahasa BASIC.
Interpreter dan kompilator masing-masing memiliki keuntungan dan kerugian. Kelebihan interpreter
adalah pengembangan program lebih cepat, tidak perlu melakukan kompilasi yang mungkin butuh
waktu lama, namun kerugiannya setiap kali program perlu dijalankan, interpreter harus bekerja lagi,
sehingga kecepatan eksekusi program menjadi kurang jika dibanding dengan kompilator.
Sebaliknya penggunaan kompilator memungkinkan kita membentuk program yang dapat langsung
dijalankan dengan cepat (karena sudah dalam bahasa mesin), namun dibutuhkan waktu yang relatif
lama dalam pengembangan programnya.
1.3 Kompilator + Interpreter
Meskipun tidak terlalu penting dalam pembahasan buku ini, namun perlu diketahui bahwa ada
bahasa yang dikompilasi namun tidak ke dalam bahasa mesin (ke bahasa antara), lalu diinterpretasi
oleh suatu interpreter untuk menjalankannya. Sebagian pekerjaan interpreter (memvalidasi program)
sudah dilakukan oleh kompilator, sehingga interpreter hanya perlu mengeksekusi program saja.
Contoh bahasa yang menggunakan pendekatan ini adalah: Java, C#, dan VB.NET
1.3.1 Debugger
Kesalahan pertama yang ditemukan pada salah satu komputer pertama (yang saat itu masih sangat
besar) adalah karena adanya serangga/kutu (bug) yang menyebabkan komputer tidak bekerja. Sejak
saat itu semua kesalahan, baik di bidang hardware maupun software komputer disebut dengan bug
(istilah ini lebih umum di bidang software dibanding hardware).
Proses untuk menemukan kesalahan program disebut juga dengan proses pencarian bug (istilah
proses ini adalah debug). Dalam pencarian kesalahan ini terkadang diperlukan program pembantu
yang dinamakan debugger. Program ini akan membantu pemrogram untuk melihat bagaimana
eksekusi program dilakukan oleh komputer, dan melihat kesalahan yang mungkin ada ketika
program sedang berjalan.
Tim Olimpiade Komputer Indonesia
Konsep Dasar Pemrograman Prosedural 5
1.3.2 Editor, Kompilator, dan IDE
Untuk memasukkan program ke dalam komputer, kita perlu tools yang dinamakan editor. Editor
adalah program yang mampu menerima teks dari manusia, dan menyimpannya ke dalam bentuk
digital yang dimengerti komputer. Editor juga memungkinkan kita melakukan koreksi terhadap
pengetikan yang kita lakukan (menghapus teks, menyalin teks, dan lain-lain). Bentuk kode program
yang kita masukkan ini disebut dengan kode sumber atau source code.
Untuk menjalankan program yang sudah kita ketikkan, kita akan membutuhkan kompilator atau
interpreter. Pada bahasa Pascal, kompilator lebih umum dipakai dibanding interpreter. Perlu
diperhatikan bahwa editor dan kompilator adalah dua program yang terpisah dan berbeda.
Sebuah IDE (Integrated Development Environment) adalah program yang menggabungkan fungsi
editor dan kompilator (serta terkadang debugger) dalam satu paket. IDE saat ini semakin populer,
bahkan banyak orang yang menyangka bahwa IDE sama dengan kompilator. Sebuah IDE mungkin
saja sekaligus memiliki fungsi kompilator, tapi tidak selalu demikian, terkadang IDE hanya
menyediakan fungsi editor, dan akan memanggil kompilator yang sesungguhnya ketika kita akan
mengkompilasi program.
1.4 Aneka Implementasi Kompilator Pascal
Sama seperti mobil, yang memiliki fungsi yang sama namun memiliki banyak merk, saat ini ada
banyak merk kompilator. Setiap kompilator ini memiliki fungsi yang sama namun memiliki
perbedaan dalam hal detailnya. Perbedaan kompilator ini ada karena beberapa hal:
• Perbedaan sistem operasi menyebabkan sifat kompilator berbeda
• Kurang detailnya standar bahasa Pascal menyebabkan interpretasi yang berbeda terhadap standar
Pascal
• Masing-masing pembuat kompilator menambahkan fitur di luar standar Pascal untuk
mempermudah pembuat program
Secara umum, semua fitur standar bahasa Pascal akan didukung oleh aneka kompilator yang ada saat
ini. Jika Anda terkadang menemukan ada program yang tidak berjalan di suatu sistem operasi atau di
suatu kompilator tertentu, maka Anda perlu memeriksa apakah program yang Anda buat memenuhi
standar Pascal.
Tim Olimpiade Komputer Indonesia
6 Konsep Dasar Pemrograman Prosedural
1.5 FreePascal
Dari aneka kompilator yang ada, FreePascal dipilih sebagai acuan dalam buku ini. FreePascal dipilih
dengan beberapa alasan:
- FreePascal tersedia gratis, dan bersifat opensource, sehingga kode sumber kompilatornya sendiri
bisa dilihat dan dipelajari
- Dokumentasi FreePascal juga tersedia gratis
- FreePascal merupakan kompilator resmi yang dipakai pada IOI (International Olympiad in
Informatics/Olimpiade Informatika Internasional)
- FreePascal memenuhi standar Pascal
Meskipun kompilator FreePascal banyak diacu dalam buku ini, buku ini bisa dipakai bersama
kompilator yang lain (bahkan dapat dipakai untuk bahasa pemrograman selain Pascal), namun perlu
diperhatikan bahwa setiap kompilator memiliki perbedaan, dan hal tersebut harus dikonsultasikan
pada manual masing-masing kompilator.
Tim Olimpiade Komputer Indonesia
Konsep Dasar Pemrograman Prosedural 7
Tim Olimpiade Komputer Indonesia
Bab 2
PEMROGRAMAN PROSEDURAL
Pemrograman dalam paradigma prosedural dilakukan dengan memberikan serangkaian perintah
yang berurutan. Dalam bab ini akan dibahas hal-hal yang menjadi dasar dalam pemrograman
prosedural, meliputi definisi algoritma dan konstruktor pemrograman prosedural, serta konsep
Input, Proses, dan Output yang sangat lazim dalam dunia pemrograman prosedural.
2.1 Algoritma
Algoritma adalah serangkaian langkah-langkah yang tepat, terperinci, dan terbatas untuk
menyelesaikan suatu masalah. Langkah yang tepat artinya serangkaian langkah tersebut selalu benar
untuk menyelesaikan masalah yang diberikan. Langkah yang tidak memberikan hasil yang benar
untuk domain masalah yang diberikan bukanlah sebuah algoritma.
Langkah yang terperinci artinya setiap langkah diberikan secara detail dan dapat dieksekusi oleh
komputer, instruksi seperti “angkat sedikit ke kiri” merupakan contoh instruksi yang tidak tepat,
karena “sedikit” tidak menyatakan sesuatu dengan tepat.
Langkah yang diberikan harus terbatas, artinya suatu saat langkah harus berhenti, jika langkah tidak
pernah berhenti (misalnya: “ambil air, masukkan ke bak mandi, ulangi ambil air, dan seterusnya”)
maka serangkaian langkah itu tidak disebut sebagai algoritma (jika: “ambil air, masukkan ke bak
mandi, ulangi ambil air sampai bak mandi penuh”, maka bisa disebut algoritma, namun langkah
ambil air, masukkan ke bak mandi, harus diperinci dan dapat dieksekusi oleh mesin).
2.2 Konstruktor (elemen) Pemrograman Prosedural
Elemen bahasa pemrograman prosedural yang penting adalah:
1. Program utama
2. Tipe
3. Konstanta
4. Variabel
Konsep Dasar Pemrograman Prosedural 9
5. Ekspresi, operator, dan operand
6. Struktur Data
7. Instruksi dasar
8. Program Moduler
9. File eksternal
10. Rekurens
Konstruktor ini tidak untuk dipelajari secara berurutan, namun semua perlu dipelajari dan
dimengerti untuk dapat membuat program dengan baik.
2.3 Input, Proses, dan Output
Sekumpulan aksi dalam pemrograman prosedural bisa dibagi menjadi tiga bagian penting yaitu:
input, proses, dan output. Bagian input, proses, dan output dikerjakan secara sekuensial, dan dalam
setiap bagian mungkin akan ada input, proses, dan output.
Tim Olimpiade Komputer Indonesia
Bab 3
PENGENALAN PROGRAM UTAMA
DALAM PASCAL
Program utama adalah bagian program yang menjadi titik awal eksekusi bagi suatu program. Sebuah
program bisa terdiri dari banyak bagian (subprogram dan unit), dan eksekusi akan dimulai dari
program utama yang mungkin akan memanggil fungsi-fungsi yang lain.
Mengenal program utama dalam suatu bahasa akan memberikan gambaran global bagaimana
menulis program dalam bahasa tersebut. Program dalam bahasa Pascal memiliki format dasar seperti
berikut (format lebih lengkap akan diberikan secara bertahap):
Program namaprogram;
begin
(*bagian program utama*)
end.
Kata-kata yang ditebalkan merupakan kata kunci (keyword) dalam bahasa Pascal. Kata kunci adalah
kata-kata baku dalam bahasa Pascal yang memiliki arti khusus, kata-kata tersebut harus kita pakai
sesuai dengan makna yang sudah berikan oleh Pascal, dan tidak bisa kita ubah.
Bagian pertama berisi nama program. Bagian ini tidak wajib ada di kompilator Pascal yang baru,
namun sebaiknya tetap ditulis, kita bisa memberi nama program dengan kata kunci program,
misalnya: program bilanganprima;
Bagian berikutnya adalah blok program utama yang ditandai dengan begin dan end. Perhatikan
bahwa setelah end ada tanda titik yang menyatakan akhir program. Bagian di dalam tanda kurung
diikuti oleh bintang/asterisk, (*seperti ini*) merupakan komentar program yang tidak akan
diproses oleh kompilator (hanya untuk dibaca oleh manusia, sebagai tambahan keterangan).
Program yang diberikan di atas tidak melakukan apa-apa, meskipun dapat dikompilasi dan
dijalankan. Program sederhana yang dapat kita buat berikutnya adalah program “hello world” yang
Konsep Dasar Pemrograman Prosedural 11
akan mencetak kalimat “hello world” ke layar komputer.
Program hello;
begin
writeln('Hello World');
end.
Program tersebut juga ada pada buku Contoh Program kecil dalam bahasa Pascal. Beberapa hal yang
perlu diperhatikan adalah:
• Pascal tidak membedakan case atau kapitalisasi huruf (jadi writeln dengan WRITELN dianggap
sama). Perhatikan bahwa banyak bahasa membedakan kapitalisasi huruf, sehingga konsistensi
dalam penulisan sebaiknya dibiasakan.
• Setelah setiap instruksi harus ada titik koma (titik koma adalah pemisah antar instruksi), kecuali
instruksi terakhir sebelum end, boleh ada titik koma, boleh juga tidak
• Writeln adalah salah satu prosedur standar Pascal
Bagian yang ada di antara blok begin dan end adalah instruksi-instruksi dalam bahasa Pascal.
Instruksi yang ada bisa berupa assignment, pemanggilan fungsi, pengulangan, instruksi kondisional,
dan lain-lain.
Batasan Penamaan Identifier
Identifier adalah nama yang diberikan untuk fungsi, prosedur, tipe, variabel, dan untuk program.
Semua nama yang disebutkan memiliki batasan tergantung pada kompilator yang digunakan,
namun umumnya:
• Nama tidak boleh diawali dengan angka, 2you adalah identifier yang tidak valid
• Nama boleh berupa huruf yang digabung dengan angka, tapi tidak boleh diawali angka: its4you
adalah nama yang valid
• Nama yang hanya terdiri dari huruf saja pasti valid (sampai panjang tertentu, tergantung
kompilator)
• Nama biasanya boleh mengandung tanda underscore (garis bawah seperti ini: nama_orang)
Perhatian: pilihlah nama yang singkat namun deskriptif untuk menamai apapun dalam program.
Tim Olimpiade Komputer Indonesia
Bab 4
EKSPRESI, VARIABEL, DAN TIPE DASAR
Konsep variabel dalam pemrograman mirip dengan konsep variabel dalam matematika. Variabel
adalah suatu nama yang dapat diasosiasikan dengan sebuah nilai yang dapat kita manipulasi. Seperti
dalam matematika, kita mengenal tipe untuk suatu variabel, misalnya 1 ≤ x < pi =" 3.14;" 5 =" 10," 3 =" 6," 2 =" 1." 2 =" 2," 2 =" 2." 2 =" 1," 5 =" 2" 5 =" 2)." 2 =" -10."> (lebih besar), < (kurang dari), <= (kurang dari atau sama dengan), >= (lebih dari atau sama dengan), tidak sama dengan (<>) dan = (sama dengan). Operasi
perbandingan memiliki semantik yang sama seperti yang dipelajari dalam matematika (sama seperti
di matematika 6 > 5).
Tim Olimpiade Komputer Indonesia
Konsep Dasar Pemrograman Prosedural 17
4.8.1 Urutan Operator (Precedence of operator) Integer
Ekspresi 2 * 4 + 5 * 2 akan menghasilkan 18 karena operasi perkalian dilakukan lebih dahulu jika
dibandingkan dengan pejumlahan. Dalam hal ini dikatakan bahwa precedence kali lebih tinggi dari
bagi. Umumnya precedence of operator untuk integer di aneka bahasa adalah sama.
4.9 Karakter
Di dalam Pascal dan aneka bahasa lain, dikenal tipe data char yang bisa menampung satu karakter.
Satu karakter adalah satu huruf, atau satu angka, atau simbol. Sebuah variabel bertipe karakter hanya
boleh diisi dengan satu simbol saja, seperti ini:
program assign_char;
var c:char;
begin
c:= 'A'; (* c berisi huruf A *)
end.
4.9.1 Representasi karakter dalam komputer
Dalam bahasa Pascal standar. Sebuah karakter adalah sebuah bilangan integer 8 bit yang memiliki
nilai dari 0 sampai 255. Setiap nilai ini dipetakan dalam suatu simbol, misalnya nilai 65 adalah nilai
untuk simbol A, 66 adalah nilai simbol B, dan seterusnya. Pemetaan ini tergantung pada encoding
yang dipakai (dan encoding ini bergantung pada wilayah atau bahasa tertentu), karakter 0 - 127
memiliki pemetaan standar yang disebut dan biasanya disebut dengan karakter ASCII (American
Standard Code For Information Interchange), sedangkan sisanya bergantung pada encoding yang dipakai
(misalnya orang Perancis memetakan menjadi beraneka huruf yang memiliki accent, orang Rusia
memetakan dalam alfabet mereka).
Dalam Pascal, ada fungsi ord (ordinal) yang bisa memetakan dari karakter menjadi nilainya, dan
fungsi chr (character) yang melakukan proses kebalikannya. Contoh pemakaian ord:
writeln(ord('A'));
akan mencetak angka 65, dan contoh pemakaian chr
writeln(chr(65));
Tim Olimpiade Komputer Indonesia
18 Konsep Dasar Pemrograman Prosedural
akan mencetak huruf A.
UNICODE
Dalam sistem operasi yang modern, terdapat jenis karakter yang disebut dengan
UNICODE, yang lebih kompleks dari karakter sederhana. Karakter UNICODE dapat
merepresentasikan hampir semua karakter yang masih dipakai di bumi (dan yang sudah
tidak dipakai, seperti hieroglyph). Pada dasarnya penyimpanan UNICODE tetap memakai
angka tapi memakai jumlah bit yang lebih dari karakter biasa (bervariasi dari 8 – 64 bit,
tergantung pada encoding yang dipakai)
4.9.2 Operasi Terhadap char
Sebuah tipe karakter hanya bisa diberi nilai (assign) dan dibaca nilainya (atau dioutputkan ke
layar/file). Sebuah tipe karakter tidak bisa dioperasikan untuk menghasilkan nilai tertentu, tidak bisa
dijumlahkan ataupun dikurangkan. Tipe char hanya bisa dioperasikan jika dikonversi menjadi integer
dengan ord. Sebuah tipe char bisa digabungkan pada sebuah tipe string.
Sebuah karakter bisa dibandingkan dengan karakter lain, hasil perbandingan adalah perbandingan
nilai ordinal karakter tersebut. Operasi perbandingan yang bisa dilakukan sama dengan yang bisa
dilakukan dengan integer. Contoh: 'A' < 'B', karena ordinal 'A' adalah kurang dari ordinal 'B', namun 'b' > 'A', karena ordinal 'b' (b kecil) lebih dari ordinal 'A' (A kapital).
Perhatian
Manipulasi karakter dengan melakukan konversi ke integer merupakan hal yang sangat tidak
disarankan. Kebiasaan melakukan hal ini juga berbahaya jika suatu saat Anda beralih ke
UNICODE, karena hasil manipulasi serupa mungkin tidak bisa diprediksi.
Jarang sekali karakter ditangani satu per satu, biasanya tipe data untuk menyimpan teks adalah
String. Lihat Bab 8 Tipe Data Lanjut untuk pembahasan mengenai String.
Tim Olimpiade Komputer Indonesia
Konsep Dasar Pemrograman Prosedural 19
4.10 Boolean
Boolean adalah suatu tipe data yang hanya memiliki nilai true (benar) dan false (salah). Tipe boolean
sangat diperlukan dalam kondisi perulangan dan kondisional (menggunakan if). Ekspresi yang
menghasilkan boolean bisa berupa ekspresi dengan tipe-tipe yang terdiri dari tipe boolean, bisa juga
berupa ekspresi dari tipe lain.
Contoh ekspresi yang menghasilkan boolean adalah 6 > 5, karena bilangan 6 memang lebih besar dari
5 maka nilai ekspresi tersebut adalah true, sedangkan 6 <> false adalah
true)
4.10.1 Representasi Boolean dalam komputer
Nilai boolean disimpan sebagai angka 0 untuk false dan bukan nol untuk true. Dalam bahasa Pascal,
boolean tidak bisa dioperasikan sebagai integer, namun dalam bahasa lain (C misalnya), boolean dan
integer adalah dua nilai yang bisa dipertukarkan.
4.10.2 Urutan Operator (Precedence of operator) Boolean
Sama seperti pada integer, ada urutan operator pada operasi boolean. Urutan untuk operator boolean
dapat dilihat pada buku panduan Free Pascal.
4.10.3 Operasi Boolean pada Bilangan Integer
Bilangan integer dapat dioperasikan dengan operator boolean, proses operasi dilakukan dengan
melihat representasi bit pada bilangan integer, dan melakukan operasi boolean yang bersesuaian
terhadap bit tersebut (bit 1 dianggap true, dan 0 dianggap false).
Tim Olimpiade Komputer Indonesia
20 Konsep Dasar Pemrograman Prosedural
Contoh: 1 or 2 = 3
representasi biner untuk 1 desimal adalah (kita ambil 8 bit) 00000001, sedangkan representasi biner
untuk 2 desimal adalah 00000010, maka jika kita or -kan masing-masing bit, hasilnya adalah
00000011, yang artinya 3 desimal
4.11 Real
Real adalah tipe yang dapat menampung bilangan real. Tipe ini bisa menampung bilangan dengan
suatu nilai di belakang koma dengan presisi tertentu (lihat bagian representasi real).
4.11.1 Representasi Real dalam komputer
Ada banyak representasi real dalam komputer, namun umumnya real direpresentasikan dalam
bentuk:
A * 2+/- b
Misalnya nilai 0.5 akan direpresentasikan sebagai 1 * 2-1 (½ = 0.5). Perhatikan bahwa tidak semua
nilai bisa direpresentasikan dengan tepat dengan cara ini, nilai 1/3 misalnya tidak bisa dinyatakan
dengan tepat dalam bentuk perkalian tersebut. Baik nilai A maupun nilai B memiliki presisi integer
yang terbatas.
4.11.2 Operasi Terhadap Real
Operasi yang bisa dilakukan terhadap real meliputi: tambah, kali, minus (sama seperti integer), dan
pembagian (memakai simbol / yang menghasilkan bilangan real), operasi MOD tidak terdefinisi
untuk real.
Operasi perbandingan selain sama dengan(=) dan tidak sama dengan (<>) bisa dilakukan terhadap
real (>, <, >=, <=, <>). Operasi sama dengan dan tidak sama dengan sebenarnya bisa dilakukan (tidak
dibatasi oleh bahasa Pascal), namun dalam kasus tertentu hasilnya mungkin tidak sesuai dengan yang
diharapkan.
Cara yang benar untuk membandingkan 2 buah real adalah dengan menetapkan nilai epsilon yang
Tim Olimpiade Komputer Indonesia
Konsep Dasar Pemrograman Prosedural 21
kecil yang dipakai untuk membandingkan (mengenai penggunaan kalimat kondisional, lihat bab 5 Instruksi
Kondisional):
if (a – b <>b) then writeln(“A lebih besar dari B”);
bagian setelah if disebut dengan bagian kondisi dan bagian setelah then adalah bagian aksi. Jika aksi
lebih dari satu instruksi maka bisa dikelompokkan dalam blok begin end. Seperti ini:
if (a>b) then
begin
writeln(“Kesimpulan:”);
writeln(“A lebih besar dari B”);
end;
5.2 IF dengan ELSE
Selain if - then, ada bentuk kondisional lain yaitu if - then - else. Kita bisa mengubah instruksi
semacam ini:
if (a>b) then writeln(“A lebih besar dari B”);
if (a<=b) then writeln(“A kurang dari atau sama dengan B”); menjadi: if (a>b) then writeln(“A lebih besar dari B”) else (“A kurang dari atau sama dengan B”);
Konsep Dasar Pemrograman Prosedural 25
Bagian else akan dieksekusi jika bagian kondisi tidak dipenuhi, atau dengan kata lain, bagian else
dieksekusi jika kondisi yang terjadi adalah komplemen dari kondisi di bagian if. Dalam bahasa
Pascal, tidak boleh ada titik koma sebelum else.
Perhatikan: untuk memperjelas program, sebaiknya semua instruksi if yang memiliki else ditulis
dengan komentar setelah else (untuk menjelaskan kondisi apa yang ditangani oleh else kepada
pembaca program) seperti ini:
if (a>b) then
begin
writeln(“A lebih besar dari B”);
end else (* a<= b *) begin (“A kurang dari atau sama dengan B”); end; 5.2.1 IF untuk banyak kondisi Instruksi if boleh digabung dengan banyak instruksi if menangani kondisi yang kompleks (banyak kondisi dan banyak aksi), seperti ini: if (kondisi_1) then begin aksi1; end else if (kondisi_2) then begin aksi2; end else (* kondisi 1 dan 2 tidak dipenuhi*) begin aksi_n; end; 5.3 Case untuk banyak aksi Selain IF, ada bentuk analisa kasus yang digunakan untuk menangani banyak kondisi yang ada dalam bentuk (a adalah suatu ekspresi yang menghasilkan tipe enumerasi, dan k1 .. kn adalah konstanta): if (a = k1 ) then begin aksi1; end else if (a = k2) then begin Tim Olimpiade Komputer Indonesia 26 Konsep Dasar Pemrograman Prosedural aksi2; end else if (a=k3) then begin aksi3; end else begin Aksi_n; end; Bentuk ini adalah bentuk case of, seperti ini: case a of k1 : begin aksi_1; end; k2 : begin aksi_2; end; k3: begin aksi_3; end; else begin aksi_n; end; end; Hal yang perlu diperhatikan dalam analisa kasus dengan case adalah bahwa ekspresi yang bisa ditangani dalam case hanya yang nilainya bisa dienumerasi, yaitu integer (dan tipe range), boolean, dan tipe enum (dijelaskan pada bab 8 Tipe Data Lanjut) Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 27 Tim Olimpiade Komputer Indonesia Bab 6 PENGULANGAN Pengulangan adalah suatu cara untuk mengulangi eksekusi blok instruksi (sekumpulan instruksi) sampai suatu kondisi tertentu dipenuhi. 6.1 Bentuk Pengulangan FOR Bentuk pengulangan ini adalah yang paling sederhana, jika kita ingin melakukan aksi sebanyak N kali (kondisi berhenti adalah jika suatu nilai sudah dicapai), maka kita bisa (dan sebaiknya) menggunakan bentuk pengulangan ini. Pengulangan dilakukan mulai dari suatu indeks awal, sampai dengan indeks akhir, misalnya: for i:=1 to 5 do writeln('Hello'); akan mencetak 5 kali kata Hello. Indeks loop (dalam kasus ini i) berguna karena dapat diakses di dalam loop, seperti ini: for i:=1 to 5 do writeln(i); yang akan mencetak angka 1 sampai dengan 5. Bentuk loop ini sangat sederhana, karena kita bisa memastikan bahwa loop pasti akan berhenti, yaitu ketika nilai indeks sudah sama dengan nilai akhirnya. Nilai indeks loop biasanya dapat diubah oleh program, namun Anda disarankan untuk TIDAK mengubah INDEKS LOOP di dalam loop, seperti ini: for i:=1 to 5 do begin i:=i+2; end; Karena hasilnya mungkin tidak dapat diprediksi Konsep Dasar Pemrograman Prosedural 29 Bentuk Pengulangan WHILE - DO Terkadang jumlah pengulangan yang akan dilakukan belum diketahui di awal sehingga kita tidak bisa menggunakan bentuk perulangan for. Bentuk loop ini adalah while (kondisi) do begin aksi; end; Aksi dalam while akan dilakukan selama kondisi memiliki nilai true, dan aksi mungkin tidak dilakukan sama sekali jika di awal loop kondisi sudah bernilai false. Hal yang perlu diperhatikan dalam loop ini adalah kepastian bahwa loop akan berhenti (bahwa suatu saat kondisi akan bernilai false). 6.2 Bentuk Pengulangan REPEAT - UNTIL Bentuk pengulangan while do mungkin tidak pernah mengeksekusi instruksi di dalam loop satu kali pun jika kondisi sudah tidak terpenuhi. Jika diinginkan agar minimal sebuah aksi dieksekusi sekali, maka gunakan bentuk perulangan repeat until . repeat aksi; until kondisi; Aksi akan diulangi sampai kondisi bernilai true. bentuk ini sama saja dengan: aksi; while (not kondisi) do begin aksi; end; Karena loop repeat bisa dikonversi ke bentuk while, maka hal yang perlu diperhatikan sama yaitu bahwa loop pasti akan berhenti. 6.3 NESTED LOOP (Loop Bersarang) Loop boleh memiliki instruksi apa saja di dalamnya, termasuk juga instruksi loop yang lain. Nested loop adalah loop yang memiliki loop di dalam bagian aksinya. Nested loop dapat dibuat dengan Tim Olimpiade Komputer Indonesia 30 Konsep Dasar Pemrograman Prosedural aneka bentuk loop yang sudah ada. Jadi kita bisa membuat loop for di dalam loop for, atau loop while dalam repeat until, atau kombinasi apapun. Jumlah loop di dalam loop bisa sangat banyak (hanya dibatasi oleh kemampuan kompilator dalam menangani loop bersarang). Variabel loop bagian luar dapat dipakai oleh loop di bagian dalamnya. Misalnya nested loop for dapat memakai indeks loop di luarnya sebagai batas seperti dalam potongan program ini (dengan i dan j adalah integer): for i:=1 to 5 do begin for j:=1 to i do begin writeln(“*”); end; end; Akan mencetak: * ** *** **** ***** Tim Olimpiade Komputer Indonesia Bab 7 SUBPROGRAM Di saat program kita sudah menjadi besar kita akan mengalami kesulitan dalam mengatur kode program, jika semua kode tersebut disatukan. Untuk mengatasi hal tersebut, kita bisa menggunakan subprogram untuk membuat program kita terbagi menjadi beberapa bagian yang masing-masing lebih kecil dan lebih mudah dikelola. Pemecahan program menjadi subprogram yang lebih kecil juga akan mempermudah kita jika ingin membuat program yang serupa, kita hanya perlu menyalin, atau memakai subprogram yang sudah ada di dalam program kita yang baru. Dalam setiap bahasa pemrograman prosedural umumnya dikenal prosedur dan fungsi, dua buah bentuk subprogram yang umum. Fungsi adalah subprogram yang memetakan suatu nilai dari suatu domain ke domain lain, sedangkan prosedur adalah suatu subprogram yang melakukan aksi tertentu. 7.1 Prosedur tanpa parameter Prosedur memungkinkan kita membagi program dengan mengelompokkan aksi menjadi bagianbagian yang jelas terpisah, prosedur juga memungkinkan kita memisahkan bagian program yang sering diulang sehingga tidak perlu ditulis ulang di setiap waktu. Contoh penggunaan prosedur tanpa parameter: program testprocedure; procedure CetakHeader; begin writeln('TIM TOKI'); writeln('-------------------'); end; var c: char; begin 32 Konsep Dasar Pemrograman Prosedural writeln('Cetak laporan harian atau bulanan: (H/B):'); if (c='H') then begin CetakHeader; (*diteruskan dgn instruksi untuk mencetak laporan harian *) end else if (c='B') then begin CetakHeader; (*diteruskan dgn instruksi untuk mencetak laporan bulanan*) end else begin writeln('Pilihan salah'); end; end. Perhatikan bahwa pemanggilan prosedur dilakukan dengan menggunakan nama prosedur, seperti ini: CetakHeader; 7.1.1 Prosedur dengan Parameter Agar prosedur lebih generik, maka prosedur bisa menerima parameter. Parameter prosedur berguna sebagai input prosedur: procedure cetakbintang(jumlahbintang: integer) var i:integer begin for i:=1 to jumlahbintang do write('*'); end; Prosedur di atas bisa dipanggil dengan: cetakbintang(5); yang akan mencetak 5 bintang (*****) di layar. Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 33 7.1.2 Prosedur dengan Parameter by Reference Perhatikan bahwa dalam prosedur seperti ini: procedure tambahsatu(angka: integer) var i:integer begin angka: = angka+1; end; dan prosedur tersebut dipanggil dengan cara: var jumlah: integer; begin jumlah:= 5; tambahsatu(jumlah); writeln(jumlah); end. Maka nilai jumlah tidak berubah, tetap 5. Hal ini dikarenakan passing parameter dilakukan by value, artinya nilai jumlah akan disalin, baru akan dipakai oleh prosedur, sehingga nilai jumlah sendiri tidak berubah (hanya salinannya yang berubah). Jika kita mengubah prosedur tersebut menjadi: procedure tambahsatu(var angka: integer) var i:integer begin angka: = angka+1; end; Perhatikan bahwa ada kata kunci var sebelum nama parameter angka, hal itu menyatakan bahwa parameter angka dilewatkan berdasarkan reference (berdasarkan variabel itu sendiri), sehingga sekarang program utama yang sama akan menghasilkan angka 6. Perhatikan bahwa prosedur tambah satu tidak bisa dipanggil seperti ini: tambahsatu(5); karena nilai 5 tidak bisa diubah oleh prosedur tambahsatu. Dengan kata lain, parameter untuk var hanyalah sesuatu yang boleh berada di ruas kiri assignment (biasanya berupa sebuah variabel, tapi apa yang boleh ada di ruas kiri assignment berbeda untuk setiap bahasa, misalnya dalam Pascal nama fungsi boleh berada di ruas kiri assignment pada fungsi itu sendiri, dan pada C makro tertentu boleh di ruas kiri pada assignment). Tim Olimpiade Komputer Indonesia 34 Konsep Dasar Pemrograman Prosedural 7.2 Fungsi Sama seperti definisi dalam matematika, fungsi dalam pemrograman juga berarti pemetaan suatu nilai dari suatu domain ke domain yang lain. Pascal sudah menyediakan aneka fungsi standar, seperti fungsi trigonometri, fungsi kuadrat, dan lain-lain. Dalam implementasinya fungsi hampir sama persis dengan prosedur (boleh memiliki variabel, parameter, dan lain-lain) dengan satu perbedaan yaitu fungsi dapat dan harus mengembalikan nilai. Contoh sebuah fungsi adalah: function kuadrat(x: integer):integer; begin kuadrat:= x * x; end; Perhatikan bahwa pada instruksi: kuadrat:= x * x; Ruas kiri adalah nama fungsi itu sendiri, di sini nilai kembalian dari fungsi diberikan. Untuk memanggil fungsi ini: var hasil:integer; begin hasil:= kuadrat(5); end. Variabel hasil akan memiliki nilai 25 Fungsi harus dideklarasikan sebelum dipanggil agar oleh kompilator dapat memeriksa apakah pemanggilan fungsi sudah benar (baik jumlah maupun jenis parameternya). Fungsi boleh dideklarasikan tapi belum didefinisikan, hal ini berguna untuk mengatasi keadaan di mana fungsi A memanggil fungsi B dan Fungsi B memanggil Fungsi A. (* prototipe, atau deklarasi fungsi *) function kali(a, b:integer):integer; function kali_lima(a:integer):integer; begin Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 35 fungsi_a := kali(a, 5); end; function kali(a, b:integer):integer; begin kali := a * b; end; 7.2.1 Prosedur dan Fungsi yang bersarang Beberapa bahasa, termasuk juga Pascal, mengijinkan prosedur dan fungsi ada dalam fungsi atau prosedur yang lain (dan di dalam prosedur yang ada di dalam prosedur masih boleh ada prosedur lain, demikian seterusnya). 7.2.2 Scope Prosedur dan Fungsi Untuk bahasa yang mendukung prosedur dan fungsi yang bersarang, maka scope prosedur dan fungsi yang ada dalam prosedur hanya pada prosedur atau fungsi terluar. 7.2.3 Scope Variabel Di dalam setiap prosedur boleh ada deklarasi variabel, setiap prosedur boleh memiliki parameter. Variabel-variabel di dalam prosedur ini boleh memiliki nama yang sama. Nama variabel dalam sebuah prosedur hanya berlaku untuk prosedur tersebut, atau secara formal: scope variabel pada sebuah prosedur hanya pada prosedur tersebut. Beberapa aturan: • Nama parameter dan variabel dalam prosedur (disebut variabel lokal) tidak boleh sama • Jika ada nama variabel global yang sama dengan variabel lokal atau nama variabel parameter, maka yang akan diakses adalah variabel lokal atau parameter • Jika tidak ada nama variabel lokal yang sama dengan global, maka variabel global yang akan diakses Lihat contoh mengenai program kecil SUBPRG.PAS dan LINGKUP.PAS Tim Olimpiade Komputer Indonesia 36 Konsep Dasar Pemrograman Prosedural 7.3 Konversi tipe dengan fungsi Konversi tipe yang melibatkan tipe yang berbeda jauh dapat dipandang sebagai konversi tipe yang tidak sederhana. Konversi ini melibatkan penggunaan fungsi khusus yang menjadi bagian dari bahasa, atau fungsi tambahan pendukung bahasa tersebut. Contoh fungsi yang adalah ceil untuk membulatkan bilangan ke atas (6.7 menjadi 7), floor untuk membulatkan bilangan real ke bawah (6.7 menjadi 6), dan round untuk membulatkan bilangan real ke nilai yang terdekat (6.7 menjadi 7). Fungi atau prosedur konversi juga tersedia untuk mengubah integer/real menjadi string dan sebaliknya. Dalam kasus konversi string ke numerik, ada kemungkinan bahwa string tidak mengandung karakter angka, tapi karakter lain sehingga konversi gagal. Fungsi konversi yang disebutkan bukan merupakan standar Pascal, sehingga perlu dikonsultasikan pada dokumentasi kompilator yang dipakai. Untuk FreePascal, informasi ini juga bisa diperiksa di buku FreePascal. Tim Olimpiade Komputer Indonesia Bab 8 TIPE DATA LANJUT Tipe dasar sudah cukup untuk dapat dipakai memproses sebagian besar data yang ada, namun tipe dasar tidak cukup untuk memproses banyak data, apalagi data yang memiliki struktur tertentu. Untuk menyelesaikan persoalan pengolahan data tertentu, suatu tipe data baru dapat dibentuk berdasarkan tipe data dasar (primitif). 8.1 Tipe Enum Tipe enum adalah suatu tipe yang elemennya didefinisikan sendiri satu per satu. Dalam representasinya sebenarnya tipe enum ini adalah sebuah integer yang diberi nama. Dalam Pascal tipe ini didefinisikan dengan cara menyebut elemen-elemennya: type hari = (senin, selasa, rabu, kamis, jumat, sabtu, minggu); warna = (merah, kuning hijau); Tipe enum tidak bisa dibaca (dengan readln) atau ditulis (dengan writeln), tipe jenis ini hanya bisa diberi nilai dengan assignment. Tipe Enumerasi Tipe enumerasi adalah tipe yang elemen-elemennya bisa disebutkan satu persatu (bisa dicacah), integer, enum, dan karakter adalah contoh tipe enumerasi. Tipe real tidak bisa dicacah satu persatu, tipe string juga tidak bisa dicacah satu per satu. 8.2 Subtipe Integer Integer memiliki range tertentu sesuai dengan jumlah bit yang dipakai oleh integer. Terkadang dalam kasus tertentu hanya diperlukan subrange (sebagian range) integer, misalnya untuk mengolah data jam yang berbasis 60 (seksadesimal), yang diperlukan hanyalah angka dari 0 sampai 59, angka di luar itu sifatnya tidak valid. Subtipe integer didefinisikan dengan menyebutkan range untuk tipe tersebut. type jam = 1..12; 38 Konsep Dasar Pemrograman Prosedural menit = 0..59; detik = 0..59; TODO: ini masuk ke mekanisme eksekusi program Pengecekan run time dan compile time Perhatikan bahwa jika Anda memiliki variabel m dengan tipe menit, lalu melakukan hal ini: M := 61; maka kompilator akan menolak program karena ada pemeriksaan pada waktu kompilasi yang mencegah m diisi selain 0 sampai 59. Namun jika dalam program dilakukan hal ini: readln(m); maka program tidak akan menolak jika pengguna memasukkan angka selain 0 sampai 59, dengan kata lain, kompilator hanya melakukan pengecekan waktu kompilasi (compile time), tapi tidak waktu eksekusi (run time). Cara yang benar untuk membaca tipe menit agar masuk ke m adalah dengan membaca integer ke dalam variabel lain dan memeriksa hasil pembacaan, seperti ini: var i:integer; m: menit; begin repeat readln(i); until (i>=0) and (i<=59); m := i; (* bilangan yang dimasukkan ke m pasti sudah valid*) end. 8.3 Tipe SET (himpunan) Tipe himpunan adalah tipe yang bisa menerima himpunan nilai yang masing-masing elemennya adalah tipe enumerasi. Perhatikan: tidak semua bahasa pemrograman prosedural memiliki tipe SET. Deklarasi tipe himpunan adalah: type hari = (senin, selasa, rabu, kamis, jumat, sabtu, minggu); setkar = set of char; harihari = set of hari; Operasi yang tersedia untuk himpunan meliputi: gabungan (union), irisan (intersection), dan pengurangan elemen himpunan, serta pengecekan keanggotaan. Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 39 Tipe set tidak bisa dibaca dan ditulis secara langsung menggunakan read/readln/write/writeln. 8.4 Tipe Komposisi (Record) Suatu tipe bisa disusun dari beberapa tipe, misalnya tipe mahasiswa bisa disusun dari tipe string untuk nama, tipe real untuk nilai, dan tipe integer untuk nomor urutnya. Deklarasi tipe komposisi dalam Pascal adalah: type mahasiswa = record nama:string; urut: integer; nilai:real; end; var mhs: mahasiswa; Cara mengakses elemen tipe adalah dengan titik, misalnya: writeln(mhs.nama); Atau dengan blok with : with mhs do begin writeln(nama); end; Jika bagian dari tipe bentukan merupakan tipe dasar yang bisa langsung dibaca atau tulis maka elemen tersebut bisa langsung dibaca atau ditulis, namun bagian tipe yang tidak bisa dibaca dan ditulis langsung tetap harus diperlakukan khusus. 8.5 Tabel Berdimensi Satu (Array) Jenis variabel yang telah diberikan hanya bisa digunakan untuk menyimpan sebuah nilai saja. Dalam banyak kasus kita perlu menyimpan banyak nilai yang serupa untuk diproses, misalnya data nilai mahasiswa dalam suatu kelas untuk dihitung rata-ratanya. Tabel adalah tipe data yang dapat menampung sejumlah data dengan tipe sejenis, jumlah data yang dapat disimpan dibatasi oleh kemampuan kompilator dan komputer. Deklarasi tabel integer yang Tim Olimpiade Komputer Indonesia 40 Konsep Dasar Pemrograman Prosedural terdiri dari 100 elemen adalah: var tabint : array [1..100] of integer; Dengan deklarasi semacam itu sebuah tabel yang terdiri dari 100 elemen integer dibentuk, dan dapat diakses melalui indeksnya (antara 1 sampai 100, inklusif). Untuk mengakses elemen tabel ke-n gunakan sintaks: tabint[n]. Tabel dapat diproses menggunakan loop (biasanya loop for, karena indeks tabel sudah jelas), contoh berikut akan menjumlahkan seluruh elemen tabel integer yang dideklarasikan di atas (jumlah dan i bertipe integer): Jumlah := 0; for i:=1 to 100 do jumlah := jumlah + tabint[i]; writeln('Jumlah elemen tabel adalah:', jumlah); 8.6 String Dalam Pascal String dapat dianggap sebagai tipe data dasar, namun dalam kebanyakan bahasa String hanyalah tipe data array of character. String dapat menampung serangkaian huruf dan angka. Suatu literal integer dapat ditulis seperti biasa: 5 atau 6, sedangkan literal string harus ditulis dengan diapit tanda kutip tunggal, seperti ini: 'ini string' Jika ada tanda kutip di dalam string, digunakan dua kutip tunggal, jadi untuk menuliskan string “don't do that”, harus seperti ini: 'don''t do that' 8.6.1 Operasi Terhadap String Ada beberapa operasi untuk string, namun yang akan dibahas di bagian ini hanyalah instruksi penambahan atau konkatenasi string. String dapat digabungkan seperti ini: program concat_string; var s1, s2, s3 : string begin s1:= 'hello'; Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 41 s2:='world'; s3:= s1 + ' '+ s2; writeln(s3); end. Nilai string s3 adalah 'hello world' yang merupakan gabungan dari string s1, spasi, dan string s2. Sebuah karakter bisa juga digabung atau disambungkan dengan sebuah karakter: var s:string; c:char; begin writeln('Masukkan sebuah huruf:'); readln(c); s:= 'Huruf yang Anda masukkan adalah '+c; writeln(s); end. Operasi terhadap string yang lain dilakukan dengan menggunakan fungsi-fungsi string yang tergantung pada kompilator Pascal. Fungsi-fungsi string yang tersedia untuk FreePascal dapat dilihat pada buku FreePascal. 8.7 String sebagai Array of Character String sebenarnya adalah tabel berdimensi satu dengan elemennya berupa karakter, indeks ke-0 tabel berisi panjang string saat ini, dan indeks ke 1 dan seterusnya berisi data karakter yang ada pada string. Pada string seperti ini: s := 'hello'; maka s[1] = 'h', s[2]='e', dst. Sedangkan ord(s[0]) akan berisi panjang string yaitu 5. Pengaksesan panjang string melalui elemen ke-0 tidak disarankan, karena tergantung pada implementasi Pascal, elemen string sebaiknya hanya diakses mulai dari elemen 1 sampai panjang string. 8.8 Tabel Berindeks Banyak (Tabel Multi Dimensi) Terkadang kita perlu memiliki tabel dengan dimensi lebih dari satu. Matriks merupakan salah satu contoh tabel dengan banyak dimensi (tabel multi dimensi). Tabel multi dimensi dipandang oleh semua bahasa yang mengenal tipe data tabel satu dimensi, karena tabel dua dimensi bisa dipandang sebagai tabel dari tabel. Tim Olimpiade Komputer Indonesia 42 Konsep Dasar Pemrograman Prosedural Dalam Pascal, tipe tabel multi dimensi dapat dideklarasikan seperti ini: var matriks : array [1..4, 1..5] of integer; untuk dimensi yang lebih dari dua, tambahkan koma setelah 1..5 dan tambahkan range indeks untuk dimensi berikutnya dan seterusnya. alternatif lain adalah: var matriks : array [1..4] of array [1..5] of integer; Pengaksesan elemen tabel dilakukan dengan memberikan indeks baris dan kolom: matriks[baris, kolom] := nilai; atau: matriks[baris][kolom] := nilai; Pemrosesan tabel multi dimensi umumnya dilakukan dengan nested loop. Hal yang perlu diperhatikan dalam pemrosesan tabel dengan loop adalah bahwa indeks tabel tidak boleh lebih dari yang sudah dideklarasikan. Tabel berdimensi dua bisa dipandang sebagai matriks, tabel berdimensi tiga dapat dipandang sebagai ruang. Tabel dengan dimensi lebih dari tiga tidak disarankan untuk digunakan dalam program. Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 43 Tim Olimpiade Komputer Indonesia Bab 9 FILE Variabel adalah bentuk penyimpanan internal ketika program dijalankan. Setelah program selesai, maka nilai variabel tersebut akan hilang. Ada banyak kasus dimana diinginkan agar nilai variabel bisa disimpan kemudian dipakai kembali. Untuk melakukan penyimpanan tersebut, kita bisa menggunakan file (berkas). File adalah suatu bentuk penyimpanan eksternal dalam suatu media penyimpanan. Program yang ditulis adalah sebuah file, hasil kompilasi (program) juga adalah sebuah file. Ketika Anda mengedit dengan editor, yang Anda edit merupakan file yang jenisnya adalah teks. File berguna untuk menyimpan data yang akan dipakai kembali, karena apa yang disimpan di file akan ada di media penyimpanan sekunder (harddisk atau disket), dan dapat dipakai kembali meskipun komputer sudah dimatikan. Hal ini berbeda dengan variabel yang nilainya akan hilang ketika program selesai berjalan. 9.1 File teks dan File biner File teks adalah file yang isinya bisa dibaca dan dibuat langsung dengan editor teks biasa, sedangkan file biner adalah file yang memiliki format khusus yang harus dibaca oleh program khusus. Dalam lomba TOKI dan IOI, jenis file yang digunakan hanya file Teks, sehingga buku ini juga hanya membahas penggunaan file teks. 9.2 Nama Fisik File File di dalam disket atau harddisk (atau media penyimpanan manapun) akan diidentifikasi dengan menggunakan suatu nama file. Nama ini disebut dengan nama fisik. Sistem operasi memiliki batasan dalam penamaan file ini (misalnya di DOS atau Windows nama file tidak boleh mengandung karakter titik dua, di DOS nama file maksimal 11 Karakter). Setiap sistem operasi juga memiliki sifat yang berbeda dalam menangani perbedaan case pada nama Konsep Dasar Pemrograman Prosedural 45 file. Windows dan DOS menganggap Aku dan AKU adalah file yang sama, sementara Linux menganggap bahwa Aku dan AKU mengacu ke dua file yang berbeda. Perbedaan dalam sistem operasi ini perlu diperhatikan oleh program agar dapat berjalan di semua lingkungan. 9.2.1 Primitif Pemrosesan File Ada lima primitif yang digunakan dalam memproses file, yang meliputi assign nama fisik ke nama logik, pembukaan file, pembacaan file, penulisan file, dan penutupan file. • Assign nama fisik ke nama logik Pemrosesan file diawali dengan assignment nama fisik (berupa string yang merupakan nama yang dikenali sistem operasi) ke nama logik (suatu variabel dalam program yang memiliki tipe file atau tipe text). Proses assignment ini dilakukan agar dalam semua langkah berikutnya file bisa diacu berdasarkan variabel tersebut dan bukan nama fisiknya.Assignment nama fisik ke nama logik tidak melakukan hal apapun terhadap file. Dalam beberapa bahasa, proses assignment dari nama fisik ke nama logik dilakukan ketika file dibuka. Dalam Pascal, assignment ini merupakan langkah yang terpisah dari langkah membuka file. Contoh assign: var t:text; begin assign(t, 'file.txt'); end. • Membuka file Setelah proses assign file dilakukan, maka file dapat dibuka. Ketika membuka file, harus ditentukan operasi apa yang hendak dilakukan terhadap file tersebut, apakah file akan dibaca saja, atau file akan ditulisi, atau file akan ditambah isinya di bagian akhir (append), atau file akan dibaca dan ditulis. Pada Pascal, file teks bisa dibuka untuk dibaca dengan memanggil prosedur reset, dibuka untuk ditulis (isi file sebelumnya akan dihapus) dengan prosedur rewrite, dan dibuka untuk ditambah isinya dengan prosedur append. File teks di Pascal tidak bisa dibuka untuk dibaca dan ditulis sekaligus. Tim Olimpiade Komputer Indonesia 46 Konsep Dasar Pemrograman Prosedural • Membaca file File yang dibuka dengan prosedur reset bisa dibaca menggunakan read atau readln. Proses pemabacaan seolah-olah seperti ada pengguna yang mengetikkan suatu input melalui keyboard. Jika ada file dengan nama input.txt dengan isi berikut: hello 123 (isi file satu baris kata hello, diikuti satu baris angka 123). maka jika program berikut ini dijalankan: program baca_file; var t:text; s:string; i:integer; begin assign(t, 'input.txt'); reset(t); (*buka file untuk dibaca*) readln(t, s); (*baca string dari file*) readln(t, i); (*baca integer dari file *) writeln(s); (*tuliskan string yang dibaca dari file *) writeln(i); (*tuliskan integer yang dibaca dari file *) close(t); end. Maka hasilnya adalah program akan mencetak hello dan diikuti dengan angka 123 di baris berikutnya. Kata hello dan angka 123 dibaca dari file input.txt. • Menulis file Sebaliknya, sebuah file yang dibuka dengan menggunakan append bisa ditulisi dengan menggunakan write atau writeln, dengan parameter pertama adalah nama logik file. Penulisan dengan write dan writeln yang dilakukan terhadap file akan tertulis pada file dan tidak pada layar. File yang sudah ditulisi ini bisa dibaca lagi dengan program yang serupa. Program berikut ini akan menuliskan 2 baris ke dalam sebuah file teks, baris pertama adalah kata hello dan baris kedua adalah sebuah integer 123 program tulis_file; var t:text; begin assign(t, 'output.txt'); rewrite(t); (*buka file untuk ditulisi*) writeln(t, 'Hello'); (*tuliskan string ke dalam file*) writeln(t, 123); (*tuliskan integer ke dalam file *) Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 47 close(t); end. Hasil output program di atas dapat dibaca oleh contoh program sebelumnya. • Menutup file Setelah selesai, maka file perlu ditutup. Setelah file ditutup sistem operasi akan memastikan bahwa file dipindahkan ke media penyimpanan, sebelum file ditutup, file mungkin belum dituliskan ke media penyimpanan. Penutupan file dalam Pascal dilakukan dengan memanggil prosedur close dengan parameter nama logik file yang telah dibuka. 9.3 Skema dasar Pembacaan File Semua soal TOKI dan IOI mewajibkan peserta membaca input dari sebuah file dan menuliskan hasil ke dalam file lain. Setiap soal TOKI selalu diberi jumlah baris yang akan dibaca berikutnya, misalnya file berisi : 5 adi budi charlie desi eni Skema pembacaan yang dilakukan untuk membaca soal semacam itu adalah dengan loop for dengan terlebih dahulu membaca jumlah yang akan diloop, misalnya seperti ini (anggap t adalah nama logik untuk file yang sudah dibuka untuk dibaca, i adalah sebuah integer, dan tabs adalah array of string): readln(t, jumlahbaris); for i:=1 to jumlahbaris do begin readln(t, tabs[i]); end; Pembacaan file juga bisa dilakukan terhadap file yang tidak diketahui jumlah barisnya dengan menggunakan fungsi eof. Fungsi eof akan mengembalikan true jika akhir dari file telah tercapai, dan false jika belum. (* buka file *) While (not eof(t)) do begin readln(t, s); (* lakukan pemrosesan *) end; Tim Olimpiade Komputer Indonesia 48 Konsep Dasar Pemrograman Prosedural STDIN dan STDOUT Sebenarnya fungsi read/readln dan write/writeln tanpa parameter file akan menganggap dua buah nama logik untuk input dan output. Read dan Readln akan membaca dari nama logik STDIN yang merupakan file input standar (yang dipetakan oleh sistem operasi menjadi input dari keyboard), sedangkan Write dan Writeln akan menulis ke nama logik STDOUT yang merupakan file output standar (yang dipetakan oleh sistem operasi menjadi output ke layar komputer). Sehingga instruksi readln(s); sama saja dengan readln(stdin, s); dan writeln(s); sama saja dengan writeln(stdout, s); Anda mungkin akan banyak menemui contoh program dari peserta TOKI yang memakai teknik seperti ini: assign(stdin, 'input.txt'); reset(stdin); yang memetakan ulang stdin ke file 'input.txt' sehingga untuk membaca file cukup dilakukan dengan readln(s); (* sama dengan readln(stdin, s) *) Sebaliknya stdout juga bisa dipetakan agar semua writeln akan muncul di file. Assign(stdout, 'fileout.txt'); rewrite(stdout); Teknik semacam ini sebaiknya tidak digunakan, karena selain mengurangi keterbacaan program, program memakai fitur sistem operasi (yang kebetulan saat ini didukung oleh Windows dan Linux), yang mungkin tidak akan ada di semua sistem. Tim Olimpiade Komputer Indonesia Konsep Dasar Pemrograman Prosedural 49 Tim Olimpiade Komputer Indonesia Bab 10 FUNGSI DAN PROSEDUR REKURSIF Fungsi dan prosedur bisa memiliki sifat yang rekursif, artinya prosedur dan fungsi tersebut memanggil dirinya sendiri dalam bagian implementasinya. Struktur data juga bisa memiliki sifat yang rekursif, yang artinya struktur data tersebut bisa menunjuk ke struktur data yang lain yang sama. Struktur data rekursif tidak akan dibahas dalam buku ini, karena terlalu komplels. Fungsi rekursif hanya akan dibahas perkenalannya saja. Konsep rekursif bisa sangat rumit, dan akan dibahas di buku lain yang mengajarkan problem solving dan algoritma. 10.1 Fungsi yang rekursif Fungsi faktorial adalah contoh fungsi yang rekursif, fungsi rekursif ini mengandung dirinya sendiri dalam definisinya: faktorial n = faktorial (n – 1) * n dan faktorial 0 = 1 Perhatikan bahwa ada dua definisi fungsi ini, yaitu untuk n = 0 (yang hasilnya adalah 1) dan untuk n lebih dari nol (hasilnya adalah faktorial (n – 1) dikalikan dengan n. Bagian yang tidak memanggil dirinya sendiri (dalam kasus n = 0) disebut dengan basis, sedangkan bagian yang memanggil dirinya sendiri disebut sebagai bagian rekurens. function faktorial(n: integer):integer; begin if (n=0) then (*basis*) begin Konsep Dasar Pemrograman Prosedural 51 faktorial:= 1; end else (* rekurens *) begin faktorial:= n * faktorial ( n – 1); end; end; Tanpa bagian basis, maka rekursi tidak akan berhenti, jadi bagian basis ini harus ada, dan harus dijamin bahwa pada suatu saat kondisi basis akan dipenuhi. 10.2 Rekursif dan interatif Suatu bentuk rekursif bisa diubah menjadi bentuk iteratif (bentuk perulangan/loop), misalnya fungsi faktorial di atas dapat diubah menjadi: function faktorial(n: integer):integer; var i, hasil: integer; begin i:=0; hasil:=1; while (i
begin
i:=i+1;
hasil:=hasil * i;
end;
faktorial:= i;
end;
Secara umum semua bentuk rekursif bisa diubah menjadi bentuk interatif. Penggunaan bentuk
rekursif biasanya lebih lambat, namun bentuk rekursif biasanya lebih natural untuk menyelesaikan
masalah yang sifatnya memang rekursif.
Tim Olimpiade Komputer Indonesia
Index
A
algoritma · 2, 8, 49
Algoritma · 8
append · 44, 45
Array · 38, 40
ASCII · 17
Assign · 44, 47
Assignment · 12, 44
B
bahasa assembly · 2
Bahasa assembly · 2
bahasa mesin · 2, 3, 4
bahasa Pascal · 4, 5, 10, 11, 12, 17,
19, 20
biner · 15, 16, 19, 43
Boolean · 14, 18, 19
bug · 4
C
Case · 24
case of · 25
Character · 40
compile time · 37
D
debugger · 1, 4
deklaratif · 1
E
Editor · 4
eksekusi · 1, 3, 4, 27, 37
Eksekusi · 2
EKSEKUSI · 1
Ekspresi · 9, 16, 18, 21
Elemen · 8
Enum · 36
Enumerasi · 36
eof · 46
F
faktorial · 49, 50
false · 18, 19, 28, 46
File · 9, 43, 44, 45, 46
FOR · 27
FreePascal · 5, 14, 35, 40
Fungsi · 30, 33, 35, 40, 46, 49
fungsional · 1
G
global · 10, 34
H
hardware · 2, 4
hardware) · 4
himpunan · 37
I
IDE · 4
Identifier · 11
if - then · 23
if - then - else · 23
Indeks loop · 27
input · 9, 14, 15, 31, 45, 46, 47
Input · 8, 9, 14
Instruksi · 9, 23, 24
Integer · 14, 15, 16, 19, 36
Integrated Development
Environment · 4
interpreter · 1, 2, 3, 4
Interpreter · 2, 3, 4
intersection · 37
Konsep Dasar Pemrograman Prosedural 53
iteratif · 50
K
Karakter · 14, 17, 43
keyword · 10
kompilator · 1, 2, 3, 4, 5, 10, 11, 29,
35, 37, 38, 40
Kompilator · 3, 4, 5
Konstanta · 8, 14
Konversi · 21, 22, 35
L
lokal · 34
loop · 15, 27, 28, 29, 39, 41, 46, 50
M
mekanisme · 1
MEKANISME · 1
MOD · 20
Moduler · 9
N
NESTED LOOP · 28
O
objek · 1
operand · 9, 16
operator · 9, 16, 19
ord · 17, 18, 40
output · 9, 14, 45, 46, 47
Output · 8, 9, 14
P
paradigma · 1, 2, 8
Paradigma · 1, 2
PARADIGMA · 1
parameter · 31, 32, 33, 34, 45, 46, 47
Parameter · 31, 32
pemrograman · 1, 5, 8, 9, 12, 13, 14,
16, 30, 33, 37, 55
PEMROGRAMAN · 1, 8
precedence · 16
program · 1, 2, 3, 4, 5, 9, 10, 11, 12,
14, 24, 27, 29, 30, 32, 34, 37, 39,
43, 44, 45, 46, 47
PROGRAM · 1, 10
programmer · 2, 4
prosedur · 11, 14, 30, 31, 32, 33, 34,
35, 44, 45, 46, 49
prosedural · 1, 2, 8, 9, 14, 30, 37
proses · 4, 9, 17, 19, 21, 44
Proses · 4, 8, 9, 44, 45
R
read · 15, 38, 45, 47
readln · 15, 36, 37, 38, 40, 45, 46, 47
real · 12, 15, 19, 20, 21, 22, 35, 36, 38
Real · 14, 19, 20
reference · 32
rekurens · 49, 50
Rekurens · 9
REKURENS · 49
rekursif · 49, 50
REPEAT - UNTIL · 28
representasi · 1, 13, 15, 19, 20, 22
reset · 44, 45, 47
rewrite · 44, 45, 47
run time · 37
S
Scope · 34
seksadesimal · 36
sekuensial · 2, 9
SET · 37
sintaks · 2, 39
software · 4, 55
STDIN · 47
STDOUT · 47
String · 39, 40
Struktur Data · 9
subprogram · 30
Subtipe · 36
T
Tabel · 38, 39, 40
teks · 4, 43, 44, 45
Tipe · 8, 13, 14, 16, 18, 19, 21, 36,
37, 38
TOKI · 30, 43, 46, 47, 55
true · 18, 19, 28, 46
U
unary · 16
underscore · 11
UNICODE · 17, 18
Tim Olimpiade Komputer Indonesia
54 Konsep Dasar Pemrograman Prosedural
union · 37
V
valid · 11, 36, 37
variabel · 11, 12, 13, 14, 15, 17, 21,
32, 33, 34, 37, 38, 43, 44
Variabel · 8, 12, 14, 21, 33, 34
W
WHILE - DO · 27
write · 14, 15, 31, 38, 45, 47
writeln · 11, 13, 14, 17, 20, 22, 23,
24, 27, 29, 30, 31, 32, 36, 38, 39,
40, 45, 47
Tim Olimpiade Komputer Indonesia
Konsep Dasar Pemrograman Prosedural 55
Tim Olimpiade Komputer Indonesia
(http://www.toki.or.id/archive/DiktatJoe/KonsepPemrograman.pdf)
Tidak ada komentar:
Posting Komentar