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 :

  1. Digit ke 3n+1 (dari kanan) pasti diikuti kata “ribu”, “juta”, “milyar”, dst
    KECUALI JIKA digit 3n+1 hingga digit 3n+3 bernilai ‘0’.
  2. 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)
  3. Digit ke 3n+3 pasti dikuti kata “ratus” KECUALI digit tersebut = ‘0’
  4. 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”.
  5. 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.
  6. 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.

One thought on “Program Penerjemah Bilangan

  1. opi mengatakan:

    mmm,,

    kaya’nya awal semester satu aku pernah dpt tugas kaya’ gitu dech,,
    ^^

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s