• Tidak ada hasil yang ditemukan

MESIN KARAKTER (Model akses sekuensial)

ADV ; INC { CC=' ', CI=3}

4. FREKUENSI HURUF ‘A’

Diberikan sebuah mesin karakter dengan pita berisi karakter (mungkin kosong), Buatlah algoritma untuk menghitung frekuensi relatif huruf 'A' yang ada pada pita tsb., Frekuensi relatif huruf ‘A’ adalah banyaknya huruf 'A' dibandingkan banyaknya seluruh karakter yang ada pada pita karakter.

Program FREKA-1

{SKEMA PEMROSESAN dengan Mark, tanpa penanganan kasus kosong} { tidak memakai mesin pencacah, melainkan menyimpan dalam nama } { yang didefinisikan pada Kamus }

Kamus:

CPT_KAR : integer { banyaknya karakter yang sudah dibaca} CPTA : integer ( banyaknya huruf A yang muncul

pada bagian pita yang sudah dibaca}

Algoritma: CPT_KAR ← 0 { Inisialisasi } CPTA ← 0 { Inisialisasi } START {First_Elmt} while (CC ≠ ‘.’) do CPT_KAR ← CPT_KAR + 1 if (CC = 'A' ) then CPTA ← CPTA + 1

else { CC ≠ 'A' Î aksi kosong }

-

ADV {Next_Elmt}

{ CC ='.' : semua karakter pada pita sudah dibaca, mungkin CPT_KAR = 0 } {Terminasi}

if (CPT_KAR ≠ 0 ) then

Output (CPTA/CPT_KAR) else { CPT_KAR = 0 }

Output (‘Frekuensi tidak terdefinisi )

Penjelasan :

1. Banyaknya karakter ‘A’ pada pita kosong tidak terdefinisi. 2. Banyaknya karakter pada pita kosong adalah nol

3. Perhatikan invarian CC, CPTA dan CPT_KAR yang selalu benar

4. Pembagian dengan nol dihindarkan dengan analisis kasus pita kosong atau tidak pada bagian TERMINASI.

Program FREKA-2

{SKEMA PEMROSESAN dengan Mark, dengan penanganan kasus kosong} { tidak memakai mesin pencacah }

Kamus:

CPT_KAR : integer { banyaknya karakter pd pita yang sudah dibaca} CPTA : integer ( banyaknya huruf A yang muncul

pada bagian pita yang sudah dibaca}

Algoritma:

START {First_Elmt} if (CC = '.') then

output (“Pita kososng”} else {CC ≠ '.' } CPT_KAR ← 0 { Inisialisasi } CPTA ← 0 { Inisialisasi } repeat CPT_KAR ← CPT_KAR + 1 if (CC = 'A' ) then CPTA ← CPTA + 1 { else {CC ≠ '.' =>do nothing }

ADV {Next_Elmt} until (CC ='.')

Output (CPTA/CPT_KAR) {Terminasi. CPT_KAR pasti tidak nol}

Penjelasan :

1. Banyaknya karakter ‘A’ pada pita kosong tidak terdefinisi. 2. Banyaknya karakter pada pita kosong adalah nol

3. Jika kasus kosong tidak ditangani secara khusus, maka akan terjadi pembagian dengan nol.

5. HITUNG-LE

Diberikan sebuah mesin karakter dengan pita berisi karakter (mungkin kosong), Buatlah algoritma untuk menghitung banyaknya pasangan dua huruf 'LE' yang ada pada pita tsb.

Versi 1:

Realisasi dengan membuat mesin "couple" yaitu mesin yang mampu untuk menampilkan dua karakter sekaligus berdasarkan mesin karakter. Couple adalah dua buah karakter berturutan (suksesif) yang meuncul pada pita.

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 } { 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 = '.' }

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}

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

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: Skema : C1 C2 ADV C2 CC

Penjelasan :

1. Solusi ini memakai Hitung A sebagai pola solusi. Pada solusi ini, couple ‘LE’ analog dengan sebuah huruf ‘A’.

2. Banyaknya ‘LE’ pada pita kosong adalah nol.

3. Banyaknya ‘LE’ pada pita dengan satu karakter adalah nol.

4. Banyaknya ‘LE’ pada pita yang tidak mengandung dua huruf suksesif ‘LE’ adalah nol. Dalam hal ini tidak dapat dibedakan antara nilai nol pada pita kosong, pita satu karakter atau untuk pita yang tidak mengandung ‘LE’

5. Perhatikan pendefinisian couple yang pertama : C1= Blank dan C2 = huruf pertama pada pita. Couple pertama ini merupakan couple yang dibuat berdasarkan definisi pemrogram, bukan merupakan couple yang sesungguhnya muncul pada pita.

6. Buatlah solusi dengan mengambil couple pertama yang muncul pada pita adalah benar-benar dua karakter pertama pada pita. Solusi ini mengharuskan akses terhadap karakter pertama pita. Jika pita kosong atau mengandung hanya satu karakter, maka pita ‘couple’ akan merupakan pita kosong (couple pertama tidak terdefinisi).

7. Solusi dengan pendefinisian couple pertama bukan dari pita bukan solusi yang ideal, namun ‘praktis’. Harap hati-hati dengan pemberian harga yang bukan berasal dari pita yang diberikan.

HITUNG-LE, versi 2 :

Idenya adalah mengingat-ingat jika menemukan 'L', dan memeriksa karakter yang selanjutnya. Di sini tidak dibentuk mesin abstrak lain seperti pada solusi 1.

Program COUNTLE2

{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'}

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}

Penjelasan :

1. Solusi ini bukan mengambil pola Hitung ‘A’. 2. Banyaknya ‘LE’ pada pita kosong adalah nol.

3. Banyaknya ‘LE’ pada pita dengan satu karakter adalah nol.

4. Banyaknya ‘LE’ pada pita yang tidak mengandung dua huruf suksesif ‘LE’ adalah nol. Dalam hal ini tidak dapat dibedakan antara nilai nol pada pita kosong, pita satu karakter atau untuk pita yang tidak mengandung ‘LE’

5. Prec-Is-L adalah sebuah boolean, dapat pula direpresentasi dengan sebuah nama bertype character, yang setiap saat berisi nilai huruf yang muncul sebelum karakter pada jendela. Inisialisasi untuk CC = karakter pertama pada pita menjadi persoalan yang sama dengan versi-1

HITUNG-LE versi- 3 :

Idenya adalah maju terus sampai menemukan 'L', dan memeriksa karakter yang berikutnya

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 yg sudah dibaca}

Algoritma :

CPTLE ← 0 {Inisialisasi}

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

Penjelasan :

1. Solusi ini berdasarkan ‘pencarian’ karakter ‘L’ pada pita, dan memeriksa karakter sesudahnya. Jika karakter pada jendela = ‘L’, pasti pita belum berada pada mark; karena itu boleh ADV

2. Banyaknya ‘LE’ pada pita kosong adalah nol.

3. Banyaknya ‘LE’ pada pita dengan satu karakter adalah nol.

4. Banyaknya ‘LE’ pada pita yang tidak mengandung dua huruf suksesif ‘LE’ adalah nol. Dalam hal ini tidak dapat dibedakan antara nilai nol pada pita kosong, pita satu karakter atau untuk pita yang tidak mengandung ‘LE’.

5. Solusi ini bukan merupakan skema sekuensial dengan mark yang murni. Perhatikan modifikasi yang dilakukan, dan test setiap kali hendak dilakukan ADV.