Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Can anyone please help me get this program to display parentheses ? I also need

ID: 3681444 • Letter: C

Question

Can anyone please help me get this program to display parentheses? I also need a space between each integer, operator and parentheses. Example ( 2 + 3 ) * 5. Also, the operators (+,-,/,*) are being displayed on the calculator which I need them to do not just perform the calculations. The calculator needs to know how to perform order of operations since parentheses are an option. Lastly, I would like the first row of the calculator to be for calculation purposes only. Currently, there is only one box to display numbers being calculated. I have provided a GUI example of how I want it to look as opposed to how it appears now. Please modify the program below.


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


public class Calc extends Applet
implements ActionListener
{
/**
   *
   */
   private static final long serialVersionUID = 1L;
       String msg=" ";
int v1,v2,result;
TextField t1;
Button b[]=new Button[10];
Button add,sub,mul,div,clear,mod,EQ,left,right;
char OP;
public void init()
{
Color k=new Color(120,89,90);
setBackground(k);
t1=new TextField(10);
GridLayout gl=new GridLayout(4,5);
setLayout(gl);
for(int i=0;i<10;i++)
{
b[i]=new Button(""+i);
}
add=new Button("add");
sub=new Button("sub");
mul=new Button("mul");
div=new Button("div");
mod=new Button("mod");
left=new Button("(");
right=new Button(")");
clear=new Button("clear");
EQ=new Button("EQ");
t1.addActionListener(this);
add(t1);
for(int i=0;i<10;i++)
{
add(b[i]);
}
add(add);
add(sub);
add(mul);
add(div);
add(mod);
add(left);
add(right);
add(clear);
add(EQ);
for(int i=0;i<10;i++)
{
b[i].addActionListener(this);
}
add.addActionListener(this);
sub.addActionListener(this);
mul.addActionListener(this);
div.addActionListener(this);
mod.addActionListener(this);
left.addActionListener(this);
right.addActionListener(this);
clear.addActionListener(this);
EQ.addActionListener(this);
}

public void actionPerformed(ActionEvent ae)
{
String str=ae.getActionCommand();
char ch=str.charAt(0);
if ( Character.isDigit(ch))
t1.setText(t1.getText()+str);
else
if(str.equals("add"))
{
v1=Integer.parseInt(t1.getText());
OP='+';
t1.setText("");
}
else if(str.equals("sub"))
{
v1=Integer.parseInt(t1.getText());
OP='-';
t1.setText("");
}
else if(str.equals("mul"))
{
v1=Integer.parseInt(t1.getText());
OP='*';
t1.setText("");
}
else if(str.equals("div"))
{
v1=Integer.parseInt(t1.getText());
OP='/';
t1.setText("");
}
else if(str.equals("mod"))
{
v1=Integer.parseInt(t1.getText());
OP='%';
t1.setText("");
}
else if(str.equals("left"))
{
v1=Integer.parseInt(t1.getText());
OP='(';
t1.setText("");
}
else if(str.equals("right"))
{
v1=Integer.parseInt(t1.getText());
OP=')';
t1.setText("");
}
if(str.equals("EQ"))
{
v2=Integer.parseInt(t1.getText());
if(OP=='+')
result=v1+v2;
else if(OP=='-')
result=v1-v2;
else if(OP=='*')
result=v1*v2;
else if(OP=='/')
result=v1/v2;
else if(OP=='%')
result=v1%v2;
t1.setText(""+result);
}   
if(str.equals("clear"))
{
t1.setText("");
}
}
}

Explanation / Answer

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.Stack;

public class Calc extends Applet implements ActionListener {
   private static final long serialVersionUID = 1L;
   String msg = " ";
   int v1, v2, result;
   TextField t1;
   Button b[] = new Button[10];
   Button add, sub, mul, div, clear, mod, EQ, left, right;
   char OP;
   boolean resetflag = false;

   public void init() {
       Color k = new Color(120, 89, 90);
       setBackground(k);
       t1 = new TextField(10);
       GridLayout gl = new GridLayout(4, 5);
       setLayout(gl);
       for (int i = 0; i < 10; i++) {
           b[i] = new Button("" + i);
       }
       add = new Button("add");
       sub = new Button("sub");
       mul = new Button("mul");
       div = new Button("div");
       mod = new Button("mod");
       left = new Button("(");
       right = new Button(")");
       clear = new Button("clear");
       EQ = new Button("EQ");
       t1.addActionListener(this);
       add(t1);
       for (int i = 0; i < 10; i++) {
           add(b[i]);
       }
       add(add);
       add(sub);
       add(mul);
       add(div);
       add(mod);
       add(left);
       add(right);
       add(clear);
       add(EQ);
       for (int i = 0; i < 10; i++) {
           b[i].addActionListener(this);
       }
       add.addActionListener(this);
       sub.addActionListener(this);
       mul.addActionListener(this);
       div.addActionListener(this);
       mod.addActionListener(this);
       left.addActionListener(this);
       right.addActionListener(this);
       clear.addActionListener(this);
       EQ.addActionListener(this);
   }

   public void actionPerformed(ActionEvent ae) {

       if (resetflag == true) {
           t1.setText("");
           resetflag = false;
       }
       String str = ae.getActionCommand();
       char ch = str.charAt(0);
       if (Character.isDigit(ch))
           t1.setText(t1.getText() + str);
       else if (str.equals("add")) {
           t1.setText(t1.getText() + " + ");
       } else if (str.equals("sub")) {
           t1.setText(t1.getText() + " - ");
       } else if (str.equals("mul")) {
           t1.setText(t1.getText() + " x ");
       } else if (str.equals("div")) {
           t1.setText(t1.getText() + " / ");
       } else if (str.equals("mod")) {
           t1.setText(t1.getText() + " % ");
       } else if (str.equals("(")) {
           t1.setText(t1.getText() + " ( ");
       } else if (str.equals(")")) {
           t1.setText(t1.getText() + " ) ");
       }
       if (str.equals("EQ")) {
           String temp = t1.getText();
           result = evaluate(temp);
           t1.setText("" + result);
           resetflag = true;

       }
       if (str.equals("clear")) {
           t1.setText("");
       }
   }

   public static int evaluate(String expression) {
       char[] tokens = expression.toCharArray();

       Stack<Integer> values = new Stack<Integer>();

       Stack<Character> ops = new Stack<Character>();

       for (int i = 0; i < tokens.length; i++) {
           if (tokens[i] == ' ')
               continue;

           if (tokens[i] >= '0' && tokens[i] <= '9') {
               StringBuffer sbuf = new StringBuffer();
               while (i < tokens.length && tokens[i] >= '0'
                       && tokens[i] <= '9')
                   sbuf.append(tokens[i++]);
               values.push(Integer.parseInt(sbuf.toString()));
           }

           else if (tokens[i] == '(')
               ops.push(tokens[i]);

           else if (tokens[i] == ')') {
               while (ops.peek() != '(')
                   values.push(applyOp(ops.pop(), values.pop(), values.pop()));
               ops.pop();
           }

           else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == 'x'
                   || tokens[i] == '/' || tokens[i] == '%') {
               while (!ops.empty() && hasPrecedence(tokens[i], ops.peek()))
                   values.push(applyOp(ops.pop(), values.pop(), values.pop()));


               ops.push(tokens[i]);
           }
       }

       while (!ops.empty())
           values.push(applyOp(ops.pop(), values.pop(), values.pop()));


       return values.pop();
   }

   public static boolean hasPrecedence(char op1, char op2) {
       if (op2 == '(' || op2 == ')')
           return false;
       if ((op1 == 'x' || op1 == '/' || op1 == '%')
               && (op2 == '+' || op2 == '-'))
           return false;
       else
           return true;
   }

   public static int applyOp(char op, int b, int a) {
       switch (op) {
       case '+':
           return a + b;
       case '-':
           return a - b;
       case 'x':
           return a * b;
       case '%':
           return a % b;
       case '/':
           if (b == 0)
               throw new UnsupportedOperationException("Cannot divide by zero");
           return a / b;
       }
       return 0;
   }

}