Wednesday 22 May 2013

C++: Program Konversi Bilangan - Desimal Biner Oktal Heksadesimal (Final Part)

Program ini adalah program final yang saya buat untuk memenuhi ujian praktek UAS pada mata kuliah Algoritma Pemrograman. Ini adalah lanjutan dari tutorial saya sebelumnya, yaitu C++: Program Konversi Bilangan - Desimal Biner Oktal Heksadesimal (Part 1) dan C++: Program Konversi Bilangan - Desimal Biner Oktal Heksadesimal (Part 2).

Pada tutorial sebelumnya terdapat banyak kekurangan, misalnya belum adanya pengkondisian bilangan yang diinputkan. Nah pada tutorial kali ini programnya sudah dioptimalisasi, jadi bilangan yang diinputkan harus sesuai dengan tipe bilangan tersebut. Misal bilangan desimal hanya bisa menginputkan angka 0-9, bilangan biner hanya bisa menginputkan bilangan 0-1, Oktal hanya bisa menginputkan bilangan 0-7, dan heksadesimal hanya bisa menginputkan bilangan 0-9 dan A-F, selain bilangan tersebut akan muncul pesan error. :D

1. Langsung aja, buka Microsoft Visual Studio (karena saya menggunakan Microsoft Visual Studio, tapi teman-teman bisa menggunakan code editor lain seperti Borland C++).
2. Buat project baru, saya beri nama projectnya konversi_bilangan_final, pilih WIN32 Console Application.
3. Masukkan code berikut :

// konversi_bilangan_final.cpp : Defines the entry point for the console application.
// Developer : Erik Gunawan
// Nickname  : EXz

#include "stdafx.h"
#include <iostream>

using namespace std;

char bil[100];
int hasil[100];
int sisa = 0;
int x = 0;

void header() {
 cout << "Program Konversi Bilangan" << endl;
 cout << "=========================================" << endl;
 cout << "A = Desimal ke Biner, Oktal, Heksadesimal" << endl;
 cout << "B = Biner ke Oktal, Desimal, Heksadesimal" << endl;
 cout << "C = Oktal ke Biner, Desimal, Heksadesimal" << endl;
 cout << "D = Heksadesimal ke Biner, Oktal, Desimal" << endl;
 cout << "=========================================" << endl;
 cout << endl;
}

int fromDecimal(int desimal, int kode) {
 for (int i=desimal; i>0; i/=kode) {
  sisa = i% kode;
  x += 1;
  hasil[x] = sisa;
 }

 switch (kode) {
  case 2:  cout << "Hasil biner        : "; break;
  case 8:  cout << "Hasil oktal        : "; break;
  case 10: cout << "Hasil desimal      : "; break;
  case 16: cout << "Hasil heksadesimal : "; break;
  default: cout << endl; break;
 }

 while (x) {
  if (kode==2 || kode==8 || kode==10) {
   cout << hasil[x];
  }
  else if (kode==16) {
   switch (hasil[x]) {
    case 10: cout << 'A'; break;
    case 11: cout << 'B'; break;
    case 12: cout << 'C'; break;
    case 13: cout << 'D'; break;
    case 14: cout << 'E'; break;
    case 15: cout << 'F'; break;
    default: cout << hasil[x]; break;
   }
  }
  x -= 1;
 }
 cout << endl;
 return 0;
}

void toDecimal(int kode) {
 int pangkat = 1;
 int hasil_desimal = 0;
 int desimal = 0;
 int index = 0;
 int error = 0;
 int a, b, c, length;

 length = strlen(bil);
 for (int i=length-1; i>=0; i--) {
  a = bil[index];
  switch (a) {
   case 'A':
   case 'B':
   case 'C':
   case 'D':
   case 'E':
   case 'F': b = a-55; break;
   default:  b = a-48; break;
  }

  c = i;
  while (c>=0) {
   desimal = pangkat*b;
   pangkat *= kode;
   c -= 1;
  }

  pangkat = 1;
  hasil_desimal += desimal;
  index += 1;

  if (kode==2) {
   if (b>1 || b<0) {
    error += 1;
   }
  }
  else if (kode==8) {
   if (b>7 || b<0) {
    error += 1;
   }
  }
  else if (kode==10) {
   if (b>9 || b<0) {
    error += 1;
   }
  }
  else if (kode==16) {
   if (b>15 || b<0) {
    error += 1;
   }
  }
 }

 if (error>0) {
  cout << "Bilangan yang Anda masukkan tidak valid!!" << endl;
 }
 else {
  if (kode==2) {
   fromDecimal(hasil_desimal, 8);
   fromDecimal(hasil_desimal, 10);
   fromDecimal(hasil_desimal, 16);
  }
  else if (kode==8) {
   fromDecimal(hasil_desimal, 2);
   fromDecimal(hasil_desimal, 10);
   fromDecimal(hasil_desimal, 16);
  }
  else if (kode==10) {
   fromDecimal(hasil_desimal, 2);
   fromDecimal(hasil_desimal, 8);
   fromDecimal(hasil_desimal, 16);
  }
  else if (kode==16) {
   fromDecimal(hasil_desimal, 2);
   fromDecimal(hasil_desimal, 8);
   fromDecimal(hasil_desimal, 10);
  }
 }
}

void binaryToAll() {
 cout << "Masukkan bilangan biner        : "; cin >> bil;
 toDecimal(2);
}

void octalToAll() {
 cout << "Masukkan bilangan oktal        : "; cin >> bil;
 toDecimal(8);
}

void decimalToAll() {
 cout << "Masukkan bilangan desimal      : "; cin >> bil;
 toDecimal(10);
}

void hexadecimalToAll() {
 cout << "Masukkan bilangan heksadesimal : "; cin >> bil;
 toDecimal(16);
}

void pilihan_salah() {
 system("cls");
 cout << "Kode yang Anda masukkan salah!!" << endl;
 cout << endl;
}

void pilihan() {
 char pilih, coba_lagi;

 pilih:
 header();
 cout << "Masukkan pilihan : "; cin >> pilih;
 cout << endl;

 if (pilih=='A' || pilih=='a') {
  decimalToAll();
 }
 else if (pilih=='B' || pilih=='b') {
  binaryToAll();
 }
 else if (pilih=='C' || pilih=='c') {
  octalToAll();
 }
 else if (pilih=='D' || pilih=='d') {
  hexadecimalToAll();
 }
 else {
  pilihan_salah();
  goto pilih;
 }

 cout << endl;

 coba_lagi:
 cout << "Ingin coba lagi (Y/N) ? "; cin >> coba_lagi;
 cout << endl;

 if (coba_lagi=='Y' || coba_lagi=='y') {
  system("cls");
  goto pilih;
 }
 else if (coba_lagi=='N' || coba_lagi=='n') {
  pilihan_salah();
  goto coba_lagi;
 }
}

void main(){
 pilihan();
}

4. Run file, hasilnya akan seperti ini :


 5. Masukkan bilangan yang ingin dicari.





6. Jika bilangan yang diinputkan tidak valid :





Untuk download contoh project di atas, klik disini atau konversi_bilangan_final.
Ditunggu kritik saran pertanyaan dan komentarnya. :D

Semoga bermanfaat.

4 comments: