3.
Pemprosesan Teks
Pernahkan anda melihat gambar slide yang diproyeksikan oleh slide proyector? 際際滷
adalah sekumpulan film negatif yang tersusun secara beruntun (sequential), yang
untuk melihat gambarnya, film tersebut digerakan satu per satu ke lubang lensa
proyektor. Proyektor memproyeksikan gambar slide ke layar.
Cara yang sama juga berlaku pada film bioskop, bedanya film bioskop digerakkan
sangat cepat sehingga kesan mata kita menangkap gambar-gambar itu bergarak.
Objek lain yang digerakkan secara beruntun adalah pita kaset. Kalau kita ingin
mendengarkan lagu yang ada ditengah kaset, kita harus memutar pita dari posisi
awal sampai pertengahan kaset.
Kumpulan film negatif dalam slide itu dapat dianggap sebagai sekumpulan data yang
tersusun secara beruntun. Tiap-tiap data dalam runtunan itu diakses satu per satu
dari awal sampai akhir. Diakses artinya data tersebut dicapai lau diproses bergantung
pada proses yang diinginkan. Model pengaksesan data yang tersusun secara
beruntun itu dinamakan model pengkaksesan beruntun.
4.
Susunan Teks
Mengakses data yang tersusun secara beruntun ini akan sering kita jumpai dalam
pemrograman. Contoh data seperti itu adalah larik,arsip beruntun (sequential
file),arsip teks (text file) dan senari berkait(linked list).
Arsip teks untuk selanjutnya kita sebut teks adalah arsip yang terdiri atas deretan
karakter. Untaian karakter itu dapat membentuk sebuah kata. Yang dimaksud
dengan kata adalah kelompok karakter yang dipisahkan dengan kelompok lain
dengan satu atau lebih spasi. Pada implementasinya, di dalam teks ditambahkan
akhir baris (end-of-line) yang membedakan sebuah baris teks dengan baris lainnya
(end-of-line terdiri dari karakter line-feed). Contoh teks adalah program sumber
(source program). Pascal (yaitu arsip *.PAS) atau C (arsip *.C), arsip README.TXT
pada beberapa program aplikasi tertentu, arsip AUTOEXEC.BAT pada sistem
operasi DOS, dan lain-lain. Teks dapat dibuat dengan pengolah kata teks, seperti
Notepade, 際際滷Kick, editor kompilator bahasa pemrogaman seperti Turbo Pascal
atau Turbo C, atau dengan pengolah kata Microsof Word asalkan disimpan (save
as)sebagai arsip teks (Teks Only).
5.
Pemrosesan teks cukup banyak ditemui di dalam aplikasi pemrograman. Misalnya
program pengolah kata (text editor) adalah program yang mengolah teks.
Pemrosesan teks antara lain proses mencari (search) sebuah karakter atau
string,menghitung jumlah karakter atau jumlah kata, menempatkan pointer
pembacaan ke karkter/kata tertentu, dan sebagainya. Aplikasi lain yang memproses
teks adalah kompilator bahasa pemrograman. Tugas pertama kompilator adalah
membaca program sumber untuk mengambil simbol-simbol (keyword, peubah
,tetapan ,dsb). Komponen kompilator yang melakukan aktivitas ini dinamakan
program scaner.
Dalam meninjau model pengaksesan beruntun pada teks, kita tidak memandang
sebuah teks disusun oleh baris-baris teks. Andaikan baris-baris sebuah teks dapat
kita gunting lalu ujung kanan baris pertama kita sambung dengan ujung baris kedua ,
ujung kanan baris kedua disambung dengan ujung kiri baris ketiga, begitu
seterusnya. Akhirnya , kita memperoleh sebuah pita yang berisi runtunan karakterkarakter, seperti yang di bawah ini :
損
Halo, apa kabar? Saya disini sedang belajar algoritma.............
損 Suatu teks P didefinisikan di dalam bagian DEKLARASI sebagai
berikut :
DEKLARASI
P : teks ( P adalah perubah teks)
6. Tanda akhir Teks
Pemrosesan teks yang utama adalah proses pembacaan. Karena teks berisi
runtunan karakter, maka pembacaan teks adalah membaca karakter demi karakter
secara beruntun, mulai dari awal teks sampai akhir teks. Akhir teks ditandai dengan
sebuah karakter khusus, yang dibedakan dengan karakter-karakter lainnya. Bila
pembacaan teks bertemu dengan karakter khusus tersebut, maka proses pembacaan
teks dihentikan.
Di dalam buku ini, kita mendefinisikan karakter titik (.) sebagai akhir teks (tetapi, ini
bukan satu-satunya karakter akhir teks yang dapat digunakan. Anda juga dapat
menggunakan karakter lain seperti #,*,$, dan sebagainya, asalkan di dalam teks
itu sendiri karakter tersebut tidak pernah digunakan ). Karakter titik ditaruh sesudah
karakter terakhir. Kita mengartikan karakter titik bukan bagian dari elemen teks.
Sekali lagi, karakter titik hanya sebagai penanda akhir arsip. Sembarang teks yang
kita susun harus diakhiri dengan titik agar algoritma yang kita susun berlaku.
7. Definisi Teks kosong
Pemrosesan teks selalu mempertimbangkan keadaan awal teks, yaitu kosong atau
tidak kosong. Sebuah teks mungkin saja kosong. Pertama-tama kita harus
mendefinisikan makna kosong itu sendiri. Karena kita telah membuat perjanjian
bahwa sembarang teks harus diakhiri dengan karakter titik , maka teks kosong
adalah teks yang hanya berisi karakter titik. Pada teks kosong, jumlah unsurnya
adalah 0, seperti dibawah ini
-
8. Pembacaan Teks
Pembacaan teks dimulai dari awal teks (dari kiri ke kanan). Kita mengandaikan
ada sebuah pointer (dilambangkan dengan b) yang menunjuk ke karakter yang akan
dibaca. Setiap kali karakter yang ditunjuk oleh pointer selesai dibaca, pointer
berpindah secara otomatis ke karakter berikutnya. Karakter yang sedang ditunjuk
oleh pointer dinyatakan di dalam perubah C.
KRMS9$SATE
9.
Contoh di atas memperlihatkan pointer menunjuk karakter M. Jika karakter ini
dibaca, maka C berisi M. Karakter K dan karakter R sudah dibaca sebelumnya,
sedangkan karakter S,9,$, dan seterusnya belum dibaca. Pembacaan teks hanya
dilakukan selama C.. jika C = . Dikatakan akhir pita telah dicapai dan pembacaan
pita dihentikan.
Nama perubah C didefinisikan di dalam bagian DEKLARSI program utama, sehingga
ia dikenal di seluruh bagian algoritma termasuk prosedur dan fungsi yang dipakai
oleh algoritma.
DEKLARASI
C : char ( karakter yang sedang ditunjuk oleh
pointer baca )
Didefinisikan RESET_TEKS adalah prosedur universal untuk teks.
RESET_TEKS menyebabkan pointer akan menunjuk pada karakter pertama
di teks. Jika teks kosong,pointer menunjuk karakter titik.
Procedure RESET_TEKS
( Menyiapkan teks pada posisi awal. )
( K. Awal : sembarang )
( K. Akhir : pointer menunjuk pada karakter pertama di dalam teks. Akibat pemanggilan
prosedur ini, pointer menunjuk ke karakter pertama teks. Karakter yang ditunjuk mungkin .)
10.
Notasi yang digunakan untuk membaca karakter dari teks P adalah :
Read(P;C) ( Membaca karakter yang ditunjuk oleh pointer baca dari
Teks P. Karakter yang dibaca disimpan di
dalampeubah C)
Di bawah ini diberikan beberapa contoh kasus pemrosesan teks. Algoritmanya diyulis
dalam bentuk prosedur atau fungsi. Pemanggilan prosedur dapat dilakukan dari
program utama atau dari prosedur lain.
Menghitung banyaknya karakter di dalam pita (tidak termasuk karakter .)
Prosedure HITUNG_BANYAK_KAR (output n : integer)
( Menghitung banyaknya karakter di dalam teks. )
( K. Awal : sembarang. )
( K. Akhir : n berisi banyaknya karakter di dalam teks. )
DEKLARASI
( tidak ada )
DESKRIPSI :
n0
RESET_TEKS
Read (P:C)
While C . do
nn+1
read (P,C) ( baca karakter berikutnya )
endwhile
(c=.)
11.
Menghitung jumlah karakter B di dalam teks.
Prosedure HITUNG_BANYAK_KAR_B (output nb : integer)
( Menghitung banyaknya karakter B di dalam teks. )
( K. Awal : nb belum terdefinisi nilainya. )
( K. Akhir : nb berisi banyaknya karakter B di dalam pita. )
DEKLARASI
( tidak ada )
DESKRIPSI :
nb0
RESET_TEKS
Read (P:C)
While C . do
If C= B then
nbnb + 1
endif
read (P,C) ( baca karakter berikutnya )
endwhile
(c=.)
12.
Algoritma HITUNG_BANYAK_KAR_B diatas masih memiliki kelemahan. Baik pada
teks kosong maupun pada teks yang sama sekali tidak berisi karakter B, nilai nb di
akhir prosedur adalah nol. Karena itu, kita harus membedakan nilai nb untuk teks
kosong dan nilai nb untuk teks yang tidak berisi karakter B. Kasus teks kosong
harus ditangani secara khusus. Jika teks kosong, maka nb diisi dengan nilai -99.
Prosedure HITUNG_BANYAK_KAR_B (output nb : integer)
( Menghitung banyak karakter B di dalam teks. )
( K. Awal : nb belum terdefinisi nilainya. )
( K. Akhir : nb berisi banyaknya karakter B di dalam teks ; jika teks kosong, maka nb diisi
-99 )
DEKLARASI
( tidak ada )
DESKRIPSI :
RESET_TEKS
Read (P:C)
if C= . then (teks kosong)
nb -9999
else (C . )
nb0
If C= B then
nbnb + 1
endif
read (P,C) ( karakter C berikutnya )
until C= .
Endif
13.
Pemanggilan HITUNG_BANYAK_KAR_B di dalam program utama adalah sebagai
berikut :
Program HITUNG_BANYAK_KARAKTER_B
( program utama untuk menghitung banyak karakter B di dalam teks )
DEKLARASI
C : char
Cb : integer ( banyak hurup B di dalam pita )
Procedure RESET_TEKS
(menyiapkan teks pada posisi awal. Pointer baca menunjuk pada karakter
pertama di dalam teks. Karakter pertama mungkin . )
DESKRIPSI :
HITUNG_BANYAK_KAR-B(cb)
If cb=-99 then
Write(teks kosong)
Else
Write(cb)
Endif
Menghitung banyak pasangan hurufAN di dalam teks. Misalnya pada
teks dibawah ini banyak AN ada 3 buah,
PANDANGAN J.
14.
Versi 1 (SALAH)
Gagasan algoritma ini adalah memeriksa apakah karakter yang sedang dibaca
merupakan huruf A. Jika ya, maka baca karakter berikutnya. Jika karakter
berikutnya adalahN, naikkan pencacah yang mencatat banyaknya AN.
Procedure HITUNG_BANYAK_AN (output nAN : integer)
( Menghitung banyak pasangan huruf AN di dalam teks. )
( K. Awal : nAN belum terdefinisi nilainya. )
( K. Akhir : nAN berisi banyaknya AN di dalam teks. Jika teks kosong, maka nAN diisi nilai
-99. )
DEKLARASI
( tidak ada )
DESKRIPSI :
RESET_TEKS
Read (P:C)
if C= . then ( teks kosong)
nAN-99
else ( c . )
nAN 0
repeat
If C= A then
Read (P;C)
If C = N then
nAN nAN +1
endif
endif
read (P,C)
until C= .
endif
15.
Prosedure HITUNG_BANYAK_AN ini akan salah untuk kasus karakter sebelum titik
adalah A, seperti pita berikut :
KENTANGD UA.
Ketika karakter yang dibaca menunjuk A, teks dibaca lagi satu karkter. Pointer
sekarang menunjuk . Setelah pemeriksaan if c = N teks dibaca lagi satu karakter,
namun karena teks sudah dicapai, algoritma akan salah fatal !
Algoritma prosedure HITUNG_BANYAK_AN diperbaiki dengan membuat kalang
while-do yang akan terus membaca teks selama karakter yang dibaca tidak sama
dengan A dan tidak sama dengan ..
16. Procedure HITUNG_BANYAK_AN (output nAN : integer)
( Menghitung banyak pasangan huruf AN di dalam teks. )
( K. Awal : nAN belum terdefinisi nilainya. )
( K. Akhir : nAN berisi jumlah AN di dalam teks. Jika teks kosong, maka nAN diisi nilai
-99. )
DEKLARASI
( tidak ada )
DESKRIPSI :
RESET_TEKS
Read (P:C)
if C= . then ( teks kosong)
nAN-99
else ( c . )
nAN 0
repeat
(baca teks sampai ketemu A atau
. )
while ( C A) and (C . ) do
read (P:C)
endwhile
(C= A or c = . )
If C = A then
Read (P:C)
If C= N then
nAN nAN + 1
endif
endif
until C= .
endif
17.
Versi 2 (Benar)
Gagasan Versi dua ini adalah dengan menggunakan dua buah nama peubah,
c_yang_lalu dan c. Peubah pertama menyimpan karakter yang terakhir kali dibaca,
sedangkan peubah kedua menyimpan karakter yang sedang ditunjuk oleh pointer
baca. Setiap kali membaca teks periksa apakah c_yang_lalu=A dan c=N. Peubah
c_yang_lalu diinisialisasi dengan karakter spasi.
Procedure HITUNG_BANYAK_AN (output nAN : integer )
( menghitung banyak pasangan huruf AN di dalam teks. )
( K. Awal : nAN belum terdefinisi hasilnya )
( K. Akhir : nAN berisi banyaknya AN di dalam teks. Jika teks kosong.
Maka nAN diisi nilai -99)
DEKLARASI
C_yang_lalu : char