Source Code dan logika untuk Konversi Angka Biner, Oktal, Desimal dan Hexadesimal pada Bahasa C

Kemarin malam iseng iseng melanjutkan program bahasa C untuk melakukan konversi angka antar basis dan vice versa. Pada program ini, Anda bisa memasukan bilangan biner, oktal, desimal atau hexadesimal dan nanti akan muncul angka konversinya. Saya menulis program ini untuk latihan lagi setelah beberapa bulan gak megang pemrograman dan kebetulan mau belajar mikrokontroller yang banyak menggunakan angka hexa dan biner.

Untuk informasi saja, biner adalah sistem penomoran berbasis 2, oktal berbasis 8, desimal berbasis 10 dan hexa berbasis 16. Pun begitu, angka maksimum penulisan adalah basis – 1, karena penulisan angka dimulai dari 0 hingga basis-1. Lebih lanjut: http://id.wikipedia.org/wiki/Sistem_bilangan

Screenshot program

Screenshot from 2014-08-12 08:05:13Gambar 1. Ketika program mulai di eksekusi

Screenshot from 2014-08-12 08:05:47Gambar 2. Ketika memilih hexadesimal dan output yang diberikan

Source Code:

#include <stdio.h>
#include <string.h>
 
void welcome() {
        printf("Selamat datang di Basis Angka Konverter");
        printf("\nby tegar (http://about.me/tegarimansyah)");
}

void cls() {
	int i;
	for (i=0;i<100;i++) {
		printf("\n");
	}
}

void biner(int n) {
    if (n > 0) {
        biner(n/2);
        printf("%d",n%2);
    }
}
 
int pangkat(int n,int x) {
    int nilai=1,i;
    for (i=0;i<x;i++) {
        nilai=nilai*n;
    }
    return nilai;
}

int cekdesimal(int x) {
    //checking
    if (x < 0)    { //no minus
        return 1;
    }
    //end of checking, all is right
    return 0;
}

int cekbiner(char str[],int *x) {
    int i,dec = 0;
    
    //checking
    for (i = 0; i < strlen(str); i++)
    {
        if ((str[i] - '0' != 1 ) && (str[i] - '0' != 0))
        {
            return 1;
        }
    }
    //end of checking, all is right
    
    for (i =0; i <  strlen(str) ; i++)
    {
        if (str[i] - '0' == 1) {
            dec = dec + pangkat(2,strlen(str)-1-i);
        }
    }
    *x = dec;
    return 0;
}

int cekoktal(char str[],int *x) {
    int i,dec=0;
    
    //checking
    if ((strlen(str) >= 6) && (str[0] > 49)) {
        return 1;
    }
    
    for (i = 0; i < strlen(str); i++)
    {
        if (!((str[i] > 47 ) && (str[i] < 56)))
        {
            return 1;
        }
    }
    //end of checking, all is right
    for (i =0; i <  strlen(str) ; i++)
    {
        dec = dec + (str[i] - '0') * pangkat(8,strlen(str)-1-i);
    }
    *x = dec;
    return 0;
}

int cekhexa(char str[],int *x) {
    int i,dec=0;
    
    //checking
    for (i = 0; i < strlen(str); i++)
    {
        if (! ( ((str[i] > 47 ) && (str[i] < 58)) || ((str[i] > 96 ) && (str[i] < 103)) || ((str[i] > 64 ) && (str[i] < 71)) ))
        {
            return 1;
        }
    }
    //end of checking, all is right
    for (i =0; i < strlen(str) ; i++)
    {
        if ((str[i] >= '0' ) && (str[i] <= '9')) {
            dec = dec + (str[i] - '0') * pangkat(16,strlen(str)-1-i);
        }
        else if ((str[i] > '@' ) && (str[i] < 'G')) {
            dec = dec + (str[i] - 55) * pangkat(16,strlen(str)-1-i);
        }
        else if ((str[i] > 96 ) && (str[i] < 'g')) {
            dec = dec + (str[i] - 87) * pangkat(16,strlen(str)-1-i);
        }
    }
    *x = dec;
    return 0;
}

int main() {
    int x,dec;
    char oct[6],bin[16],hex[4];
    welcome();
    while(1) {
    printf("\n\n===============================\nBasis Angka Masukan\n1. Desimal\n2. Biner\n3. Oktal\n4. Heksadesimal\nChoose: ");
    scanf("%d",&x);
    switch(x) {
        case 1:
                    printf("Masukan angka desimal (Maksimal 65535): ");
                    scanf("%d",&dec);
                    if(cekdesimal(dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("Biner: ");
                    biner(dec);
                    printf("\nOktal: %o",dec);
                    printf("\nHexa: %X",dec);
                    break;
        case 2:
                    printf("Masukan angka biner (Maksimal 16 bit): ");
                    scanf("%s",bin);
                    if(cekbiner(bin,&dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("\nDesimal: %d",dec);
                    printf("\nOktal: %o",dec);
                    printf("\nHexa: %X",dec);
                    break;
        case 3:
                    printf("Masukan angka Oktal (Maksimal 177777): ");
                    scanf("%s",oct);
                    if(cekoktal(oct,&dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("Desimal: %d",dec);
                    printf("\nBiner: ");
                    biner(dec);
                    printf("\nHexa: %X",dec);
                    break;
        case 4:
                    printf("Masukan angka hexa (Maksimal FFFF): ");
                    scanf("%s",hex);
                    if(cekhexa(hex,&dec) != 0) {
                        printf("Input salah");
                        break;
                    }
                    printf("Desimal: %d",dec);
                    printf("\nBiner: ");
                    biner(dec);
                    printf("\nOktal: %o",dec);
                    break;
        default: printf("Not Present");
    } //end case
    } //end loop
    return 0;
} //end main

Programnya masih dapat dipadatkan lagi, tapi karena kemarin sedang malas malasnya ngoding jadinya ya berantakan seperti itu. Terkompilasi tanpa error dan warning pada gcc 4.6.3 di Ubuntu Linux 12.04 kernel 3.11.0-15-generic.

Penjelasan Program

Untuk melakukan konversi dapat dibilang sangat sederhana. Cuma dibutuhkan sedikit imajinasi untuk meminta input berupa hexa, oktal dan biner. Pada program tersebut, jika user meminta konversi dari hexa, oktal atau biner maka input berupa string ( %s ), bukan integer ( %d ). Disana pun telah disediakan variabel untuk menyimpan bilangan dalam bentuk string ( dan ini seharusnya bisa lebih di singkat, boros banget mendeklarasi string sebesar itu).

Terdapat beberapa fungsi yang dibuat, yang pertama adalah void welcome() yang hanya dipanggil sekali (tidak dimasukkan looping) saat aplikasi mulai dijalankan. Setelah itu fungsi void cls() yang sepertinya tidak digunakan karena saya berubah pikiran untuk melakukan penghapusan layar, jadi fungsi ini bisa dihapus.

Setelah itu fungsi void biner(int n). Dikarenakan melakukan konversi desimal ke biner tidak dapat dilakukan dengan specifier (seperti %d, %X, %o) maka kita dapat menggunakan cara menemukan angka biner ke desimal seperti yang diajarkan pada dulu jaman sekolah. Pada program ini terdapat rekursif fungsi, yaitu memanggil diri dia sendiri hingga kondisi tidak terpenuhi. Rekursif ini saya panggil diatas printf agar penulisan biner tidak terbalik.

Nah selanjutnya fungsi int pangkat(int n. int x). Sebenarnya ini hanya fungsi yang mengembalikan nilai yang sama dengan n pangkat x. Entah kenapa saya lebih suka membuat fungsi sendiri dari pada memanggil header math.h. Pangkat ini cukup dibutuhkan untuk melakukan konversi ke bilangan desimal.

Selanjutnya int main(). Ya, program utama ini hanya berisi looping dan switch case yang memanggil fungsi lainnya. Looping saya gunakan infinite loop sehingga hanya dapat ditutup dengan menekan close pada terminal atau signal interupt (ctrl+c).

Nah, sengaja saya lewatkan untuk funsi cekdesimal, cekbiner, cekoktal dan cekhexa. Pada cekdesimal, saya hanya mensyaratkan nilai tidak boleh negatif. Pada lainnya, ada setidaknya dua tugas yang harus dikerjakan yaitu mengecek apakah penulisan benar dan tidak melebihi 16 bit serta tugas kedua untuk melakukan konversi dari string yang ada ke bilangan desimal terlebih dahulu. Setelah terkonversi, bilangan desimal tersebut dikirim ke variabel dec melalui alamat pointer.

Sudah selesai, mungkin ada yang ditanyakan? Pengembangan terhadap kode ini terbuka secara bebas.

Advertisements

One thought on “Source Code dan logika untuk Konversi Angka Biner, Oktal, Desimal dan Hexadesimal pada Bahasa C

Pendapat anda

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s