import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
public class CalculatorOneFile{
String input = "";
public static void main(String[] args){
Solve Solve = new Solve();
CalculatorOneFile obj = new CalculatorOneFile();
JFrame calc = new JFrame("Calculator");
JTextArea hello = new JTextArea(1,1);
calc.add(hello);
calc.setSize(220, 420);
calc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
calc.setLayout(null);
JButton buttonoutput = new JButton(obj.input);
buttonoutput.setBounds(0, 0, 200, 70);
calc.add(buttonoutput);
JButton buttonAC = new JButton("AC");
buttonAC.setBounds(0, 70, 50, 50);
JButton buttonparentheses1 = new JButton("(");
buttonparentheses1.setBounds(50, 70, 38, 50);
JButton buttonparentheses2 = new JButton(")");
buttonparentheses2.setBounds(75, 70, 38, 50);
JButton buttonpercent = new JButton("%");
buttonpercent.setBounds(100, 70, 50, 50);
JButton buttondivide = new JButton("/");
buttondivide.setBounds(150, 70, 50, 50);
JButton button1 = new JButton("1");
button1.setBounds(0, 120, 50, 50);
JButton button2 = new JButton("2");
button2.setBounds(50, 120, 50, 50);
JButton button3 = new JButton("3");
button3.setBounds(100, 120, 50, 50);
JButton buttonmultiply = new JButton("x");
buttonmultiply.setBounds(150, 120, 50, 50);
JButton button4 = new JButton("4");
button4.setBounds(0, 170, 50, 50);
JButton button5 = new JButton("5");
button5.setBounds(50, 170, 50, 50);
JButton button6 = new JButton("6");
button6.setBounds(100, 170, 50, 50);
JButton buttonsubract = new JButton("-");
buttonsubract.setBounds(150, 170, 50, 50);
JButton button7 = new JButton("7");
button7.setBounds(0, 220, 50, 50);
JButton button8 = new JButton("8");
button8.setBounds(50, 220, 50, 50);
JButton button9 = new JButton("9");
button9.setBounds(100, 220, 50, 50);
JButton buttonadd = new JButton("+");
buttonadd.setBounds(150, 220, 50, 50);
JButton button0 = new JButton("0");
button0.setBounds(0, 270, 50, 50);
JButton buttondecimalpoint = new JButton(".");
buttondecimalpoint.setBounds(50, 270, 50, 50);
JButton buttonbackspace = new JButton("<<");
buttonbackspace.setBounds(100, 270, 50, 50);
JButton buttonequals = new JButton("=");
buttonequals.setBounds(150, 270, 50, 50);
calc.add(buttonAC);
buttonAC.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input = "";
buttonoutput.setText(obj.input);
}
});
calc.add(buttonparentheses1);
calc.add(buttonparentheses2);
calc.add(buttonpercent);
calc.add(buttondivide);
calc.add(button1);
calc.add(button2);
calc.add(button3);
calc.add(buttonmultiply);
calc.add(button4);
calc.add(button5);
calc.add(button6);
calc.add(buttonsubract);
calc.add(button7);
calc.add(button8);
calc.add(button9);
calc.add(buttonadd);
//Numbers
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "1";
buttonoutput.setText(obj.input);
}
});
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "2";
buttonoutput.setText(obj.input);
}
});
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "3";
buttonoutput.setText(obj.input);
}
});
button4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "4";
buttonoutput.setText(obj.input);
}
});
button5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "5";
buttonoutput.setText(obj.input);
}
});
button6.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "6";
buttonoutput.setText(obj.input);
}
});
button7.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "7";
buttonoutput.setText(obj.input);
}
});
button8.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "8";
buttonoutput.setText(obj.input);
}
});
button9.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "9";
buttonoutput.setText(obj.input);
}
});
button0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "0";
buttonoutput.setText(obj.input);
}
});
//Other
buttondecimalpoint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += ".";
buttonoutput.setText(obj.input);
}
});
buttonparentheses1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "(";
buttonoutput.setText(obj.input);
}
});
buttonparentheses2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += ")";
buttonoutput.setText(obj.input);
}
});
buttonpercent.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "%";
buttonoutput.setText(obj.input);
}
});
//Operators
buttonadd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "+";
buttonoutput.setText(obj.input);
}
});
buttonmultiply.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "x";
buttonoutput.setText(obj.input);
}
});
buttonsubract.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "-";
buttonoutput.setText(obj.input);
}
});
buttondivide.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input += "÷";
buttonoutput.setText(obj.input);
}
});
calc.add(button0);
calc.add(buttondecimalpoint);
//BackSpace
calc.add(buttonbackspace);
buttonbackspace.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.input = obj.input.substring(0,obj.input.length()-1);
buttonoutput.setText(obj.input);
}
});
//Equal Button
calc.add(buttonequals);
calc.setVisible(true);
buttonequals.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
//MDAS
String result = "";
if (!((obj.input.contains("(")) || (obj.input.contains(")")))) {
//MDAS
result = Solve.MDAS(obj.input);
obj.input = result;
buttonoutput.setText(obj.input);
}
else {
//PEMDAS
result = Solve.PEMDAS(obj.input);
obj.input = result;
buttonoutput.setText(obj.input);
}
}catch(NumberFormatException error) {
buttonoutput.setText("Error");
}catch(NullPointerException error) {
buttonoutput.setText("Error");
}catch(ArrayIndexOutOfBoundsException error) {
buttonoutput.setText("Error: "+error);
}catch(Exception error) {
buttonoutput.setText("Error: "+error);
}
}
});
}
}
class Operator {
String modulo(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
double equal = a1%b1;
String stringEqual = Double.toString(equal);
return stringEqual;
}
String add(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
double equal = a1+b1;
String stringEqual = Double.toString(equal);
return stringEqual;
}
String subtract(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
double equal = a1-b1;
String stringEqual = Double.toString(equal);
return stringEqual;
}
String multiply(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
double equal = a1*b1;
String stringEqual = Double.toString(equal);
return stringEqual;
}
String divide(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
double equal = (a1)/b1;
String stringEqual = Double.toString(equal);
return stringEqual;
}
}
class Solve {
String[] numArrage(String[] numbers, String operator, int indexIndentify, int i){
for (int change = i + 1; change < indexIndentify; change++) {
numbers[change] = numbers[change+1];
}
numbers[indexIndentify] = null;
return numbers;
}
String MDAS(String input){
Operator Operator = new Operator();
String expression = input;
String[] numbers = expression.split("[+\\-x÷%]");
//Scan Operator
String operator = "";
for (int i = 0; i<expression.length(); i++) {
if ( expression.charAt(i) == '+' ||
expression.charAt(i) == '-' ||
expression.charAt(i) == 'x' ||
expression.charAt(i) == '%' ||
expression.charAt(i) == '÷') {
operator += expression.charAt(i);
}
}
int indexIndentify = numbers.length-1;
for (int i = 0; i<operator.length(); i++) {
if (operator.charAt(i) == 'x' || operator.charAt(i) == '÷' || operator.charAt(i) == '%') {
//Multiply
if (operator.charAt(i) == 'x') {
numbers[i] = Operator.multiply(numbers[i], numbers[i+1]);
operator = operator.substring(0, i) + operator.substring(i + 1);
numbers = numArrage(numbers, operator, indexIndentify, i);
indexIndentify--;
i--;
//Debug
//JOptionPane.showMessageDialog(null, "Operator: "+operator+"\n Numbers: "+Arrays.toString(numbers));
continue;
}
if (operator.charAt(i) == '÷') {
numbers[i] = Operator.divide(numbers[i], numbers[i+1]);
operator = operator.substring(0, i) + operator.substring(i + 1);
numbers = numArrage(numbers, operator, indexIndentify, i);
indexIndentify--;
i--;
//Debug
//JOptionPane.showMessageDialog(null, "Operator: "+operator+"\n Numbers: "+Arrays.toString(numbers));
continue;
}
if (operator.charAt(i) == '%') {
numbers[i] = Operator.modulo(numbers[i], numbers[i+1]);
operator = operator.substring(0, i) + operator.substring(i + 1);
numbers = numArrage(numbers, operator, indexIndentify, i);
indexIndentify--;
i--;
//Debug
//JOptionPane.showMessageDialog(null, "Operator: "+operator+"\n Numbers: "+Arrays.toString(numbers));
continue;
}
}
}
for (int i = 0; i<operator.length(); i++) {
if (operator.charAt(i) == '+' || operator.charAt(i) == '-') {
//Multiply
if (operator.charAt(i) == '+') {
numbers[i] = Operator.add(numbers[i], numbers[i+1]);
operator = operator.substring(0, i) + operator.substring(i + 1);
numbers = numArrage(numbers, operator, indexIndentify, i);
indexIndentify--;
i--;
//Debug
//JOptionPane.showMessageDialog(null, "Operator: "+operator+"\n Numbers: "+Arrays.toString(numbers));
continue;
}
if (operator.charAt(i) == '-') {
numbers[i] = Operator.subtract(numbers[i], numbers[i+1]);
operator = operator.substring(0, i) + operator.substring(i + 1);
numbers = numArrage(numbers, operator, indexIndentify, i);
indexIndentify--;
i--;
//Debug
//JOptionPane.showMessageDialog(null, "Operator: "+operator+"\n Numbers: "+Arrays.toString(numbers));
continue;
}
}
}
return numbers[0];
}
String PEMDAS(String input){
return "Parenthesis Not Yet Supported";
}
}