Selasa, 14 April 2009

Scientific Calculator (Kalkulator)

import java.awt.*;
import java.awt.event.*;

/* Kalkulator yang ga beres
* Dalam bahasa Java (In Java Language)

*/

//kelas untuk membuat frame
class TFrame extends Frame {
TFrame( String str) {
// memanggil superclass
super(str);
// membuat tampilan window close/ Windows API
addWindowListener(new WindowAdapter() {
public void windowClosing (WindowEvent we) {
System.exit(0);
}
});
}
}


public class Kalkulator implements ActionListener, ItemListener {
// instance objek
double temp[]= new double[3];
TFrame fr;
CheckboxGroup cbg;
Checkbox radians, degrees, gradians;
TextField display;
Button key[] = new Button[36]; // membuat tombol sebanyak 36
Button clearAll, clearEntry;

// variabel
boolean addButtonPressed, subtractButtonPressed, multiplyButtonPressed;
boolean divideButtonPressed, decimalPointPressed, powerButtonPressed;
boolean akarButtonPressed;
double angka1; // inputan pertama
double angka2 = 0; // inputan kedua (ditampilkan terakhir pada layar)
int decimalPlaces = 0;//jumlah angka belakang koma

// fungsi utama
public static void main (String args[]) {
// constructor
Kalkulator kl = new Kalkulator();
kl.Tombol();
}


public void Tombol() {
// ukuran mutlak tombol
final int lebar = 25;
final int tinggi = 25;
int count =1;
TFrame fr = new TFrame("Kalkulator ga Beres");
// ukuran frame
fr.setSize(400,270);
fr.setBackground(Color.white);

fr.setLayout(null);


for (int baris = 0; baris < 3; baris++) {
for (int kolom = 0; kolom < 3; kolom++) {
// mengeset tombol dari 1 hingga 9
key[count] = new Button(Integer.toString(count));
key[count].addActionListener(this);
// area tombol key
key[count].setBounds(30*(kolom + 1), 30*(baris + 4),lebar,tinggi);
key[count].setBackground(Color.gray);
// menambah tombol pada frame
fr.add(key[count++]);
}
}


// menambah ActionListener dan menempatkan tombol pada frame
//tombol 0
key[0] = new Button("0");
key[0].addActionListener(this);
key[0].setBounds(30,210,lebar,tinggi);
key[0].setBackground(Color.gray);
fr.add(key[0]);

//desimal
key[10] = new Button(".");
key[10].addActionListener(this);
key[10].setBounds(60,210,lebar,tinggi);
key[10].setBackground(Color.gray);
fr.add(key[10]);

//perkalian
key[11] = new Button("*");
key[11].addActionListener(this);
key[11].setBounds(90,210,lebar,tinggi);
key[11].setBackground(Color.gray);
fr.add(key[11]);

//sama dengan
key[12] = new Button("=");
key[12].addActionListener(this);
key[12].setBounds(120,120,lebar,tinggi);
key[12].setBackground(Color.gray);
fr.add(key[12]);

//pembagian
key[13] = new Button("/");
key[13].addActionListener(this);
key[13].setBounds(120,150,lebar,tinggi);
key[13].setBackground(Color.gray);
fr.add(key[13]);

//penjumlahan
key[14] = new Button("+");
key[14].addActionListener(this);
key[14].setBounds(120,180,lebar,tinggi);
key[14].setBackground(Color.gray);
fr.add(key[14]);

//pengurangan
key[15] = new Button("-");
key[15].addActionListener(this);
key[15].setBounds(120,210,lebar,tinggi);
key[15].setBackground(Color.gray);
fr.add(key[15]);

//resiprok
key[16] = new Button("1/x");
key[16].addActionListener(this);
key[16].setBounds(150,120,lebar,tinggi);
key[16].setBackground(Color.gray);
fr.add(key[16]);

//pemangkatan
key[17] = new Button("x^n");
key[17].addActionListener(this);
key[17].setBounds(150,150,lebar,tinggi);
key[17].setBackground(Color.gray);
fr.add(key[17]);

//ganti tanda
key[18] = new Button("+/-");
key[18].addActionListener(this);
key[18].setBounds(150,180,lebar,tinggi);
key[18].setBackground(Color.gray);
fr.add(key[18]);

//faktorial
key[19] = new Button("x!");
key[19].addActionListener(this);
key[19].setBounds(150,210,lebar,tinggi);
key[19].setBackground(Color.gray);
fr.add(key[19]);

// Reset
clearAll = new Button("AC");
clearAll.addActionListener(this);
clearAll.setBounds(30, 240, lebar+20, tinggi);
clearAll.setBackground(Color.gray);
fr.add(clearAll);

// backspase
clearEntry = new Button("<-");
clearEntry.addActionListener(this);
clearEntry.setBounds(80, 240, lebar+20, tinggi);
clearEntry.setBackground(Color.gray);
fr.add(clearEntry);

// akar n
key[20] = new Button("x^(1/n)");
key[20].addActionListener(this);
key[20].setBounds(130, 240, lebar+20, tinggi);
key[20].setBackground(Color.gray);
fr.add(key[20]);

// display pada kalkulator

display = new TextField("0");
display.setBounds(30,90,180,20);
display.setBackground(Color.white);

// tombol-tombol scientific

// Sinus
key[21] = new Button("Sin");
key[21].addActionListener(this);
key[21].setBounds(180, 120, lebar + 10, tinggi);
key[21].setVisible(true);
key[21].setBackground(Color.gray);
fr.add(key[21]);

// cosinus
key[22] = new Button("Cos");
key[22].addActionListener(this);
key[22].setBounds(180, 150, lebar + 10, tinggi);
key[22].setBackground(Color.gray);
key[22].setVisible(true);
fr.add(key[22]);


// Tangen
key[23] = new Button("Tan");
key[23].addActionListener(this);
key[23].setBounds(180, 180, lebar + 10, tinggi);
key[23].setBackground(Color.gray);
key[23].setVisible(true);
fr.add(key[23]);

// Phi
key[24] = new Button("Phi");
key[24].addActionListener(this);
key[24].setBounds(180, 210, lebar + 10, tinggi);
key[24].setBackground(Color.gray);
key[24].setVisible(true);
fr.add(key[24]);

// anti sinus
key[25] = new Button("aSin");
key[25].addActionListener(this);
key[25].setBounds(220, 120, lebar + 10, tinggi);
key[25].setBackground(Color.gray);
key[25].setVisible(true);
fr.add(key[25]);

// anti-cosinus
key[26] = new Button("aCos");
key[26].addActionListener(this);
key[26].setBounds(220, 150, lebar + 10, tinggi);
key[26].setBackground(Color.gray);
key[26].setVisible(true);
fr.add(key[26]);


// anti-tangen
key[27] = new Button("aTan");
key[27].addActionListener(this);
key[27].setBounds(220, 180, lebar + 10, tinggi);
key[27].setBackground(Color.gray);
key[27].setVisible(true);
fr.add(key[27]);


// logaritma
key[28] = new Button("log");
key[28].addActionListener(this);
key[28].setBounds(220, 210, lebar + 10, tinggi);
key[28].setBackground(Color.gray);
key[28].setVisible(true);
fr.add(key[28]);

// logaritma natural
key[29] = new Button("ln");
key[29].addActionListener(this);
key[29].setBounds(180, 240, lebar + 10, tinggi);
key[29].setBackground(Color.gray);
key[29].setVisible(true);
fr.add(key[29]);

// kombinasi
key[30] = new Button("nCr");
key[30].addActionListener(this);
key[30].setBounds(220, 240, lebar , tinggi);
key[30].setBackground(Color.gray);
key[30].setVisible(true);
fr.add(key[30]);

//permutasi
key[31] = new Button("nPr");
key[31].addActionListener(this);
key[31].setBounds(260, 240, lebar , tinggi);
key[31].setBackground(Color.gray);
key[31].setVisible(true);
fr.add(key[31]);

//M+ harus diedit
key[32] = new Button("M+");
key[32].addActionListener(this);
key[32].setBounds(280, 100, lebar + 10, tinggi);
key[32].setBackground(Color.gray);
key[32].setVisible(true);
fr.add(key[32]);

//M- harus diedit
key[33] = new Button("M-");
key[33].addActionListener((ActionListener)this);
key[33].setBounds(280, 125, lebar + 10, tinggi);
key[33].setBackground(Color.gray);
key[33].setVisible(true);
fr.add(key[33]);

//MC harus diedit
key[34] = new Button("MC");
key[34].addActionListener(this);
key[34].setBounds(280, 150, lebar + 10, tinggi);
key[34].setBackground(Color.gray);
key[34].setVisible(true);
fr.add(key[34]);

//MR harus diedit
key[35] = new Button("MR");
key[35].addActionListener(this);
key[35].setBounds(280, 175, lebar + 10, tinggi);
key[35].setBackground(Color.gray);
key[35].setVisible(true);
fr.add(key[35]);


cbg = new CheckboxGroup();
degrees = new Checkbox("Degrees", cbg, true);
radians = new Checkbox("Radians", cbg, false);
gradians = new Checkbox("Gradians", cbg, false);
degrees.addItemListener((ItemListener) this);
radians.addItemListener((ItemListener) this);
gradians.addItemListener((ItemListener) this);

degrees.setBounds(185, 75, 3 * lebar, tinggi);

radians.setBounds(185, 95, 3 * lebar, tinggi);

gradians.setBounds(185, 55, 3 *lebar, tinggi);

//degrees.setVisible(true);
//radians.setVisible(true);
//gradians.setVisible(true);
fr.add(degrees);
fr.add(radians);
fr.add(gradians);
fr.add(display);
fr.setVisible(true);
}// akhir method






//aksi
public void actionPerformed(ActionEvent ae) {
String buttonText = ae.getActionCommand();
double displayNumber = Double.valueOf(display.getText()).doubleValue();

// kalau kita menekan tombol 1-9 akan menghasilkan seperti ini!

if((buttonText.charAt(0) >= '0') & (buttonText.charAt(0) <= '9')) {
if(decimalPointPressed) {
for (int i=1;i <=decimalPlaces; i++)
angka2 *= 10;
angka2 +=(int)buttonText.charAt(0)- (int)'0';
for (int i=1;i <=decimalPlaces; i++) {
angka2 /=10;
}
decimalPlaces++;
display.setText(Double.toString(angka2));
}

else {
angka2 = angka2 * 10 + (int)buttonText.charAt(0)-(int)'0';
display.setText(Integer.toString((int)angka2));
}
}

// penjumlahan
if(buttonText == "+") {
addButtonPressed = true;
angka1 = displayNumber;
angka2 = 0;
decimalPointPressed = false;
}

// pengurangan

if (buttonText == "-") {
subtractButtonPressed = true;
angka1 = displayNumber;
angka2 = 0;
decimalPointPressed = false;
}

// pembagian
if (buttonText == "/") {
divideButtonPressed = true;
angka1 = displayNumber;
angka2 = 0;
decimalPointPressed = false;
}

// perkalian
if (buttonText == "*") {
multiplyButtonPressed = true;
angka1 = displayNumber;
angka2 = 0;
decimalPointPressed = false;
}

// tombol 1/x
if (buttonText == "1/x") {
// panggil method resiprok
display.setText(resiprok(displayNumber));
angka2 = 0;
decimalPointPressed = false;
}

// ganti tanda
if (buttonText == "+/-") {
// memanggil method changesign
display.setText(changeSign(displayNumber));
angka2 = 0;
decimalPointPressed = false;
}

// faktorial
if (buttonText == "x!") {
display.setText(factorial(displayNumber));
angka2 = 0;
decimalPointPressed = false;
}
// pangkat
if (buttonText == "x^n") {
powerButtonPressed = true;
angka1 = displayNumber;
angka2 = 0;
decimalPointPressed = false;
}


// tombol-tombol scientific

if (buttonText == "Sin") {
if (degrees.getState())
display.setText(Double.toString(Math.sin(Math.PI * displayNumber/180)));
else if(radians.getState()){
display.setText(Double.toString(Math.sin(displayNumber)));
angka2 = 0;
decimalPointPressed = false;
}
else {
display.setText(Double.toString(Math.sin(displayNumber/200 * Math.PI)));
}
}


if (buttonText == "Cos") {
if (degrees.getState())
display.setText(Double.toString(Math.cos(Math.PI * displayNumber/180)));
else if(radians.getState()){
display.setText(Double.toString(Math.cos(displayNumber)));
angka2 = 0;
decimalPointPressed = false;
}
else{
display.setText(Double.toString(Math.cos(displayNumber/200 * Math.PI)));
}
}


if (buttonText == "Tan") {
if (degrees.getState())
display.setText(Double.toString(Math.tan(Math.PI * displayNumber/180)));
else if(radians.getState()){
display.setText(Double.toString(Math.tan(displayNumber)));
angka2 = 0;
decimalPointPressed = false;
}
else{
display.setText(Double.toString(Math.tan(displayNumber/200 * Math.PI)));
}
}

if (buttonText == "aSin") {
if (degrees.getState())
display.setText(Double.toString(Math.asin(displayNumber)* 180/Math.PI ));
else if(radians.getState()){
display.setText(Double.toString(Math.asin(displayNumber)));
//angka2 = 0;
decimalPointPressed = false;
}
else{
display.setText(Double.toString(Math.asin(displayNumber/200 * Math.PI)));
}
}


if (buttonText == "aCos") {
if (degrees.getState())
display.setText(Double.toString(Math.acos(displayNumber)* 180/Math.PI ));
else if(radians.getState()){
display.setText(Double.toString(Math.acos(displayNumber)));
//angka2 = 0;
decimalPointPressed = false;
}
else{
display.setText(Double.toString(Math.acos(displayNumber/200 * Math.PI)));
}
}

if (buttonText == "aTan") {
if (degrees.getState())
display.setText(Double.toString(Math.atan(displayNumber)* 180/Math.PI ));
else if(radians.getState()){
display.setText(Double.toString(Math.atan(displayNumber)));
angka2 = 0;
decimalPointPressed = false;
}
else{
display.setText(Double.toString(Math.atan(displayNumber/200 * Math.PI)));
}
}

if (buttonText == "Phi") {
display.setText(Double.toString(Math.PI));
angka2 =0;
decimalPointPressed = false;
}

if (buttonText == "log"){
display.setText(Double.toString(Math.log10(displayNumber)));
//display.setText(Double.toString(Math.log10(angka1)));
angka2 =0;
decimalPointPressed = false;
}
if (buttonText == "ln"){
display.setText(Double.toString(Math.log(displayNumber)));
angka2 =0;
decimalPointPressed = false;
}
if(buttonText== "x^(1/n)")
{ akarButtonPressed = true;
angka1 = displayNumber;
angka2 = 0;
decimalPointPressed = false;
}
// tombol desimal
if (buttonText == ".") {
String displayedNumber = display.getText();
boolean decimalPointFound = false;
int i;
decimalPointPressed = true;
// cek untuk decimal point
for (i =0; i < displayedNumber.length(); ++i) {
if(displayedNumber.charAt(i) == '.') {
decimalPointFound = true;
continue;
}
}
if (!decimalPointFound)
decimalPlaces = 1;
}

if(buttonText == "AC"){
// set all buttons to false
resetAllButtons();
display.setText("0");
angka2 = 0;
}

if (buttonText == "<-") {
display.setText("0");
angka2 = 0;
decimalPointPressed = false;
}
if(buttonText == "nPr"){
display.setText(permutasi(angka1, angka2));
}

if(buttonText == "nCr"){
display.setText(kombinasi(angka1, angka2));
}

// merupakan fungsi untuk menyimpan memori namun mengakibatkan error
if (buttonText=="M+")
{
for(int i=0; i angka1+=temp[i];
display.setText("0");
}}

if(buttonText=="M-"){
for(int i=(temp.length-1); i>1; i--){
temp[i]=0;
}}

if(buttonText=="MR"){
//int i=0 global
//i++
for(int i=temp.length-1; i>=0; i--) {
temp[i] = angka1;
//display.setText(temp[i]);
}
}
if(buttonText=="MC"){
for(int i=temp.length-1; i>=0; i--) {
temp[i] = 0;
} }
//resetAllButtons();






// main action

if (buttonText == "=") {
angka2 = 0;
// tombol penjumlahan ditekan
if(addButtonPressed)
display.setText(Double.toString(angka1 + displayNumber));
// tombol pengurangan
if(subtractButtonPressed)
display.setText(Double.toString(angka1 - displayNumber));
// tombol pembagian ditekan
if (divideButtonPressed) {
// cek apakah pembaginya 0
if(displayNumber == 0) {
display.setText("Error");
}
else
display.setText(Double.toString(angka1/displayNumber));
}

// jika tombol kali ditekan
if(multiplyButtonPressed)
display.setText(Double.toString(angka1 * displayNumber));
// jika perpangkatan dilakukan
if (powerButtonPressed)
display.setText(power(angka1, displayNumber));
//jika dilakukan pemangkatan
if(akarButtonPressed)
display.setText(power(angka1, 1/displayNumber));

resetAllButtons();
}

}


// mereset semua tombol dan entri
public void resetAllButtons() {
addButtonPressed = false;
subtractButtonPressed = false;
multiplyButtonPressed = false;
divideButtonPressed = false;
decimalPointPressed = false;
powerButtonPressed = false;
akarButtonPressed = false;
}

//faktorial
public String factorial(double num) {
int no1 = (int)num;
if (no1 < 1) {
display.setText("Faktorial Error");
return ("0");
}
else {
for (int i=(no1 -1); i > 1; --i)
no1 *= i;
return Integer.toString(no1);
}
}
//kombinasi
public String kombinasi(double angka1, double angka2){
int no1 = (int)angka1;
int no2 = (int)angka2;
int no3 = no1-no2;
int num1 = 0, num2=0, num3=0;
if(no3<0){
display.setText("error");
return ("0");
}
else {
for (int i=no1-1;i>0;i--)
num1 = no1*=i;

for (int j=no2-1;j>0;j--)
num2 = no2*=j;

for (int k=no3-1;k>0;k--)
num3 = no3*=k;
int hasil= num1/(num3*num2);
return Integer.toString(hasil);
}
}



//Permutasi
public String permutasi(double angka1, double angka2){
int i, j;
int no1= (int)angka1;
int no2= (int)angka2;
if(no2<=0){
display.setText("error");
return ("0");

}
else {
for(i =no1-1; i>0; i--)
no1=no1*=i;
for(j=no2-1; j>0; j--)
no2=no2*=j;
return Integer.toString(no1/no2);
}

}
public String resiprok(double num) {
if (num ==0) {
display.setText("1/x anda error");
}
else
num = 1/num;
return Double.toString(num);
}

public String power(double base, double index) {
return Double.toString(Math.pow(base, index));
}

public String akar(double base, double index){
return Double.toString(Math.pow(base, (1/index)));
}
// ganti tanda
public String changeSign(double num) {
return Double.toString(-num);
}


//(non-Javadoc)
// * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)

public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub

}
}


// message box untuk menampilkan pesan kesalahan namun tidak jadi dipakai
class MessageBox extends Dialog implements ActionListener {
Button ok;
MessageBox(Frame frm, String title, boolean mode, String message) {
super(frm, title, mode);

Panel centrePanel = new Panel();
Label lbl = new Label(message);
centrePanel.add(lbl);
add(centrePanel, "Center");
Panel southPanel = new Panel();
ok = new Button ("OK");
ok.addActionListener(this);
southPanel.add(ok);
add(southPanel, "South");
pack();
addWindowListener (new WindowAdapter() {
public void windowClosing (WindowEvent we) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent ae) {
dispose();
}
}