Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop p

java program to create a smart calculator | java programming example

Making a calculator project  in java [2020]


In this post, I am gonna tell you how can you create a calculator in java, our calc program will support every mathematical expression from user input, such as 3+5*5(7+9)^ 9.

Making Strategies to code our calc program

  1. Our program will run continuously until the user enters an "/exit" command.
    so for that, we will use while loop.
  2. If the user enters an invalid Exp then we will print out "Invalid Exp".
  3. To Calculate the result efficiently we'll change the Input expression From Infix to Postfix notation (read this in infix to postfix post)
  4. At last, we will print out the result and wait for the next input.

Code Structure

import java.util.Scanner;

public class Calculator {
public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
String userInput;
while(true) {
userInput = scanner.nextLine().trim();
if(userInput.equals("/exit")) {
break;
}
else {
infixToPostfix(userInput);
}

}
}
// You'll implement these methods bellow
static String infixToPostfix(String infixExp) { return "this method will return postfix exp";
 }

static Integer result(String postfixExp) {
return 0;
}

Read this post if you don't know about infix and postfix notation, then come back 

Implementation of infix to postFix method

In our program, infix to postfix method takes a String type argument as infixExp and returns its corresponding postfixExp as String. see the implementation below.
you can see I have defined a new method operator precedence, which returns
the priority order for the operators. The implementation of that method Is done by using a switch statement. This method helps the infix to postfix method in converting in notation. 

static String infixToPostfix(String infixExp) {
      
           final Stack<Character> stack = new Stack<>();
  
           String postfix = "";

           //Remove all spaces 

           infixExp = infixExp.replaceAll(" *", "");     

           // Make a char array from infixExp, 
           for (final char ch : infixExp.toCharArray()) {
             if(Character.isDigit(ch)) 
             postfix += ch;
             else if (stack.isEmpty()) {
               stack.push(ch);
               postfix += " ";
     }
          else if ( ch == '(' )
             stack.push(ch);
             else if( ch == ')' ) {
               while( !stack.isEmpty() && stack.peek() != '(' ) {
                 postfix += " " + stack.pop();
               }
               stack.pop(); 
     }
   else if (operatorPrecedence(ch) > operatorPrecedence(stack.peek())) {    
               stack.push(ch);
               postfix += " ";
     }

             else postfix += " " + stack.pop();
   
   }
           while (!stack.isEmpty()) {
             postfix += " " + stack.pop();
   }
           return postfix;
      
      
 }
         static short operatorPrecedence(final char ch) {
            switch (ch) {
             case '+':
             case '-': return 1;
             case '*':
             case '/': return 2;
             case '^': return 3;
             default:
               return 0;
   }
      
 }

Implementation of result method

Again I have made another additional method (arithmeticOP) to help the result method. this method is also using a switch statement.

static Double result(final String postfixExp) {

                 final String[] items = postfixExp.split(" "); 
                 final Stack<Double> stack  = new Stack<>();

                 for(final String item : items) {
    
                   if (item.matches("\\d+"))
                   stack.push(Double.valueOf(item));

                   else {
                     final Double y = stack.pop();
                     final Double x = stack.pop();
                     stack.push(arithmeticOP(x, y, item));
  
     }
                 }

                 return stack.pop();

               }
        
               static Double arithmeticOP(final Double x, final Double y, final String op) {

                 switch (op) {
                   case "+": return x + y;
                   case "-": return x - y;
                   case "*": return x * y;
                   case "/": return x / y;
                   case "^": return Math.pow(x, y);
                   default: return 0.0;
        
                 }
        
               }
              }

Complete code

Please comment if anything was wrong


No comments:

Post a Comment