Konversi Basis Angka yang dapat Di Jalankan pada Handheld Android dalam Bahasa C

Setelah membuat program convert yang dibahas pada artikel sebelumnya ( Source Code dan logika untuk Konversi Angka Biner, Oktal, Desimal dan Hexadesimal pada Bahasa C ), sekarang saya mencoba membuat aplikasi itu tidak hanya bisa jalan di desktop tapi juga di Android.

Pada dasarnya, Android menggunakan bahasa Java (ditambah ADT-nya). Tapi karena berbagai tool yang dikembangkan oleh para developer yang hebat, kini kita bisa menjalankan bahasa bahasa lain diatasnya seperti python, php, dan C/C++. Jadi tugas kita sebenarnya hanya mencari, Tool apa yang kita butuhkan?

Untuk C, saya menggunakan c4droid. Aplikasi berbayar (yang ingin saya beli apa daya tak punya cc) dengan gcc sebagai compilernya (CMIIW). Kesan saya pada aplikasi ini pertama sedikit meragukannya. Lalu saya coba men-copy source code permainan kotak 9 yang dulu pernah saya coba. Ternyata dapat dicompile tanpa ada halangan dan berjalan halus tanpa lag.

Setelah itu, saya mencoba mendownload aplikasi konversi angka yang juga dulu pernah saya buat. Ya, tetap berjalan mulus. Saya pun menghapus aplikasi biner <-> desimal karena saya punya yang lebih powerfull dan bikinan sendiri. Saat itu terkendala ketika mau eksekusi program, saya harus mencari file conv.c dan merun nya. Hal ini sangat merepotkan dan membuat waktu terbuang.

Ternyata, C4droid memiliki solusinya. Hasil compile tersebut dapat di ubah menjadi .apk. Dengan kata lain, program tersebut dapat dijalankan layaknya program pada umumnya.

Berikut dokumentasinya

Screenshot_2014-09-12-10-02-59 Screenshot_2014-09-12-10-03-24

Untuk mencoba program ini, silahkan mengunduh conv.apk disini

md5sum conv.apk : 47d618f4f43885754357d8301805c473

Advertisements

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.