Membuat Quiz Menggunakan Thread pada Bahasa C

Bagaimana membuat quiz dengan kita dapat menentukan waktu pengerjaan tiap soal? jadi jika tidak dapat menjawab soal dalam waktu yang ditentukan, maka akan beralih ke soal berikutnya dan dianggap tidak menjawab soal/salah. Setelah itu jawaban akan dicatat dalam sebuah teks dan hasil quiz akan ditampilkan di layar.

Membuat quiz yang seperti dijelaskan di atas bisa menggunakan thread. Dalam post ini saya menggunakan bahasa c dalam membuat program quiz tersebut.

Kode format soal quiz seperti berikut :

[jumlah_soal]
[waktu_pengerjaan] [kunci_jawaban]
[soal


]
* //soal diakhiri dengan tanda bintang ini '*'
[waktu_pengerjaan] [kunci_jawaban]
... //dan seterusnya

Contoh soal quiz :
------------------------------------------------------------------------------------
4
5 b
Berapakah 1 menit dalam detik?
a. 30
b. 60
c. 15
d. 25
*
4 c
Hewan yang bukan berkaki empat?
a. Kucing
b. Anjing
c. Ayam
d. Sapi
*
6 a
Ibukota Indonesia?
a. Jakarta
b. Jambi
c. Maluku
d. Surabaya
*
3 d
4 + 4 =
a. 2
b. 4
c. 6
d. 8
*
------------------------------------------------------------------------------------
Kode main.c :
------------------------------------------------------------------------------------
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

int wak[10],nos[10];
char jaw[10];

char soal[10][255];

int flag[10];

pthread_t thread1, thread2;

FILE *rit, *krit, *krit2;

char jabt;
int noso=1;

int nilai=0, count;

void *input(int *no)
{
    int a = *( (int *) no);
    system("clear");
    printf("%d. %s",noso, soal[a]);
    printf("Jawab : ");
    scanf("%c", &jabt);
    getchar();
    pthread_cancel(thread1);
}

void *waktu(int *no)
{
    int a = *( (int *) no);
    while(wak[a]>0)
    {
        count++;
        sleep(1);
        if(count==wak[a])
        {
            pthread_cancel(thread2);
            pthread_cancel(thread1);
        }
    }
}

void cek(int no)
{
    if (jabt==jaw[no])
    {
        fprintf(krit,"%d %c benar - waktu : %d\n", no+1, jabt, count);
        nilai+=10;
    }
    else
        fprintf(krit,"%d %c salah - waktu : %d\n", no+1, jabt, count);
}

int main()
{
    krit=fopen("/home/wicakson/Documents/shift3/hasil.txt","w+");
    rit=fopen("/home/wicakson/Documents/shift3/soal.txt","r");
    int no=0, jumlah, i;
    fscanf(rit, "%d", &jumlah);
    for(no=0;no<jumlah;no++)
    {
        flag[no]=0;
        fscanf(rit,"%d", &wak[no]);
        fgetc(rit);
        fscanf(rit,"%c", &jaw[no]);
        fgetc(rit);
        i=0;
        fscanf(rit, "%c", &soal[no][i]);
        while(soal[no][i]!='*')
        {
            i++;
            fscanf(rit, "%c", &soal[no][i]);
        }
        soal[no][i]='\n';
    }
    for(no=0;no<jumlah;no++) puts(soal[no]);
    int sek, k=jumlah;
    while (k)
    {
        srand(time(NULL));
        sek = rand() % jumlah ;
        if(flag[sek]==0)
        {
            count=0;
            pthread_create(&thread2, NULL, (void *) &input, (void *) &sek);
            pthread_create(&thread1, NULL, (void *) &waktu, (void *) &sek);
            pthread_join(thread1, NULL);           
            pthread_join(thread2, NULL);
            cek(sek);
            pthread_cancel(thread1);
            k--;
            noso++;
            flag[sek]= 1;
        }
        jabt='\0';   
    }

    fprintf(krit,"\nNilai Anda: %d\n",nilai);
    char str[255];
    sprintf(str, "zenity --info --title=\"Selamat\" --text=\"Nilai Anda: %d\"", nilai);
    system(str);
    return 0;   
}
------------------------------------------------------------------------------------
Penjelasan beberapa fungsi dalam kode tersebut :
1.
2.
3.
4.
krit=fopen("/home/wicakson/Documents/shift3/hasil.txt","w+");
dan beberapa fungsi fprintf akan menghasilkan hasil.txt yang menampilkan hasil pengerjaan seseorang jika telah menjalankan quiz tersebut.

Contoh hasil.txt
------------------------------------------------------------------------------------
4 \00 salah - waktu : 4
3 \00 salah - waktu : 7
1 b benar - waktu : 3
2 b salah - waktu : 2
Nilai Anda: 10
------------------------------------------------------------------------------------
Contoh di atas terjadi jika anda tidak menjawab pada soal pertama dan kedua yang muncul, lalu anda menjawab b pada soal ketiga saat detik ke-3 dan menjawab b pada soal keempat saat detik ke-2.
Karena soal pada quiz ini dirandom pengeluarannya, maka setiap anda menjalankan program, akan berbeda urutan soalnya.
2 b salah - waktu : 2
[kode_soal] [input_jawaban]  [benar/salah] - waktu : [waktu_pengerjaan]
Jika anda tidak menjawab sama sekali seperti pada contoh di bawah ini
3 \00 salah - waktu : 7
maka waktu akan diset menjadi [waktu_pengerjaan+1]

1 comment:

  1. Halo kak mohon bantuannya.. Boleh kah saya meminta file codingannya kak? Soalnya error di di CodeBlocks saya:")

    ReplyDelete