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

Can someone debug this code please? public class MathCalculator { String exp; in

ID: 3728115 • Letter: C

Question

Can someone debug this code please?

public class MathCalculator {
String exp;
int result;
  
public MathCalculator()
{
exp = " ";
result = 0;
}
  
public void evaluate(String ev)
{
Stack<Character> cStack = new Stack<Character>();
Stack<Integer> iStack = new Stack<Integer>();
  
exp = ev;
int index = 0;
  
while(index < ev.length())
{
if(Character.isDigit(ev.charAt(index)))
{
String temp = "";
while(Character.isDigit(ev.charAt(index)))
{
temp += ev.charAt(index);
index++;
}
iStack.push(Integer.parseInt(temp));
}
else if(ev.charAt(index) == '(')
{
cStack.push(ev.charAt(index));
index++;
}
else if(ev.charAt(index) == ')')
{
while(ev.charAt(index) != '(')
{
calculate(cStack, iStack);
cStack.pop();
index++;
}
}
else if(isOperator(ev.charAt(index)))
{
if(cStack.lookUp() >= priorityOperator(ev.charAt(index)));
{
calculate(cStack, iStack);
}
else
{
cStack.push(ev.charAt(index));
}

  
  
}
}
}
  
private void calculate(Stack<Character> cStack, Stack<Integer> iStack)
{
int x1, x2, result = 0;
char operator;
  
x2 = iStack.pop();
x1 = iStack.pop();
operator = cStack.pop();
  
switch(operator)
{
case '^':
{
result = (int) Math.pow(x1,x2);
break;
}
case '*':
{
result = x1 * x2;
break;
}
case '/':
{
result = x1 / x2;
break;
}
case '%':
{
result = x1 % x2;
break;
}
case '+':
{
result = x1 + x2;
break;
}
case '-':
{
result = x1 - x2;
break;
}
default:
{
System.out.println("Error: unknown operator" + operator);
}
}
iStack.push(result);
}
  
private boolean isOperator(char ch)
{
switch(ch)
{
case '^': case '*': case '/': case '%': case '+': case '-': return true;
default: return false;
}
}
  
private int priorityOperator(char ch)
{
int value = 0;
  
switch(ch)
{
case '^':
{
value = 2;
break;
}
case '*':
{
value = 2;
break;
}
case '/':
{
value = 2;
break;
}
case '%':
{
value = 2;
}
case '+':
{
value = 1;
break;
}
case '-':
{
value = 1;
break;
}
default:
{
System.out.println("Error: unknown operator" + ch);
}  
}
/*
if(ch == '^' || ch == '*' || ch == '/' || ch == '%')
{
value = 2;
}
else if(ch == '+' || ch == '-')
{
value = 1;
}
else
{
System.out.println("Error: unknown operator" + ch);
}
*/
return value;
}   

}

Explanation / Answer

Solution:

The spaces are also taken care of!

There are 9 places where I have debugged your code. I have marked these places in the code. I have also tested the code using main.java file.

MathCalculator.java

import java.util.Stack;

public class MathCalculator {

String exp;

int result;

  

public MathCalculator()

{

exp = " ";

result = 0;

}

  

public void evaluate(String ev)

{

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

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

  

//remove spaces from input

  

String tmp="";

for(int i=0;i<ev.length();i++) {

if(ev.charAt(i)==' ')

continue;

tmp=tmp+ev.charAt(i);

}

  

ev=tmp;

System.out.println(ev);

  

exp = ev;

int index = 0;

  

while(index < ev.length())

{

System.out.println("input char is "+ev.charAt(index));

if(Character.isDigit(ev.charAt(index)))

{

String temp = "";

//debug 7:

while(index<ev.length() && Character.isDigit(ev.charAt(index)))

{

temp += ev.charAt(index);

index++;

}

iStack.push(Integer.parseInt(temp));

}

else if(ev.charAt(index) == '(')

{

cStack.push(ev.charAt(index));

index++;

}

else if(ev.charAt(index) == ')')

{

//debug 9

while(cStack.peek() != '(')

{

calculate(cStack, iStack);

//cStack.pop(); debug1- no need to pop here,already popped out in calculate function

}

cStack.pop();//debug3 - removes '(' from stack

index++;

}

else if(isOperator(ev.charAt(index)))

{

//debug 4

while(cStack.size()>0 && cStack.peek()!='(' && priorityOperator(cStack.peek()) >= priorityOperator(ev.charAt(index))) //debug2

{

calculate(cStack, iStack);

}

  

cStack.push(ev.charAt(index));

index++; //debug 6

}

displayOperand(iStack);

displayOperator(cStack);

}

  

//debug 5 - calculates result from remaining operators and operands in the stacks

  

while(!cStack.isEmpty()) {

calculate(cStack, iStack);

}

  

//result is stored in istack

  

result=iStack.peek();

  

  

  

}

  

void displayOperator(Stack<Character> s) {

System.out.println("OPerator stack");

for(char ch:s) {

System.out.print(ch+" ");

}

System.out.println();

}

  

void displayOperand(Stack<Integer> s) {

System.out.println("OPerand stack");

for(int ch:s) {

System.out.print(ch+" ");

}

System.out.println();

}

  

private void calculate(Stack<Character> cStack, Stack<Integer> iStack)

{

int x1, x2, result = 0;

char operator;

  

x2 = iStack.pop();

x1 = iStack.pop();

operator = cStack.pop();

  

switch(operator)

{

case '^':

{

result = (int) Math.pow(x1,x2);

break;

}

case '*':

{

result = x1 * x2;

break;

}

case '/':

{

result = x1 / x2;

break;

}

case '%':

{

result = x1 % x2;

break;

}

case '+':

{

result = x1 + x2;

break;

}

case '-':

{

result = x1 - x2;

break;

}

default:

{

System.out.println("Error:ff unknown operator" + operator);

}

}

iStack.push(result);

}

  

private boolean isOperator(char ch)

{

switch(ch)

{

case '^': case '*': case '/': case '%': case '+': case '-': return true;

default: return false;

}

}

  

private int priorityOperator(char ch)

{

int value = 0;

  

switch(ch)

{

case '^':

{

value = 2;

break;

}

case '*':

{

value = 2;

break;

}

case '/':

{

value = 2;

break;

}

case '%':

{

value = 2;

//debug 8

break;

}

case '+':

{

value = 1;

break;

}

case '-':

{

value = 1;

break;

}

default:

{

System.out.println("Error: unknown operator" + ch);

}  

}

/*

if(ch == '^' || ch == '*' || ch == '/' || ch == '%')

{

value = 2;

}

else if(ch == '+' || ch == '-')

{

value = 1;

}

else

{

System.out.println("Error: unknown operator" + ch);

}

*/

return value;

}   

}

Main.java

public class Main {

public static void main(String[] args) {

MathCalculator m=new MathCalculator();

String exp="3*5+4/2+(4*10-(3*2+1))/3";

m.evaluate(exp);

System.out.println(m.result);

}

}

Sample input/output

input - 3*5+4/2-10%4

output - 15

input - 3*5+4/2

output-17

input - 3*5+4/2+(4*10)/3

output - 30

input - 3*5+4/2+(4*10-(3*2+1))/3

output-28

input - 3 * 6 + ( 25 - 7 * 2 ) / 10

output - 19