Program Penerjemah Bilangan
Ok, next program, pengeja bilangan.
Kebetulan, dulu temen saya pernah minta tolong dibuatkan program ini untuk tugas kuiahnya, jadi saya tinggal copy-paste
Bagaimana caranya membuat program untuk membaca digit angka ini?
Sebeumnya, mari kita analisis masalahnya dulu.
Disediakan bilangan yang tersusun dari m digit angka.
Kita lihat angka ini mulai dari yang paling kanan.
Untuk n>=0 berlaku lemma sebagai berikut :
- Digit ke 3n+1 (dari kanan) pasti diikuti kata “ribu”, “juta”, “milyar”, dst
KECUALI JIKA digit 3n+1 hingga digit 3n+3 bernilai ‘0′. - Digit ke 3n+2 pasti diikuti kata “puluh”, KECUALI :
- digit tersebut ‘0′
- digit ke 3n+2=’1′ dan digit ke 3n+1<>’0′ (karena menghasilkan angkabelasan)
- Digit ke 3n+3 pasti dikuti kata “ratus” KECUALI digit tersebut = ‘0′
- Karakter ‘1′ ditulis sebagai “satu” jika berada pada posisi 3n+1. KECUALI pada posisi ke 4 (ribuan), bisa ditulis sebagai “se” (’seribu’) jika dua digit didepannya (digit 5 dan 6) adalah ‘0′. Selain pada posisi itu dan posisi 3n+2, ‘1′ ditulis sebagai “se”.
- Jika karakter ‘1′ menempati posisi 3n+2, maka
- jika karakter dibelakangnya (3n+1) adalah ‘0′ maka kedua digit ditulis sebagai “se”+”puluh”
- jika karakter dibelakangnya (3n+1) bukan ‘0′ maka kedua digit ditulis sebagai “”+”belas”, kemudian ind dan i masing2 dikurangi 1
yang berarti kedua digit sudah diterjemahkan.
- Karakter ‘0′ tidak diterjemahkan.
Dari lemma-lemma diatas, terlihat bahwa blok seleksi/ logika akan sangat dominan dalam program ini. Pertama-tama kata-kata untuk menerjemahkan digit angka ini kita simpan dahulu dalam array. Dan untuk memudahan penerjemahan dan indexingnya (yup! kita akan bermain-main dengan index di sini
), angka ini kita baca dari yang paling kanan (atau lebih mudahnya, angkanya kita balik!). Oh, iya! Jangan lupa dengan special casenya yah! Hati-hati dengan angka 0 dan 1!
So, here it is listing yang saya buat
var pangkat3:array[0..4] of string=('','ribu ','juta ','milyar ','trilyun ');
//pangkat3 => kata untuk orde 10^3n
atrib:array[0..3] of string=('belas ','','puluh ','ratus ');
//atrib => untuk ratusan, puluhan dan belasan
angka:array[0..9] of string=('se','satu','dua','tiga',
'empat','lima','enam',
'tujuh','delapan','sembilan');
//angka => menerjemahkan tiap digit angka
inp:string;
//inp => angka yang akan diterjemahkan
ind:integer;
//ind => bernilai 1-3 untuk menyatakan digit ke 3n+ind
//berfungsi menentukan atrib yang akan digunakan
i,j:integer;
c:char;
begin
readln(inp);
i:=length(inp);
inp:='0'+inp; //mengatasi input '0'
while (inp<>'') and (inp[1]='0') do
begin
delete(inp,1,1);
end;
if inp='' then
begin
writeln('nol');
halt;
end;
i:=length(inp);
while i mod 3<>0 do //ditambah '0' sampai panjangnya kelipatan 3
begin //untuk mempermudah penulisan nantinya
inp:='0'+inp;
inc(i);
end;
ind:=3;
for j:=1 to i div 2 do //angka dibalik, biar gampang diproses
begin
c:=inp[j];
inp[j]:=inp[i+1-j];
inp[i+1-j]:=c;
end;
while i<>0 do
begin
{angka 1 biasa atau menimbulkan angka belasan?}
if inp[i]='1' then
if ind<>2 then
{pilih "se" atau "satu"?}
if ((ind=1) and (i<>4)) or
((i=4) and ((inp[5]<>'0') or (inp[6]<>'0'))) then
write(angka[1],' ')
else
write(angka[0])
else
begin
{angka belasan dan "sepuluh"}
if (inp[i-1]='0') then write(angka[0])
else
begin
if inp[i-1]='1' then write(angka[0],atrib[0])
else
begin
val(inp[i-1],j);
write(angka[j],atrib[0]);
end;
dec(i);
dec(ind);
end;
end
else
if inp[i]<>'0' then
begin
{angka-angka lainnya}
val(inp[i],j);
write(angka[j],' ');
end;
{ratus dan puluh}
if inp[i]<>'0' then write(atrib[ind]);
{ribu, juta, milyar}
if (ind=1) and ((inp[i]<>'0') or (inp[i+1]<>'0') or (inp[i+2]<>'0')) then
write(pangkat3[(i-1) div 3]);
dec(ind);
dec(i);
if ind=0 then ind:=3;
end;
writeln;
readln;
end.
opi berkata,
Desember 24, 2008 pada 9:29 am
mmm,,
kaya’nya awal semester satu aku pernah dpt tugas kaya’ gitu dech,,
^^