Mengubah Warna RGB Menjadi Notasi Hex

Pernah melihat warna direpresentasikan dalam 3 bilangan model warna RGB (Red, Green Blue)?

Warna bisa direpresentasikan dalam 3 bilangan warna ini. Warna putih misalnya, terdiri dari 255 R, 255 G, dan 255 B. Warna hitam, terdiri dari 0 R, 0 G, dan 0 B. Warna merah, terdiri dari 255 R, 0 G, dan 0 B.

Dalam proses styling menggunakan CSS, salah satu skema warna yang dapat digunakan adalah warna dalam notasi hex alias hexadecimal atau bilangan berbasis 16. Misalkan, warna putih yang 255 R, 255 G, dan 255 B tadi, dapat ditulis sebagai #ffffff. Jika diperhatikan, sebenarnya struktur penulisan kode warnanya adalah #RRGGBB dengan masing-masing RR, GG, dan BB direpresentasikan dalam bilangan berbasis 16 tadi. Dalam notasi hex, 255 adalah ff, sehingga dapat ditulis demikian.

Jadi, bagaimana dengan warna hijau yang memiliki nilai 0 R, 255 G, dan 0 B? Karena 0 adalah tetap 0, dan 255 adalah ff, maka dapat ditulis #00ff00.

Proses konversi ini sering sekali saya butuhkan. Biasanya untuk memudahkan, bisa pakai converter yang tersedia di internet, atau dengan menggunakan script sederhana menggunakan JavaScript. Kode-kode JavaScript bisa langsung dijalankan di browser, dan tinggal dipakai di browser JavaScript console di saat-saat tertentu.

Kalau ada yang mau mencoba, ini kodenya:

var normalize = function(h) { return h.length == 1 ? '0' + h : h; };
var convert = function(r, g, b) { return '#' + normalize(r.toString(16)) + normalize(g.toString(16)) + normalize(b.toString(16)); };

Contoh penggunaannya seperti ini:

Convert RGB to Hex Script

Demikian. Semoga bermanfaat. 🙂

Reverse Polish Notation Calculator

Setelah ini saya berencana meletakkan beberapa kode yang pernah saya kerjakan di sela-sela waktu belajar saya. Kode yang ini adalah kode pertama. 😀

Setiap kode yang saya arsipkan di blog saya ini akan diletakkan di bawah sub-kategori Code Archive yang berada di bawah kategori Programming. Mudah-mudahan bisa bermanfaat untuk pembaca.

Kode yang saya post kali ini adalah Reverse Polish Notation CalculatorReverse Polish Notation (RPN) dikenal juga dengan postfix notation, yaitu notasi di mana operator diletakkan setelah operand.

Program ini dulunya saya buat untuk mendemonstrasikan proses perhitungan operasi postfix di mata pelajaran matematika komputer di kampus saya. Dalam praktiknya, notasi postfix dapat diproses dengan menggunakan sebuah stack.

Berikut adalah tampilan programnya:

Jika kode di bawah ini dibaca, akan terlihat bahwa kalkulator ini masih punya banyak keterbatasan. Kalkulator ini hanya bisa memproses bilangan bulat, sebatas integer 32 bit saja. Selain itu, ukuran dari stack yang dimiliki program ini juga terbatas.

Saya membuatnya di atas IDE Microsoft Visual Studio 2010 Express dan bisa berjalan dengan baik. Jika pembaca menemukan masalah saat melakukan compile atau ternyata program ini memiliki kesalahan pemrosesan, jangan sungkan untuk berkomentar.

Semoga bermanfaat.


/*
 * Reverse Polish Notation Calculator
 * Written by Imam Hidayat
 * https://imamhidayatsite.wordpress.com
**/

#include <iostream>

using namespace std;

typedef enum {
	END,
	INT,

	ADD,
	SUB,
	MUL,
	DIV
}TOKEN;

const int MAX = 100;

int stack[MAX];

int N = 0, current = -1;

int pop(int stack[MAX]) {
	if (current == -1) {
		cout << "Empty stack!" << endl;
		return 0;
	}

	current--;
	N--;

	cout << "  -- POP " << stack[current+1] << endl;
	return stack[current+1];
}

void push(int stack[MAX], int value) {
	N++;
	if (N > MAX) {
		cout << "Stack full!" << endl;
		exit(1);
	}
	current++;
	stack[current] = value;
	cout << "  -- PUSH " << value << endl;
}

char token[MAX];

TOKEN get_next_token(FILE *input) {
	int index = 0;
	strcpy(token, "");
	char c = getc(input);
	while (true) {
		if (isdigit(c)) {
			token[index] = c;
			index++;
			c = getc(input);
		}
		else {
			if (index > 0) {
				token[index] = '\0';
				ungetc(c, input);
				return INT;
			}

			switch (c) {
				case '+':
					return ADD;
				case '-':
					return SUB;
				case '*':
					return MUL;
				case '/':
					return DIV;
				case '\n':
					return END;
				case ' ':
					c = getc(input);
					break;
				default:
					cout << "Error!" << endl;
					exit(1);
			}
		}
	}
}

int operate(TOKEN token, int op1, int op2) {
	switch (token) {
		case ADD:
			return op1 + op2;
		case SUB:
			return op1 - op2;
		case MUL:
			return op1 * op2;
		case DIV:
			return op1 / op2;
	}
}

void evaluate(int stack[MAX], FILE *input) {
	TOKEN current_token;
	current_token = get_next_token(input);
	cout << "---------------------------------------------------------------" << endl;
	cout << "Mengevaluasi ekspresi! Lihat operasi pada stack di bawah ini : " << endl;
	cout << "---------------------------------------------------------------" << endl;
	while (current_token != END) {
		int op1, op2;
		switch (current_token) {
			case ADD:
			case SUB:
			case MUL:
			case DIV:
				op2 = pop(stack);
				op1 = pop(stack);
				push(stack, operate(current_token, op1, op2));
				break;
			case INT:
				push(stack, atoi(token));
				break;
		}
		current_token = get_next_token(input);
	}
	int result = pop(stack);
	cout << "--------------------------------" << endl;
	cout << "Result = " << result << endl << endl;
}

int main() {
	while (true) {
		cout << "Masukkan ekspresi matematika dalam notasi RPN. (Ctrl + C untuk keluar)" << endl;
		cout << "Ekspresi: ";

		evaluate(stack, stdin);
	}

	return 0;
}