MODULALPRO
MODULALPRO
K U L I A H
Jl. Siliwangi No. 24 Tasikmalaya Kotak Pos 164 Tlp. (0265) 323537 E-Mail : [email protected] ; URL : http://www.unsil.ac.id
TEKNIK INFORMATIKA
Prakata
Bismillahirrohmanirrohim, Diktat ini disusun secara khusus untuk keperluan pengajaran kuliah Algoritma dan Pemrograman di Lingkungan Jurusan Teknik Informatika Fakultas Teknik Universitas Siliwangi. Diktat ini merupakan revisi dari diktat yang pernah disusun untuk perkuliahan Algoritma dan Pemrograman dan disempurnakan serta disesuaikan dengan hasil rapim Jurusan mengenai penyempurnaan kurikulum, silabus, SAP dan GBPP yang rutin dilakukan. Pada diktat matakuliah ini dibahas tentang prosedur dan fungsi, matriks dan manipulasinya, algoritma pencarian (searching), algoritma pengurutan data (sorting), berkas sekuensial dan algoritma manipulasinya, konsep mesin abstrak, konsep rekursifitas serta studi kasus bahasa pemrograman dengan pendekatan prosedural. Pada matakuliah ini diberikan untuk meningkatkan kemampuan pemecahan persoalan di bidang studi mahasiswa, dengan mengimplementasi program, mahasiswa memakai bahasa pemrograman untuk penyelesaian persoalan di bidangnya, dengan merealisasi program. Selanjutnya saya mengucapkan terima kasih dan penghargaan kepada semua pihak yang telah memberi bantuan hingga selesainya diktat ini. Keritik, saran dan koreksi sangat diharapakan untuk perbaikan diktat ini pada edisi yang akan datang. Demikian semoga bermanfaat.
DAFTAR ISI
BAB 2 SEARCHING
BAB 3 SORTING
15
22
28
PEMROSESAN MATRIKS Pemrosesan terhadap Matriks berarti memproses elemen mulai dari elemen pertama (elemen dengan indeks terkecil, berturut-turut pada elemen berikutnya, sampai elemen terakhir dicapai) untuk setiap baris dan setiap kolom for i index_awal_baris to index_akhir_baris do for j index_awal_kolom to index_akhir_kolom do Proses(Nama_Variabel_Array[i][j]) endfor endfor 1
1. Pengisian elemen matriks dengan nilai yang dibaca dari piranti masukan Algoritma Matriks Kamus Matrix : array[1..50][1..50] of integer n, m, i, j : integer Agoritma read(n,m) {n adalah banyaknya baris, m adalah banyaknya kolom} if (n > 0) and (m > 0) then for i 1 to n do for j 1 to m do read(Matrix[i][j]) endfor endfor endif 2. Penulisan elemen matriks Algoritma Tabel Kamus Matrix : array[1..50][1..50] of integer n, m, i, j : integer Agoritma read(n,m) if (n > 0) and (m > 0) then for i 1 to n do for j 1 to m do read(Matrix[i][j]) endfor endfor for i 1 to n do for j 1 to m do write(Matrix[i][j]) endfor endfor endif LATIHAN SOAL 1. Tuliskan algoritma untuk penulisan elemen matriks yang memiliki 5 baris dan 8 kolom, pengisian matriks dengan nilai yang dibaca dari piranti masukan. 2. Tuliskan algoritma untuk membuat serta mengisi nilai matriks seperti dibawah ini. 10 3 8 3,2 1 5 5 8 6 6,7 6 5
SEARCHING
Searching (Pencarian) merupakan proses menemukan suatu nilai(data) tertentu di dalam sekumpulan data yang bertipe sama(baik bertipe dasar atau bertipe bentukan)
Metode-metode Pencarian : 1. Pencarian Beruntun(SEQUENTIAL SEARCH) Proses pencarian dengan metode Sequential Search adalah dengan melakukan perbandingan nilai yang dicari dengan setiap elemen pada array mulai dari indeks terkecil sampai indeks terbesar. Pencarian dihentikan jika nilai yang dicari telah ditemukan atau semua elemen array sudah diperiksa. Ilustrasi Kasus : Terdapat sebuah Array TabInt yang terdiri dari n=10 elemen Isi Tabel 7 5 23 1 15 8 17 75 10 4 Indeks 1 2 3 4 5 6 7 8 9 10
Kasus 1 : Misalkan nilai yang dicari adalah x = 7 Elemen yang dibandingkan : 7 (ditemukan) Karena data langsung ditemukan maka pengulangan dihentikan indeks larik yang dikembalikan : idx = 1 Kasus 2 : Misalkan nilai yang dicari adalah x = 17 Elemen yang dibandingkan : 7, 5, 23, 1, 15, 8, 17 (ditemukan) Setelah data ditemukan pengulangan dihentikan indeks larik yang dikembalikan : idx = 7 Kasus 3 : Misalkan nilai yang dicari adalah x = 25 Elemen yang dibandingkan: 7, 5, 23, 1, 15, 8, 17, 75, 10, 4 (tidak ditemukan) Karena pencarian data sudah mencapai indeks terbesar dan nilai yang dicari belum ditemukan maka pencarian dihentikan indeks larik yang dikembalikan : idx = 0
Algoritma Sequential Search Algoritma Sequential_Search Kamus const Nmax=100 type TabInteger = array[1..NMax] of integer TabInt : TabInteger jml_data, x, i : integer Deskripsi read(jml_data) for i 1 to jml_data do read(TabInt[i]) endfor
{Banyaknya integer} {Awal Proses Input Data ke Array} {Akhir Proses Input Data ke Array}
read (x) {membaca data yang akan dicari} i1 {Awal Prosedur Sequential Search} while (i<jml_data) and (TabInt[i] x) do i i+1 endwhile { perulangan berhenti jika i jml_data atau TabInt[i] = x} if (TabInt[i] = x) then write('Data ditemukan pada posisi ke - ',i) else write('Data tidak ditemukan!') {Akhir Prosedur Sequential Search} endif Salah satu ciri program yang baik adalah program tersebut memiliki sifat prosedural. Tujuannya untuk memudahkan dalam pengembangan program, menghemat ukuran program(jika ada beberapa instruksi yang sama digunakan pada beberapa tempat dalam program), mempermudah pembacaan program, dan mempermudah pendeteksian kesalahan pada program. Algoritma di atas bukan algoritm yang prosedural karena belum membagi bagian-bagian tertentunya menjadi prosedur atau fungsi. Algoritma berikut ini merupakan modifikasi dari algoritma di atas dan sifatnya lebih prosedural
Implementasi Algoritma Sequential Search dengan Prosedur procedure InputData(input n : integer , output T : TabInteger) Kamus i : integer Deskripsi for i 1 to n do read(T[i]) endfor
procedure SeqSearch(input T : TabInteger; input n , x : integer ; output idx : integer) Kamus i : integer Deskripsi i1 while (i<n) and (T[i]x) do i i+1 endwhile if (T[i] = x) then idx i else idx 0 endif Algoritma Sequential_Search2 Kamus const Nmax=100 type TabInteger = array[1..NMax] of integer TabInt : TabInteger jml_data, data, indeks : integer cari : char Deskripsi read(jml_data) {banyaknya data yang diinputkan} InputData(jml_data,TabInt) {panggil prosedur InputData} repeat read(data) {memasukkan data yang akan dicari} SeqSearch(TabInt, jml_data, data, indeks) {panggil prosedur SeqSearch} if (indeks = 0) then write('Data tidak ditemukan!') else write('Data ditemukan pada posisi ke-',indeks) endif write('Cari data lagi(y/t) ? ') read (cari) until (cari='t') or (cari='T') Algoritma Sequential_Seach2 memanggil dua prosedur yaitu prosedur InputData(dengan parameter jml_data sebagai input untuk parameter input n dan TabInt sebagai output untuk parameter output T) dan prosedur SeqSearch(dengan parameter TabInt sebagai input untuk T, jml_data sebagai input untuk n, data sebagai input untuk x, dan indeks sebagai output untuk idx)
Algoritma pencarian dengan metode Sequential Search memiliki banyak versi tergantung kebutuhan akan output, kreatifitas pembuat algoritma, dan faktor lainnya. Procedure di bawah ini adalah versi lain dari algoritma Sequential Search
Prosedur Sequential Search versi Boolean procedure SeqSearch2(input T : TabInteger ; input n , x : integer ; output idx : integer ; output found : boolean) Kamus i : integer Deskripsi i1 found false while (i n) and (not found) do if (T[i] = x) then {jika isi T[i] = x, nilai found diubah menjadi true} foundtrue else {jika isi T[i] x, pencacah indeks array bertambah 1} i i+1 endif endwhile {perulangan berhenti jika i > n atau found=true} if (found) then {jika found=true} idx i else {jika i > n} idx 0 endif 2. Pencarian Bagi Dua(Binary Search) Pencarian bagi dua adalah metode pencarian yang diterapkan pada sekumpulan data yang sudah terurut baik menaik maupun menurun. Maksud dari metode ini adalah mempersingkat waktu pencarian data/nilai pada tabel. Proses pencarian : 1. Bandingkan nilai yang kita cari(x) dengan data yang berada pada posisi tengah. Jika sama, maka pencarian selesai. 2. Jika x lebih kecil daripada data pada posisi tengah, pencarian dilakukan pada daerah yang data-datanya lebih kecil dari data tengah 3. Jika x lebih besar daripada data pada posisi tengah, pencarian dilakukan pada daerah yang data-datanya lebih besar dari data tengah 4. Kembali ke proses nomor 1 jika masih ada daerah pencarian. Jika tidak ada, berarti data tidak ditemukan.
Prosedur Binary Search procedure SeqSearch(input T : TabInteger; input n , x : integer ; output idx : integer) Kamus BatasAtas, BatasBawah, Tengah : integer Deskripsi BatasAtas 1 BatasBawah n while (BatasAtas BatasBawah) and (T[Tengah]x) do Tengah (BatasAtas + BatasBawah) div 2 if (T[Tengah] > x) then BatasBawah Tengah-1 else if (T[Tengah] < x) then BatasAtas Tengah+1 endif endif endwhile if (T[Tengah]=x) then idx Tengah else idx 0 endif
LATIHAN SOAL 1. Prosedur sequential versi boolean dan prosedur binary search pada contoh pembahasan yang sudah dibahas, implementasikan kedalam algoritma dengan perosedur seperti contoh algoritma sequential search yang sudah dibahas. 2. Perhatikanlah pada semua prosedur search yang sudah dibahas, dipakai kamus umum sebagai berikut. Kamus Umum constant Nmax : integer = 100 type TabInt : array [1..Nmax+1] of integer { jika diperlukan sebuah tabel, maka akan dibuat deklarasi sebagai berikut} T : TabInt {tabel integer} N : integer {indeks efektif, 1 < N < Nmax+1} Jika prosedur diparametrisasi seperti pada spesifikasi yang diberikan, maka T dan N menjadi dua buah parameter. Padahal, nilai T dan N sebenarnya erat kaitannya satu sama lain. Deklarasi TabInt akan lebih baik jika dibungkus menjadi sebuah type komposisi sebagai berikut : Kamus Umum constant Nmax : integer = 100 type TabInt : < TI: array [1..Nmax+1] of integer N : integer {indeks efektif, } {maksimum tabel yang terdefinisi, 1 < N < Nmax+1} { jika diperlukan sebuah tabel, maka akan dibuat deklarasi sebagai berikut} T : TabInt {tabel integer} Sebagai latihan, tuliskan ulang semua prosedur yang pernah didefinisikan dengan deklarasi type komposisi ini.
SORTING
Sorting atau pengurutan data adalah proses untuk menyusun kumpulan data yang seragam menjadi susunan tertentu. Kumpulan data dapat diurutkan secara Ascending(Urut Menaik), yaitu dari data yang nilainya paling kecil sampai data yang nilainya paling besar, atau diurutkan secara Descending(Urut Menurun), yaitu dari data yang nilainya paling besar sampai data yang nilainya paling kecil. Metode-metode Sorting : 1. Bubble Sort Pengurutan model ini mengambil ide dari gelembung air, yaitu mengapungkan elemen yang bernilai kecil dari bawah ke atas. Proses pengapungan dilakukan dengan pertukaran elemen-elemen tabel. Apabila kita menginginkan array terurut menaik, maka elemen array yang berharga paling kecil diapungkan artinya diangkat ke atas (atau ke ujung kiri array) melalui proses pertukaran. Proses pengapungan ini dilakukan sebanyak n-1 langkah(satu langkah disebut satu kali pass) dengan n adalah ukuran array. Ilustrasi Kasus : Perhatikan array TabInt di bawah ini yang terdiri dari n = 6 elemen yang belum terurut. Array ini akan diurutkan menaik dengan metode Bubble Sort. Elemen Array 25 27 10 8 76 21 Indeks 1 2 3 4 5 6 Arah pembandingan Pass 1 : 25 1 25 25 25 8 27 2 27 27 8 25 10 3 10 8 27 27 8 4 8 10 10 10 21 5 21 21 21 21 76 6 76 8 76 8 76 76 Hasil akhir Pass 2 : 8 10 25 27 1 2 3 4 21 5 76 6 10 25 27 21 76 25 10 27 21 76 Pass 2 : (Berdasarkan hasil akhir Pass 1) 8 25 27 10 21 76 8 25 27 10 21 76
21 5
76 6 9
27 5
76 6
27 5
76 6
27 5
76 6
Hasil akhir Pass 5 menyisakan satu elemen yang tidak perlu diurutkan lagi maka pengurutan selesai Keterangan : : Bagian data yang sudah diurutkan/diapungkan : Bagian data yang dibandingkan dan mungkin ditukarkan posisinya
Procedure Bubble Sort Procedure BubbleSort(input n:integer,input/output T:TabInteger) {Mengurutkan Tabel Integer[1..N] dengan Bubble Sort} Kamus pass : integer {pencacah untuk jumlah langkah} k : integer {pencacah pengapungan untuk setiap langkah} temp : integer {variabel bantu untuk pertukaran} Algoritma for pass 1 to (n-1) do for k n downto (pass+1) do if (T[k] < T[k-1]) then {pertukarkan T[k] dengan T[k-1]} temp T[k] T[k] T[k-1] T[k-1] temp endif endfor endfor
10
Implementasi Procedure Bubble Sort dalam Algoritma procedure InputData(input n : integer; output T : TabInteger) Kamus i : integer Deskripsi for i 1 to n do read(T[i]) endfor Procedure BubbleSort(input n:integer,input/output T:TabInteger) {Mengurutkan Tabel Integer[1..N] dengan Bubble Sort} Kamus pass : integer {pencacah untuk jumlah langkah} k : integer {pencacah pengapungan untuk setiap langkah} temp : integer {variabel bantu untuk pertukaran} Algoritma for pass 1 to (n-1) do for k n downto (pass+1) do if (T[k] < T[k-1]) then {pertukarkan T[k] dengan T[k-1]} temp T[k] T[k] T[k-1] T[k-1] temp endif endfor endfor Algoritma Bubble_Sort Kamus const Nmax=100 type TabInteger = array[1..NMax] of integer TabInt : TabInteger jml_data : integer Deskripsi read (jml_data) {memasukkan banyak data yang mau diinput} InputData(jml_data,TabInt) {memanggil prosedur InputData} BubbleSort(jml_data,TabInt) {memanggil Prosedur BubbleSort} Algoritma Bubble_Sort memanggil dua prosedur yaitu prosedur InputData(dengan parameter jml_data sebagai input untuk parameter input n dan TabInt sebagai output untuk parameter output T) dan prosedur BubbleSort(dengan jml_data sebagai input untuk parameter input n dan TabInt sebagai input sekaligus output untuk parameter input/output T )
11
2. Maximum Sort Pengurutan model ini dilakukan dengan mencari nilai terbesar/maksimum dari suatu array. Nilai terbesar tersebut kemudian disimpan di awal array(jika diurutkan menurun) atau di akhir array(jika diurutkan menaik) dan diisolasi agar tidak disertakan lagi pada proses selanjutnya. Ilustrasi Kasus : Perhatikan array TabInt di bawah ini yang terdiri dari n = 6 elemen yang belum terurut. Array ini akan diurutkan menaik dengan metode Bubble Sort. Elemen Array 29 27 10 8 76 21 Indeks 1 2 3 4 5 6
Pass 1 : Cari elemen maksimum di dalam array TabInt[1..n] maks = TabInt[5] = 76 Pertukarkan TabInt[5] dengan TabInt[n] Proses Pertukaran Hasil Akhir Pass 1 29 27 10 8 76 21 29 27 10 8 21 76 Pass 2 : (Berdasarkan sususan Array hasil Pass 1) Cari elemen maksimum di dalam array TabInt[1..5] maks = TabInt[1] = 29 Pertukarkan TabInt[1] dengan TabInt[5] 29 27 10 8 21 76 21 27 10 8 29 76 Pass 3 : (Berdasarkan sususan Array hasil Pass 2) Cari elemen maksimum di dalam array TabInt[1..4] maks = TabInt[2] = 27 Pertukarkan TabInt[2] dengan TabInt[4] 21 27 10 8 29 76 21 8 10 27 29 76 Pass 4 : (Berdasarkan sususan Array hasil Pass 3) Cari elemen maksimum di dalam array TabInt[1..3] maks = TabInt[1] = 21 Pertukarkan TabInt[1] dengan TabInt[3] 2 1 2 2 7 1 2 2 2 7 8 8 1 0 7 9 6 0 1 7 9 6 Pass 5 : (Berdasarkan sususan Array hasil Pass 4) Cari elemen maksimum di dalam array TabInt[1..2] maks = TabInt[1] = 10 Pertukarkan TabInt[1] dengan TabInt[2] 10 8 21 27 29 76 8 10 21 27 29 76 Terisa satu elemen yaitu 8, maka pengurutan dihentikan. Array sudah terurut menaik Keterangan : : Bagian data yang sudah diurutkan : Bagian data yang terbesar dan posisi yang akan ditukarkan dengan data terbesar
12
Algoritma 2Procedure Pengurutan dengan Metode Maximum Sort secara Menaik Procedure MaxSort(input n:integer,input/output T:TabInteger) {Mengurutkan Tabel Integer[1..N] dengan Maximum Sort} Kamus i : integer {pencacah untuk jumlah langkah} k : integer {pencacah untuk mencari nilai maksimum} imaks: integer {indeks yang berisi nilai maksimum sementara} temp : integer {variabel bantu untuk pertukaran} Algoritma for i n downto 2 do imaks 1 for k 1 to (i-1) do if (T[k] > T[imaks]) then imaks k endif endfor {pertukarkan T[i] dengan T[imaks]} temp T[i] T[i] T[imaks] T[imaks] temp endfor 3. Minimum Sort Berbeda dengan algoritma pengurutan Maksimum, pada algoritma pengurutan minimum, basis pencarian adalah elemen minimum. Pengurutan model ini dilakukan dengan mencari nilai terkecil/minimum dari suatu array. Nilai terkecil tersebut kemudian disimpan di awal array(jika diurutkan menaik) atau di akhir array(jika diurutkan menurun) dan diisolasi agar tidak disertakan lagi pada proses selanjutnya. Algoritma 3 Procedure Pengurutan dengan Metode Minimum Sort secara Menaik Procedure MinSort(input n:integer,input/output T:TabInteger) {Mengurutkan Tabel Integer[1..N] dengan Minimum Sort} Kamus i : integer {pencacah untuk jumlah langkah} k : integer {pencacah untuk mencari nilai minimum} imin : integer {indeks yang berisi nilai minimum sementara} temp : integer {variabel bantu untuk pertukaran} Algoritma for i 1 to (n-1) do imin i for k (i+1) to n do if (T[k] < T[imin]) then imin k endif endfor
13
{pertukarkan T[i] dengan T[imin]} temp T[i] T[i] T[imin] T[imin] temp Endfor LATIHAN SOAL 1. Untuk setiap metoda sort, coba analisis secara kualitatif apa yang dikerjakan jika : a. Elemen array sudah terurut b. Elemen array terurut terbailk c. Elemen array bernilai sama 2. Carilah performasi ke tiga algoritma pengurutan yang dibahas, dansebutkan kasus terbaik dan kasus terjeleknya. 3. Prosedur pengurutan maximum sort dan prosedur pengurutan minimum sort pada contoh yang dibahas, implementasikan kedalam bentuk algoritma seperti conoth prosedur bubble sort. 4. Perhatikanlah pada semua prosedur untuk sort yang sudah dibahas, dipakai kamus umum sebagai berikut. Kamus Umum constant Nmax : integer = 100 type TabInt : array [1..Nmax+1] of integer { jika diperlukan sebuah tabel, maka akan dibuat deklarasi sebagai berikut} T : TabInt {tabel integer} N : integer {indeks efektif, 1 < N < Nmax+1} Jika prosedur diparametrisasi seperti pada spesifikasi yang diberikan, maka T dan N menjadi dua buah parameter. Padahal, nilai T dan N sebenarnya erat kaitannya satu sama lain. Deklarasi TabInt akan lebih baik jika dibungkus menjadi sebuah type komposisi sebagai berikut : Kamus Umum constant Nmax : integer = 100 type TabInt : < TI: array [1..Nmax+1] of integer N : integer {indeks efektif, } {maksimum tabel yang terdefinisi, 1 < N < Nmax+1} { jika diperlukan sebuah tabel, maka akan dibuat deklarasi sebagai berikut} T : TabInt {tabel integer} Sebagai latihan, tuliskan ulang semua prosedur yang pernah didefinisikan dengan deklarasi type komposisi ini.
14
4 PEMROSESAN FILE
Data yang disimpan pada tipe-tipe data yang telah dipelajari pada bab-bab sebelumnya bersifat sementara. Artinya, sewaktu program selesai dijalankan, data tersebut akan hilang. Pada banyak aplikasi, data yang dimasukkan, meskipun program telah selesai, harus disimpan. Contohnya aplikasi pemesanan tiket kereta api atau transaksi perbankan. Data pesanan tiket dan data transaksi keuangan harus tetap disimpan sampai diinginkan dihapus. Untuk memecahkan masalah penyimpanan data yang seperti itu digunakan file. Data yang dioutputkan oleh program dapat disimpan dalam sebuah file(file output). Data pada file juga dapat dibaca lagi(file input). Jenis file ada dua macam yaitu file teks dan nonteks.
FILE TEKS File teks adalah sebuah file yang terdiri dari karakter-karakter. Karakter-karakter tersebut dapat dianggap sebagai data yang bertipe karakter, integer, real, atau string tergantung tipe data yang digunakan untuk menyimpan hasil pembacaan dari file.
Deklarasi File Supaya dapat menggunakan file teks, maka file tersebut harus dideklarasikan terlebih dahulu. Cara mendeklarasikan file teks adalah contoh : F : text Nama File : text
Instruksi Baku Untuk pemrosesan file, Pascal telah menyediakan sejumlah instruksi baku berupa prosedur atau fungsi yang dapat langsung digunakan dengan cara memanggil prosedur atau fungsi tersebut. Beberapa instruksi baku untuk pemrosesan File yang sudah tersedia antara lain : Assign, berfungsi untuk membuka file untuk siap dibaca atau ditulis. Cara memanggil prosedur ini dengan perintah Assign(Nama File, File Fisik). Nama File digunakan untuk menampung isi dari File Fisik Jika file dibuka untuk ditulis/diisi, setelah perintah assign gunakan perintah Rewrite(Nama File). Jika file dibuka hanya untuk dibaca, setelah perintah assign gunakan perintah Reset(Nama File)
15
contoh :
Assign(F, data.txt); {data.txt adalah contoh nama file fisik} Rewrite(F); {File dibuka untuk ditulisi} Assign(F, data.txt); Reset(F); {File dibuka untuk dibaca}
Read, berfungsi untuk membaca isi file kemudian ditampung dalam sebuah variabel. Tipe data variable disesuaikan dengan hasil pembacaan dari file, bisa bertipe integer, character, string, atau record. Isi dari file akan dikonversi sesuai dengan tipe variabel tempat menyimpan data yang dibaca jika memungkinkan. Jika isi file bertipe string sedangkan variabel bertipe integer tidak dapat dilakukan karena tidak memungkinkan. Jika file berisi angka maka variabel dapat bertipe integer, karakter atau string. Variabel tersebut harus sudah dideklarasikan sebelumnya. Cara memanggil prosedur ini dengan perintah Read(Nama File, Nama Variabel) Jika deklarasi programnya sebagai berikut : var F : text; i : integer; c : char; kalimat : string Maka contoh perintah yang menggunakan statement Read antara lain contoh : Read(F, i) {membaca isi file F yang bertipe integer disimpan di i} Read(F, c) {membaca isi file yang bertipe karakter disimpan di c} Read(F, kalimat){membaca isi file yang bertipe string disimpan di kalimat}
Write, berfungsi untuk menulis nilai atau isi variable ke dalam file. Cara memanggil prosedur ini dengan perintah Write(Nama File, Nama Variabel) contoh : i := 5; Write(MyFile, i) {menuliskan isi variable i ke dalam file MyFile} kalimat := Pemrosesan File; Write(MyFile, kalimat) { menuliskan isi variable kalimat ke MyFile} Write(MyFile, Informatika); { menuliskan Informatika ke MyFile}
Close, berfungsi untuk menutup file yang telah dibuka. Setiap file yang sudah dibuka harus ditutup kembali dengan perintah tersebut. Cara memanggil prosedur ini dengan perintah Close(Nama File); contoh : Close(F)
16
Berikut ini beberapa contoh program untuk memperjelas pemahaman tentang file teks : Program 4.1 : Program untuk penulisan File Teks program Tulis_Jurusan; var fjurusan : text; begin assign(fjurusan,'jurusan.txt'); rewrite(fjurusan); writeln(fjurusan,'Jurusan Teknik Informatika'); writeln(fjurusan,'Fakultas Teknik'); writeln(fjurusan,'Universitas Siliwangi'); close(fjurusan); end. Jika ingin menggunakan file yang sudah ada dan menambahkan isinya gunakan prosedure append(Nama File)
Program 4.2 : Program Pembacaan isi file teks dan menuliskannya di layar program Baca_Jurusan; uses crt; var fjurusan : text; temp : string; begin clrscr; assign(fjurusan,'jurusan.txt'); reset(fjurusan); while not eof (fjurusan) do begin readln(fjurusan,temp); writeln(temp); end; close(fjurusan); readln; end. Pengulangan menggunakan statement while digunakan untuk melakukan pembacaan file sampai akhir. Fungsi eof(fjurusan) mengirimkan true jika sudah sampai akhir file fjurusan, dan false jika sebaliknya.
17
Program 4.3 : Program di bawah ini menyimpan kalimat ke dalam file lalu membacanya per karakter Program MyFile; uses crt; var F : text; c : char; kalimat : string; begin clrscr; writeln('$ PENULISAN FILE $'); assign(F,'sentence.txt'); {membuat/membuka file} rewrite(F); {membuka file untuk ditulisi} write('Input Kalimat : '); readln(kalimat); write(F,kalimat); {menulis isi variabel kalimat ke file F} close(F); {menutup File} writeln; writeln('$ PEMBACAAN FILE $'); assign(F,'sentence.txt'); {membuka file} reset(F); {membuka file untuk ditulisi} while not eof(F) do {membaca isi file selama belum mencapai akhir file} begin read(F,c); {membaca isi file per karakter} write(c); end; close(F); {menutup File} readln; end. FILE SEKUENSIAL File sekuensial atau file beruntun termasuk file non teks. File Sekuensial adalah sekumpulan elemen data bertipe sama yang diakses secara berurutan mulai dari elemen data pertama sampai elemen data terakhir. Data di dalam file sekuensial diakses satu persatu secara searah. Struktur file sekuensial tidak jauh berbeda dengan struktur array, perbedaannya array disimpan di memori sedangkan file sekuensial disimpan di dalam HardDisk sehingga tidak akan hilang setelah program selesai dijalankan dan dapat diakses kembali. Selain itu pengaksesan elemen file tidak dapat diakses langsung melalui indeksnya. Deklarasi File Cara mendeklarasikan file sekuensial di dalam bagian deklarasi adalah sebagai berikut: Nama_File : file of tipe_elemen_data tipe_elemen_data bisa berupa tipe dasar(integer, karakter, real, string, boolean) atau tipe terstruktur(record) tergantung jenis data yang akan disimpan 18
contoh : FBil : file of integer Fkar : file of char type DataMhs = record {file dengan elemen data bertipe integer} {file dengan elemen data bertipe karakter}
NIM : integer; Nama : string; IP : real; end; Mhs : file of DataMhs {file dengan elemen data bertipe record DataMhs} Instruksi Baku Instruksi yang digunakan pada File Sekuensial sama seperti yang digunakan pada File Teks
Program 4.4 Penulisan dan Pembacaan File Sekuensial Program File_Sequential; uses crt; var FInt : file of integer; i, bil : integer; begin {PENULISAN FILE} assign(FInt,'Integer.txt'); rewrite(FInt); i:=1; repeat write('Data - ',i,' : '); readln(bil); write(FInt,Bil); i:=i+1; until (i>10); close(FInt); clrscr; {PEMBACAAN FILE} assign(FInt,'Integer.txt'); reset(FInt); while not eof(FInt) do begin read(FInt, bil); writeln(bil); end; close(FInt); readln; end.
19
Program 4.5 : Program Penulisan File bertipe terstruktur(record) Program BuatArsipMahasiswa; uses crt; type DataMhs = record NIM : longint; Nama: string[25]; IP : real; end; var MSiswa : DataMhs; {variable yang bertipe record DataMhs} Mhs : File of DataMhs; {nama file sekuensial} answer : char; begin clrscr; writeln(' PENULISAN FILE'); writeln; assign(Mhs,'Mhs.dat'); rewrite(Mhs); repeat write('NIM : '); readln(MSiswa.NIM); write('Nama : '); readln(MSiswa.Nama); write('IP : '); readln(MSiswa.IP); write(Mhs,MSiswa); {data yang ditampung var MSiswa dimasukkan ke file Mhs} write('Input Data Lagi? ');readln(answer);writeln; until (answer='t') or (answer='T'); close(Mhs); end. Program 4.6 : Program Pembacaan File bertipe terstruktur(record) Program BacaArsipMahasiswa; uses crt; type DataMhs = record NIM : longint; Nama: string[25]; IP : real; end; var MSiswa : DataMhs; Mhs : File of DataMhs; begin clrscr; writeln(' PEMBACAAN FILE'); writeln('-----------------------------------'); writeln(' NIM Nama IP'); writeln('-----------------------------------'); assign(Mhs,'Mhs.dat'); reset(Mhs);
20
while not eof(Mhs) do begin read(Mhs,MSiswa); {hasil pembacaan file ditampung di var MSiswa} writeln(MSiswa.NIM:10,MSiswa.Nama:16,MSiswa.IP:8:2); end; close(Mhs); readln; end.
LATIHAN SOAL 1. Dengan memperhatikan contoh pemrosesan file teks seperti contoh program 4.1, 4.2 dan 4.3 yang sudah dibahas, buatlah program untuk biodata/ daftar riwayat hidup anda masing-masing. 2. Dengan memperhatikan contoh pemrosesan file teks seperti contoh program 4.4, 4.5 dan 4.6 yang sudah dibahas, buatlah program untuk biodata/ daftar riwayat hidup anda dan senua teman-teman sekelas anda.
21
MESIN ABSTRAK
Mesin adalah mekanisme yang terdefinisi dan mengerti serta mampu untuk mengekseskusi aksi-aksi primitif yang terdefinisi untuk mesin tersebut. Mesin abstrak adalah mesin yang dianggap ada, dan diasumsikan mampu melakukan mekanisme yang didefinisikan untuk mesin tersebut. Mesin abstrak memodelkan suatu semesta (universe) tertentu. Dalam pemrograman, seringkali pemrogram harus mendefinisikan mesin-mesin abstrak sebelum menuliskan kode program karena mesin abstrak memungkinkan pemrogram untuk melakukan pemecahan masalah secara bertahap. Mesin abstrak yang diciptakan pada tahap konseptual bahkan memungkinkan pemrogram untuk berfikir tahap demi tahap, sampai akhirnya dijabarkan dalam terminologi mesin riil.
Sebetulnya, bahasa tingkat tinggi adalah mesin abstrak bagi asembler, dan lebih abstrak bagi mesin rill yaitu komputer. Mendefinisikan mesin abstrak, berarti mendefinisikan. - sekumpulan state yang mungkin - sekumpulan aksi primitif yang diasumsikan dapat dimengerti dan dieksekusi mesin bersangkutan. Contoh macam-macam mesin abstrak misalnya: mesin gambar, mesin karakter, mesin integer, mesin rekam, dan lain-lain. Pada diktat ini, akan diberikan contoh mesin abstrak untuk mesin integer dan mesin karakter.
22
MESIN INTEGER (PENCACAH) Mesin integer adalah mesin abstrak yang terdiri dari : tombol RESET dan INC. Seperti halnya mesin karakter, mesin ini sebuah jendela yang menunjukan sebuah angka integer yang diingatkan, yang disebut CI (Current Integer). Mesin ini berfungsi sebagai pencacah bilangan integer. Primitif untuk mengubah keadaan mesin procedure RESET {pencacah disiapkan untuk dipakai, harga bilangan bulat yang disimpan adalah nol IS : sembarang FS : CI = 0 } procedure INC {pencacah dimajukan satu IS : CI = harga FS : CI = harga + 1 }
MESIN KARAKTER (MODEL AKSES SEKUENSIAL) Suatu mesin karakter adalah mesin yang dapat memproses pita karakter dan memiliki elemen-elemen sebagai berikut : 1. PITA KARAKTER yang merupakan kumpulan karakter yang diakhiri tanda titik. Pita yang hanya terdiri dari . disebut sebagai pita kosong 2. POINTER yang merupakan penunjuk posisi karakter pada pita 3. Jendela CURRENT CHARACTER(CC) yang akan menampilkan karakter yang sedang ditunjuk oleh POINTER 4. Tombol START yang menempatkan POINTER mesin ke awal pita 5. Tombol ADVANCE yang akan memajukan pointer ke karakter selanjutnya pada pita karakter 6. Lampu EOP(End Of Pita) yang menunjukkan apakah POINTER ada di akhir pita atau tidak. Lampu EOP akan menyala jika POINTER ada di akhir pita dan mengembalikan nilai True, jika sebaliknya akan mengembalikan nilai False Misalkan kita memiliki pita karakter dengan kumpulan karakter berupa HALLO.[dengan titik sebagai tanda akhir pita] maka visualisasinya adalah sebagai berikut :
23
ADVANCE ADVANCE Pointer : 4 Pointer : 5 CC : L CC : O EOP : False EOP : False Tanda G berfungsi sebagai pointer penunjuk
Prosedur-prosedur standar yang terdapat pada Mesin karakter antara lain : 1. START yang berfungsi untuk memulai pembacaan pita karakter dan meempatkan head/CC pada karakter pertama dalam pita procedure START {mesin siap dioperasikan. Pita disiapkan untuk dibaca. Karakter pertama pada pita posisinya ada pada jendela sebagai Current Character IS : sembarang FS : CC adalah karakter pertama yang ada pada pita, Jika CC . maka EOP akan padam (false) Jika CC = . maka EOP akan menyala (true) } 2. ADV yang berfungsi untuk memajukan pointer ke karakter selanjutnya(membaca karakter selanjutnya) procedure ADV {Pita dimajukan. IS : karakter pada jendela = CC, CC . FS : CC adalah karakter berikutnya dari CC yang lama, CC mungkin = . jika CC = . maka lampu EOP akan menyala } Catatan : EOP diwakili oleh tipe boolean., bernilai true jika menyala, atau false jika tidak menyala. Jika EOP menyala, mesin sudah tidak bisa dioperasikan lagi
24
Studi Kasus Mesin Karakter Algoritma untuk membaca pita karakter, menampilkan isinya, dan menghitung jumlah karakter yang terdapat pada pita Algoritma Pita_Karakter Kamus procedure START procedure ADV jum_char : integer CC : char Deskripsi jum_char 0 START {memulai pembacaan pita, CC = karakter pertama pada pita} if (CC='.') then {jika pita kosong} write('Pita Kosong') else {jika pita tidak kosong} while (CC '.')do {pengulangan dilakukan selama pointer belum menunjuk karakter tanda akhir pita yaitu .} write(CC) jum_char jum_char + 1 ADV {menggerakan pointer ke posisi berikutnya pada pita} endwhile endif write (jum_char);
Algoritma menghitung banyaknya huruf A pada pita karakter Algoritma Hitung_A Kamus Jum_A : integer CC : char Algoritma Jum_A 0 START while (not EOP) do if (CC=A) then Jum_A Jum_A + 1 endif ADV endwhile
25
Algoritma menghitung banyaknya pasangan huruf SA pada pita karakter Algoritma Hitung_SA Kamus Jum_SA : integer CC, CC_Lama : char Algoritma Jum_SA 0 CC_Lama START while (not EOP) do if (CC_Lama = S) and (CC=A) then Jum_SA Jum_SA + 1 endif CC_Lama CC ADV endwhile
26
LATIHAN SOAL 1. Diberikan empat pita sebagai berikut, hitung karakter dari pita-pita sebagai berikut I Y T . L A . F A . I T B E A U .
Deretan aksi (penekanan tombol) pada kedua mesin untuk menghitung banyaknya huruf pada pita :
1.a) START; RESET ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC ADV; INC START; RESET ADV; INC ADV; INC ADV; INC ADV; INC START; RESET ADV; INC START; RESET { CC=I, CI = 0} {CC=L,CI=1} {CC= ,CI=2} {CC=F,CI=3} {CC=A,CI=4} {CC=I,CI=5} {CC=T,CI=6} {CC= ,CI=7} {CC=B,CI=8} {CC=E,CI=9} {CC=A,CI=10} {CC=U,CI=11} {CC=.,CI=12} { CC=Y, CI = 0} {CC=A,CI=1} {CC= ,CI=2} {CC= ,CI=3} {CC=.,CI=4} { CC=T, CI = 0} {CC=.,CI=1} { CC=., CI = 0} 1.b.) START; RESET INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV INC;ADV
2)
3)
4)
2. Dengan memperhatikan soal nomor 1 diatas, hitung karakter dari pita-pita dibawah ini dengan deretan aksi (penekanan tombol) pada kedua mesin untuk menghitung banyaknya huruf pada pita. I F T . N T A F S O U I R N K M S A I . T L I . K A .
27
PROGRAM REKURSIF
Program rekursif adalah program yang memanggil dirinya sendiri. Oleh karena itu, program rekursif harus dinyatakan dalam prosedur atau fungsi, karena hanya prosedur dan fungsi yang dapat dipanggil dalam sebuah program. Fungsi atau Prosedur Rekursif disusun oleh dua komponen : 1. Basis(komponen basis) fungsi : Menghentikan rekursif dan memberi nilai yang terdefinisi 2. Aturan rekursif(komponen induksi) fungsi : mendefinisikan dengan dirinya sendiri Aturan rekursif dapat memungkinkan komputasi tak berhingga bila komputasi tidak mencapai komponen basis. Pemrogram harus berhati-hati dalam membuat definisi rekursif. Definisi harus menunjukkan pergerakan yang semakin menuju ke objek yang lebih sederhana sehingga memungkinkan deinisi tersebut berhenti. Studi Kasus Rekursif : 1. Perhitungan jumlah deret integer Permasalahan : Diberikan sebuah integer non-negatif, n, buatlah algoritma untuk menghitung jumlah deret integer mulai dari 1 sampai n Permasalahan tersebut dapat diselesaikan dengan pengulangan dan rekursif
Algoritma Perhitungan jumlah deret integer dengan pengulangan Algoritma Jumlah_Deret Kamus i,n, sum : integer Deskripsi read(n) {n = banyaknya deret} sum 0 for i 1 to n do sum sum + i endfor write(sum) Definisi secara rekursif : (i) jumlah = 1 , jika n=1 {komponen basis}
Algoritma Perhitungan jumlah deret integer dengan rekursif function sum(n : integer) integer Kamus Deskripsi if (n=1) then 1 else n + sum(n-1) {pemanggilan fungsi sum secara rekursif} endif Algoritma Jum_Deret_Rekursif Kamus nderet : integer Deskripsi read (nderet) write(sum(nderet)) {memanggil fungsi sum} 2. Perhitungan Faktorial Definisi secara iterasi : n! = 1 x 2 x x n dan didefinisikan 0! = 1 contoh : 5! = 1 * 2 * 3 * 4 * 5
Fungsi Faktorial dengan Pengulangan function fact (n : integer) integer Kamus i , temp : integer Deskripsi if (n > 0) then temp 1 for i 1 to n do temp temp * i endfor temp else 1 endif Definisi secara rekursif : (i) (ii) n! = 1 n! = n x (n-1)! , jika n = 0 , jika n > 0 {komponen basis} {komponen induksi}
29
Fungsi Faktorial secara Rekursif function fact (n : integer) integer Kamus i : integer Deskripsi if (n = 0) then 1 {komponen basis} else n * fact (n-1) {komponen induksi} endif Maka untuk menghitung 5!, berarti n=5 dihitung dengan langkah berikut
Langkah ke 0 Langkah ke 1 Langkah ke 2 Langkah ke 3 Langkah ke 4 Langkah ke 5 [fact(5)] {5} * [fact(5-1)] {4} *
Jadi pada akhir proses fact mengoutputkan {5 * 4 * 3 * 2 * 1 = 120} Hal yang harus diperhatkan dalam melakukan proses rekursif aitu memastikan batas atau kondisi berhenti proses rekursif. Pada fungsi fact di atas kondisi berhenti jika n=0. Sebellum mengimplementasikan suatu proses rekursif yakinkan bahwa syarat berhenti dapat dicapai. Jangan sampai proses berhenti tidak pernah dapat tercapai. Untuk itu, berbagai kondisi yang dapat menyebabkan rekursif tak berujung harus dapat ditangani (contohnya jika kita masukkan n<0). Proses rekursif yang tak berujung akan menyebabkan memori system habis, dengan kata lain komputer hang,
30
DAFTAR PUSTAKA
Bryon, Goffried. Programming with PASCAL. 1986. New York : Schaum Series Inggriani Liem. Dasar Pemrograman (Bagian Pemrograman Prosedural). April 2007. Bandung : STEI - ITB Munir, Rinaldi. Algoritma dan Pemrograman 2. 2001. Bandung : Informatika Pranata, Antony. Algoritma dan Pemrograman. 2005. Yogyakarta : Graha Ilmu Santosa, Insap. Dasar-dasar Pemrograman Pascal Teori dan Program Terapan. Yogyakarta : Andi Offset Wahid, Fathul. Dasar-dasar Algoritma dan Pemrograman. 2004. Yogyakarta : Andi Offset