Menyelesaikan Soal Ujian Pemrograman

Riri Maiyuliani
3 min readSep 16, 2021

Assalamualaikum. Kali ini saya akan membuat tulisan singkat mengenai sebuah soal ujian pemrograman yang sempat diposting di twitter. Telah banyak akun yang memposting solusi untuk soal tersebut di twitter, termasuk saya sendiri. Jadi pertanyaannya adalah membuat sebuah program yang dapat menghitung jumlah tahun, bulan, minggu dan hari dari sebuah angka yang merepresentasikan jumlah hari. Misalnya pada soal tersebut diberikan angka 452 hari, maka nilainya adalah 1 tahun, 2 bulan, 3 minggu, dan 6 hari. Nilai tersebut diperoleh dengan asumsi bahwa dalam 1 tahun ada 365 hari. Agar lebih jelas, berikut ini adalah gambar soal tersebut:

Programming Exam

Saya akan membuat 2 buah solusi untuk soal tersebut yaitu dengan menggunakan PowerShell dan bahasa C. Pada dasarnya algoritma untuk perhitungannya cukup sederhana seperti ini (dijelaskan pada sebuah cuitan):

  • Ambil input dari pengguna misalnya pada contoh soal di atas adalah 452.
  • Tahun = 452 / 365, sisa harinya disimpan dalam variabel t dimana t = 452 % 365.
  • Bulan = t / 30.
  • Minggu = (t % 30) / 7
  • Hari = ((t % 30) / 7) % 7

Setelah mengetahui algoritma perhitungannya, maka waktunya untuk membuat solusi pertama menggunakan PowerShell. Jawaban yang saya buat dapat dilihat di sini atau pada gambar berikut ini:

Solusi Menggunakan PowerShell

Mungkin source code tersebut agak sulit untuk dibaca, jadi berikut ini adalah source code dengan format yang lebih mudah dimengerti. Inti dari source code ini adalah penggunaan method [System.math]::DivRem.

Selanjutnya adalah menggunakan bahasa C dengan inline assembly. Alasan penggunaan inline assembly adalah karena bahasa assembly untuk arsitektur x86 sudah menyediakan instruksi yang sama dengan method [System.math]::DivRem pada PowerShell di atas. Instruksi yang dimaksud adalah instruksi div. Penjelasan sederhana untuk instruksi div menggunakan register 32bit adalah meletakkan nilai yang akan dibagi pada register EDX:EAX, lalu membaginya menggunakan instruksi div yang disertai register atau memori 32bit. Hasil dari pembagian tersebut akan disimpan pada register EAX sedangkan sisanya akan disimpan pada register EDX. Dengan demikian, untuk perhitungan/pembagian selanjutnya isi dari register EDX cukup dipindahkan ke register EAX dengan menggunakan instruksi XCHG, kemudian register EDX dikosongkan dengan menggunakan instruksi XOR. Agar lebih jelas, berikut ini adalah source code untuk solusi tersebut:

Cara melakukan kompilasi untuk source code tersebut adalah dengan menggunakan perintah:

cl /nologo /MD solusi_exam.c

Jika dijalankan maka akan seperti ini (perlu diingat bahwa pada gambar berikut ini source code tersebut diberi nama solusi.c):

Solusi Menggunakan C dan Inline Assembly

Untuk lebih jelasnya mengenai contoh penggunaan inline assembly pada pemrograman C di Windows bisa dibaca pada situs dokumentasi Microsoft. Cukup sampai di sini dulu untuk tulisan kali ini. Wassalam.

--

--

Riri Maiyuliani

Dinas Pendidikan dan Kebudayaan Kabupaten Lima Puluh Kota