pengantar algoritma & pemrograman komputer

116
Algoritma & Pemrograman Hendra, S.T. Indoprog 1 Pengantar Algoritma & Pemrograman Komputer Program Komputer Program komputer adalah suatu himpunan dari instruksi yang memberitahukan kepada komputer apa yang harus dilakukan. Instruksi tersebut mungkin memberitahukan kepada komputer untuk menambah, membandingkan, dan membuat keputusan berdasarkan hasilnya. Bahasa Komputer Agar suatu komputer dapat mengenali instruksi yang anda berikan, instruksi tersebut perlu ditulis dalam bahasa yang dimengerti oleh komputer. HIGH-LEVEL dan LOW-LEVEL Pada dasarnya orang mengolongkan Bahasa komputer menjadi dua golongan besar yaitu High-Level dan Low-Level. Bahasa pemrograman seperti BASIC, PASCAL, FORTRAN dan C, memungkinkan programmer untuk menulis program yang tidak begitu tergantung pada jenis komputer. Berdasarkan hal inilah bahasa-bahasa ini dapat dikategorikan sebagai high-level karena lebih dekat kepada manusia. Sebaliknya, bahasa assembly dikategorikan sebagai low-level karena mereka sangat dekat kepada hardware. Keuntungan utama dari bahwa high-level dibandingkan dengan low level adalah lebih mudah dibaca, ditulis, dan ditangani. Selanjutnya program yang ditulis dengan bahasa high-level harus diterjemahkan menjadi bahasa mesin melalui suatu compiler atau interpreter. BAHASA MESIN Sesuatu hal yang harus dipahami bahwa setiap CPU hanya mengerti satu bahasa. Bahasa ini dikenal sebagai machine language (bahasa mesin).

Upload: al-ds

Post on 20-Jun-2015

2.417 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 1

Pengantar Algoritma & Pemrograman Komputer Program Komputer Program komputer adalah suatu himpunan dari instruksi yang memberitahukan kepada komputer apa yang harus dilakukan. Instruksi tersebut mungkin memberitahukan kepada komputer untuk menambah, membandingkan, dan membuat keputusan berdasarkan hasilnya. Bahasa Komputer Agar suatu komputer dapat mengenali instruksi yang anda berikan, instruksi tersebut perlu ditulis dalam bahasa yang dimengerti oleh komputer. HIGH-LEVEL dan LOW-LEVEL Pada dasarnya orang mengolongkan Bahasa komputer menjadi dua golongan besar yaitu High-Level dan Low-Level. Bahasa pemrograman seperti BASIC, PASCAL, FORTRAN dan C, memungkinkan programmer untuk menulis program yang tidak begitu tergantung pada jenis komputer. Berdasarkan hal inilah bahasa-bahasa ini dapat dikategorikan sebagai high-level karena lebih dekat kepada manusia. Sebaliknya, bahasa assembly dikategorikan sebagai low-level karena mereka sangat dekat kepada hardware. Keuntungan utama dari bahwa high-level dibandingkan dengan low level adalah lebih mudah dibaca, ditulis, dan ditangani. Selanjutnya program yang ditulis dengan bahasa high-level harus diterjemahkan menjadi bahasa mesin melalui suatu compiler atau interpreter.

BAHASA MESIN

Sesuatu hal yang harus dipahami bahwa setiap CPU hanya mengerti satu bahasa. Bahasa ini dikenal sebagai machine language (bahasa mesin).

Page 2: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 2

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].

Page 3: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 3

Berikut ini adalah contoh bahasa assembly dengan bahasa mesin yang berasosiasi disampingnya.

Beberapa hal yang perlu anda ingat tentang bahasa assembly.

1. Walaupun programmer menjadi lebih produktif, tetapi mereka tetap harus menulis bahasa assembly untuk setiap perintah bahasa mesin.

• Komputer tidak mengerti bahasa assembly sama sekali, hanya bahasa mesin. Setelah suatu program assembly dibuat, programmer harus mengkonversi program tersebut menjadi bahasa mesin dengan suatu program yang dikenal sebagai assembler, dan baru dapat dijalankan.

Page 4: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 4

BAHASA TINGKAT TINGGI

Orang segera menyadari bahwa komputer dapat menterjemahkan bahasa assembly mejadi kode mesin, dan mereka mudah memikirkan bagaimana jika komputer dapat diprogram dengan bahasa yang lebih "alamiah" [lebih alamiah untuk manusia], inilah awal dari bahasa generasi ketiga yaitu High Level Languages.

INTERPRETER dan COMPILER

Ketika anda menggunakan suatu interpreter, ia akan membaca perintah source code baris perbaris, kemudian menterjemahkannya menjadi perintah mesin yang bersesuaian (kode mesin) dan menjalankannya seketika. Kode mesin ini tidak disimpan; sehingga ketika anda mencoba menjalankan program yang sama pada kesempatan berikutnya, anda membutuhkan source code dan interpreter untuk menjalankannya.

Ketika anda menggunakan suatu compiler, ia akan membaca perintah source code dan menulis kode mesin. Setelah selesai keseluruhan kode mesin akan disimpan untuk pemakaian selanjutnya. Ketika anda ingin menjalankan program tersebut, system operasi akan menjalankan kode mesin yang telah disimpan – dalam hal ini source code tidak diperlukan lagi. Eksekusi menjadi lebih cepat, dan dapat dijalankan dikomputer lain (dalam hal ini pada komputer dan system operasi yang sama)

Page 5: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 5

KOMPUTER DAN ALGORITMA

Untuk membuat komputer melakukan sesuatu, anda perlu untuk menulis program komputer. Dalam menulis suatu program komputer, kita perlu memberitahukan kepada komputer, langkah-langkah persis apa yang harus ia lakukan. Ketika komputer menjalankan program tersebut, ia akan melakukan setiap langkah secara mesin untuk mencapai tujuan akhir. Ketika anda memberitahu kepada komputer apa yang harus dilakukan, anda perlu memilih bagaimana hal tersebut dilakukan. Dari sinilah Algoritma Komputer muncul. Algoritma adalah teknik dasar untuk menyelesaikan suatu pekerjaan. Perhatikan contoh berikut untuk membantu pengertian anda tentang konsep dari algoritma. Katakanlah misalnya anda mempunyai teman yang baru tiba di airport, dan teman anda ingin berangkat dari airport ke rumah anda. Berikut ini adalah empat algoritma yang berbeda yang mungkin dilakukan teman anda:

Algoritma taxi:

Pergi ke pemberhentian taxi.

Masuk ke taxi.

Berikan alamat rumah anda.

Algoritma Telepon untuk dijemput:

Ketempat pemberhentian, telepon ke handphone anda.

Menunggu saja ditempat pengambilan bagasi.

Algoritma Bus:

Keluar dari tempat pengambilan bagasi, naik bus nomor 70.

Turun dan naik bus nomor 14 pada jalan utama.

Turun di jalan pada jalan AB.

Jalan kaki dua blok arah utara ke rumah anda.

Ketiga algoritma diatas memiliki tujuan yang sama, tetapi masing-masing melakukannya dengan cara yang berbeda. Masing-masing algoritma diatas juga menghabiskan waktu dan biaya yang berbeda. Naik taxi, adalah contoh yang paling cepat, tetapi paling mahal. Naik bus mungkin adalah paling hemat, tetapi lambat. Tentu saja anda perlu memilih algortima sesuai dengan situasi dan kondisi.

Dalam pemrograman komputer, juga terdapat banyak cara algoritma yang berbeda. Masing-masing algoritma memiliki keuntungan dan kerugian untuk situasi yang berbeda.

Kata algoritma (algorithm) berasal dari nama matematikawan Persia pada abad 9 Abu Abdullah Muhammad bin Musa al-Khwarizmi. Kata aslinya algorism mengacu pada aturan dari melakukan aritmetika menggunakan bilangan Arab dan berkembang menjadi algoritma pada abad 18. Kata ini sekarang berevolusi untuk mencantumkan semua prosedur-prosedur khusus untuk memecahkan masalah atau mengerjakan tugas

Kasus pertama dari algoritma yang ditulis untuk komputer adalah catatan Ada Byron's notes pada analytical engine yang ditulis pada tahun 1842, yang mana diyakini

Page 6: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 6

banyak orang sebagai programmer pertama didunia. Bagaimanapun, sejak Charles Babbage tidak pernah menyelesaikan analytical engine-nya, dan algoritma tersebut tidak pernah diimplementasi padanya.

Tahapan Pengembangan Program

Permasalahan dalam pembuatan program yang besar tentu saja berbeda dengan program yang kecil, pada program yang kecil umumnya dikembangkan untuk sekali pakai dan meliputi suatu detail yang kecil, sedangkan program yang besar umumnya dikembangkan atas permintaan dan dipakai oleh orang lain. Oleh karena itu program tersebut harus ditulis dengan lebih hati-hati untuk mencegah segala bentuk pemakaian yang menyimpang, serta harus disertai dengan dokumentasi dan petunjuk pemakaian.

Hal lain yang harus dinyakini adalah keterbatasan memori manusia, kebanyakan orang dengan mudah dapat memahami program dibawah 10 baris dalam beberapa detik, dan mereka tetap dapat mengingatnya pada saat perubahan dibutuhkan. Pada program yang besar, programmer harus memiliki semua informasi yang tertulis untuk memahami atau mengubah program.

Oleh karena itu, penulisan program yang besar adalah tidak mudah, bahkan untuk programmer yang profesional. Kita sering mendengar bahwa berbagai program besar memiliki banyak bug maupun menyebabkan crash ketika dioperasikan pada kondisi tertentu dan beberapa lama setelah dijalankan.

Adalah tidak mungkin untuk menghasilkan program yang bebas dari kesalahan, kita sering tidak mengetahui dengan persis. Tetapi banyak cara yang dapat kita lakukan untuk menghasilkan program dengan bug yang lebih sedikit. Salah satunya adalah memahami langkah-langkah pengembangan suatu program yang besar, langkah-langkah ini dikenal sebagai Software Development Life Cycle.

Pemrograman dalam pengertian luas meliputi seluruh kegiatan yang tercakup dalam pembuatan program, termasuk analisis kebutuhan (requirement's analysis) dan keseluruhan tahapan dalam perencanaan (planning), perancangan (design) dan pewujudannya (implementation). Dalam pengertian yang lebih sempit, pemrograman merupakan pengkodean (coding atau program writing = penulisan program) dan pengujiannya (testing) berdasarkan rancangan tertentu. Pemahaman yang lebih sempit ini sering digunakan dalam pembuatan program-program terapan komersial yang membedakan antara system analyst yang bertanggung jawab dalam menganalisa kebutuhan, perencanaan dan perancangan program dengan pemrogram (programmer) yang bertugas membuat kode program dan menguji kebenaran program.

Page 7: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 7

Gambar : Tahap pengembangan program

1. Batasan Masalah Merencanakan sistim dan spesifikasi program: Siapa yang akan menggunakan program dan untuk apa? dengan cara:

a. Menentukan tujuan dan hasil yang akan dicapai b. Menentukan hal-hal yang diperlukan oleh sistim c. Pengumpulan data

2. Pengembangan Model Pembuatan model dari sistim yang akan kita bangun, model adalah suatu gambaran sederhana dari sistim yang kita buat. Dengan pembuatan model akan terlihat dengan jelas hubungan antara objek-objek dalam sistim yang akan kita bangun. Untuk penyelesaian aritmatik, biasanya model dibuat dalam bentuk rumus matematik. Contoh: untuk membuat program luas_lingkaran kita membuat model matematis c = a x b

3. Rancangan algoritma Pembuatan urutan instruksi yang akan ditulis pada program (dijelaskan lebih lanjut)

4. Pemrograman Implementasi algoritma ke dalam program (algoritma sendiri dalam komputer adalah merupakan program).

5. Uji dan Validasi Pengujian terhadap program : seperti kesalahan penulisan (syntax error) , kesalahan saat eksekusi (runtime error) kesalahan logika program (program berjalan tapi menghasilkan output yang salah- fatal error).

Dokumentasi Pembuatan catatan pada program terutama pada modul-modul yang rumit. Suatu ilustrasi tentang rumitnya SDLC yang dapat menyebabkan kekacauan berikut ini :

Page 8: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 8

How the customers

explained it

How the Project

Leader understood

it

How the Analyst

designed it

How the

Programmer wrote

it

How the Business

Consultant

described it

How the project

was documented What operations

installed How the customer

was billed

How it was supported What the customer really needed

Page 9: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 9

Aturan Penulisan Teks Algoritma

Tidak ada notasi yang baku dalam penulisan teks algoritma. Algoritma bukanlah program yang harus mengikuti aturan-aturan tertentu. Meski demikian, algoritma dituliskan mendekati gaya bahasa pemrograman umumnya. Misal, tulis nilai X dan Y, dituliskan dalam algoritma sebagai write(X,Y). Perhatikan dalam notasi write(X,Y) ini hanya memerintahkan penyajian nilai X ke piranti keluaran (output). Dalam notasi itu juga tidak memasalahkan format ataupun bentuk-bentuk tampilan lainnya, seperti dicetak dalam satu baris X dan Y, pemakaian pemisah antara X dan Y menggunakan koma atau spasi. Hal-hal yang bersifat teknis ini baru dipikirkan waktu penulisan program. Algoritma adalah bebas bahasa pemrograman. Teks Algoritma Mengikuti alur konsep pemrograman prosedural, suatu teks algoritma disusun dalam tiga bagian, yaitu:

1. Bagian kepala algoritma, 2. Bagian deklarasi, dan 3. Bagian deskripsi algoritma.

Setiap bagian disertai dengan penjelasan atau dokumentasi tentang maksud pembuatan

teks. Bagian penjelasan diawali dan diakhiri dengan simbol { dan }. Algoritma NAMA_ALGORITMA { Penjelasan tentang algoritma yang menguraikan

secara singkat hal-hal yang dilakukan oleh algoritma } DEKLARASI { Semua nama yang digunakan, meliputi nama-nama: tipe, konstanta,

variabel. Juga nama sub-program dinyatakan di sini } DESKRIPSI { Semua langkah atau aksi algoritma dituliskan di sini }

Contoh: 1). Kepala algoritma: Algoritma Luas_Lingkaran { Menghitung luas lingkaran dengan ukuran jejari tertentu. Algoritma menerima masukan jejari lingkaran, menghitung luasnya, dan menyajikan hasilnya ke piranti keluaran } Perhatian, dalam menulis nama-nama dalam algoritma harus mempunyai makna yang mencerminkan proses, sifat atau identitas lainnya yang melekat dengan suatu proses, tipe, konstanta, variabel, sub-program dan lain-lainnya.Nama-nama yang bermakna disebut mnemonic. 2) Deklarasi algoritma: DEKLARASI { nama konstanta } const PHI = 3.14; { Nilai phi = 22/7 } { nama peubah } var R : real; { input jejari lingkaran bilangan riil } l_Lingkaran : real; { luas lingkaran bilangan riil } { nama sub program } procedure TUKAR(input/output A:integer, input/output B:integer)

Page 10: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 10

{ Mempertukankan nilai A dan B.Parameter A dan B sudah terdefinisi nilainya.Setelah pertukaran, A berisi nilai B dan B berisi nilai A } 3) Deskripsi algoritma: Bagian ini merupakan bagian inti algoritma yang berisikan uraian langkah-langkah penyelesaian suatu masalah. Setiap langkah algoritma dibaca dari atas ke bawah. Urutan penulisan menentukan urutan pelaksanaan perintah. { Baca data jejari lingkaran R.Jika R <= 0 tulis pesan data salah, selain itu hitung luas ingkaran. Tampilkan luas lingkaran. } baca(R); jika R <= 0 then tulis("Data salah !") selain itu l_Lingkaran = PHI x R x R; tulis(l_Lingkaran); Flowchart

Flowchart adalah alat untuk menganalisa proses. Hal tersebut memungkinkan anda untuk memecah proses menjadi kejadian-kejadian individual atau aktifitas untuk menunjukan secara singkat hubungan diantaranya. Konstruksi flowchart memungkinkan pengertian yang lebih baik kepada proses, dan pengertian yang lebih baik terhadap proses akan membawa kepada perbaikan dan pengembangan.

Berbagai jenis flowchart telah dikembangkan pada berbagai bidang seperti pada sistem produksi, maupun pada sistem design dan pemrograman. Diagram Alir (Flowchart) Merupakan bentuk grafis/visual dari algoritma Bentuk umum dari simbol-simbol dalam diagram alir:

Simbol untuk mulai (start) atau akhir (end) program

Simbol untuk pembacaan (read) data atau penulisan hasil (write) pada layar

Simbol untuk suatu proses terhadap data pada program

Simbol untuk suatu pernyataan pilihan (optional) pada program.

Simbol untuk penghubung antar aktifitas.

Konektor, Simbol untuk memutus aktivitas karena keterbatasan media kertas.

Sub program

Page 11: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 11

Komentar

Contoh pemakaian flowchart: Sequential (berurutan) perhitungan volume dan luas permukaan silinder

Selection/Branching Structure (Struktur pemilihan)

Page 12: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 12

Repetition/Looping Structure(Struktur pengulangan)

Page 13: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 13

Kombinasi

Page 14: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 14

Flowchart dahulu digunakan di computer science untuk mengambarkan algoritma, dimana mereka merupakan blok-blok instruksi untuk suatu rangkaian operasi. Dewasa ini trend kedepan adalah pemakaian pseudocode untuk mengambarkan algoritma. Tetapi bagaimanapun flowchart lebih visual dan sering digunakan pada saat presentasi.

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 :

Page 15: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 15

BEGIN { mulai } { input } read(R); { proses } If R <= 0 then tulis("Data salah !") else L_Lingkaran = PHI x R x R; { output } write(l_Lingkaran); END; { selesai }

Page 16: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 16

Sejarah dari bahasa pemrograman komputer

Sejak pertama komputer difference engine diciptakan oleh Charles Babbage pada tahun 1822, komputer membutuhkan sejumlah instruksi untuk melakukan suatu tugas tertentu. Instruksi-instruksi ini dikenal sebagai bahasa pemrograman. Bahasa komputer mulanya terdiri dari sejumlah langkah pengkabelan untuk membuat suatu program; hal ini dapat dipahami sebagai suatu rangkaian pengetikan kedalam komputer dan kemudian dijalankan. Pada awalnya, difference engine-nya Charles Babbage hanya dibuat untuk menjalankan tugas dengan menggunakan perpindahan gigi roda untuk menjalankan fungsi kalkukasi. Jadi, bentuk awal dari bahasa komputer adalah berupa gerakan secara mekanik, selanjutnya gerakan mekanik tersebut digantikan dengan sinyal listrik ketika pemerintah AS mengembangkan ENIAC pada tahun 1942, tetapi masih banyak mengadopsi prinsip-prinsip dasar dari Babbage's engine yang mana diprogram dengan mengeset switch dan perkabelan pada seluruh sistem pada setiap "program" maupun kalkulasi. Tentu saja ini merupakan pekerjaan yang membosankan. Pada 1945, John Von Neumann yang bekerja pada Institute for Advanced Study mengemukakan dua konsep yang secara langsung mempengaruhi masa depan dari bahasa pemrograman komputer. Yang pertama dikenal sebagai "shared-program technique" (www.softlord.com). Pada teknik ini dinyatakan bahwa hardware komputer haruslah sederhana dan tidak perlu dilakukan pengkabelan dengan menggunakan tangan untuk setiap program. Sebagai gantinya, instruksi-instruksi yang lebih kompleks harus digunakan untuk mengendalikan perangkat keras yang lebih sederhana, hal ini memungkinkan komputer diprogram ulang dengan cepat. Konsep yang kedua yang juga sangat penting untuk pengembangan bahasa pemrograman. Von Neumann menyebutnya sebagai "conditional control transfer" (www.softlord.com). Ide ini berkembang menjadi bentuk subrutin, atau blok kode yang kecil yang dapat panggil berdasarkan aturan tertentu, dari pada suatu himpunan tunggal urutan kronologis yang harus dijalankan oleh komputer. Bagian kedua dari ide tersebut menyatakan bahwa kode komputer harus dapat bercabang berdasarkan pernyataan logika seperti IF (ekspresi) THEN, dan perulangan seperti FOR statement. "Conditional control transfer" mengembangkan ide adanya "libraries," yang mana merupakan blok kode yang dapat digunakan berulang kali. Pada 1949, setelah beberapa tahun Von Neumann bekerja, bahasa Short Code dilahirkan (www.byte.com), yang merupakan bahasa komputer yang pertama untuk peralatan elektronik yang membutuhkan programmer untuk mengubah perintah kedalam 0 dan 1 dengan tangan. Pada 1957, bahasa khusus yang pertama muncul dalam bentuk FORTRAN yang merupakan singkatan dari sistem FORmula TRANslating. Bahasa ini dirancang pada IBM untuk perhitungan scientific. Komponen-komponennya sangat sederhana, dan

Page 17: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 17

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

Page 18: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 18

pengembangannya adalah untuk kebutuhan pengajaran. Pada awalnya bahasa ini dikembangkan bukan dengan harapan adopsi pemakaian secara luas. Prinsipnya mereka mengembangkannya untuk alat pengajaran pemrograman yang baik seperti kemampuan debug dan perbaikan sistem dan dukungan kepada mikroprosesor komputer yang digunakan pada institusi pendidikan. Pascal dirancang dengan pendekatan yang sangat teratur (terstruktur), dia mengkombinasikan kemampuan yang terbaik dari bahasa-bahasa saat itu, COBOL, FORTRAN, dan ALGOL. Dalam pengerjaannya banyak perintah-perintah yang tidak teratur dan aneh dihilangkan, sehingga sangat menarik bagi pemakai (Bergin, 100-101). Kombinasi dari kemampuan input/output dan kemampuan matematika yang solid, membuatnya menjadi bahasa yang sukses besar. Pascal juga mengembangkan tipe data "pointer", suatu fasilitas yang sangat bermanfaat pada bahasa yang mengimplementasikannya. Dia juga menambahkan perintah CASE, yang mana memperbolehkan perintah bercabang seperti suatu pohon pada suatu aturan:

CASE expression OF possible-expression-value-1: statements to execute... possible-expression-value-2: statements to execute... END

Pascal juga mengembangkan variabel dinamis, dimana variabel dapat dibuat ketika suatu program sedang berjalan, melalui perintah NEW dan DISPOSE. Tetapi Pascal tidak mengimplementasikan suatu array dinamis, atau kelompok dari variabel-variabel, yang mana sangat dibutuhkan, dan merupakan salah satu penyebab kekalahannya (Bergin, 101-102). Wirth kemudian membuat lanjutan dari Pascal, Modula-2, tetapi pada saat itu muncul C yang dengan cepat menjadi mengeser posisi Pascal. C dikembangkan pada tahun 1972 oleh Dennis Richie ketika sedang bekerja pada Bell Labs di New Jersey. Transisi pemakaian dari bahasa umum yang pertama ke bahasa umum sampai hari ini yaitu transisi antara Pascal dan C, C merupakan perkembangan dari B dan BCPL, tetapi agak menyerupai Pascal. Semua fasilitas di Pascal, termasuk perintah CASE tersedia di C. C menggunakan pointer secara luas dan dibangun untuk kecepatan dengan kelemahannya yaitu menjadi sulit untuk dibaca. Tetapi karena dia menghilangkan semua kelemahan yang terdapat di Pascal, sehingga dengan cepat mengambil alih posisi Pascal. Ritchie mengembangan C untuk sistem Unix yang baru pada saat yang bersamaan. Oleh karena ini, C dan Unix saling berkaitan. Unix memberikan C beberapa fasilitas besar seperti variabel dinamis, multitasking, penanganan interrupt, forking, dan strong low-level, input-output. Oleh karena itu, C sangat sering digunakan untuk pemrograman sistem operasi seperti Unix, Windows, MacOS, dan Linux. Pada akhir tahun 1970 dan awal 1980, suatu metode pemrograman yang baru telah

Page 19: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 19

dikembangkan. Ha tersebut dikenal sebagai Object Oriented Programming, atau OOP. Object merupakan suatu potongan dari data yang dapat dipaket dan dimanipulasi oleh programmer. Bjarne Stroustroup menyukai metode ini dan mengembangkan lanjutan dari C yang dikenal sebagai "C With Classes." Kemampuan lanjutan ini dikembangkan menjadi bahasa C++ yang diluncurkan pada tahun 1983. C++ dirancang untuk mengorganisasikan kemampuan dasar dari C dengan OOP, dengan tetap mempertahankan kecepatan dari C dan dapat dijalankan pada komputer yang tipe berlainan. C++ sering kali digunakan dalam simulasi, seperti game. C++ menyediakan cara yang baik untuk memanipulasi ratusan instance dari manusia didalan elevator, atau pasukan yang diisi dengan tipe prajurit yang berbeda. Bahasa ini menjadi pilihan pada mata kuliah AP Computer Science sampai hari ini. Pada awal 1990's, interaktif TV adalah teknologi masa depan. Sun Microsystems memutuskan bahwa interaktif TV membutuhkan suatu hal yang khusus, yaitu bahasa portable (bahasa yang dapat berjalan pada banyak jenis mesin yang berbeda). Bahasa ini dikenal sebagai Java. Pada tahun 1994, team proyek Java mengubah fokus mereka ke web, yang mana berubah menjadi sesuatu yang menjanjikan setelah interactive TV gagal. Pada tahun berikutnya, Netscape menyetujui pemakaian Java pada internet browser mereka, Navigator. Sampai titik ini, Java menjadi bahasa masa depan dan beberapa perusahaan mengumumkan aplikasi harus ditulis dalam Java. Java mempunyai tujuan yang besar dan merupakan bahasa yang baik menurut buku text, pada kenyataanya "bahasa tersebut tidak". Dia memiliki masalah yang serius dalam optimasi, dengan arti program yang ditulis dengannya berjalan dengan lambat. Dan Sun telah membuat cacat penerimaan terhadap Java dengan pertikaian politis dengan Microsoft. Tetapi Java telah dinyatakan sebagai bahasa untuk instruksi masa depan dan benar-benar menerapkan object-oriented dan teknik tingkat tinggi seperti kode yang portable dan garbage collection. Visual Basic sering diajari sebagai bahasa pemrograman dasar yang mengacu pada bahasa BASIC yang dikembangkan pada tahun 1964 oleh John Kemeny dan Thomas Kurtz. BASIC adalah bahasa yang sangat terbatas dan dirancang untuk orang yang bukan computer science. Perintah-perintah dijalankan secara berurutan, tetapi kendali program dapat berubah berdasarkan IF..THEN, dan GOSUB yang mana menjalankan suatu blok kode dan kembali ketitik semula didalam alur program. Microsoft telah mengembangkan BASIC ke dalam produk Visual Basic (VB). Jantung dari VB adalah form, atau suatu window kosos dimana anda dapat drag dan drop komponen seperti menu, gambarm dan slider bars. Item-item ini dikenal sebagai "widgets." Widget memiliki properti (seperti warna) dan events (seperti klik dan double klik) dan menjadi pusat dari pengembangan antarmuka dengan pemakai diberbagai bahasa program dewasa ini. VB merupakan program yang banyak digunakan untuk membuat interface sederhana ke produk Microsoft lainnya seperti Excel dan Access tanpa membaca banyak kode, dengannya dapat dimungkinkan untuk dibuat aplikasi yang lengkap.

Page 20: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 20

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. What is a computer program ?

2. Explain what is the different between High Level Language & Low Level Language ! 3. How about Machine Language & Assembly Language ! 4. Explain how are interpreters and Compiler works ! 5. Is a computer program like an algorithm ? 6. What can we use to presenting an algorithm ? 7. Draw the symbols use in flowchart, and mention each symbols function !

Page 21: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 21

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,

Page 22: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 22

Mengapa kita belajar bahasa pemrogram Pascal, padahal trend pemrograman

dewasa ini adalah C/C++, C#, dan Java ? Sebagaimana tujuan awal dari pembuatan bahasa Pascal adalah untuk pengajaran pemrograman komputer di perguruan tinggi4, sebagai bahasa pemrograman yang terstruktur Pascal akan menjadi dasar praktek pemrograman yang baik bagi mahasiswa. Jika dibandingkan dengan C/C++, Pascal relatif lebih mudah dipelajari, karena bahasa C/C++ merupakan bahasa yang cenderung simbolic dan adanya type casting serta pointer arithmetic (sering membuat program menjadi crash dan buffer overun bagi programmer yang kurang berpengalaman. Sedangkan bahasa Java dan C# adalah bahasa pemrograman terkini yang menekanan kepada pendekatan berorientasi object, padahal pendekatan tersebut adalah tidak mudah untuk orang yang baru belajar pemrograman komputer. Kemudian Borland merupakan salah satu perusahaan yang terus mengembangan produknya, terutama Delphi dan Kylix yang menggunakan Object Pascal.

Bagaimana Struktur program pascal yang paling sederhana ? Struktur program pascal yang paling sederhana adalah : uses ...;

var ...;

begin

.... {Your program is here}

end. Dapatkah anda memberi contoh sebuah program pascal yang sederhana ? begin

Writeln('Saya sedang belajar Pascal !');

Writeln('Di STMIK IBBI');

end.

Bagaimana kalau saya mau membersihkan layar terlebih dahulu sebelum mencetak

tulisan ? Untuk membersihkan layar, anda dapat menggunakan perintah Clrscr yang terdapat pada unit CRT.

MacOSX/Darwin, MacOS classic, DOS, Win32, OS/2, BeOS, SunOS (Solaris), Netware (libc and classic), QNX and Classic Amiga. 4 According to the Pascal Standard (ISO 7185), these goals were to a) make available a language suitable for teaching programming as a systematic discipline based on fundamental concepts clearly and naturally reflected by the language, and b) to define a language whose implementations could be both reliable and efficient on then-available computers.

Page 23: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 23

Contoh :

Uses CRT;

begin

Clrscr;

Writeln('Saya sedang belajar Pascal !');

Writeln('Di STMIK IBBI');

end.

Bagaimana Struktur program pascal yang kompleks ? Adapun struktur dasar suatu program pascal adalah sebagai berikut : program ... ; { Program heading }

uses ... ; { Uses clause }

label ... ; { Labels }

const ... ; { Constants }

type ... ; { Types }

var ... ; { Variables }

procedure ... ; { Procedures }

function ... ; { Functions }

begin

statement; { Statements }

...

end.

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 unit-unit lain hanya akan disertakan bila kita pilih pada bagian uses.

Page 24: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 24

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 Jangkuan Ukuran

Shortint -128..127 8 bit

Integer -32768..32767 16 bit

Longint -2147483648..2147483647 32 bit

Byte 0..255 8 bit

Page 25: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 25

Word 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 Jangkauan Ketelitian Ukuran

Real 2.9e-39..1.7e38 11-12 digit 6 bit

Single 1.5e-45..3.4e38 ³ 7-8 7-8 digit 4 bit

Double 5.0e-324..1.7e308 15-16 digit 8 bit

Extended 3.4e-4932..1.1e4932 19-20 digit 10 bit

Comp -9.2e18..9.2e18 19-20 digit 8 bit

Untuk pengolahan type variabel diatas di sediakan berbagai jenis operator antara lain :

Operator Integer Type Real Type

+ Penjumlahan Penjumlahan

- Pengurangan Pengurangan

* Perkalian Perkalian

/ Pembagian Pembagian

DIV Hasil bagi

MOD Sisa Bagi

Operator Integer Type Boolean Type

NOT Bitwise Negation Logical Negation

AND Bitwise AND Logical AND

OR Bitwise inclusive OR Logical inclusive OR

XOR Bitwise exclusive OR Logical exclusive OR

SHL Bitwise shift-left

SHR Bitwise shift-right

Operator relasi yang mengembalikan hasil Boolean

Operator Fungsi

:= Menyatakan nilai

= Sama dengan

<> Tidak sama dengan

< Lebih kecil

> Lebih besar

<= Lebih kecil atau sama dengan

>= Lebih besar atau sama dengan

Apa pengertian Pascal adalah bahasa yang strong type ?

Page 26: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 26

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.

Bagaimana kalau saya ingin membaca masukan dari pemakai ? Perintah Readln dapat digunakan untuk membaca masukan dari pemakai dan menyimpannya ke suatu variabel. var

UmurKu : Byte;

Keterangan : String;

begin

Write('Berapa umur anda ? '); Readln(UmurKu);

Write('Komentar anda: '); Readln(Keterangan);

Writeln;

Writeln('Saya berumur ',UmurKu,' tahun');

Writeln(Keterangan);

end. Bagaimana membatasi pencetakan tempat desimal untuk data Real type ? Untuk menentukan jumlah tempat sebelum desimal dan sesudah desimal anda dapat menggunakan :x:y setelah variabel yang akan dibatasi pencetakan nilainya, dimana x adalah jumlah tempat sebelum desimal dan y adalah jumlah tempat setelah desimal. Silahkan coba koding berikut : var

Pi : Real;

Begin

Pi := 22/7;

Writeln('Bilangan Pi adalah ', Pi);

Writeln('Bilangan Pi adalah ', Pi:2:3);

end.

Page 27: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 27

Proses pemrograman komputer

Ketika melakukan pemrograman dengan menggunakan bahasa tingkat tinggi, ada beberapa operasi yang harus dilakukan. Mekanisme ini dikenal sebagai siklus edit-

compile-run. Mempelajari proses ini adalah berbeda dengan belajar bagaimana untuk membuat program; anda harus menguasai proses ini—dan hal tersebut adalah penting.

Berikut ini adalah proses membuat sebuah program :

Edit Ketika anda menulis sebuah program dalam bahasa tingkat tinggi, anda menulis perintah-perintahnya dalam bentuk perintah bahasa pemrograman dengan menggunakan text editor. Dokumen yang anda hasilkan pada tahap ini dikenal sebagai source code.

Compile Setelah anda selesai menulis program anda, anda perlu meng-kompilasi-nya dengan menggunakan suatu software yang disebut sebagai compiler. Kompiler mengubah source code anda menjadi bahasa mesin. Jika program anda gagal di kompilasi (tejadi kesalahan "grammatical" atau sytnax errors pada kode anda), anda harus meng-edit kembali kode anda sampai dapat dikompilasi dengan benar.

Setelah suatu program berhasil dikompilasi artinya dia telah benar secara syntax, tetapi masih dapat mengandung runtime error, atau logical error.

Run Setelah program anda dikompilasi, anda dapat menjalankannya. Ketika anda menjalankan program anda, hal yang pertama yang perlu anda lakukan adalah memeriksa apakah programt tersebut berjalan seperti yang diharapkan, proses ini dikenal sebagai testing. Pada tahapan ini dapat ditemui logical error ataupun runtime error.

Untuk menghilangkan runtime error atau logical error anda perlu kembali ke langkah pertama, jadi inilah yang dikenal sebagai siklus edit-compile-run cycle sampai program dapat berjalan dengan benar.

Latihan 1 1. What does structured programming mean ? 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 ?

Page 28: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 28

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.

4. Make a program to convert temperature from Celcius to Reamur, Kelvin, and

Fahrenheit.

Page 29: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 29

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; Atau lebih baik ditulis sebagai

Page 30: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 30

If conditon Then

Statement1

Else

Statement2;

Langsung saya buatkan contoh : Uses Crt;

Var

Bilangan : Integer;

Begin

Clrscr;

Write('Masukan Bilangan ? '); Readln(Bilangan);

If (Bilangan Mod 2) = 0 Then

Writeln ('Genap')

Else

Writeln ('Ganjil');

Readln;

End.

He-he-he, bagaimana kalau keputusannya lebih dari 2, misalnya 4 Statement yang

harus dijalankan berdasarkan masing-masing condition ? Oh, hal itu bisa dilakukan dengan merangkai beberapa struktur If, misalnya : If condition1 Then

Statement1

Else

If condition2 Then

Statement2

Else

If condition3 Then

Statement3

Else

Statement4; Jadi pada prinsipnya adalah terdiri dari tiga struktur If. Misalnya kita akan membuat nilai huruf dari angka dengan kriteria 80 keatas mendapat A, 70 s/d 79 mendapat B, 60 s/d 69 mendapat C, 50 s/d 59 mendapat D, dan dibawah 49 mendapat E, maka dapat ditulis menjadi : if mark>=80 then

grade:='A'

else { 79 or below goes here }

if mark>=70 then

grade:='B'

else { 69 or below goes here }

if mark>=60 then

Page 31: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 31

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; Saya akan menggulangi contoh diatas dengan struktur Case : Case mark of

80..100: grade:='A';

70..79 : grade:='B';

60..69 : grade:='C';

50..59 : grade:='D';

Else grade:='E';

End; Lebih sederhana bukan. Tetapi sesuatu hal yang perlu diperhatikan bahwa variabel yang akan dievaluasi dengan Case haruslah Ordinal type. Opss, hampir lupa, bagaimana kalau statement yang harus dijalankan pada masing-

masing condition lebih dari 1 ? Ya, benar, sering kita perlu menjalankan beberapa Statement pada masing-masing condition, untuk keperluan tersebut kita dapat memblok perintah-perintah tersebut dengan Begin … End; Contoh : If Belanja > 100000 Then

Begin

Belanja := Belanja * 0.97;

Writeln ('Anda berhak mendapat potongan 3%');

End;

Page 32: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 32

Pertanyaan yang terakhir, bagaimana penulisan condition yang terdiri dari

beberapa logika ? Pertanyaan yang tepat sekali, untuk condition yang terdiri dari beberapa logika dapat anda gabungkan dengan operasi AND, OR. Misalnya kita akan mencari tahun kabisat. In the Gregorian calendar, which is the calendar used by most modern countries, the following rules decides which years are leap years:

1. Every year divisible by 4 is a leap year. 2. But every year divisible by 100 is NOT a leap year 3. Unless the the year is also divisible by 400, then it is still a leap year.

Maka penulisan programnya menjadi : If ((tahun Mod 4) = 0) And Not (tahun Mod 100 = 0)) Or ((tahun Mod 400) = 0)

Then

Writeln ('Tahun Kabisat !')

Else

Writeln ('Bukan Tahun Kabisat !');

Catatan Instruktur Berdasarkan hasil pengamatan, kesalahan yang sering dilakukan oleh mahasiswa dalam pemakaian struktur If…Then…Else, adalah didepan Else tidak ada pemakaian titik koma (;).

Latihan 2

1. What does Pascal provide in order to perform conditional branching ? 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 ==> "You are a baby !"

Page 33: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 33

* 2 to age < 12 ==> "You are a kid !"

* 12 to age < 18 ==> "You are a teenager !"

* 18 to age < 24 ==> "You are a young adult !"

* 24 to age < 40 ==> "You are an adult !"

* 40 to age < 55 ==> "You are middle aged !"

* 55 to age < 65 ==> (Give comments yourself)

* age to 65 ==> (Give comments yourself) 6. Using ABC formula, make a program to solve aX2 + bX + C problem.

Page 34: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 34

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;

Dimana variabel harus ordinal type Contoh : Var I : Integer;

Begin

For I := 1 To 10 Do Writeln(' STMIK IBBI '); End. Tapi tadi saya lihat yang satu pakai To dan yang satu lagi pakai DownTo, apa sih

bedanya ? Kita menggunakan To kalau nilai awal < nilai akhir, dan sebaliknya pakai DownTo Contoh :

Page 35: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 35

Var I : Integer;

Begin

For I := 10 DownTo 1 Do Writeln(' STMIK IBBI'); End.

Apa maksudnya variabel counter harus ordinal type ? Maksudnya variabel counter harus berupa salah satu type seperti Byte, Shortint, Integer, Longint, Char, Boolean. Misalnya Ch adalah Char, maka dapat dilakukan For Ch := 'a' to 'z' Do Write(Ch,' ');

Dan bahkan misalnya Bo adalah boolean, dapat juga For Bo :=false to true do writeln(Bo);

Adakah struktur perulangan lainnya pada bahasa pascal ? Ya, ada lagi, yaitu yang melakukan perulangan yang menggunakan condition. While condition Do Statement; Contoh : I := 1;

While I <= 10 Do

Begin

Writeln(' STMIK IBBI'); I := I + 1;

End;

Apakah maksudnya I := I + 1; saya belum pernah melihat persamaan seperti ini

secara matematika ! Ya, memang hal ini tidak mungkin ada secara matematika, tetapi pada dunia pemrograman artinya menaikan nilai variabel I sebesar 1. Supaya tidak membingungkan pascal menyediakan suatu function Inc(variabel); sebagai penganti I:= I + 1; Ok, sekarang saya sudah jelas dengan struktur looping pada bahasa pascal. Tunggu dulu, masih ada satu struktur perulangan dengan condition, yaitu : Repeat

Statement;

Until condition; Contoh : I := 1;

Repeat

Page 36: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 36

Writeln(' STMIK IBBI'); Inc(I);

Until I <= 10;

Kalau begitu ya sama saja dengan yang While, bukankah begitu ? Tentu saja ada perbedaannya, coba perhatikan contoh berikut I := 11;

While I <= 10 Do

Begin

Writeln(' STMIK IBBI'); Inc(I);

End;

Dan

I := 11;

Repeat

Writeln(' STMIK IBBI'); Inc(I);

Until I <= 10;

Pada contoh 1, tidak akan mencetak apa-apa, sedangkan pada contoh 2 akan mencetak tulisan STMIK IBBI minimal 1 kali. Pada prinsipnya struktur While melakukan pemeriksaan awal, dan struktur Repeat melakukan pemeriksaan di akhir. Bagaimana kalau kita ingin keluar dari pertengahan looping walaupun conditionnya

masih terpenuhi ? Mudah saja, gunakan perintah Break, dan anda juga dapat menggunakan perintah Continue untuk kembali ke While ataupun Repeat. Contoh : I := 1;

While I <= 10 Do

Begin

Writeln(' STMIK IBBI'); I := I + 1;

Break;

End;

Akan mencetak STMIK IBBI sekali saja, karena begitu ketemu perintah Break, maka proses keluar dari looping. Bagaimana dengan yang berikut ini : I := 1;

While I <= 10 Do

Begin

Writeln(' STMIK IBBI'); I := I + 1;

Page 37: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 37

Continue;

End;

Catatan Instruktur Berdasarkan hasil pengamatan, kesalahan yang sering dilakukan oleh mahasiswa dalam pemakaian struktur For…Do, dan While…Do adalah adanya pemakaian titik koma dibelakang Do, sehingga menyebabkan looping tidak menjalankan statement sebagaimana yang diharapkan. Contoh : For I := 1 To 10 Do;

Writeln(' STMIK IBBI ');

Akan menyebabkan tulisan STMIK IBBI hanya dicetak satu kali, hal ini terjadi karena looping menjalankan apa-apa.

Indentasi pada penulisan program Pascal yang menggunakan perintah-perintah terstruktur adalah sangat penting, terutama dalam program yang besar, pemakaian indentasi akan membantu pemeriksaan kelengkapan block begin…end, serta memudahkan pembacaan program.

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

Page 38: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 38

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 : 5 2. Input : 5

Output : 1 2 3 4 5 4 3 2 1 Output : 1 2 3 4 5

Input : 1 1 2 3 4 5

Output : 1 1 2 3 4 5

1 2 3 4 5

3. Input : 5 1 2 3 4 5

Output : 1 2 3 4 5 4. Input : 5

2 3 4 5 1 Output : 1

3 4 5 1 2 1 2

4 5 1 2 3 1 2 3

5 1 2 3 4 1 2 3 4

1 2 3 4 5

5. Input : 5 6. Input : 5

Output : 1 Output : 1 1 1 1 1

2 2 2 2 2 2 2

3 3 3 3 3 3 3 3

4 4 4 4 4 4 4 4 4

5 5 5 5 5 5 5 5 5 5

7. Input : 5

Output : 1

1 2 1

1 2 3 2 1

1 2 3 4 3 2 1

1 2 3 4 5 4 3 2 1

1 2 3 4 4 4 4 4 3 2 1

1 2 3 3 3 3 3 3 3 3 3 2 1

1 2 2 2 2 2 2 2 2 2 2 2 2 2 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

program jawaban_soal_no_2;

var

n,i,j : byte;

begin

write('jumlah data :'); readln(n);

for i := 1 to n do

begin

for j := 1 to n do

write (j);

writeln;

end;

readln;

Page 39: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 39

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.

9. Make fibonacci series. If input is n, write all the series up to n numbers : Input : 10 Output : 1 1 2 3 5 8 13 21 34 55 The first and the second numbers of fibonacci series are 1. The third is the sum of the first and the second. The fourth is the sum of the second and the third. The fifth is the sum of the third and the fourth, so on. program cetak_suku_fibonacci;

var

Page 40: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 40

n,i, n_1, n_2, n_i : byte;

begin

write('jumlah suku :'); readln(n);

n_1 := 1;

n_2 := 1;

for i := 1 to n do

if i = 1 then write(n_1:4)

else if i = 2 then write(n_2:4)

else

begin

n_i := n_1 + n_2;

write(n_i:4);

n_1 := n_2;

n_2 := n_i;

end;

readln;

end.

10. Make a factor tree. Input : 100 Input : 1001 Output : 100 Output : 1001

/ \ /\

2 50 7 143

/\ /\

2 25 11 13

/\ Input : 5

5 5 Output : 5 is a prime !

Page 41: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 41

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 kalau pakai array : Total := 0;

For I:= 1 To 10 Do Total := Total + Nilai[I]; Dan bagaimana kalau ada elemennya ada 100. Bisa anda bayangkan. Adakah bentuk array yang lain, selain yang anda sebutkan ?

Page 42: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 42

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 : Array[3..10] of Integer; {elemennya x[3], x[4], x[5], …, x[10]}

idx : Array['A'..'Z'] of Integer;

a : Array['a'..'z'] of Byte;

n : 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;

Dan kalau pakai looping : For c:='A' to 'Z' do

idx[c]:= 0;

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.

Page 43: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 43

Latihan di Laboratorium 1. Make a Pascal triangle, example : Input : 7

Output : 1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

program segitiga_pascal;

var

baris_kini,

baris_lalu : array [0..99] of integer;

n,i,j : byte;

begin

write('jumlah baris :'); readln(n);

baris_lalu[0] := 0;

baris_lalu[1] := 1;

baris_lalu[2] := 0;

for i := 1 to n do

begin

for j := 1 to i do

begin

baris_kini[j] := baris_lalu[j-1]+baris_lalu[j];

write(baris_kini[j]:3);

end;

baris_lalu := baris_kini;

writeln;

end;

readln;

end.

2. Suppose you have an array 100 elements of random numbers. Find its average, maxi- mum and minimum value of the elements. Program mencari_nilai_minimum_dari_100_nilai_random;

const

jd = 100;

var

arr : array [1..100] of integer;

i : byte;

min : integer;

begin

randomize;

for i := 1 to jd do

arr[i] := random(1000);

min := arr[1];

for i := 2 to jd do

if arr[i] < min then min = arr[i];

writeln('Nilai minimum :', min);

readln;

Page 44: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 44

end.

4. Make matrix operations : addition, subtraction, multiplication.You may limit the

maximum dimension of the matrix. program Penjumlahan_dua_matrix;

var

jb,jk,i,j : byte;

arr1,arr2,arr3 : array[1..10,1..10] of integer;

begin

write('Jumlah baris :'); readln(jb);

write('Jumlah kolom :'); readln(jk);

writeln('Data Matrix 1');

for i := 1 to jb do

for j := 1 to jk do

begin

write('Data ke ',i,'-',j,':');

readln(arr1[i,j]);

end;

writeln('Data Matrix 2');

for i := 1 to jb do

for j := 1 to jk do

begin

write('Data ke ',i,'-',j,':');

readln(arr2[i,j]);

end;

{penjumlahan matrix}

for i := 1 to jb do

for j := 1 to jk do

arr3[i,j] := arr1[i,j] + arr2[i,j];

writeln('Hasil penjumlahan');

for i := 1 to jb do

for j := 1 to jk do

begin

writeln('Data ke ',i,'-',j,':',arr3[i,j]);

end;

readln;

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 :

• Bubble Sort - O(n²)

• Selection Sort - O(n²)

Page 45: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 45

• Insertion Sort - O(n²)

• Shell Sort - O(n1.25)

• Quick Sort - O(n log n) Tetapi sebelum kita mulai dengan pengurutan data, kita akan membahas tentang pseudo random generator (PRNG). Apa itu PRNG ? Pseudorandom number

5 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. Cobalah contoh berikut : var

5 Pseudorandom numbers are a critical part of modern computing, from cryptography to the Monte Carlo method for simulating physical systems.

Page 46: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 46

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.

Page 47: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 47

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];

Page 48: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 48

a[i] = a[minidx];

a[minidx] = t;

end;

Shell Sort

7

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].

Page 49: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 49

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.

Page 50: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 50

Modul 6

Saya yakin anda sudah mengerti beberapa algoritma sort, sebagai seorang sarjana komputer, anda harus mengerti dan mengetahui kelemahan dan kelebihan dari masing-masing algoritma tersebut. 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

Page 51: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 51

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;

Page 52: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 52

end;

if a[low] = findvalue then

writeln('data found at :',low);

else

writeln('data not found')

Latihan 6 1. What is search algorithm ? 2. Explain how linear search work ! 3. Explain how binary search work ! 4. Explain how interpolation search work ! 5. Can we use binary search in not ordered list ? How about linier search ? Why ? 6. Explain when interpolation search is better than binary search ! 7. Suppose we have an array contain 10 data (1,3,6,7,8,9,10,11,12,13), please write

down step by step data comparing data which find value is 12 using Binary Search and Interpolation Search !

Latihan di Laboratorium

1. Write a program to generate 10000 random number, and then sort it Shell Sort, examine how many data comparing to find a value using linier search, binary search and interpolation search.

program analisa_binary_search; const

jd = 10000;

var

arr : array [1..10000] of integer;

j,t,gap,

findvalue,

first,last,

mid,jb : integer;

continue : boolean;

begin

{generate 10000 bilangan random}

randomize;

for j := 1 to jd do

arr[j] := random(jd);

{urut data dengan algoritma shell sort}

for gap := (jd div 2) downto 1 do

for j := 1 to (jd-gap) do

if arr[j] > arr[j+gap] then

begin

t := arr[j];

arr[j] := arr[j+gap];

arr[j+gap] := t;

end;

{tanya data yang dicari}

Page 53: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 53

write('Nilai yang dicari 0-10000 :');

readln(findvalue);

{pencarian data dengan binary search}

first:=1;

last :=jd;

jb := 0;

continue := true;

while (first <= last) and continue do

begin

mid := (first + last) Div 2;

if (findvalue > arr[mid]) then

begin

jb := jb + 1;

first := mid + 1;

end

else

if (findvalue < arr[mid]) then

begin

jb := jb + 1;

last := mid - 1

end

else

continue := false;

end;

if first > last then

writeln('data not found')

else

writeln('data found at :',mid);

writeln('jumlah perbandingan data :',jb);

readln;

end.

Modul 7

Pada contoh maupun tugas modul-modul sebelumnya kita telah banyak

menggunakan string (pada saat writeln), apakah sebenarnya string pada Pascal ? Sebenarnya string adalah suatu array dari char, maksudnya anda dapat mengambil masing-masing character dari suatu string dengan memperlakukannya sebagai elemen dari array. Contoh : Var

Nama : String;

Begin

Nama := 'Computer';

Writeln(Nama[1]);

Writeln(Nama[8]);

Nama[1] := 'K';

Writeln(Nama);

Page 54: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 54

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);

Page 55: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 55

Menggambil 5 character mulai posisi ke 5 Misalnya s:='Apa kabar ?'; st akan berisi 'kabar'. Pos, mengambil posisi substring dari suatu string. Syntax : Pos(substr,s) Contoh : : n:=pos('kabar','Apa kabar ?'); { n:=5; } Jika substring tidak ditemukan, maka akan mengembalikan 0. Val, mengkonversi string menjadi numerik. Syntax : val(strvar,numvar,errorcode) strvar adalah suatu variabel string yang akan di konversi numvar adalah variabel integer atau real errorcode adalah variabel integer yang akan berisi nilai kesalahan, jika berisi 0 sukses. Contoh : : Var

s : string;

e : integer;

r : real;

Begin

Write('Enter a number : '); readln(s);

val(s,r,e);

if e<>0 then

writeln('Error at position : ',e);

else

writeln('That was : ',r:4:3);

end. Str, mengkonversi numerik menjadi string. Syntax : (numvar,strvar) Contoh : : var

s : string;

i : integer;

begin

write('Input an integer : '); readln(i);

str(i,s);

writeln('That was : ',s);

end.

Jika anda bekerja dengan type real, anda perlu melakukan pemformatan sebelum konversi ke string.

Page 56: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 56

Contoh : : var

s : string;

r : real;

begin

write('Input a real : '); readln(r);

str(r:4:3,s);

writeln('That was : ',s);

end. Concat, mengabung dua string atau lebih Syntax : concat(s1,s2,...,sn) Contoh : st:=concat(s1,s2); Jika s1 adalah 'STMIK', dan s2 adalah 'IBBI', maka st menjadi 'STMIKIBBI' Sebenarnya kita juga dapat menggunakan operator + untuk mengabung string. Contoh : st:=s1 + s2; {adalah sama dengan st:=concat(s1,s2);} Insert, menyisip suatu string kedalam string lain dari posisi tertentu Syntax : insert(source,target,index) Contoh : : var

s1, s2 : string;

begin

s1:='not ';

s2:='I do love you';

insert(s1,s2,6);

writeln(s2); { I do not love you }

end.

Delete, menghapus sejumlah character dari string mulai posisi ke i Syntax : delete(s,i,n); var

s : string;

begin

s:='I am not responsible for that !';

delete(s,6,3);

writeln(s); { I am responsible for that }

end.

Page 57: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 57

Latihan 7

1. What is a string ?

2. Explain what the relationsip between string and character in pascal !

2. What is the maximum length of a string ? 3. How is the declaration ? 4. Explain how to merge two string, using function and operator ! 5. Explain how to convert string to value and vice versa ! 6. Explain how to know the length of a string !

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;

Page 58: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 58

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 : string;

temp1,temp2 : string;

val1,val2,

result : real;

numcode : integer;

begin

write('masukkan ekspresi penjumlahan :');

readln(ekspresi);

temp1:=copy(ekspresi,1,pos('+',ekspresi)-1);

temp2:=copy(ekspresi,pos('+',ekspresi)+1,length(ekspresi)-

pos('+',ekspresi));

val(temp1,val1,numcode);

val(temp2,val2,numcode);

result := val1 + val2;

writeln('Hasil perhitungan :',result:10:2);

readln;

Page 59: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 59

end.

Page 60: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 60

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. Dengan memecah program kita menjadi kesatuan yang lebih kecil : uses crt;

procedure pause;

begin

writeln('Press any key when ready ...');

readkey;

end;

begin

clrscr;

writeln('ABC');

pause;

writeln('Hey, let''s pause !');

pause;

writeln('Pause again !');

pause;

end.

Page 61: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 61

Contoh pemakaian function :

Var

I : Byte;

Akar,Bagi : Word;

Begin

Writeln(Upper('Bilangan Prima dari 1 s/d 100');

Writeln(Replicate('-',30);

For I := 1 To 100 do

If (Bil > 1 And Bil < 4) Then

Write(I : 4)

Else

Begin

Akar := Round(Sqrt(Bil));

Bagi := 3;

While (Bagi <= Akar) And (Bil Mod Bagi <> 0) Do

Bagi := Bagi + 1;

If Bagi > Akar Then

Write(I : 4);

End;

End.

Dan contoh berikut yang menggunakan function : Function IsPrime (Num : Longint) : Boolean;

Var

Sq ,Dv : Word; (*local variable )

Begin

If Num < 2 Then

IsPrime := False

Else

If Num < 4 Then

IsPrime := Bil > 1

Else

Begin

Sq := Round(Sqrt(Num));

Dv := 3;

While (Dv <= Sq) And (Num Mod Dv <> 0) Do

Dv := Dv + 1;

IsPrime := Dv > Sq;

End;

End;

(* Main program*)

Var

I : Byte; (*local variable*)

Begin

Writeln(Upper('Prime number from 1 to 100');

Writeln(Replicate('-',30);

For I := 1 To 100 do

If IsPrima(I) Then

Write(I : 4);

End.

Tadi saya melihat ada keterangan variabel local, apa maksudnya ?

Page 62: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 62

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 { main begin...end block }

foo;

a:=15; { This will be an error, since a is only known inside foo }

end. Kalau begitu berarti ada variabel global dong ? Ya, benar, global variabel adalah variabel yang ruang lingkup pemakaiannya meliputi seluruh program, baik program utama, procedure maupun function. Contoh: var

b : byte; { global variabel }

procedure foo;

var a : byte;

begin

a:=10;

b:=15; { This is legal }

end;

begin { main begin...end block }

foo;

a:=15; { This is illegal }

b:=5; { This is perfectly legal }

end.

Jadi variabel global harus dideklarasi diatas semua procedure maupun function.

Bagaimana kalau ada variabel local dan variabel global yang sama namanya ? Global variabel tersebut akan di override. Pada suatu program yang terstruktur dengan baik, usahakan untuk menggunakan variabel Global seminimal mungkin. Contoh : uses crt;

var

a : byte; { This is the global variable }

Page 63: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 63

procedure foo;

var

a : byte; { This is local variable }

begin

a:=15;

writeln('foo is ',a); { Will print 15}

end;

begin

a:=10;

writeln(a); { Will print 10}

foo;

writeln(a); { Still print 10}

end. Dari tadi anda menyebutkan procedure dan function, apa sih bedanya ? Pada prinsipnya function mengembalikan nilai. Syntax untuk procedure : Procedure namaprocedure (deklarasi parameter);

Deklarasi variabel local

begin

:

{ commands }

:

:

end; Syntax untuk function : function namafunction (deklarasi parameter) : returntype;

Deklarasi variabel local

begin

:

{ commands }

:

namafunction := return value;

end; Coba perhatikan kembali contoh Isprima untuk lebih jelas. Sebenarnya apa fungsi deklarasi parameter pada procedure maupun function ? Pada deklarasi bagian deklarasi parameter kita menentukan parameter dan type data dari masing-masing parameter yang akan dikirim kedalam procedure maupun function. procedure makewin(x1,y1,x2,y2 : byte);

var

i,j : byte;

begin

gotoxy(x1,y1); write(#201); {top}

Page 64: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 64

for i:=x1+1 to x2-1 do write(#205);

write(#187);

for i:=y1+1 to y2-1 do {middle}

begin

gotoxy(x1,i); write(#186);

for j:=x1+1 to x2-1 do write(' ');

write(#186);

end;

gotoxy(x1,y2); write(#200); {bottom}

for i:=x1+1 to x2-1 do write(#205);

write(#188);

end;

begin

makewin(1,1,30,8);

makewin(10,10,60,18);

end.

Dan contoh untuk function :

function factorial(n : byte):longint;

var

i : byte;

result : longint;

begin

result:=1;

for i:=1 to n do

result:=result*i;

factorial:=result;

end;

var

x : byte;

begin

writeln('Enter a value : '); readln(x);

writeln(x,'! is ',factorial(x));

end. Kalau kita bisa mengirim nilai kedalam procedure maupun function, apakah bisa

juga sebaliknya ? Pada contoh diatas nilai parameter dikirim secara PASS BY VALUE. Kita dapat juga mengirim parameter secara PASS BY REFERENCE dengan menambah Var pada saat deklarasi masing-masing parameter, dalam hal ini yang dikirim kedalam procedure maupun function adalah alamat dari variabel tersebut. Contoh : (*Pass by value*)

procedure foo(a : byte);

begin

writeln(a); {15}

a:=10;

writeln(a); {10}

(*Pass by reference*)

procedure foo(var a : byte);

begin

writeln(a); {15}

a:=10;

writeln(a); {10}

Page 65: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 65

end;

var

x : byte;

begin

x:=15;

writeln(x); {15}

foo(x);

writeln(x); {15}

end.

end;

var

x : byte;

begin

x:=15;

writeln(x); {15}

foo(x);

writeln(x); {10}

end.

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

Page 66: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 66

Make a program to translate a number into word using function. Input : 1537000

Output : Satu juta lima ratus ribu tiga puluh tujuh ribu rupiah.

program baca_bilangan_sampai_ratusan;

function BacaBilangan(x : integer):string;

const

angka : array[0..19] of string =

('nol','satu','dua','tiga','empat','lima',

'enam','tujuh','delapan','sembilan','sepuluh',

'sebelas','duabelas','tigabelas','empatbelas','limabelas',

'enambelas','tujuhbelas','delapanbelas','sembilanbelas');

var

ratusan,puluhan,satuan,sisa : integer;

hasil : string;

begin

hasil := '';

ratusan := x div 100;

if ratusan > 0 then

hasil := hasil + angka[ratusan] + 'ratus';

sisa := x - (ratusan*100);

if (sisa > 0) and (sisa < 20) then

hasil := hasil + angka[sisa]

else

begin

puluhan := sisa div 10;

if puluhan > 0 then

hasil := hasil + angka[puluhan] + 'puluh';

satuan := sisa - (puluhan*10);

if satuan > 0 then

hasil := hasil + angka[puluhan];

end;

BacaBilangan := hasil;

end;

(*program utama*)

begin

writeln(BacaBilangan(200));

readln;

end.

Page 67: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 67

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! * 5

4! = 3! * 4

2! = 1! * 2

1! = 1

Jadi kita secara programming dapat dilakukan dengan : function factorial (n:byte):factorial;

begin

if n<2 then { This is the terminating condition }

factorial:=1;

else

factorial:=n*factorial(n-1); { This is the recursive part }

end;

var

x : byte;

begin

writeln('Enter a value : '); readln(x);

writeln(x,'! is ',factorial(x));

end.

Sesuatu hal yang perlu diperhatikan dalam pembuatan fungsi rekursif adalah harus adanya suatu titik akhir, sehingga rekursif dapat selesai. Quick Sort

8 Quicksort was invented by C.A.R. Hoare in 1960, and was published in Computer Journal in 1962

Page 68: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 68

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 left }

while Data[right] > pivot do right:=right-1;{ Parting for right}

if left<=right then { Validate the change }

begin

swap(Data[left],Data[right]);

left:=left+1;

right:=right-1;

end;

end;

if right>lower then qsort(lower,right); { Sort the LEFT part }

if upper>left then qsort(left ,upper); { Sort the RIGHT part }

end;

Pemakaian : qsort(1,NumberOfData); Contoh program menggunakan procedure dan function dengan implementasi Quick Sort dan Interpolation Search. program urut_data_qsort_dan_cari_data_interpolation_search; (*oleh : hendra soewarno*) const jd = 10000; var Data : array[1..jd] of integer; procedure swap(var data1,data2 : integer); var temp : integer; begin temp := data1;

Page 69: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 69

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

Page 70: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 70

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.

Page 71: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 71

2. Write a program to generate 10000 random number, and then sort it using Quick sort examine how many data comparing and data exchange.

Page 72: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 72

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 Nama Tugas Teori Praktek

02001 Hendra Soewarno

80 90 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; Sedangkan kalau kita menggunakan fasilitas Record Type, maka : Type

TSiswa = Record

NIS : String[9];

NAMA : String[30];

Tugas, Teori, Praktek : Byte;

End;

Var

Siswa : Array [1..10] of TSiswa;

Bukankan menjadi lebih sederhana dan terstruktur. Ok, I got It, tetapi bagaimana cara pemakaiannya dalam program ?

Page 73: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 73

Misalnya kita anda mengisi data untuk Siswa yang pertama. Siswa[1].Nis := "02001";

Siswa[1].Nama := "Hendra Soewarno";

Siswa[1].Tugas := 80;

Siswa[1].Teori := 90;

Siswa[1].Praktek := 90;

Bisakah anda bayangkan kalau yang tidak pakai Record Type ! Adakah cara untuk melakukan hal yang sama ? Ya, kita dapat menggunakan block With … End; With Siswa[1] Do Begin

Nis := "02001";

Nama := "Hendra Soewarno";

Tugas := 80;

Teori := 90;

Praktek := 90;

End;

Bagaimana untuk proses input-outputnya ? Untuk proses input-output sama saja dengan variabel biasanya. Contoh : For I := 1 To 10 Do Begin

Write('No. Induk siswa :'); Readln(Siswa[I].Nis);

Write('Nama siswa :'); Readln(Siswa[I].Nama);

Write('Tugas :'); Readln(Siswa[I].Tugas);

Write('Teori :'); Readln(Siswa[I].Teori);

Write('Praktek :'); Readln(Siswa[I].Praktek);

End;

For I := 1 To 10 Do Begin

With Siswa[I] Do Begin

Rata := (Tugas+Teori+Praktek)/3;

Write(Nis:9,' ');

Write(Nama:30,' ');

Write(Tugas:6:2,' ');

Write(Teori:6:2,' ');

Write(Praktek:6:2,' ');

Write(Rata:6:2);

End;

End;

Contoh Kongkrit pemanfaatan data terstruktur dengan pendekatan pemrograman terstruktur.

Page 74: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 74

program data_terstruktur;

(*oleh : hendra soewarno*) uses CRT; Type TSiswa = Record NIS : String[9]; NAMA : String[30]; Tugas, Teori, Praktek : Integer; End; const jd = 200; (*variabel global*)

var Siswa : Array [1..jd] of TSiswa; Js : Integer; procedure bacasiswa(I : integer);

begin Writeln('Record ke-',I); With Siswa[I] do begin Nis := ''; Write('No. Induk siswa :'); Readln(Nis); If Nis <> '' Then begin Write('Nama siswa :'); Readln(Nama); Write('Tugas :'); Readln(Tugas); Write('Teori :'); Readln(Teori); Write('Praktek :'); Readln(Praktek); end; end; end; procedure tampilsiswa(I : integer); begin Writeln('Record ke-',I); With Siswa[I] do begin Writeln('No. Induk siswa :',Nis); Writeln('Nama siswa :',Nama); Writeln('Tugas :',Tugas); Writeln('Teori :',Teori); Writeln('Praktek :',Praktek); end; end; procedure hapusdata(I : integer);

var J : Integer; begin For J := I to Js-1 do {geser 1 record ke atas} Siswa[J] := Siswa[J+1]; Js := Js-1; end; procedure tampildaftarnilai;

var I : Integer; Rata : Real; begin For I := 1 To JS Do begin With Siswa[I] Do begin Rata := (Tugas+Teori+Praktek)/3;

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;

Page 75: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 75

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 begin tampilsiswa(Posisi); Writeln('Diubah menjadi'); bacasiswa(Posisi); end; end; procedure proseshapusdata;

var TNis : String[9]; Posisi: Integer; Tanya : Char; begin write('Nis yang ingin dihapus :'); readln(TNis); Posisi := caridata(TNis); If Posisi = -1 Then Writeln('Data tidak ditemukan !') else begin Write('Apakah yakin dihapus [Y/T] :'); repeat Tanya := Upcase(Readkey); until Tanya in ['Y','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.

Page 76: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 76

* Apply quick sort for at least one key-sort. * Apply search for student name first before editing the data. Tip : Use array of records.

Page 77: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 77

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 masing-masing 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 meng-asosiasikan variable tersebut dengan suatu nama file, contoh: assign(F,'README'); Apakah setelah itu kita dapat langsung bekerja dengan file tersebut ? Oh, belum-belum, selanjutnya anda perlu membuka file tersebut dengan menggunakan perintah reset, contoh : reset(F); Dan selanjutnya anda dapat membaca dari file tersebut baris-perbaris ke variable string, seperti : readln(F, s); Dalam hal ini s adalah variable string yang akan menampung pembacaan tersebut. Apakah kita dapat menentukan baris nomor berapa yang akan dibaca ? Dalam hal ini tidak dapat dilakukan, karena text file hanya dapat diolah secara sequential, artinya kita hanya dapat membaca baris ketiga, setelah membaca baris pertama dan kedua. Kalau begitu, bagaimana saya bisa tahu bahwa pembacaan telah selesai ? Untuk keperluan tersebut telah disediakan fungsi bantu EOF, dimana fungsi ini akan bernilai True kalau pembacaan telah mencapai akhir dari file, contoh : if EOF(F) then writeln('This is the end of text file');

Page 78: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 78

Bagaimana kalau kita telah selesai bekerja dengan file tersebut ? Kalau anda telah selesai, maka anda perlu menutupnya, contoh : close(F); Jadi contoh kongkrit membaca suatu text file dari awal sampai akhir dari file adalah : uses crt;

var

F : text;

s : string;

begin

clrscr;

write('Input file name to read : '); readln(s);

assign(F,s); { associate it }

reset(F); { open it }

while not EOF(F) do { read it until it's done }

begin

readln(F,s);

writeln(s);

end;

close(F); { close it }

end.

Mudah bukan ? 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); { write it until done }

if s='' then break;

writeln(F,s);

until true;

close(F); { close it }

end.

Page 79: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 79

Perhatian : Perintah rewrite akan menghapus file yang telah ada. Mengenai close, apakah wajib dilakukan pada setiap akhir operasi file ? Ya, hal itu harus dilakukan, terutama pada proses penulisan file, pada dasarnya system operasi menyediakan suatu buffer untuk proses I/O file, tujuan pemakaian buffer adalah untuk mempercepat proses I/O. Jadi kalau kita menulis data ke file, hal tersebut tidak secara otomatis dilakukan oleh system operasi, jadi pastikan penulisan isi buffer ke file dengan close. Jika saya perhatikan, kalau kita membuka suatu file, dan file tersebut belum ada,

maka akan terjadi runtime error, bagaimana caranya menangani masalah ini ? Ha-ha-ha, jangan takut, turbo pascal telah mengantisipasi masalah ini dengan mematikan sementara I/O checking, dan selanjutnya kita dapat memeriksanya dengan Ioresult, jika bernilai 0, artinya tidak ada error. Contoh :

uses crt;

var

F : text;

s : string;

begin

clrscr;

write('Input file name to read : '); readln(s);

assign(F,s); { associate it }

{$I-}

reset(F); { open it }

{$I+}

if IOresult<>0 then

begin

writeln('Error encountered in reading file ',s);

halt;

end;

while not EOF(F) do { read it until it's done }

begin

readln(F,s);

writeln(s);

end;

close(F); { close it }

end. Sebenarnya, selain 0, IOResult dapat berisi nilai lain yang memiliki arti, perhatikan contoh berikut : uses crt;

var

F : text;

s : string;

begin

clrscr;

write('Input file name to read : '); readln(s);

assign(F,s); { associate it }

{$I-}

reset(F);

{$I+}

n:=IOResult;

if n<>0 then

begin

writeln('Error encountered in reading file ',s);

case n of

2: writeln('File not found');

3: writeln('Path not found');

4: writeln('Too many open files');

Page 80: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 80

5: writeln('File access denied');

100: writeln('Disk read error');

101: writeln('Disk write error');

150: writeln('Disk is write protected');

152: writeln('Drive is not ready');

154: writeln('CRC error in data');

156: writeln('Disk seek error');

157: writeln('Unknown media type');

162: writeln('Hardware failure');

else writeln('Various error');

end;

halt;

end;

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

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.

Page 81: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 81

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 }

Page 82: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 82

uses crt;

type

Temployee = record

name : string[20];

address : string[40];

phone : string[15];

age : integer;

salary : longint;

end;

var

F : file of Temployee;

c : char;

r : Temployee;

s : string;

begin

clrscr;

write('Input file name to record databases : '); readln(s);

assign(F,s); { Associate it }

rewrite(F); { Create it }

repeat

clrscr;

write('Name = '); readln(r.name); { Input data }

write('Address = '); readln(r.address);

write('Phone = '); readln(r.phone);

write('Age = '); readln(r.age);

write('Salary = '); readln(r.salary);

write(F,r); { Write data to file }

write('Input data again (Y/N) ?');

repeat

c:=upcase(readkey); { Ask user : Input again or not }

until c in ['Y','N'];

writeln(c);

until c='N';

close(F);

end.

Apakah suatu file of records juga diolah secara sequential ? Ha-ha, ini pertanyaan yang sangat bagus. Pada file of records, anda dapat membaca data berdasarkan record tertentu. Sesuatu yang menentukan posisi record yang akan dibaca/tulis adalah record pointer. Pointer ini dapat dipindah-pindahkan sebelum proses pembacaan maupun penulisan. Adapun syntaxnya adalah sebagai berikut : seek(F,recordno); Perhatian : recordno dimulai dari 0 untuk record 1 Contoh pemakaiannya : seek(F,9); { Data record number started from 0 }

read(F,r); { r is the record variable }

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 ?

Page 83: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 83

Tentu saja, adapun triknya adalah : 1. Buka file tersebut dengan 'reset', 2. Pindahkan pointer file ke record terakhir dengan seek, 3. Lakukan proses penulisan Kalau begini, saya perlu mengetahui jumlah record yang telah ada, dan bagaimana

caranya ? Jangan takut, pascal ada menyediakan sebuah fungsi yaitu filesize, contoh : totalrecord := filesize(f); Apakah kita bisa menghapus record tertentu pada file of records ? Pada dasarnya pascal tidak menyediakan fungsi tertentu untuk menghapus record, tetapi anda dapat membuat suatu rutin sendiri untuk melakukan hal tersebut, perhatikan potongan algoritma berikut : for i:=n to totalrecord-1 do begin seek(f,i); read(f,r); seek(f,i-1); write(f,r); end; seek(f,totalrecord-1); truncate(f); dec(totalrecord); Saya melihat ada perintah truncate, apa fungsinya ? Perintah truncate dapat digunakan untuk membuat EOF pada posisi record yang ditentukan, atau dengan kata lain memotong file mulai posisi record tertentu. Dapatkah saya mengetahui posisi record pointer yang sedang aktif ? Ya, anda dapat menggunakan fungsi 'filepos' , contoh : n:=filepos(F); Contoh program kongkrit : program data_record_terstruktur; (*oleh : hendra soewarno*) uses crt; Type TSiswa = Record NIS : String[9]; NAMA : String[30]; Tugas, Teori, Praktek : integer; End; (*variabel global*) var Siswa : TSiswa; FSiswa : File of TSiswa; procedure bukafile(fname : string);

begin assign(FSiswa,fname); {$I-}

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

Page 84: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 84

begin Write('Nama siswa :'); Readln(Nama); Write('Tugas :'); Readln(Tugas); Write('Teori :'); Readln(Teori); Write('Praktek :'); Readln(Praktek); end; end; end; procedure tampilsiswa(I : integer);

begin Writeln('Record ke-',I); With Siswa do begin Writeln('No. Induk siswa :',Nis); Writeln('Nama siswa :',Nama); Writeln('Tugas :',Tugas); Writeln('Teori :',Teori); Writeln('Praktek :',Praktek); end; end; procedure hapusdata(I : integer);

var J : integer; Js : integer; begin Seek(FSiswa,I); Js := Filesize(FSiswa); For J := I to Js-2 do begin Seek(FSiswa,J+1); read(FSiswa,siswa); Seek(FSiswa,J); write(FSiswa,siswa); end; truncate(FSiswa) end; procedure tampildaftarnilai; var Rata : Real; begin Seek(FSiswa,0); While not eof(FSiswa) do begin read(FSiswa,Siswa); With Siswa Do begin Rata := (Tugas+Teori+Praktek)/3; 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:=0;

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

Page 85: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 85

begin tampilsiswa(Posisi); Writeln('Diubah menjadi'); bacasiswa(Posisi); Seek(FSiswa,Posisi); Write(FSiswa,Siswa); end; end; procedure proseshapusdata;

var TNis : String[9]; Posisi: integer; Tanya : Char; begin write('Nis yang ingin dihapus :'); readln(TNis); Posisi := caridata(TNis); If Posisi = -1 Then Writeln('Data tidak ditemukan !') else begin Write('Apakah yakin dihapus [Y/T] :'); repeat Tanya := Upcase(Readkey); until Tanya in ['Y','T']; if Tanya = 'Y' Then begin hapusdata(posisi); Writeln('Proses hapus berhasil !'); end;

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.

Page 86: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 86

Modul 13

Akhirnya kita sampai juga pada pembahasan tentang Untyped file. Sebenarnya cara pengolahan Untyped file mirip dengan Typed file, dalam hal ini masing-masing record berukuran 1 integer. 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. Berikut ini saya akan mendeklarsikan variable sebagai buffer, contoh :: var buffer : array[1..2048] of integer; count, actual : word; f : file; Dan proses pembacaan dapat sebagai berikut : count:=sizeof(buffer); blockread(f,buffer,count,actual); Variabel actual, akan berisi jumlah integer yang benar-benar berhasil dibaca dari file, demikian juga untuk proses 'blockwrite' : count:=sizeof(buffer); blockwrite(f,buffer,count,actual); Contoh berikut ini akan mencoba membaca 512 integer dari file. blockread(f,buffer,512,actual); Contoh kongkrit : program enkripsi_dekripsi_file; (*oleh : hendra soewarno*) uses crt; const

Blen = 1024; (*variabel global*) var FSource, FTarget : file; Bread,Bkey : array [1..BLen] of byte;

Page 87: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 87

Key : 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

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.

Page 88: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 88

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');

Page 89: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 89

Akan menampilkan tulisan tersebut mulai kolom 10 di baris 5. Jadi misalnya anda ingin mencetak tulisan tersebut pada kolom 20, baris 13, maka anda harus memindahkan cusor keposisi kolom 20, baris 13, diikuti dengan perintah pencetakan tulisan tersebut, contoh : GotoXY(20,13);

Writeln('Tulisan ini dicetak mulai kolom 20, di baris 13); Bisakah saya mendapatkan nilai posisi cursor yang sedang aktif ? Bisa, anda bisa menggunakan variabel internal unit CRT, yaitu WhereX, dan WhereY. GotoXY(5,5);

Write('Turbo');

GotoXY(WhereX+10,3);

Write('Pascal'); Ngomong-ngomong, berapa sih jumlah kolom dan baris pada layar normal ? Normalnya 80 kolom, 25 baris. Saya pernah melihat tulisan layar komputer di bandara Polonia yang lebih besar

dari tulisan normal, bagaimana hal tersebut dapat dilakukan ? Oh, ya. Hal tersebut dapat dilakukan dengan mengatur Mode layar dengan perintah : TextMode(CO40);

Dan TextMode(CO80);

Untuk menormalkannya. Contoh : Uses CRT;

begin

TextMode(CO40);

Writeln('A Real BIG Characters on screen !');

Readln;

TextMode(CO80);

Writeln('Back to normal');

Readln;

end.

He-he-he, saya sudah mengerti trik yang mereka gunakan. Tunggu dulu, ada satu hal lagi yang belum diberitahu, yaitu membatasi dari pencetakan dilayar berdasarkan koordinat kiri atas dan koordinat kanan bawah dengan perintah : Window(x1, y1, x2, y2);

Dimana x1, y1 adalah koordinat kiri atas dan x2, y2 adalah koordinat kanan bawah. Contoh : uses Crt;

begin

ClrScr;

WriteLn('Creating a window from 30,10 to 50,20');

Window(30,10,50,20);

WriteLn('We are now writing in this small window we just created, we'+

'can''t get outside it when writing long lines like this one');

Write('Press any key to clear the window');

Page 90: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 90

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.

Ok, apakah anda sudah selesai ? Belum, sebenarnya masih banyak perintah yang terdapat pada unit CRT, seperti : Sound(frekuensi);

Delay(milidetik);

NoSound;

Apa pula fungsinya itu ? Fungsi perintah Sound untuk membunyikan speaker komputer dengan frekuensi tertentu. Contoh : Sound(500);

Tolong, bunyinya tidak berhenti, walaupun programnya sudah selesai ! He-he-he, anda tidak menggunakan perintah NoSound untuk menghentikan efek dari perintah Sound. Contoh : Sound(500);

NoSound;

Kok sekarang speaker komputer tidak berbunyi sama sekali ? Oh, ya, saya lupa menyisipkan delay diantara Sound dan NoSound. Contoh : Sound(500);

Delay(1000);

NoSound;

Daftar Frekuensi

Nada Frekuensi

C 262

D 294

E 330

F 350

G 392

A 440

B 494

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

Page 91: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 91

real dengan real = real Konvensi Pembagian (/) : Selalu menghasilkan real. Pembagian bulat dengan Div : Menghasilkan Integer.

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 ?

Page 92: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 92

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.

Kalau begitu bukankan sama saja dengan menulis langsung Setelah PPN =

NilaiPenjualan * (1+0.1); dan apa hubungannya dengan membuat program kita lebih mudah di maintenance ? Pada prinsipnya sama, tetapi coba anda bayangkan, misalnya terjadi perubahan nilai PPN menjadi 12.5%, berdasarkan contoh diatas kita tinggal mengubah Const {deklarasi konstanta}

PPN = 0.125; {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');

Page 93: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 93

dan contoh lain :

Uses crt;

Const {deklarasi konstanta}

Gaji : Real = 500000;

Var

Omzet : Real;

Begin

Write('Omzet penjualan :') Readln(Omzet);

If Omzet >= 10000000 Then

Gaji := Gaji + 10000;

Writeln('Gaji yang diterima ', Gaji:10:2);

End. 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'; {deklarasi variabel Set}

letter : set of 'A'..'Z'; {range A s/d Z}

begin

write('Enter a vowel');

repeat

c:=upcase(readkey);

until c in vowel;

write('Enter a letter');

repeat

c:=upcase(readkey);

until c in letter;

end.

Contoh lain pemakaian set uses crt;

var

c : char;

begin

write('Yes or no (Y/N) ?');

repeat

c:=upcase(readkey);

until c in ['Y','N'];

end.

Apakah fungsi operator in pada operasi Set ? Oh, ya, fungsi operator in pada Set adalah menyatakan bagian dari himpunan tertentu. Apakah masih ada fasilitas lain yang khusus pada pascal ? Ya, masih adalah beberapa yaitu user defined type, dimana pemakai dapat membuat type ciptaan sesuai dengan kebutuhan program. Dapatkah anda menjelaskan lebih lanjut apa itu type ciptaan dari sisi penerapan

pada program, dan kalau bisa kasih contoh dong !

Page 94: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 94

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; Tetapi akan lebih baik kalau dengan contoh berikut ; Type

Nilai = 0..100;

Var

Fisika : Nilai;

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;

Adakah type ciptaan yang lain ? Masih ada dua yaitu Enumerated type dan Record Type, pada modul ini kita belum akan membahas tentang Record type. Apa itu Enumerated type ? Pada pascal, user diberi kesempatan untuk membentuk ordinal type yang sesuai dengan kebutuhan program, misalnya : Contoh :

Page 95: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 95

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. Dapatkah Enumerated type mengalami input-output dan operasi matematika ? Enumerated type tidak dapat mengalami input output maupun operasi matematika, tetapi ada beberapa fungsi bantu ordinal yang dapat digunakan untuk mengolah enumerated type, yaitu : Pred(X), function mendapatkan nilai predecessor dari suatu nilai ordinal

type.

Succ(X), function mendapatkan nilai predecessor dari suatu nilai ordinal

type.

Dec(X), procedure mengurangi nilai 1 ke variabel X.

Inc(X), procedure menambah nilai 1 ke variabel X.

Contoh :

Type

DOW = (senin, selasa, rabu, kamis, jumat, sabtu, minggu);

Var

Today : DOW;

Begin

Today := minggu;

Today := Pred(Today); {sabtu}

Inc(Today); {minggu}

End.

Latihan 15

1. Explain what is constants in pascal ?

2. Explain how constants make your program more easy maintenance ? 3. Can we change the value of constant in program ? 4. Explain how to declare set variable ! 5. Explain the function of in operator in set ! 6. Explain what is Sub Ranges, Subtitution and Enumerated in type declaration ? 7. Can we do input output for Enumerated type ?

Page 96: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 96

Fungsi bantu konversi ini terdiri atas ROUND(Real) FUNCTION untuk menghasilkan data type INTEGER dari suatu REAL dengan memperhatikan aturan pembulatan. TRUNC(REAL) FUNCTION untuk mengambil bagian INTEGER dari suatu REAL. ORD(Char); FUNCTION untuk menghasilkan data type Integer dari suatu Character. CHR(Integer); FUNCTION untuk menghasilkan data type Character dari suatu Integer. Fungsi Bantu Matematika : ABS(Numerik); FUNCTION untuk mengambil harga mutlak suatu nilai FRAC(Real); FUNCTION untuk mengambil bagian pecahan dari suatu REAL INT(Real); FUNCTION untuk mengambil bilangan bulat dari suatu REAL SQR(Real); FUNCTION untuk menghasilkan nilai kuadrat suatu bilangan SQRT(Real) FUNCTION untuk menghasilkan akar kwadrat suatu bilangan COS(Real) FUNCTION untuk menghasilkan Cosinus suatu sudut SIN(real); FUNCTION untuk menghasilkan Sinus suatu sudut (dalam radian PI/180) ARCTAN(real); FUNCTION untuk menghasilkan sudut yang diketahui nilai tangennya PI; FUNCTION untuk menghasilkan nilai pi (3.1415926...) LN(Real); FUNCTION untuk menghasilkan logaritma natural dari suatu nilai EXP(real); FUNCTION untuk menghasilkan eksponensial dari suatu nilai.

Page 97: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 97

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

Page 98: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 98

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; 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); 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.

Page 99: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 99

program nqueen_visual_grafik;

(*oleh hendra soewarno*) uses graph,crt; var cq : array[1..1000] of integer; procedure initialgraph;

var graphdriver : integer; graphmode : integer; begin detectgraph (graphdriver, graphmode); initgraph (graphdriver, graphmode, 'EGAVGA.BGI'); end; procedure drawchessboard(n :byte);

var i,j,k : byte; begin cleardevice; k := 0; for i := 1 to n do for j := 1 to n do begin setfillstyle(1,(i+j) mod 2); bar((j-1)*(200 div n),(i-1)*(200 div n), j*(200 div n), i*(200 div n)); k:=k+1; end; end; 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; procedure showresult(n : byte); var i : integer; begin drawchessboard(n); for i := 1 to n do circle((cq[i]-1)*(200 div n)+(200 div (n*2)), (i-1)*(200 div n)+(200 div (n*2)), 200 div (n*3)); end; (* program utama*)

var nq,r,c, solution,i : integer; jbacktrack : longint; continue : boolean; backtrack : boolean; begin write('no. of queen :'); readln(nq);

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.

Page 100: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 100

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:

• recursive functions and stacks • recurrence relations

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

Page 101: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 101

Solve(N, Src, Aux, Dst)

if N is 0 exit

Solve(N-1, Src, Dst, Aux)

Move from Src to Dst

Solve(N-1, Aux, Src, Dst)

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. Move from Src to Dst 2. Move from Src to Aux 3. Move from Dst to Aux 4. Move from Src to Dst 5. Move from Aux to Src 6. Move from Aux to Dst 7. Move from Src to Dst

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

Page 102: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 102

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);

Page 103: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 103

Move (Height, 'A', 'C', 'B') end. program Hanoi_visual_grafik; {Recursively solves the Towers of Hanoi problem. Moves disks from A to C.} uses crt,graph; (*modify by hendra soewarno*) Type PPeg = ^Peg; Peg = object private stack : array [1..100] of byte; nstack : byte; public stackname : string; midpoint : integer; constructor initial(name:string;mid:integer); procedure push(size : byte); procedure pop(var size : byte); function height:byte; end; var A,B,C : PPeg; procedure initialgraph; var graphdriver : integer; graphmode : integer; begin detectgraph (graphdriver, graphmode); initgraph (graphdriver, graphmode, 'EGAVGA.BGI'); end; procedure printdisk(height,size,mid:integer); begin setfillstyle(1,1); bar(mid - size div 2,300 - 20*height, mid + size div 2,319 - 20*height); setcolor(15); rectangle(mid - size div 2,300 - 20*height, mid + size div 2,319 - 20*height); end; procedure erasedisk(height,size,mid:integer); begin setfillstyle(1,0);

Page 104: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 104

bar(mid - size div 2,300 - 20*height, mid + size div 2,319 - 20*height); end; constructor Peg.initial(name:string;mid:integer); begin nstack := 0; stackname := name; midpoint := mid; end; procedure Peg.push(size : byte); begin inc(nstack); stack[nstack] := size; printdisk(nstack,size,midpoint) end; procedure Peg.pop(var size : byte); begin size := stack[nstack]; dec(nstack); erasedisk(nstack+1,size,midpoint) end; function Peg.height:byte; begin height := nstack; end; procedure Move(Height:byte;FromPeg,ToPeg,UsingPeg:PPeg); var disk : byte; begin if Height = 1 then begin FromPeg^.pop(disk); ToPeg^.push(disk); end else begin Move (Height-1,FromPeg, UsingPeg, ToPeg); FromPeg^.pop(disk); ToPeg^.push(disk); Delay(1000); Move (Height-1,UsingPeg, ToPeg, FromPeg); end end;

Page 105: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 105

(*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.

Page 106: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 106

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(n

2), since n

2 + 3n + 4 < 2n

2 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.

Page 107: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 107

Strictly, the character is the upper-case Greek letter Omicron, not the letter O, but who

can tell the difference?

Page 108: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 108

Sorting Algorithms, http://www.aeriesoft.ru/Projects/SortAlg/

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.

A characteristic of sorting methods which is sometimes important in practice is stability. A sort is called stable if it preserves the relative order of keys in the file. Insertion sort is an example of stable sorting algorithm.

Basic Sorting Algorithms

Bubble Sorts

Bubble Sort is a sorting technique in which pairs of adjacent values in the list to be sorted are compared and interchanged if they are out of order; thus, list entries "bubble upward" in the list until they bump into one with a lower sort value. The name is derived from the fact that as each pass is made, the largest element in a sub-list sinks all the way to the bottom of the list, displacing each smaller element one position, at most, upward. As the sort progresses, the larger elements sink quickly to their lower positions while the smaller elements slowly

Page 109: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 109

"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

Page 110: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 110

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

Page 111: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 111

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

Asymptotic Behavior Algorithm

Best Average Worst

In-Place

Stable

Bubble Sort N N2 N2 Yes No

Selection Sort N2 N2 N2 Yes No

Insertion Sort N N2 N2 Yes Yes

Shell Sort N(logN)2 N1.25 N1.5 Yes No

Quick Sort N logN N logN N2 Yes* No * Uses stack for recursion

Computational Complexity (Comparisons and Assignments)

Initial Array Content

Ascending Random Descending Algorithm

< : = < : = < : =

Bubble Sort 99 0 4940 8115 4950 14850

Selection Sort 4950 300 4950 300 4950 300

Insertion Sort 99 198 2644 2745 4950 5148

Shell Sort 342 692 765 1163 500 922

Quick Sort 552 180 880 854 676 431

Simplicity is traditionally considered the least important issue, but some attention must be paid to it. Simpler algorithms are less error-prone, easier to implement and result in more reliable and easy-to-maintain programs.

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

Page 112: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 112

o Average and Worst Cyclomatic Complexity among methods o Average and Worst Extended Cyclomatic Complexity among

methods • Halstead's Metrics

o Average and Worst Volume among methods (V) o Average and Worst Effort among methods (E) o Average and Worst Difficulty among methods (D)

All sorting algorithms in the applet that is running in the right frame were implemented as separate classes. Major metrics produced by TotalMetric for all methods of these classes are listed in the tables below.

Average in Class

Metrics Algorithm

v(G) ev(G) E V D

Bubble Sort 6 6 8470 385 22

Selection Sort 5 5 7756 357 21

Insertion Sort 4 5 9734 335 29

Shell Sort 7 9 31405 563 55

Quick Sort 5 6 33709 476 37

Page 113: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 113

What is Pascal's Triangle?

How do you construct it?

What is it used for?

Pascal's Triangle is an arithmetical triangle you can use for some neat things in mathematics. Here's how you construct it: 1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

.

.

.

You start out with the top two rows: 1, and 1 1. Then to construct each entry in the next row, you look at the two entries above it (i.e. the one above it and to the right, and the one above it and to the left). At the beginning and the end of each row, when there's only one number above, put a 1. You might even think of this rule (for placing the 1's) as included in the first rule: for instance, to get the first 1 in any line, you add up the number above and to the left (since there is no number there, pretend it's zero) and the number above and to the right (1), and get a sum of 1.

When people talk about an entry in Pascal's Triangle, they usually give a row number and a place in that row, beginning with row zero and place zero. For instance, the number 20 appears in row 6, place 3.

Where do we use Pascal's Triangle?

Pascal's Triangle is more than just a big triangle of numbers. There are two major areas where Pascal's Triangle is used, in Algebra and in Probability / Combinatorics.

Algebra

Let's say you have the polynomial x+1, and you want to raise it to some powers, like 1,2,3,4,5,.... If you make a chart of what you get when you do these power-raisings, you'll get something like this:

(x+1)^0 = 1

(x+1)^1 = 1 + x

(x+1)^2 = 1 + 2x + x^2

(x+1)^3 = 1 + 3x + 3x^2 + x^3

(x+1)^4 = 1 + 4x + 6x^2 + 4x^3 + x^4

(x+1)^5 = 1 + 5x + 10x^2 + 10x^3 + 5x^4 + x^5 .....

Page 114: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 114

If you just look at the coefficients of the polynomials that you get, you'll see Pascal's Triangle! Because of this connection, the entries in Pascal's Triangle are called the binomial coefficients.

There's a pretty simple formula for figuring out the binomial coefficients:

n!

[n:k] = --------

k! (n-k)!

6 * 5 * 4 * 3 * 2 * 1

For example, [6:3] = ------------------------ = 20.

3 * 2 * 1 * 3 * 2 * 1

Probability/Combinatorics The other main area where Pascal's Triangle shows up is in Probability, where it can be used to find Combinations. Let's say you have five hats on a rack, and you want to know how many different ways you can pick two of them and wear them. It doesn't matter to you which hat is on top, it just matters which two hats you pick. So this problem amounts to the question "how many different ways can you pick two objects from a set of five objects?"

The answer? It's the number in the second place in the fifth row, i.e. 10. (Remember that the first number in the row, 1, is always place 0.)

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

Because of this choosing property, the binomial coefficient [6:3] is usually read "six choose three." If you want to find out the probability of choosing one particular combination of two hats, then that probability is 1/10.

In about 1654 Blaise Pascal started to investigate the chances of getting different values for rolls of the dice, and his discussions with Pierre de Fermat are usually considered to have laid the foundation for the theory of probability.

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 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

Page 115: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 115

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.

Page 116: Pengantar Algoritma & Pemrograman Komputer

Algoritma & Pemrograman Hendra, S.T.

Indoprog 116

Daftar Pustaka

http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html, Sorting Algorithms Demo.

http://www.nist.gov/dads/, Dictionary of Algorithms and Data Structure, National Institute of Standards and Technology.

http://free.pages.at/bossung/prog/delphi/sorting.html, Sorting Algoritms in Pascal, Sebastian Boßung