Bismillaah, Alhamdulillah,
Salah satu materi yang disampaikan dalam mata pelajaran Matematika untuk anak kelas 4 SD adalah membaca lambang bilangan.
Hal ini cukup menarik bagaimana seorang anak yang semula diajarkan cara mengenal lambang bilangan (atau angka), menghafalnya, dan kemudian membacanya secara benar jika lambang bilangan tersebut merupakan suatu rangkaian dari banyak bilangan.
Tahap pertama untuk mengenal lambang bilangan adalah mulai dari angka 0 sampai dengan 9. Angka tersebut dapat dikatakan sebagai angka dasar dari semua angka yang sudah dirangkai.
Dalam logika pemrograman, kita dapat memanfaatkan sebuah larik (array) untuk menyimpan pelafalan lambang bilangan atau selanjutnya kita sebut dengan label bilangan. Penggunaan list atau tuple dalam bahasa pemrograman Python saya kira sudah mencukupi.
Tahap 1. Membuat daftar label dengan angka dasar
1. Buat tuple (atau list) untuk menyimpan label angka dari 0 s/d 9;
2. Panggil isi tuple berdasarkan angka masukan terhadap indeks dari label angka;
listLabelAngka = ('nol', 'satu', 'dua', 'tiga', 'empat', 'lima', 'enam', 'tujuh', 'delapan', 'sembilan')
# cek indeks bilangan
print(listLabelAngka[0]) # output: 'nol'
print(listLabelAngka[5]) # output: 'lima'
print(listLabelAngka[8]) # output: 'delapan'
3. Uji dengan angka sebagai parameter masukan.
angka = 3
print(listLabelAngka[angka]) # output: 'tiga'
Catatan:
Jangan lupa! indeks larik dalam Python selalu diawali dengan 0
Tahap 2. Angka masukan lebih dari 9 hingga 99
- Periksa dan validasi angka masukan yang lebih dari 9;
- Karena angka ini sudah masuk ke area “puluhan”, maka kita membutuhkan tiga tempat untuk menampung data, yaitu angka puluhan (angka paling kiri), data satuan (misal: “puluh”), dan angka satuan (angka paling kanan);
- Angka puluhan_ diperoleh dari angka masukan dibagi 10 (pembagian bilangan bulat), sedangkan angka satuan diperoleh dari angka masukan modulo (sisa hasil bagi) terhadap 10;
- Luaran adalah gabungan dari ketiga data tersebut.
angkaDepan = angka // 10
satuan = "puluh"
angkaSatuan = angka % 10
teks = listLabelAngka[angkaDepan] + " " + satuan + " " + listLabelAngka[angkaSatuan]
print(teks)
Berikut ini contoh kode lengkapnya.
Dalam kode tersebut di atas sudah cukup memadai untuk membaca bilangan dari 0 s/d 99. Hanya saja masih bermasalah (dengan pembacaan yang tidak alami) terhadap angka masukan mulai dari angka 10 s/d 19, serta setiap bilangan yang berakhiran dengan angka nol, dimana contoh hasilnya adalah sebagai berikut.
Angka 10, memiliki luaran: "satu puluh nol", seharusnya "sepuluh"
Angka 13, memiliki luaran: "satu puluh tiga", seharusnya "tiga belas"
Angka 90, memiliki luaran: "sembilan puluh nol", seharusnya "sembilan puluh"
dst...
Solusi:
a. Untuk luaran yang berakhiran dengan “nol” dapat disiasati dengan pengecekan label. Jika sisa hasil bagi adalah nol, maka angka satuan tidak perlu ditambahkan, sebaliknya dapat ditambahkan;
if angkaSatuan == 0:
teks = listLabelAngka[angkaDepan] + " " + satuan
else:
teks = listLabelAngka[angkaDepan] + " " + satuan + " " + listLabelAngka[angkaSatuan]
b. Penyebutan tidak alami angka 10 — yang seharusnya dibaca “sepuluh” namun dibaca “satu puluh” — dapat disiasati dengan modifikasi kode sebelumnya. Yaitu pengecekan apakah angka depan adalah angka 1;
if angkaSatuan == 0:
if angkaDepan == 1:
teks = "se" + satuan
else:
teks = listLabelAngka[angkaDepan] + " " + satuan
c. Adapun untuk angka dalam kelompok “belasan”, yaitu angka 11 s/d 19, dapat disiasati dengan memeriksa apakah angka depan adalah angka satu, dan seterusnya.
if angkaDepan == 1:
satuan = "belas"
if angkaSatuan == 0:
teks = "sepuluh"
elif angkaSatuan == 1:
teks = "se" + satuan
else:
teks = listLabelAngka[angkaSatuan] + " belas"
Berikut ini contoh kode lengkapnya.
Tahap 3. Membaca bilangan hingga satu kuadriliun/dwiyar kurang satu
Sebenarnya angka berapapun (dalam format integer atau bilangan bulat) tanpa dibatasi juga dapat dibaca. Hanya saja dalam kode ini saya batasi hingga nilai 1 kuadriliun/dwiyar (10¹⁵ - 1) untuk “penyederhanaan” 😀.
Untuk rentang nilai lebih besar atau sama dengan 100 (ratusan), ribuan, jutaan, dan seterusnya; hal ini akan menjadikan kode terlalu panjang jika dibuat semua aturannya (rules-based) secara lengkap. Sehingga untuk meminimalkan kode, dapat dibuat fungsi yang dipanggil secara berulang atau dikenal dengan istilah rekursi atau rekursif ¹.pdf) ² .
Ada beberapa modifikasi dari kode sebelumnya adalah:
- Tuple label angka dimulai dari penyebutan bilangan 0 s/d 11;
- Dibuat fungsi untuk pemeriksaan angka masukan, harus berupa (atau dapat dikonversi ke format) bilangan integer. Termasuk di dalamnya bilangan bulat negatif;
- Validasi label angka “nol” dibuat dalam sebuah fungsi tersendiri, sekaligus untuk merapikan teks dari adanya multiple space (banyak spasi) yang tergabung;
- Pembacaan bilangan dibuat dalam sebuah fungsi yang dapat dipanggil di dalam fungsi itu sendiri (rekursif).
Kode sumber pembaca lambang bilangan dengan variasi lain dapat ditemukan di Github saya.
Demikian tutorial langkah per langkah dalam membuat aplikasi pembacaan lambang bilangan dalam bahasa pemrograman Python. Saran dan masukan tentunya sangat saya terima dengan baik.
Terima kasih.
Bacaan Lebih Lanjut.
- Rinaldi Munir. (2015). Rekursi dan Relasi Rekurens. Retrieved October 11, 2021, from https://informatika.stei.itb.ac.id/~rinaldi.munir/Matdis/2015-2016/Rekursi%20dan%20Relasi%20Rekurens%20(2015).pdf.pdf)
- Khabib Mustofa, Dr. techn. (n.d.). PROSEDUR dan FUNGSI REKURSIF. Retrieved October 11, 2021, from http://www.khabib.staff.ugm.ac.id/index.php?option=com_content&task=view&id=82&Itemid=33