BAHAN AJAR
ALGORITMA DAN PEMROGRAMAN II (PAI 112)
OLEH : DODON YENDRI, M.KOM
PROGRAM STUDI SISTEM KOMPUTER FAKULTAS TEKNOLOGI INFORMASI UNIVERSITAS ANDALAS 2012
Algoritma dan Pemrograman II
2012
SORTING (PENGURUTAN) Adalah suatu proses untuk menyusun sekelompok data dari data yang tidak urut menjadi data terurut berdasarkan kriteria tertentu. Ada 2 jenis pengurutan, yakni : a. Ascending ; adalah pengurutan dari kecil ke besar. Misalnya : 0,1,2,3, dst. Atau A, B, C, D, E, dst. b. Descending ; adalah pengurutan dari besar ke kecil Misalnya : 100,90, 80, 70 , dst., atau Z,Y, X, W, dst.
Ada banyak metoda/cara proses pengurutan, diantaranya : a. Bubble Sort / Exchange Sort / Metode Gelembung b. Selection Sort c. Insert Sort d. Quick Sort, dll
Bubble Sort Adalah proses pengurutan dengan membandingkan 2 buah data yang bersebelahan dengan berulang kali. Banyaknya proses pembandingan tergantung pada jumlah datanya. Contoh : Misalkan ada sekumpulan data tersimpan dalam sebuah VektorA dengan nilai sebagai berikut : 7
3
10
2
9
1
6
2
1
2
3
4
5
6
7
8
Urutkan data-data tersebut secara Ascending !. Dosen : Dodon Yendri, M.Kom
Page 1
Algoritma dan Pemrograman II
2012
Karena ada 8 data yang akan dibanding, maka proses membandingkan 2 data yang bersebelahan (dari pasangan pertama sampai ke tujuh) akan dilakukan sebanyak 7 kali Adapun proses tersebut adalah : Langkah Pertama : i= 1 7 3 3 3 3 3 3 3
2 3 4 5 6 7 8 3 10 2 9 1 6 2 7 10 2 9 1 6 2 7 10 2 9 1 6 2 7 2 10 9 1 6 2 7 2 9 10 1 6 2 7 2 9 1 10 6 2 7 2 9 1 6 10 2 7 2 9 1 6 2 10
Swap s=1 s=1 s=1 s=1 s=1 s=1
Langkah Kedua : i= 1 3 3 3 3 3 3 3 3
2 7 7 2 2 2 2 2 2
3 2 2 7 7 7 7 7 7
4 9 9 9 9 1 1 1 1
Dosen : Dodon Yendri, M.Kom
5 1 1 1 1 9 6 6 6
6 6 6 6 6 6 9 2 2
7 2 2 2 2 2 2 9 9
8 10 10 10 10 10 10 10 10
Swap s=1 s=1 s=1 s=1 s=1 s=1
Page 2
Algoritma dan Pemrograman II
2012
Dan begitu seterusnya sampai seluruh data tersebut terurut dari yang terkecil sampai terbesar. Algoritma Tukar Data For I <- 1 to N do For J <- 1 to N-1 do If VektorB[J] > VektorB[J+1] Then Min <- VektorB[J] VektorB[J] <-VektorB[J+1] VektorB[J+1] <- Min EndIf EndFor EndFor
Dosen : Dodon Yendri, M.Kom
Page 3
Algoritma dan Pemrograman II
2012
Program Pascalnya : program bubble_sort; uses crt; var VektorB : array[1..8] of integer; i,j,min : integer; begin clrscr; writeln('Mengisi Array'); writeln;writeln; i:=1; while i<=8 do begin write('Iputkan Bilangan Vektor B[',i,'] : ');readln(VektorB[i]); i:=i+1; end; (* Urut data *) for i:=1 to 8 do begin for j:=1 to 7 do begin if VektorB[J] > VektorB[J+1] then begin Min:=VektorB[j]; VektorB[j] := VektorB[J+1]; VektorB[J+1]:=Min; end; end; end; writeln;writeln; writeln('Hasil Pengurutan '); writeln;writeln; for i:=1 to 8 do begin write(VektorB[i]:7); end; repeat until keypressed; end.
Dosen : Dodon Yendri, M.Kom
Page 4
Algoritma dan Pemrograman II
2012
Selection Sort Adalah suatu metoda pengurutan data dengan langkah-langkah : 1. Cari data terkecil/terbesar yang dimulai dari data pertama sampai data terakhir dan kemudian tukarkan letaknya dengan data pertama. 2. Cari data terkecil/terbesar yang dimulai dari data ke-dua sampai data terakhir dan kemudian tukarkan letaknya dengan data ke -2. 3. Cari data terkecil/terbesar yang dimulai dari data ke-tiga sampai data terakhir dan kemudian tukarkan letaknya dengan data ke -3. 4. Dan begitu seterusnya sampai data habis. Contoh : Diketahui sekumpulan data telah tersimpan dalam Vektor A dengan data-data berikut : 15 20 13 19 10 5 11 12 Urutkan data tersebut secara Ascending. Buat langkah, algoritma dan Pascalnya ! Proses dan Langkah : i = 1 15 Langkah 1. Langkah 2. Langkah 3. Langkah 4. Langkah 5.
5 5 5 5 5
Dosen : Dodon Yendri, M.Kom
2 20
3 13
4 19
5 10
6 5
7 11
8 12
Swap
20 10 10 10 10
13 13 11 11 11
19 19 19 12 12
10 20 20 20 13
15 15 15 15 15
11 11 13 13 20
12 12 12 19 19
s=1 s=1 s=1 s=1 s=1 Page 5
Algoritma dan Pemrograman II
Langkah 6. Langkah 7.
5 5
10 10
11 11
12 12
13 13
15 15
20 19
19 20
2012
s=1
Algoritma Tukar Data : For I <-1 to N do For J <-1 to N do If VektorA[J] < Min Then Min <- VektorA[J] Lok <- J; EndIf EndFor VektorA[lok]:=VektorA[I]; VektorA[I]:=min; EndFor
Program Pascalnya : program selection_sort; uses crt; var VektorA : array[1..10] of integer; i,j : integer; min,max,lok : integer; begin clrscr; writeln('Mengisi Array'); writeln;writeln; i:=1; while i<=10 do begin write('Iputkan Bilangan Vektor A[',i,'] : ');readln(VektorA[i]); i:=i+1; end; (* cari data *) writeln;writeln; Write('Hasil Analisis '); Dosen : Dodon Yendri, M.Kom
Page 6
Algoritma dan Pemrograman II
2012
writeln;writeln; for I:=1 to 10 do begin min:=1000; for J:=I to 10 do begin if VektorA[j] < Min then begin Min:=vektorA[j]; lok:=j; end; end; VektorA[lok]:=VektorA[i]; VektorA[i]:=min; end; for I:=1 to 10 do begin write(VektorA[i]:5); end; writeln;writeln; repeat until keypressed; end.
SEARCHING (PENCARIAN DATA) Adalah suatu proses untuk mencari data dari sekelompok data yang tersimpan dalam larik. Ada beberapa metoda searching/pencarian data, antara lain : 1. Sequential Search 2. Binary Search
Ad. 1. Sequential Search Proses pada sequential search ini dilakukan dengan cara membandingkan data yang akan dicari secara berurutan dari data pertama ke data berikutnya hingga didapatkan data yang diinginkan atau data yang dibaca habis dibaca. Untuk mencari data pada metoda ini, data tidak perlu diurutkan terlebih dahulu. Dosen : Dodon Yendri, M.Kom
Page 7
Algoritma dan Pemrograman II
2012
Misal : Diketahui sebuah Larik dalam Vektor A dengan 10 indeks sebagai berikut : 14
45
22
15
5
30
20
1
2
3
4
5
6
7
12 8
9 9
Buatlah Flowchart dan program Pascalnya untuk mengisi dan mencari data tertentu didalam Vektor tersebut. Algortima : 0. Baca Vektor, misalnya VektorA dengan N elemen 1. Inputkan Data yang akan di Cari 2. Inisialisasi : Ada = false 3. (Proses pencarian) Untuk I = 1 sampai N kerjakan langkah 4 4. Test apakah Cari = VektorA[I] jika ya berarti ketemu, tentukan : Ada = true Posisi = I I=N I=I+1 Jika tidak I=I+1 Ulangi langkah 3 5. Cek Hasil Pencarian : Jika Ketemu, tampilkan pesan “Data yang dicari ditemukan” pada lokasi ke I Jika tidak tampilkan pesan “Data yang dicari tidak ditemukan” 6. Selesai
Dosen : Dodon Yendri, M.Kom
Page 8
Algoritma dan Pemrograman II
2012
Flowchart start
VektorA =1..10 Cari=0 Ketemu=False
Readln Cari
I=1
T I<=10 Y T Cari=VektorA[I] Y Ketemu=True I=10
I=I+1
T Ketemu ? Y
Tidak Ketemu !
Ketemu ! pada lokasi I
stop
Dosen : Dodon Yendri, M.Kom
Page 9
Algoritma dan Pemrograman II
2012
Program Pascalnya : program cari_data_dlm_array; uses crt; var VektorA : array[1..9] of integer; ketemu : boolean; x : char; i,cari : integer; lokasi : integer; begin clrscr; writeln('Mengisi Array'); writeln;writeln; i:=1; while i<=9 do begin write('Iputkan Bilangan Vektor A[',i,'] : ');readln(VektorA[i]); i:=i+1; end; (* cari data *) writeln;writeln; Write('Data yang akan dicari ? : ');readln(cari); writeln;writeln; ketemu:=false; i:=1; while i<=9 do begin if cari=VektorA[i] then begin ketemu:=true; lokasi:=i; i:=9; i:=i+1 end else i:=i+1; end; if ketemu then writeln('Data ditemukan ! pada indeks ke ',lokasi) else writeln('Data tidak ditemukan !'); repeat until keypressed; end.
Dosen : Dodon Yendri, M.Kom
Page 10
Algoritma dan Pemrograman II
2012
Ad. 2. Binary Search Adalah proses mencari data dalam sekumpulan data yang sudah tersimpan secara terurut. Langkah-langkah : 1. Data yang akan dicari langsung dibandingkan dengan data yang berada pada posisi tengah dalam deretan verktor 2. Jika data yang dicari sama dengan data yang berada di posisi tengah vektor, maka pencarian data berhenti (selesai). 3. Jika data yang dicari tidak sama dengan data yang berada pada posisi tengah vektor, tetapi lebih kecil dari data yang ada diposis tersebut, maka komputer akan mengabaikan data dalam vektor yang dimulai dari posisi tengah ke data paling kahir. Dan proses selanjutnya adalah mencari data tersebut ke bagian tengak Vektor yang masih ada. Demikian juga dilakukan jika data yang dicari lebih besar dari data yang berada pada posisi tengah Vektor. Contoh : Misalkan akan dicari data 2 pada Vektor berikut ini : 1
2
3
5
8
9
10
15
Algoritma : 0. Baca VektorA dengan N elemen 1. Baca Data yang akan di Cari 2. Inisialisasi : Ada = false Atas = N Bawah = 1 3. Kerjakan langkah 4 dan 5 selama Atas >= Bawah 4. Tentukan Batas sub vektor Tengah = (atas + bawah) div 2
Dosen : Dodon Yendri, M.Kom
Page 11
Algoritma dan Pemrograman II
2012
5. Test nilai Cari terhadap VektorA[tengah] Jika Cari < VektorA[tengah] (* ada di sub vektor 1 *) Atas = Tengah – 1 Jika Cari > VektorA[tengah] (* ada di sub vektor 2 *) Bawah = Tengah + 1 Jika Cari = VektorA[tengah] (* ketemu *) Ada = true Posisi = Tengah Bawah = Atas + 1 6. Cek Hasil Pencarian : Jika Ketemu, tampilkan pesan “Data yang dicari ditemukan” pada lokasi ke I Jika tidak tampilkan pesan “Data yang dicari tidak ditemukan” 7. Selesai
Tugas Saudara :
Buat Flowchart dan Program Pascalnya ! Program Pascalnya program binary_search; uses crt; var VektorA : array[1..100] of integer; i,tengah,cari,n : Integer; atas, bawah : integer; posisi : integer; ketemu : boolean; begin clrscr; writeln('Mengisi Array'); writeln;writeln; write('Jumlah N data : ');readln(N); i:=1; writeln; writeln; while i<=N do begin write('Iputkan Bilangan Vektor A[',i,'] : '); readln(VektorA[i]); i:=i+1; Dosen : Dodon Yendri, M.Kom
Page 12
Algoritma dan Pemrograman II
2012
end; (* cari data *) writeln;writeln; ketemu := false; atas := N; bawah := 1; write('Data yang akan dicari :');readln(Cari); while atas >= bawah do begin tengah := (atas + bawah) div 2; if Cari < VektorA[tengah] then atas := tengah -1 else if Cari > VektorA[Tengah] then bawah := tengah +1 else begin ketemu := true; posisi := tengah; bawah := Atas + 1; end; end; if ketemu then write('data di temukan pada posisi ke ',posisi:5) else write('data tidak ketemu'); repeat until keypressed; end.
PEMROGRAMAN MODULAR Seringkali dalam membuat program si pemrogram perlu memecah masalah menjadi beberapa upa-masalah yang lebih kecil. Tiap upa-masalah kadangkala cukup independence dari program utama sehingga programnya dapat dirancang tanpa mempertimbangkan konteks tempat ia digunakan. Program dengan upa-masalah disebut Modul. Modul dapat dirancang oleh pemrogram selain dari orang yang mengembangkan program utama. Modul yang sudah ditulis dan dapat dipasang ke program lain yang membutuhkannya. Teknik pemrograman seperti ini dinamakan Pemrograman Modular. Beberapa bahasa pemrograman menamakan modul dengan sebutan rutin (routine), prosedur (procedure) atau fungsi (function). Dosen : Dodon Yendri, M.Kom
Page 13
Algoritma dan Pemrograman II
2012
Dalam teknik pemrograman modular, tiap modul mempunyai fungsi yang “khas” dan harus diberi nama. Dengan teknik ini modul yang sering digunakan berulang kali cukup ditulis satu kali saja dan pelaksanaan aksi didalam modul cukup dilakukan dengan memanggil nama modul tersebut dari bagian manapun didalam program utama atau dari modul lainnya. Ketika modul dipanggil, pelaksanaan program sekarang “berpindah” kedalam modul. Selanjutnya aksi didalam modul dilaksanakan secara beruntun sampai akhir modul tercapai. Setelah aksi didalam modul selesai dilaksanakan, pelaksanaan program kembali berpindah ke program pemanggil untuk melaksanakan aksi berikutnya. Berikut adalah mekanisme penggunaan modul :
Program Utama A1 A2 A3 CALL MODUL1 A4 A5 CALL MODUL2 A6 A7 A8 CALL MODUL1 A9 End.
MODUL1 M11 M12 M13 . .
End;
MODUL2 M21 M22 M23 M24 . .
End; Dosen : Dodon Yendri, M.Kom
Page 14
Algoritma dan Pemrograman II
2012
Keterangan Jalannya Program : Pelaksanaan program dimulai dari program utama. Aksi A1, A2 dan A3 dilaksanakan secara beruntun. Setelah aksi A3, Call Modul1(artinya MODUL1 dipanggil). Pelaksanaan program sekarang berpindah ke MODUL1. Aksi didalam Modul1 yaitu M11,M12 dan M13 dilaksanakan secara beruntun sampai instruksi terakhir (end). Setelah seluruh aksi didalam MODUL1 dilaksanakan program kembali berpindah ke program utama. Aksi yang terdapat setelah pemanggilan MODUL1 dilaksanakan, yaitu Aksi A4 dan A5. Setelah aksi A5, Call Modul2 ( artinya MODUL2 dipanggil) dan aksi-aksi dalam MODUL2 (M21,M22,M23, M24) dilaksanakan secara beruntun sampai terakhir (end). Setelah itu aksi kembali ke program Utama yakni mengerjakan Aksi A6,A7 dan A8. Kemudian MODUL1 dipanggil kembali dan aksi dalam MODUL1 dilaksanakan lagi secara berurutan dan kemudian kembali lagi ke Program Utama (Aksi A9) dan program selesai. Ada 2 jenis modul, yakni : 1. Fungsi 2. Prosedur 1. Fungsi Fungsi adalah modul program yang mengembalikan (return) sebuah nilai. Dalam matematika anda tentu sudah mengenal fungsi sbb: f(x) = x2 + 3x – 5 Dari contoh diatas f adalah nama fungsi. Sedangkan x adalah parameter fungsi yang bersangkutan. Dengan memberikan harga parameter, nilai fungsinya dapat dihitung sbb: Contoh : X=2 f(2) = 22 + 3(2) – 5 = 5 Jadi, kita katakan fungsi f mengembalikan nilai 5 setelah pemberian parameter x=2. Dosen : Dodon Yendri, M.Kom
Page 15
Algoritma dan Pemrograman II
2012
Deklarasi Fungsi : Function Namafungsi(parameter masukan) tipe hasil Parameter yang didefinisikan pada bagian judul fungsi dinamakan Parameter Formal. Parameter formal boleh tidak ada (kosong). Kalau ada harus berupa nama peubah/variabel. Semua nama yang didefinisikan dalam fungsi (tidak termasuk nama parameter formal) didefinisikan dalam kamus lokal. Fungsi dipanggil dengan menyebutkan nama fungsi beserta parameternya (kalau ada) Pemanggilan Fungsi : Namafungsi(parameter) Nama parameter yang disertakan pada waktu pemanggilan disebut dengan Parameter Aktual. Parameter aktual dapat berupa tetapan, nama tetapan atau nama peubah asalkan sudah terdefinisi tipe dan harganya. Pada waktu pemanggilan, terjadi korespondensi satu-satu antara parameter aktual dengan parameter formal. Ada beberapa hal yang perlu diperhatikan dalam pemanggilan fungsi, yakni : 1. Jumlah parameter aktual harus sama dengan jumlah parameter formal 2. Tipe parameter aktual harus sama dengan tipe parameter formal 3. Urutan parameter aktual harus sama dengan urutan parameter formal 4. Nama parameter aktual tidak boleh sama dengan nama parameter formal
Contoh : Dosen : Dodon Yendri, M.Kom
Page 16
Algoritma dan Pemrograman II
2012
(* Contoh Fungsi-1 *) program genapganjil; uses crt; var bilangan : integer; function genap(bil : integer) : boolean; begin genap:=(bil mod 2=0); end; begin write('Ketikkan sembarang Bilangan : ');readln(bilangan); if genap(bilangan) then writeln('Bilangan Genap') else writeln('Bilangan Ganjil'); repeat until keypressed; end. (* ----------- akhir program fungsi-1----------- *)
(* Contoh Fungsi-2 *) Program Fak; uses crt; var F : integer; Function Factorial(N:Integer): integer; begin if N=0 then Factorial:=1 else Factorial := N * Factorial(N-1); end; begin clrscr; write('Berapa Faktorial : ');readln(f); writeln(F,' Faktorial = ',factorial(f)); repeat until keypressed; Dosen : Dodon Yendri, M.Kom
Page 17
Algoritma dan Pemrograman II
2012
end. (*------------------akhir fungsi 2 ---------------*) Hasil Program :
(* Contoh Program Fungsi-3 *) program ApangkatN; uses CRT; Var A : integer; N : integer; Result : real; Function a_pangkat_npositif( X, Y : Integer) : Real; var hasil : real; I : Integer; begin hasil :=1; if Y > 0 then for I:=1 to Y do Hasil :=hasil * X; a_pangkat_npositif :=Hasil; end; procedure pangkat(var r : real; S,T : integer); begin if T < 0 then begin T := -T; R :=1/a_pangkat_npositif(S,T); end else R := a_pangkat_npositif(S,T); end; (* main program *) Dosen : Dodon Yendri, M.Kom
Page 18
Algoritma dan Pemrograman II
2012
begin clrscr; write('Inputkan harga A : ');readln(A); write('Inputkan harga N : ');readln(N); result:=0; pangkat(result,A,N); write(' Hasil ',A:3,' pangkat ',N:3, ' adalah = ',result:8:2); repeat until keypressed; end. (*------------------akhir fungsi 2 ---------------*)
2. Prosedur Adalah program yang berisi rangkaian aksi dan menghasilkan “efek netto” yang terdefinisi. Karena ada efek yang akan ditimbulkan maka pada setiap prosedur harus didefinisikan keadaan awal dan keadaan akhir setelah rangkaian aksi dilaksanakan. Suatu prosedur harus diberi nama yang unik dan disertai dengan daftar parameter (kalau ada). Parameter formal dibedakan atas 3 jenis : 1. Parameter input 2. Parameter output 3. Parameter input/output Parameter Input adalah parameter yang berlaku sebagai penampung masukan Parameter Output adalah parameter yang berlaku sebagai keluaran Parameter Input/Output adalah parameter masukan dan keluaran Deklarasi Prosedur Dosen : Dodon Yendri, M.Kom
Page 19
Algoritma dan Pemrograman II
2012
Procedure NamaProsedur(parameter formal) Pemanggilan Prosedur
NamaProsedur(parameter aktual) Contoh : (*program tanpa parameter *) program luassegi3_1; uses crt; var alas,tinggi,luas : real; procedure luassegi3; begin luas:=0.5*alas*tinggi; end; begin clrscr; write('Harga Alas : ');readln(alas); write('Harga Tinggi : ');readln(tinggi); luassegi3; writeln('Luas Segitiga = ',luas:8:2); repeat until keypressed; end. (*-------------- akhir program luassegi3_1------------- *);
(*program dengan parameter *) program luassg3_2; uses crt; var alas,tinggi,luas : real;
Dosen : Dodon Yendri, M.Kom
Page 20
Algoritma dan Pemrograman II
2012
procedure luassegi3(a,t : real; var L : real); begin L:=0.5*a*t; end; (*main program *) begin clrscr; write('Harga Alas : ');readln(alas); write('Harga Tinggi : ');readln(tinggi); luassegi3(alas,tinggi,luas); writeln('Luas Segitiga = ',luas:8:2); repeat until keypressed; end. (*------------- akhir program luassg3_2 -----------*); (*program dengan parameter *) program tukar1_1; uses crt; var A,B : Integer; procedure tukarAB(var X,Y : integer); var Z : integer; begin Z := X; X := Y; Y := Z; end; begin clrscr; write('Input A : ');readln(A); write('Input B : ');readln(B); TukarAB(a,b); writeln; writeln('Hasil Pertukaran '); writeln('Nilai A = ',A); writeln('Nilai B = ',B); repeat until keypressed; end. (* -------------- akhir program tukar1_1------------ *); Dosen : Dodon Yendri, M.Kom
Page 21
Algoritma dan Pemrograman II
2012
(*program tanpa parameter *) program tukar1_2; uses crt; var A,B : Integer; procedure tukarAB; var z : integer; begin Z := x; X := Y; Y := Z; end; begin clrscr; write('Input A : ');readln(A); write('Input B : ');readln(B); TukarAB; writeln; writeln('Hasil Pertukaran '); writeln('Nilai A = ',A); writeln('Nilai B = ',B); repeat until keypressed; end. (* -------------- akhir program tukar1_2-------------- *);
PR : 1. Menentukan berapa bilangan terbesar dari 2 buah Angka yang diinputkan dari keyboard. 2. Untuk menentukan apakah suatu tahun merupakan tahun kabisat dari tahun yang diinputkan. ((tahun mod 4 = 0) and (thn mod 100 <>0 )) or (thn mod 400 = 0) 3. Menampilkan tabel yang berisi nilai-nilai x dan F(x) di dalam selang [10,15] dengan x = 0,2 seperti contoh berikut ini. F(x)=2x2 + 5x - 8
Dosen : Dodon Yendri, M.Kom
Page 22
Algoritma dan Pemrograman II
2012
REKURSIF • Rekursif merupakan alat/cara untuk memecahkan masalah dalam suatu fungsi atau procedure yang memanggil dirinya sendiri. • Definisi menurut Niclaus Wirth : “ An object is said be recursive if it partially consist or is defines in terms of itself” • Perhitungan matematika ( contoh fungsi factorial dan bilangan Fibonacci) Beberapa Contoh : Faktorial • Fungsi factorial dari bilangan bulat positif n didefinisikan sebagai berikut: n!= n.(n-1)! , jika n>1 n!= 1 , jika n=0, 1 • contoh : 3!= 3. 2! 3!= 3. 2. 1! 3!= 3. 2. 1 3!= 6 Kita dapat menuliskan fungsi penghitung factorial seperti dibawah ini
Dosen : Dodon Yendri, M.Kom
Page 23
Algoritma dan Pemrograman II
2012
Bilangan Fibonacci • Fungsi lain yang dapat diubah ke bentuk rekursif adalah perhitungan Fibonacci. Bilangan Fibonacci dapat didefinisikan sebagai berikut: fn = fn-1 + fn-2 untuk n > 2 f1 = 1 f2 = 1 Berikut ini adalah barisan bilangan Fibonacci mulai dari n=1 sampai n=9 1 1 2 3 5 8 13 21 34
Dosen : Dodon Yendri, M.Kom
Page 24
Algoritma dan Pemrograman II
2012
Algoritma Fibonacci yang dipakai Function Fibonacci(input n:integer) integer Deklarasi Lokal {tidak ada} Deskripsi If (n=1) or (n=2)Then Fibonacci:=1 Else Fibonacci:= Fibonacci(n-1)+Fibonacci(n-2); Contoh : Untuk ukuran n= 4, proses perhitungan Fibonacci dapat dilakukan sebagai berikut: f4 = f3+f2 f4 = (f2+f1) + f2 f4 = (1+1) +1 f4 = 3
Latihan : 1. Buat program untuk menghitung deret S = 1+2+3+4+5+...+n menggunakan function rekursi 2. Buat program untuk menghitung deret S = 2+4+6+8+10+...+2n menggunakan function rekursi
Dosen : Dodon Yendri, M.Kom
Page 25
Algoritma dan Pemrograman II
2012
No.1 deret S=1+2+3+4+5+…+n Function S(input n:integer) integer Deklarasi Lokal {tidak ada} Deskripsi If (n=1) Then return (1) Else return (n + S(n-1)) Endif
No.2 deret S=2+4+6+8+10+…+2n Function S(input n:integer) integer Deklarasi Lokal {tidak ada} Deskripsi If (n=1) Then return (2) Else return (2*n + S(n-1)) Endif
Dosen : Dodon Yendri, M.Kom
Page 26
Algoritma dan Pemrograman II
2012
REKURSI versus ITERASI Dalam beberapa hal, rekursi kurang efesien dibandingkan dengan proses iterasi. Perhatikan fungsi Fibonacci. Pada proses fibonacci terdapat beberapa pemanggilan fungsi fibonacci yang berulang-ulang. Sebagai contoh Fibonacci(6) memerlukan pemanggilan Fibonacci(5) dan fibonacci(4), dimana fibonacci(5) memerlukan pemanggilan fibonacci(4) dan fibonacci(3), dan begitu seterunya. Berikut adalah program menghitung Fibonacci dengan Iterasi uses crt; var n : integer; function fibonaci(n : integer) : integer; var f, akhir, bantu, i : integer; begin i := 1; f:=1; akhir :=0; if (n=1) then f:=0; while i <> N do begin bantu := F; I := I+1; F := F + Akhir; Akhir := Bantu; end; fibonaci := F; end; begin Dosen : Dodon Yendri, M.Kom
Page 27
Algoritma dan Pemrograman II
2012
writeln('Berapa n : ');readln(n); writeln('Fibonaci N=',n,' adalah : ',fibonaci(n):5); repeat until keypressed; end.
PERMUTASI Salah satu contoh pemakian Rekursi adalah Permutasi. Contoh : jika kita mempunyai 3 buah karakter A, B dan C maka semua permutasi yang mungkin dari ketiga karakter ini adalah : ABC BAC CAB ACB BCA CBA Secara umum, banyaknya permutasi dari N buah karakter adalah N faktorial. Contoh diatas N = 3, maka banyaknya permutasi adalah 3!=6. Proses penyusunan permutasi adalah : 1. Cetak elemen ke 1, dan cetak permutasi elemen ke 2 sampai ke N (permutasi dengan N-1 elemen) 2. Cetak elemen ke 2, dan cetak permutasi elemen ke 3 sampai ke N (permutasi dengan N-1 elemen) 3. Cetak elemen ke 3, dan cetak permutasi elemen ke 4 sampai ke N (permutasi dengan N-1 elemen) 4. Dan seterusnya sampai langkah terakhir adalah cetak elemen ke N, dan cetak permutasi elemen ke (N-1) (permutasi N-1) elemen) Proses diatas diulang terus sampai dicetak permutasi dengan 1 elemen. Dari N = 3 diatas, maka prosesnya adalah :
Dosen : Dodon Yendri, M.Kom
Page 28
Algoritma dan Pemrograman II
2012
• Cetak ‘A’ dan cetak permutasi (‘B’ ‘C’) • Cetak ‘B’ dan cetak permutasi (‘A’ ‘C’) • Cetak ‘C’ dan cetak permutasi (‘A’ ‘B’)
Program Lengkap Permutasi adalah : program susun_permutasi; uses crt; const max = 5; type larik =array[1..max] of char; var a : larik; (* larik yang akan dipermutasikan *) c_permutasi, (* jumlah permutasi *) c_elemen, (* cacah karakter *) i : integer; (* perubah kendali *) lagi : char; (* perubah kendali *) procedure permutasi (var b : integer; a : larik; k,n : integer); var i : integer; temp : char; begin if k=n then begin b := succ(b); {membaca karakter berikut} write('permutasi ke ',b:2, ' : '); for i:=1 to n do write(a[i]:3); writeln; end else for i:= k to n do begin temp := a[i]; Dosen : Dodon Yendri, M.Kom
Page 29
Algoritma dan Pemrograman II
2012
a[i] := a[k]; a[k] := temp; permutasi(b,a, k+1, n); end; end; begin repeat clrscr; writeln(' banyaknya karakter yang akan dipermutasikan '); repeat gotoxy(50,1);readln(c_elemen); until c_elemen <= max; (* menyusun karakter yang akan dipermutasikan *) for i := 1 to c_elemen do a[i] := chr(i+64); clrscr; writeln('penyusunan permutasi untuk ',c_elemen,' karakter'); writeln('--------------------------------------------'); writeln; (*proses mencari permutasi *) c_permutasi :=0; permutasi(c_permutasi, a,1,c_elemen); (* mencetak hasil *) writeln; writeln('banyaknya permutasi : ',c_permutasi:3); writeln; write('akan coba lagi (y/t) : ');readln(lagi) until not (lagi in ['y','y']); end. Dosen : Dodon Yendri, M.Kom
Page 30
Algoritma dan Pemrograman II
2012
PROGRAM FILE DATA/ARSIP Suatu file terdiri dari suku-suku atau data bertipe sama. Tipe data ini dapat berbentuk type data sederhana atau tipe data berstruktur. Masing-masing suku pada file akan terkait dengan adanya pointer. Akhir dari suatu file diberi tanda EOF (End-Of-File). Berikut ini adalah beberapa contoh deklarasi contoh file : Type Catatan = record; Nama : string[15]; Bp : string[13]; End; Larik = array[1..10] of integer; Var Peserta : file of catatan; {file variable} Data : file of larik; {file variable } A : catatan; {data variable} Untuk mendeklarasikan file harus dilakukan pada blok file. Pada deklarasi tersebut harus dipilih file variabel dan type dari file. Pada contoh diatas, peserta merupakan file variable dari suku-suku data yang bertype catatan. Sedangkan Data adalah file variabel dari sukusuku file bersuku larik. A adalah data variable dari record Catatan. Untuk keperluan operasi penggarapan file, ada beberapa statement yang diperlukan antara lain : ASSIGN(File-Variable, File-Name) REWRITE(File-Variable) RESET(File-Variable) WRITE(File-Variable,Data-Variable) Dosen : Dodon Yendri, M.Kom
Page 31
Algoritma dan Pemrograman II
2012
READ(File-Variable, Data-Variable) CLOSE(File-Variable) ASSIGN Perintah ASSIGN digunakan untuk menghubungkan antara FileVariable dengan Data-Variable.Setelah file berhubungan, maka barulah kita dapat melakukan penulisan/pembacaan terhadap file. Contoh pemakaian Assign : Assign(Peserta,’Data.dat’); atau ASSIGN(Peserta,’A:Data.Dat’);
REWRITE REWRITE diperlukan jika kita ingin menuliskan data baru kedalam File-Variable. Perintah ini dilakukan setelah perintah ASSIGN. Contoh : ASSIGN(Peserta,’A:Data.dat’); REWRITE(Peserta); RESET Digunakan apabila kita ingin membaca data dari file data. Perintah ini juga dituliskan setelah statement ASSIGN. Contoh : ASSIGN(Peserta,’A:Data.dat’); RESET(Peserta); Dosen : Dodon Yendri, M.Kom
Page 32
Algoritma dan Pemrograman II
2012
WRITE Perintah ini akan menuliskan Data-Variable kedalam File-Variabel. Type file variable harus sama dengan data variable. Contoh : READLN(A.Nama); Readln(A.BP); WRITE(Peserta,A); READ Digunakan untuk membaca data yang ada pada Variabel-File dan dimasukkan kedalam Variabel-data. Contoh : READ(Peserta,A) CLOSE Perintah ASSIGN digunakan untuk menghubungkan File-variable dengan File-Data. Ini juga berarti kita membuka suatu file. Setelah file dibuka dan digunkan harus ditutup kembali supaya data yang ada didalamnya tersimpan dengan aman. Untuk menutup file yang telah digunakan perintah CLOSE. Perintah ini tidak berarti pemutusan hubungan antara File-Variable dengan Data-Variabel. Secara garis besar tatacara urutan penggunaan perintah tersebut adalah : Dosen : Dodon Yendri, M.Kom
Page 33
Algoritma dan Pemrograman II
2012
Jika ingin menuliskan data kedalam file/menyimpan, maka perintahnya sbb: ASSIGN(File-Variable, File-Name); REWRITE(File-Variable); WRITE(File-Variabel,Data-Variable); CLOSE(File-Variable); Jika ingin membaca data dari file, maka urutan adalah :
perintahnya
ASSIGN(File-Variable, File-Name); RESET(File-Variable); READ(File-Variable) CLOSE(File-Variable); Contoh Program : 1. Program File1; uses crt; Var Nilai : file of Integer; { File variable } A, B : Integer; { Data variable } I : Integer; Procedure Simpan; Begin Assign(Nilai,'Data.dat'); Rewrite(Nilai); clrscr; writeln('Menginput dan Menyimpan Nilai'); writeln; writeln; For I:=1 to 5 do Begin Dosen : Dodon Yendri, M.Kom
Page 34
Algoritma dan Pemrograman II
2012
Write('Input Nilai ke-',i,' : ');readln(A); Write(Nilai,A); End; Close(Nilai) End; Procedure Baca; Begin Assign(Nilai,'Data.dat'); Reset(Nilai); writeln;writeln; writeln('Nilai yang disimpan'); writeln;writeln; For I:=1 to 5 do Begin Read(nilai,B); Writeln(B); End; Close(Nilai); writeln; writeln('Tekan sembarang tombol ..!'); Repeat until keypressed; End; Begin (* menu utama *) Simpan; Baca; End. Hasil Program
Dosen : Dodon Yendri, M.Kom
Page 35
Algoritma dan Pemrograman II
2012
Contoh Program 2. Program file2; Uses crt; Type DataMhs = record Nobp : string[5]; Nama : string[20]; Nilai : real; end; ArsipMhs = file of DataMhs; var RekMhs : DataMhs; {rekaman} Mhs : ArsipMhs; {arsip} File Variabel Procedure Input; var lagi : char; Begin Assign(Mhs,'Mhs.Dat'); Rewrite(Mhs); repeat Dosen : Dodon Yendri, M.Kom
Data-variabel
Page 36
Algoritma dan Pemrograman II
2012
clrscr; writeln(' *** Iput Data Mahasiswa ***'); writeln('----------------------------'); writeln; write('NoBP : ');readln(RekMhs.nobp); write('Nama : ');readln(Rekmhs.nama); write('Nilai : ');readln(RekMhs.nilai); write(Mhs,RekMhs); writeln; write('Ada Mhs lagi (Y/T) : ');readln(lagi); writeln; until not (lagi in ['Y','y']); end; procedure Cetak; var no : integer; begin Assign(Mhs,'Mhs.Dat'); Reset(Mhs); writeln('*** Daftar Nilai Mahasiswa ***'); writeln('----------------------------------'); writeln('No No.Bp Nama Nilai '); writeln('----------------------------------'); no := 1; while not eof(Mhs) do begin read(Mhs,RekMhs); writeln(no:3,RekMhs.nobp:8,RekMhs.nama:25,RekMhs.Nilai:6:2); no := no + 1; End; writeln('----------------------------------'); Dosen : Dodon Yendri, M.Kom
Page 37
Algoritma dan Pemrograman II
2012
repeat until keypressed; Close(Mhs) End; begin (* main program *) input; cetak; end.
BEBERAPA FUNGSI TAMBAHAN PENANGANAN FILE 1. Kompiler Directive; adalah fungsi yang digunakan untuk membaca dan mencek apakah input file ada atau tidak. Misalnya : {$I-} {$I+} untuk pengecekan digunakan fungsi : IOResult :=0 file sudah ada IoResult <> 0 file belum ada 2. Filesize(variable file) digunakan untuk menentukan jumlah record didalam file database Contoh : JmlRecord :=filesize(filebar); {menetukan jumlah record dalam database} For I :=1 to JmlRecord do
{ membaca dari record pertama sampai habis}
Bisa diganti dengan : while not(eof(filebar)) do Dosen : Dodon Yendri, M.Kom
Page 38
Algoritma dan Pemrograman II
2012
3. Seek(variable file, N-1) digunakan untuk mencari record dalam file. N-1 adalah record saat ini. Misalnya : Seek(filebar, i-1) Read(filebar,recbar); Seek(filebar,filesize(filebar)) menempatkan pointer pada posisi terakhir untuk ditulis
Contoh Program : program menu_barang; uses crt; type rec = record kobar : string[4]; nabar : string[20]; satuan : string[15]; harga : longint; stock : integer; end; var filebar : file of rec; {variable file} recbar : rec; {variable data} lagi,jawab,pilih : char; filetakada,selesai : boolean; jumlahrecord : longint; ketemu : boolean; procedure entri_barang; begin assign(filebar,'barang.dat'); {$i-} reset(filebar); Dosen : Dodon Yendri, M.Kom
Page 39
Algoritma dan Pemrograman II
2012
if ioresult <> 0 then rewrite(filebar); {$i+} seek(filebar,filesize(filebar)); lagi:='y'; while upcase(lagi)='y' do with recbar do begin clrscr; writeln('memasukkan data barang'); writeln('----------------------'); writeln; write('kode barang : ');readln(kobar); write('nama barang : ');readln(nabar); write('satuan barang : ');readln(satuan); write('harga barang : ');readln(harga); write('stock : ');readln(stock); write(filebar,recbar); write('ada lagi (y/t) : ');readln(lagi); end; close(filebar); end;
procedure tampil_barang; var kobarcari : string[4]; i : integer; begin assign(filebar,'barang.dat'); {$i-} reset(filebar); {$i+} jumlahrecord :=filesize(filebar); lagi:='y'; while upcase(lagi)='y' do begin Dosen : Dodon Yendri, M.Kom
Page 40
Algoritma dan Pemrograman II
2012
clrscr; ketemu :=false; writeln('menampilkan barang tertentu'); writeln('---------------------------'); writeln; write('kode barang : ');readln(kobarcari); for i := 1 to jumlahrecord do begin seek(filebar,i-1); read(filebar,recbar); if recbar.kobar = kobarcari then begin ketemu :=true; writeln('nama barang : ',recbar.nabar); writeln('satuan barang : ',recbar.satuan); writeln('harga barang : ',recbar.harga); writeln('stock : ',recbar.stock); writeln; end; end; if not ketemu then writeln('tidak ada kode barang tersebut !!!'); write('ada lagi yang dicari (y/t) : ');readln(lagi); end; close(filebar); end; procedure koreksi_barang; var kobarcari : string[4]; i : integer; begin assign(filebar,'barang.dat'); {$i-} reset(filebar); {$i+} Dosen : Dodon Yendri, M.Kom
Page 41
Algoritma dan Pemrograman II
2012
jumlahrecord :=filesize(filebar); lagi:='y'; while upcase(lagi)='y' do begin clrscr; ketemu :=false; writeln('menampilkan barang tertentu'); writeln('---------------------------'); writeln; write('kode barang : ');readln(kobarcari); writeln; for i := 1 to jumlahrecord do begin seek(filebar,i-1); read(filebar,recbar); if recbar.kobar = kobarcari then begin with recbar do begin ketemu :=true; writeln('nama barang : ',nabar); write('koreksinya : ');readln(nabar); writeln('satuan barang : ',satuan); write('koreksinya : ');readln(satuan); writeln('harga barang : ',harga); write('koreksinya : ');readln(harga); writeln('stock : ',stock); write('koreksinya : ');readln(stock); writeln; end; end; seek(filebar,i-1); write(filebar,recbar); Dosen : Dodon Yendri, M.Kom
Page 42
Algoritma dan Pemrograman II
2012
end; if not ketemu then writeln('tidak ada kode barang tersebut !!!'); write('ada lagi yang dicari (y/t) : ');readln(lagi); end; close(filebar); end; procedure tampil_semua; var nilaibrg : longint; totnilbrg : longint; totharsat : longint; totstock : integer; i : integer; begin assign(filebar,'barang.dat'); {$i-} reset(filebar); {$i+} if ioresult=0 then filetakada:=false; clrscr; writeln('daftar persediaan barang di gudang'); writeln('pt.xyz padang'); writeln; writeln('------------------------------------------------------------------------'); writeln('no kode nama satuan harga stock nilai '); writeln('urt. brg barang barang barang barang barang '); writeln('-------------------------------------------------------------------------'); jumlahrecord:=filesize(filebar); Dosen : Dodon Yendri, M.Kom
Page 43
Algoritma dan Pemrograman II
2012
totnilbrg :=0; totharsat :=0; totstock :=0; for i:=1 to jumlahrecord do with recbar do begin read(filebar,recbar); nilaibrg:=harga*stock; writeln(i:3,kobar:5,nabar:20,satuan:10,harga:9,stock:10,nilaibrg:12) ; totstock := totstock+stock; totnilbrg := totnilbrg+nilaibrg; totharsat := totharsat+harga end; writeln('-------------------------------------------------------------------------'); writeln(' total : ',totharsat:12,totstock:10,totnilbrg:12); writeln('-------------------------------------------------------------------------'); writeln('tekan sembarang konci.............. !'); repeat until keypressed; close(filebar); end;
begin {* main program *} repeat clrscr; writeln('******* menu utama barang ********'); writeln; writeln('1. menambah data barang'); writeln('2. menampilkan barang tertentu'); writeln('3. me-koreksi data barang'); writeln('4. menampilkan semua barang'); writeln('5. selesai'); writeln; Dosen : Dodon Yendri, M.Kom
Page 44
Algoritma dan Pemrograman II
2012
write('pilihan anda [1..5] : ');readln(pilih); case pilih of '1' : entri_barang; '2' : tampil_barang; '3' : koreksi_barang; '4' : tampil_semua; end; until pilih = '5'; end.
Dosen : Dodon Yendri, M.Kom
Page 45
Algoritma dan Pemrograman II
2012
STUDI KASUS Menyalin Arsip, Konsolidasi, Merging, Updating File Data dan Spliting
A. Menyalin Arsip Rekaman di dalam suatu arsip adakalanya perlu disalin (copy) ke arsip yang lain. Penyalinan dapat dilakukan terhadap seluruh rekaman atau hanya rekaman tertentu saja. Berikut adalah algoritma menyalin seamluruh rekaman dari arsip Mhs1 ke Arsip Mhs2. File Mhs1 NIM Nama 70001 Adi 70003 Budi 70004 Susi 70006 Anti 70008 Doni
Alamat Alamat Indarung Siteba Andalas Sawahan
File Mhs2 NIM Nama 70001 Adi 70003 Budi 70004 Susi 70006 Anti 70008 Doni
Alamat Alamat Indarung Siteba Andalas Sawahan
Salin Arsip {Menyalin seluruh arsip Mhs1 ke arsip Mhs2} {Kondisi awal : Arsip Mhs2 mungkin kosong } {Kondisi akhir : Arsip Mhs2 berisi salinan seluruh rekaman dari arsip Mhs1} Deklarasi RekMhs
: DataMhs
Algoritma; Open(Mhs1, 1) Open(Mhs2, 2) Dosen : Dodon Yendri, M.Kom
{Buka arsip Mhs1 untuk pembacaan } {Buka arsip Mhs2 untuk penulisan } Page 46
Algoritma dan Pemrograman II
While (not(EOF(Mhs1)) do Fread(Mhs1, RekMhs) Fwrite(Mhs2, RekMhs) Enwhile { EOF (Mhs1)}
2012
{baca rekaman dari arsip Mhs1 } {salin RekMhs ke arsip Mhs2 }
Close(Mhs1) Close(Mhs2)
B. Konsolidasi adalah pengelompokan data dengan kunci yang sama yang harus diproses sebagai satu kesatuan. Contoh Kasus : Diketahui sebuah Arsip Nilai Mahasiswa, satu mahasiswa dapat mempunyai beberapa buah nilai (karena dalam satu semester mengambil beberapa matakuliah, dan tiap mahasiswa bisa berbeda matakuliah). Buatlah Algoritma untuk menghitung nilai rata-rata tiap mahasiswa, dan membuat daftar nilai yang lebih sederhana, yaitu menuliskan NIM dan nilai rata-rata tiap mahasiswa. NIM 70001 70001 70001 70001 70002 70002
File Nilai Kode MK1 MK2 MK3 MK4 MK1 MK2
Dosen : Dodon Yendri, M.Kom
Nilai 50 80 60 70 55 75
File Hasil Konsolidasi NIM Rata-rata 70001 65 70002 69 70003 80 70004 53
Page 47
Algoritma dan Pemrograman II
70002 70002 70002 70003 70003 70004 70004 70004
MK3 MK4 MK5 MK1 MK2 MK1 MK2 MK3
2012
65 86 64 77 83 45 54 60
Konsolidasi {Kondisi awal : ArsipMhs sudah berisi NIM dan nilai} {Kondisi akhir : Record sudah dikelompokkan berdasarkan NIM yang sama, dengan nilainya adalah nilai rata-rata} Deklarasi Type DataMhs : Record < NIM : integer Nilai : real > ArsipMhs1, ArsipMhs2 : seqFile of DataMhs Mhs : DataMhs CurrentNim, JumNil, nMK : integer Rata : real Function Mark(Input Mhs : DataMhs) Boolean Deskripsi Open(ArsipMhs1,1) Open(ArsipMhs2,2) Fread(ArsipMhs1, Mhs) If (Mark(Mhs) = true) then Dosen : Dodon Yendri, M.Kom
Page 48
Algoritma dan Pemrograman II
2012
Output(‘Arsip kosong…’) Else While (Mark(Mhs) = false) do JumNil 0 nMK 1 currentNIM Mhs.NIM {record1 dari ArsipMhs1} Repeat JumNil JumNil + Mhs.Nilai nMK nMK + 1 Fread(ArsipMhs1,Mhs) Until (currentNIM <> Mhs.NIM) Rata JumNil/nMK Fwrite(ArsipMhs2, <currentNIM, Rata>) Output(currentNIM,Rata) Endwhile EndIf Close(ArsipMhs1) Close(ArsipMhs2)
C. Merging Merging adalah penggabungan dua buah file yang tipe recordnya sama. Untuk melakukan merging ada dua cara, yakni Penggabungan dua buah arsip dengan cara penyambungan dan Penggabungan dua buah arsip terurut. Cara yang paling sederhana adalah data file kedua ditambahkan setelah record terakhir file pertama, sehingga membentuk file baru (penggabungan dua buah arsip dengan cara penyambungan).
Dosen : Dodon Yendri, M.Kom
Page 49
Algoritma dan Pemrograman II
2012
Contoh : File ArsipMhs1 NIM Nama 70001 Adi 70003 Budi 70004 Susi 70006 Anti 70008 Doni
File ArsipMhs2 NIM Nama 70002 Yudi 70009 Eka 70010 Bima
File ArsipMhs3 NIM Nama 70001 Adi 70003 Budi 70004 Susi 70006 Anti 70008 Doni 70002 Yudi 70009 Eka 70010 Bima
Merging Sambung {Menggabungkan dua buah arsip beruntun yaitu ArsipMhs1 dan ArsipMhs2, menjadi sebuah arsip baru yaitu ArsipMhs3, dengan cara semua record arsip kedua disambungkan setelah record terakhir arsip pertama} {Kondisi awal : arsip pertama dan kedua sudah berisi data} {Kondisi akhir : arsip'ketiga berisi hasil sambungan kedua arsip} Deklarasi Type DataMhs : Record
ArsipMhsl, ArsipMhs2, ArsipMhs3 : SeqFile of DataMhs Mhs : DataMhs Function Mark(Input Mhs : DataMhs) Boolean Deskripsi Open(ArsipMhs1, 1) Open(ArsipMhs2, 1) Dosen : Dodon Yendri, M.Kom
Page 50
Algoritma dan Pemrograman II
2012
Open(ArsipMhs3, 2) FRead(ArsipMhs1, Mhs) While (Mark(Mhs) = false) Do FWrite(ArsipMhs3, Mhs) FRead(ArsipMhs1, Mhs) EndWhile FRead(ArsipMhs2, Mhs) While (Mark(Mhs) = false) Do FWrite(ArsipMhs3, Mhs) FRead(ArsipMhs2, Mhs) EndWhile FWrite(ArsipMhs3, <99999, 'xxxxx', 99.9>) Close(ArsipMhsl) Close(ArsipMhs2) Close(ArsipMhs3)
Merging Urut {Menggabungkan dua buah arsip beruntun yaitu ArsipMhs1 dan ArsipMhs2yang sudah terurut, menjadi sebuah arsip baru yaitu ArsipMhs3 yang juga terurut} {Kondisi awal : arsip pertama dan kedua sudah berisi data} {Kondisi akhir : arsip ketiga berisi hasil merging kedua arsip} Deklarasi Type DataMhs : Record ArsipMhsl, ArsipMhs2, ArsipMhs3 : SeqFile of DataMhs Mhs 1, Mhs2 : DataMhs
Dosen : Dodon Yendri, M.Kom
Page 51
Algoritma dan Pemrograman II
2012
Function Mark(Input Mhs : DataMhs) Boolean Algoritma Open(ArsipMhsl, 1) Open(ArsipMhs2, 1) Open(ArsipMhs3, 2) FRead(ArsipMhs1, Mhs1) FRead(ArsipMhs2, Mhs2) While (Mark(Mhsl) = false) Or (Mark(Mhs2) = false) Do If (Mhsl.NIM <= Mhs2.NIM) Then FWrite(ArsipMhs3, Mhs1) FRead(ArsipMhsl, Mhsl) Else FWrite(ArsipMhs3, Mhs2) FRead(ArsipMhs2, Mhs2) Endif EndWhile {Mark(Mhs 1) = true dan Mark(Mhs2) = true} FWrite(ArsipMhs3, <99999, 'xxxxx', 99.9>) Close(ArsipMhs1) Close(ArsipMhs2) Close(ArsipMhs3)
D. Updating Updating adalah proses editing harga suatu record (field key tidak diedit) pada file master dengan data dari file transaksi. Berikut ini adalah algoritma umum untuk meremajakan record pada file master (bersifat beruntun, nilai field keynya terurut naik tetapi bisa tidak unik). Artinya bahwa suatu record pada file master dapat mengalami satu atau beberapa kali peremajaan.
Dosen : Dodon Yendri, M.Kom
Page 52
Algoritma dan Pemrograman II
2012
Contoh : Peremajaan File Saldo tabungan pada Bank, dengan perjanjian jika nilai uang pada file update berharga negatif, berari pengambilan, tetapi jika nilai uang pada File Update berharga positif, berarti transaksi penabungan. File Master NoRek Saldo 001 100000 003 150000 004 175000 006 180000 007 210000 008 112000 009 135000 010 210000 999 0
File Transaksi NoRek Saldo 001 +5000 001 -2000 002 +1000 004 -1500 004 +10000 004 -7500 006 +10500 006 -5000 007 -3000 999 0
File New Master NoRek Saldo 001 103000 003 150000 004 176000 006 185500 007 207000 008 112000 009 135000 010 210000 999 0
Updating {Mengubah salah satu isi field dari file master berdasarkan data dari file transaksi lalu simpan hasil editing ke file new master} {Kondisi awal : suatu variabel sudah bemilai isi dari field key pada posisi record yg akan diubah, field key sudah terurut naik} {kondisi akhir : file new master sudah berisi data dari hasil editing file master berdasarkan file transaksi1} Deklarasi Type DataSaldo : Record < NoRek : Integer, Saldo : Longint > Master, Transaksi, NewMaster : SeqFile of DataSaldo Nasabah1,Nasabah2 : DataSaldo Dosen : Dodon Yendri, M.Kom
Page 53
Algoritma dan Pemrograman II
2012
NewSaldo : Longint FunctionMark(InputNasabah : DataSaldo) Boolean Algoritma Open(Master, 1) Open(Transaksi, 1) Open(NewMaster, 2) FRead(Master, Nasabah1) FRead(Transaksi, Nasabah2) While (Mark(Nasabahl) = false) Do While (Nasabah2.NoRek < Nasabahl.NoRek) and (Mark(Nasabah2) = false) Do FRead(Transaksi, Nasabah2) {skip record dari file trans} EndWhile If (Nasabah2.NoRek = Nasabahl.NoRek) Then NewSaldo Nasabah 1.Saldo {yg akan diedit} While (Nasabah2.NoRek = Nasabahl.NoRek) and (Mark(Nasabah2) = false) Do NewSaldo NewSaldo+ Nasabah2.Saldo FRead(Transaksi, Nasabah2) EndWhile FWrite(NewMaster, ) Else FWrite(NewMaster, Nasabahl) . Endif FRead(Master, Nasabah1) EndWhile FWrite(NewMaster, <999, 0>) Close(Master) Close(Transaksi) Close(NewMaster)
Dosen : Dodon Yendri, M.Kom
Page 54
Algoritma dan Pemrograman II
2012
E. Spliting Spliting adalah pemecahan sebuah file menjadi dua atau lebih file baru. Algoritmanya tergantung dari kriteria pemecahannya. Contoh : Memisahakan
file
nilai
suatu
matakuliah
suatu
kelas
berdasarkan yang lulus dan yang tidak lulus.
NIM -
99999
Nilai 80 42 60 56 55 71 38 65 40 54 0
NIM 99999
Nilai 80 60 56 55 71 65 0
NIM -
Nilai 42 38
99999
40 54 0
PENUTUP SOAL-SOAL Implementasikan algoritma konsolidasi, merging, updating dan spliting dengan bahasa pemrograman Pascal.
Dosen : Dodon Yendri, M.Kom
Page 55