This is a working program.
But there is a logical error.
Try this with the calculator:
Press 2,M;
Press R,*,2;
Press R,*2;
The output in the same order must be:
2
2*2 = 4
2*2 = 4
but the third one outputs 88 instead.
M stands for Memory, it stores the value and R calls that value to be used in future operations. Why is this error so?
package MyJava; //change package name according to what
//package you installed the class in
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class De_Galicia6 extends JFrame implements ActionListener{
private JTextField displayText = new JTextField(30);
private JButton[] button = new JButton[19];
private String[] keys = {"7", "8", "9", "/",
"4", "5", "6","*",
"1", "2", "3", "-",
"0", "C", "=", "+",
"M", "R", "E"};
private String numStr1 = "";
private String numStr2 = "";
private char op;
private boolean firstInput = true;
private String memory = null;
public De_Galicia6 () {
setTitle("Calculator");
setSize(230, 230);
Container pane = getContentPane();
pane.setLayout(null);
displayText.setSize(200, 30);
displayText.setLocation(10,10);
pane.add(displayText);
int x, y;
x = 10;
y = 40;
for (int ind = 0; ind < 19; ind++) {
button[ind] = new JButton(keys[ind]);
button[ind].addActionListener(this);
button[ind].setSize(50, 30);
button[ind].setLocation(x, y);
pane.add(button[ind]);
x = x + 50;
if ((ind + 1) % 4 == 0) {
x = 10;
y = y +30;
}
}
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
String resultStr;
String str = String.valueOf(e.getActionCommand());
char ch = str.charAt(0);
switch (ch) {
case 'R':
displayText.setText(memory);
if (firstInput)
numStr1 = memory;
else
numStr2 = memory;
break;
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
if (firstInput) {
numStr1 = numStr1 + ch;
displayText.setText(numStr1);
}
else {
numStr2 = numStr2 + ch;
displayText.setText(numStr2);
}
break;
case '+' :
case '-' :
case '*' :
case '/' :
op = ch;
firstInput = false;
break;
case '=' :
resultStr = evaluate();
displayText.setText(resultStr);
numStr1 = resultStr;
numStr2 = " ";
firstInput = false;
break;
case 'C' :
displayText.setText(" ");
numStr1 = " ";
numStr2 = " ";
firstInput = true;
break;
case 'M':
memory = displayText.getText();
break;
case 'E':
System.exit(0);
}
}
private String evaluate() {
final char beep = '\u0007';
try {
float num1 = Float.parseFloat(numStr1);
float num2 = Float.parseFloat(numStr2);
float result = (float) 0.00;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
return String.valueOf(result);
}
catch (ArithmeticException e) {
System.out.print(beep);
return "E R R O R: " + e.getMessage();
}
catch (NumberFormatException e) {
System.out.print(beep);
if (numStr1.equals(""))
return "E R R O R : Invalid First Number";
else
return "E R R O R: Invalid Second Number";
}
catch (Exception e) {
System.out.print(beep);
return "E R R O R";
}
}
public static void main(String[] args) {
De_Galicia6 C = new De_Galicia6();
}
}