HITUNG-LE Versi 1 - Telkom University

advertisement
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
Download