Jumat, 23 Mei 2014

Membuat Program Computer Based Test Dengan Delphi Tahap 2 - Menyimpan Soal di File Luar

Artikel "Membuat Program Computer Based Test Dengan Delphi 2" merupakan kelanjutan dari artikel sebelumnya yang berjudul "Bagaimana Membuat Program Computer Based Test Sederhana Dengan Delphi".

Di dalam artikel sebelumnya sudah dibahas dari awal hingga sebuah Computer Based Test (CBT) bisa jalan dan melakukan penilaian. Semua pertanyaan disimpan di dalam program dalam bentuk konstanta.

Salah satu kelemahan di CBT sebelumnya yaitu apabila daftar pertanyaan berubah, maka orang perlu memodifikasi program dan melakukan recompile. Di sini akan dijelaskan bagaimana supaya CBT tersebut bisa mengambil data soal dari file luar.

Sebelum melanjutkan, diharapkan pembaca sudah bisa memahami dan mempraktekan pembuatan CBT di artikel sebelumnya karena artikel di sini tidak akan membahas dari awal.

Baik, mari kita kupas terlebih dahulu bagian dari artikel sebelumnya terkait dengan soal. Di dalam poin 3.2, dijelaskan tentang bagaimana soal tersebut disimpan yaitu dengan konstanta seperti pada Gambar 1.


Gambar 1. Kode untuk menambahkan data soal ke dalam konstanta dengan nama DataSoal
Karena di CBT kali ini soal tidak lagi di konstanta tetapi variabel maka kode di atas harus diganti dengan cara menghapus yang ada di dalam kotak merah di atas. Setelah itu memasukkan variabel baru yang bisa ditulis di bawah var seperti yang tersaji di Gambar 2.

Gambar 2. Deklarasi variabel DataSoal yang berupa array

Di dalam Gambar 2, nama variabelnya sama dengan nama konstanta sebelumnya yaitu DataSoal agar tidak banyak yang dimodifikasi dari program sebelumnya. Kode yang ditambahkan hanyalah yang di dalam kotak merah.

Apakah sudah selesai? Tentu belum, ini baru mengubah konstanta menjadi variabel. Salah satu perbedaan konstanta dan variabel bahwa, ketika mendeklarasikan konstanta, nilai dari konstanta tentu masuk di dalam deklarasi, sementara variabel, memerlukan inisialisasi.

Karena variabel DataSoal ini diambil dari luar, maka perlu disepakati bagaimana format penulisan soal di dalam file luar.

Di dalam artikel ini, kita sepakati bahwa setiap soal ditulis di dalam satu baris. Jadi satu baris mewakili satu soal. Di dalam satu soal terdapat:
  1. Pertanyaan
  2. Pilihan Jawaban
    Pilihan Jawaban terdiri dari lima pilihan berupa A, B, C, D dan E
  3. Indek Kunci Jawaban
Di dalam soal yang tersimpan antara satu bagian dengan bagian lainnya dipisahkan dengan tag "". 

Lebih jelasnya pembaca coba ketik daftar soal seperti pada Gambar 3. Pembaca ketik menggunakan notepad kemudian disimpan dengan nama file "daftarsoal.txt" di dalam folder yang sama dengan folder aplikasi ini.

Gambar 3. Data soal yang tersimpan di file luar program
Setelah file "daftarsoal.txt" dibuat dan disimpan, maka langkah berikutnya kembali lagi ke Delphi dan membuat sebuah prosedur yang berguna untuk memuat soal tersebut ke dalam variabel yang sudah dideklarasikan yaitu variabel DataSoal.

Ada banyak cara untuk mengakses file, namun di sini penulis menggunakan TStringList untuk mengakses file. Pembaca perlu tambahkan procedure LoadSoal untuk memuat soal dan juga sebuah function EkstrakSoalFromString yang bertujuan untuk memindahkan soal dalam bentuk string ke dalam record bertipe TSoal.

Gambar 4 menunjukkan fungsi untuk mengubah soal dalam format string seperti yang ada di dalam Gambar 3 ke dalam tipe data TSoal. Penulisan fungsi tersebut berada di dalam implementation. Silakan pembaca menuliskannya.

Gambar 4. Fungsi EkstrakFromString
Di dalam Gambar 4 di jelaskan, setelah begin ada dua sintak. Sintak pertama adalah mendapatkan seberapa panjang pertanyanyaan yang ada di dalam string. Pada baris ke dua adalah mengambil pertanyaan dan dimasukkan ke dalam record TSoal yang menjadi result dari fungsi bersangkutan.

Pada baris berikutnya merupakan perintah menghapus komponen pertanyaan pada String. Mengapa ada "+8" di sana? Karena panjang kata "" adalah 9 karakter tetapi dikurangi karakter awal yang tidak masuk hitungan sehingga menjadi 8.

Baris-baris berikutnya adalah perintah-perintah yang mirip dimana proses untuk mendapatkan pilihan jawaban A hingga E. Pada bagian terakhir adalah mengambil indek kunci jawaban. Karena kunci merupakan integer sementara tipe data yang diambil adalah String, maka perlu perintah untuk mengubah String ke Integer dengan fungsi StrToInt.

Langkah berikutnya adalah membuat prosedur untuk memuat file yaitu procedure LoadSoal. Silakan pembaca menuliskan prosedur tersebut ke dalam implementation seperti pada Gambar 5.

Gambar 5. Procedure LoadSoal untuk memuat soal dari file luar
Di dalam procedure tersebut menggunakan TStringList. Kali ini soal tidak lagi dimulai dari indek 1 tetapi indek 0 karena menggunakan array yang dinamis. Nanti dalam penyajiannya tentu harus ada perubahan.

Langkah berikutnya adalah melakukan pengubahan saat inisialisasi. Di dalam procedure FormCreate, ditambahkan sebuah sintak. Pembaca bisa mengubah procedure FormCreate yang sebelumnya sudah pembaca buat menjadi seperti Gambar 6. Yang diberi kotak merah adalah yang ditambahkan.

Gambar 6. Modifikasi pada procedure FormCreate

Mengapa ada tambahan " - 1 " pada pengaksesan indek soal? Karena daftar soal kini dimulai dari indek 0, di mana indek soal nomor 0 adalah nomor soal 1. Di situ tertulis bahwa NomorSoal = 1. Jadi proses pengaksesan soal mestinya dari NomorSoal - 1.

Langkah terakhir adalah penyesuaian kode program saat menjawab terkait adanya indek yang bergeser. Pada saat pembaca klik tombol jawab maka langkah pada Gambar 7 menunjukkan perubahan kode yang harus pembaca tulis ulang.

Gambar 7. Perubahan pada Procedure Button1Click
Baik, selamat mencoba. Apabila ada yang belum paham silakan tulis di komentar. Selamat mencoba. Jika sudah berhasil coba tambahkan aturan berikut ini:
  1. Buat prosedur untuk mengacak urutan soal, kemudian dijalankan saat inisialisasi soal
  2. Buat aturan penilaiannya dengan:
    1. Nilai 4 jika benar
    2. Nilai -1 jika salah
  3. Buat inputan NIM dan Nama dengan TEdit.
Materi selanjutnya bisa dilihat di sini.

5 komentar:

  1. kalau muncul tulisan " is not a valid integer value. yang bermasalah bagian apanya ya?

    BalasHapus
    Balasan
    1. Itu bermasalah pada saat proses pengubahan dari String ke Integer dengan perintah StrToInt, yang menjadi parameter bukan string yang bisa dikonversi integer. Di situ tertulis dua tanda petik, artinya itu karakter kosong. Kesalahan yang terjadi adalah, bisa jadi proses parsing-nya ndak pas atau memang datanya kurang. Begitu mas.

      Hapus
  2. saya juga seperti itu pak, solusinya gmn ya?

    BalasHapus
  3. eh ternyata saya salah coding di ekstrakssoalfromstring.. kurang option E, mungkin pak suprap man kejadiannya kayak saya.. suwun

    BalasHapus
  4. Gimana klo ada soal-soaln yg menggunakan gambar pak?

    BalasHapus

Silakan menulis komentar. Tulislah komentar dengan penuh tanggung jawab.

Coretan Populer