CS1023 Pemrograman Komputer Lecture 16 Mesin Abstrak [2] Mesin Couple • Kasus : – Diberikan sebuah mesin karakter dengan pita berisi karakter (mungkin kosong). Buatlah algoritma untuk menghitung banyaknya pasangan dua huruf ‘LE’ yang ada pada pita tersebut Mesin Couple • HITUNG-LE Versi 1 : – Realisasi dengan membuat mesin couple: mesin yang mampu untuk menampilkan dua karakter sekaligus berdasarkan mesin karakter. HITUNG-LE Versi 1 : Program COUNTLE-1 {SKEMA PEMROSESAN DENGAN MARK} {Solusi 1: Mesin COUPLE}: Kamus : CPTLE : Integer {banyaknya ‘LE’ pada bagian pita yang sudah dibaca} C1, C2 : character {C1, C2 adalah Couple} procedure START-COUPLE {mendapatkan couple yang pertama} HITUNG-LE Versi 1 : Lanjutan Kamus {I.S. : sembarang } {F.S. : Couple pertama terbentuk : C1 = ‘ ‘, C2 = CC, CC mungkin = ‘.’} procedure ADV-COUPLE {next-couple} {I.S. : C1 dan C2, C2 ≠ ‘.’} {F.S. : C1 = C2, C2 = CC, CC mungkin = ‘.’} HITUNG-LE Versi 1 : Lanjutan Kamus Algoritma : START-COUPLE {First_Elmt} CPTLE ← 0 while (CC ≠ ‘.’) do {not End-Couple} if (C1 = ‘L’ and C2 = ‘E’) then CPTLE ← CPTLE + 1 {couple ‘LE’} {else : C1 ≠ ‘L’ or C2 ≠ ‘E’ : -} ADV-COUPLE {Next_Elmt} Output (CPTLE) {Terminasi} HITUNG-LE Versi 1 : Procedure START-COUPLE {SKEMA PEMROSESAN DENGAN MARK, Solusi 1 : mesin COUPLE}: {I.S. : sembarang } {F.S. : Couple pertama terbentuk : C1 = ‘ ‘, C2 = CC, CC mungkin = ‘.’} Kamus : Algoritma : C1 ← ‘ ‘ {karena yang dicari adalah ‘LE’, Bagaimana jika yang dicari pasangan lain?} START C2 ← CC HITUNG-LE Versi 1 : procedure ADV-COUPLE {SKEMA PEMROSESAN DENGAN MARK, Solusi 1 : mesin COUPLE}: {I.S. : C1 dan C2, C2 ≠ ‘.’} {F.S. : C1 = C2, C2 = CC, CC mungkin = ‘.’} Kamus : Algoritma : C1← C2 ADV C2 ← CC • HITUNG-LE, versi 2 : – Ide → mengingat-ingat jika menemukan ‘L’, dan memeriksa karakter selanjutnya HITUNG-LE, versi 2 : Program COUNTLE-2 {SKEMA PEMROSESAN DENGAN MARK} {Solusi 2: Memorisasi satu karakter sebelum karakter yang ada di jendela} Kamus : CPTLE : Integer {banyaknya ‘LE’ pada bagian pita yang sudah dibaca} Prec-Is-L : boolean {true jika karakter sebelum CC adalah ‘L’} HITUNG-LE, versi 2 : Algoritma : Prec-Is-L ← false {inisialisasi} CPTLE ← 0 {inisialisasi} START {First_Elmt} while CC ≠ ‘.’ do Prec-Is-L ← CC = ‘L’ ADV {Next_Elmt} if CC = ‘E’ and Prec-Is-L then CPTLE = CPTLE + 1 Output (CPTLE) {Terminasi} • HITUNG-LE versi-3 : – Ide → maju terus sampai menemukan ‘L’, dan memeriksa karakter berikutnya HITUNG-LE versi-3 Program COUNTLE-3 {SKEMA PEMROSESAN DENGAN MARK} {Solusi 3: majukan pita sampai ketemu ‘L’, periksa karakter berikutnya. Proses ini diulang sampai seluruh karakter selesai diproses}: Kamus : CPTLE : Integer {banyaknya ‘LE’ pada bagian pita yang sudah dibaca} Algoritma : CPTLE ← 0 START {First_Elmt} while (CC ≠ ‘.’) do {Cari sampai ketemu ‘L’, namun mungkin ketemu ‘.’} while (CC ≠ ‘L’) and (CC ≠ ‘.’) do ADV {CC = ‘L’ or CC = ‘.’} if (CC = ‘L’ and CC = ‘.’) then ADV {Boleh ADV, karena CC bukan‘.’} if CC = ‘E’ then CPTLE ← CPTLE + 1 {else : CC ≠ ‘L’ : -} {CC = ‘.’, seluruh karakter pada pita sudah dibaca} Output (CPTLE) {Terminasi} MESIN KATA • Dari primitif-primitif mesin karakter, dapat dibuat mesin kata yang melakukan pemrosesan terhadap pita karakter dengan anggapan tiap elemen yang diakuisisi berupa kata. • Definisi kata : sederetan karakter suksesif pada pita larakter yang merupakan karakter bukan blank • Kemungkinan isi dari pita karakter : – hanya mengandung titik (pita kosong) MESIN KATA – - hanya mengandung blank diakhiri titik hanya mengandung blank diakhiri titik - tidak mengandung blank di awal dan di akhir pita MESIN KATA - mengandung blank di akhir pita - mengandung blank di awal pita MODEL AKUISISI Berikut ini beberapa contoh model akuisisi kata pada pita karakter dengan kasus menghitung panjang rata- rata kata pada sebuah pita karakter. Versi 1 Akhir proses adalah sebuah Boolean, berisi true jika kata terakhir telah diakusisi. Kata diakuisisi mulai dari karakter pertama sesudah akhir kata. Akuisisi kata terakhir menghasilkan kata kosong. Model Akuisisi Versi 1 Program PANJANG_RATA_KATA1 { algoritma menghitung panjang rata-rata kata pada pita karakter } { Versi 1 : Skema pemrosesan tanpa penanganan kasus kosong } Kamus Constant Mark : character = ‘.’ Constant Blank : character = ‘ ’ Lkata : integer {panjang kata terakhir yang sudah diakuisisi} NbKata : integer {jumlah kata pada pita} LTotal : integer {akumulasi panjang kata} EndKata : boolean {true jika kata terakhir sudah diakusisi} Lanjutan Kamus Procedure Ignore_Blank {mengabaikan satu atau beberapa blank} {I.S : CC sembarang} {F.S : CC Blank, atau CC = mark} Procedure Hitung_Panjang {menghitung panjang kata} {I.S : CC adalah karakter pertama dari kata } {F.S : CC = Blank atau CC = mark, CC adalah karakter pertama sesudah huruf terkahir kata yang diakuisisi; Lkata berisi panjang kata yang sudah diakuisisi} Lanjutan Kamus Procedure START_KATA {mengabaikan satu atau beberapa blank} {I.S : CC sembarang} {F.S : Endkata true dan CC = mark atau EndKata false, Lkata adalah panjang kata yang sudah diakuisisi, CC karakter pertama sesudah karakter terakhir kata} Procedure ADVKATA {mengabaikan satu atau beberapa blank} {I.S : EndKata false; CC adalah karakter sesudah karakter terakhir dari kata yang sudah diakuisisi} {F.S : Endkata true dan CC = mark atau EndKata false, Lkata adalah panjang kata yang sudah diakuisisi, CC karakter pertama sesudah karakter terakhir kata} Algoritma : LTotal 0 NbKata 0 STARTKATA While not EndKata do LTotal LTotal + LKata NbKata NbKata + 1 ADVKATA depend on NbKata NbKata 0 : Output (LTotal/NbKata) NbKata 0 : Output (‘Pita tidak mengandung kata’) Procedure Ignore_Blank {mengabaikan satu atau beberapa Blank} {I.S : CC sembarang} {F.S : CC Blank atau CC = Mark} Kamus Algoritma {I.S CC sembarang} while (CC = Blank) and (CC Mark) do ADV {F.S : CC Blank atau CC = Mark} Procedure Hitung_Panjang {menghitung panjang kata} {I.S : CC adalah karakter pertama dari kata, CC Blank dan CC Mark } {F.S : CC = Blank atau CC = Mark; CC adalah karakter sesudah huruf terakhir kata yang diakuisisi; Lkata berisi panjang kata yang sudah diakuisisi} Kamus Algoritma Lkata 1 {karena berada pada karakter pertama pita} iterate ADV Stop ((CC = Mark) or (CC = Blank)) Lkata Lkata + 1 {(CC = Mark) or (CC = Blank); Lkata = # karakter kata yang diakuisisi} Procedure START_KATA {mengabaikan satu atau beberapa Blank} {I.S : CC sembarang } {F.S : Endkata True dan CC = Mark atau EndKata = False; Lkata adalah panjang kata yang sudah diakuisisi; CC karakter pertama sesudah karakter terakhir kata} Kamus Algoritma START Ignore_blank depend on CC CC = Mark : EndKata true CC Mark : EndKata false Hitung_Panjang Procedure ADVKATA {mengabaikan satu atau beberapa Blank} {I.S : EndKata = false; CC adalah karakter sesudah karakter karakter terahir kata yang sudah diakusisi } {F.S : Endkata True dan CC = Mark atau EndKata = False; Lkata adalah panjang kata yang sudah diakuisisi; CC karakter pertama sesudah karakter terakhir kata} Kamus Algoritma Ignore_blank depend on CC CC = Mark : EndKata true CC Mark : Hitung_Panjang