Advertisement
Guest User

Untitled

a guest
Sep 9th, 2016
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.03 KB | None | 0 0
  1. package stringcalculator;
  2.  
  3. import java.net.URL;
  4. import java.util.ResourceBundle;
  5. //import javafx.event.ActionEvent;
  6. import javafx.fxml.FXML;
  7. import javafx.fxml.Initializable;
  8. import javafx.scene.control.*;
  9. import java.util.*;
  10. //import java.util.function.Consumer;
  11. //import java.lang.*;
  12. //import java.io.*;
  13.  
  14. public class GuiController implements Initializable {
  15.        
  16.     @FXML
  17.     private TextField textField;
  18.    
  19.     @FXML
  20.     private void clickC() {
  21.         textField.setText("0");
  22.     }    
  23.     @FXML
  24.     private void clickPoint() {
  25.         if (!textField.getText().endsWith(".")) {
  26.             textField.setText(textField.getText() + ".");            
  27.         }
  28.     }    
  29.     @FXML
  30.     private void click0() {
  31.         if (!textField.getText().equals("0")) {
  32.             textField.setText(textField.getText() + "0");            
  33.         }
  34.     }
  35.     @FXML
  36.     private void click1() {
  37.         if (textField.getText().equals("0")) {
  38.             textField.setText("1");
  39.         } else {
  40.             textField.setText(textField.getText() + "1");  
  41.         }
  42.     }
  43.     @FXML
  44.     private void click2() {
  45.         if (textField.getText().equals("0")) {
  46.             textField.setText("2");
  47.         } else {
  48.             textField.setText(textField.getText() + "2");  
  49.         }
  50.     }
  51.     @FXML
  52.     private void click3() {
  53.         if (textField.getText().equals("0")) {
  54.             textField.setText("3");
  55.         } else {
  56.             textField.setText(textField.getText() + "3");  
  57.         }    }
  58.     @FXML
  59.     private void click4() {
  60.         if (textField.getText().equals("0")) {
  61.             textField.setText("4");
  62.         } else {
  63.             textField.setText(textField.getText() + "4");  
  64.         }
  65.     }
  66.     @FXML
  67.     private void click5() {
  68.         if (textField.getText().equals("0")) {
  69.             textField.setText("5");
  70.         } else {
  71.             textField.setText(textField.getText() + "5");  
  72.         }        
  73.     }
  74.     @FXML
  75.     private void click6() {
  76.         if (textField.getText().equals("0")) {
  77.             textField.setText("6");
  78.         } else {
  79.             textField.setText(textField.getText() + "6");  
  80.         }
  81.     }
  82.     @FXML
  83.     private void click7() {
  84.         if (textField.getText().equals("0")) {
  85.             textField.setText("7");
  86.         } else {
  87.             textField.setText(textField.getText() + "7");  
  88.         }
  89.     }
  90.     @FXML
  91.     private void click8() {
  92.         if (textField.getText().equals("0")) {
  93.             textField.setText("8");
  94.         } else {
  95.             textField.setText(textField.getText() + "8");  
  96.         }
  97.     }
  98.     @FXML
  99.     private void click9() {
  100.         if (textField.getText().equals("0")) {
  101.             textField.setText("9");
  102.         } else {
  103.             textField.setText(textField.getText() + "9");  
  104.         }
  105.     }
  106.     @FXML
  107.     private void clickPlus() {
  108.         textField.setText(textField.getText() + "+");        
  109.     }
  110.     @FXML
  111.     private void clickMinus() {
  112.         textField.setText(textField.getText() + "-");
  113.     }
  114.     @FXML
  115.     private void clickPow() {
  116.         textField.setText(textField.getText() + "*");
  117.     }
  118.     @FXML
  119.     private void clickDivide() {
  120.         textField.setText(textField.getText() + "/");
  121.     }
  122.     @FXML
  123.     private void clickOpen() {
  124.         if (textField.getText().equals("0")) {
  125.             textField.setText("(");
  126.         } else {
  127.             textField.setText(textField.getText() + "(");  
  128.         }
  129.     }
  130.     @FXML
  131.     private void clickClose() {
  132.         textField.setText(textField.getText() + ")");
  133.     }
  134.    
  135.    
  136.     public Double calc(List<String> postfix) {
  137.         Deque<Double> stack = new ArrayDeque<>();
  138.         for (String x : postfix) {
  139.             if (x.equals("sqrt")) {
  140.                 stack.push(Math.sqrt(stack.pop()));
  141.             } else if (x.equals("cube")) {
  142.                 Double tmp = stack.pop();
  143.                 stack.push(tmp * tmp * tmp);
  144.             } else if (x.equals("pow10")) {
  145.                 stack.push(Math.pow(10, stack.pop()));
  146.             } else if (x.equals("+")) {
  147.                 stack.push(stack.pop() + stack.pop());
  148.             } else if (x.equals("-")) {
  149.                 Double b = stack.pop(), a = stack.pop();
  150.                 stack.push(a - b);
  151.             } else if (x.equals("*")) {
  152.                 stack.push(stack.pop() * stack.pop());
  153.             } else if (x.equals("/")) {
  154.                 Double b = stack.pop(), a = stack.pop();
  155.                 stack.push(a / b);
  156.             } else if (x.equals("u-")) {
  157.                 stack.push(-stack.pop());
  158.             } else {
  159.                 stack.push(Double.valueOf(x));
  160.             }
  161.         }
  162.         return stack.pop();
  163.     }
  164.  
  165.     //-----------------------------------------
  166.     private final String operators = "+-*/";
  167.     private final String delimiters = "() " + operators;
  168.     public boolean flag = true;
  169.  
  170.     private boolean isDelimiter(String token) {
  171.         if (token.length() != 1) {
  172.             return false;
  173.         }
  174.         for (int i = 0; i < delimiters.length(); i++) {
  175.             if (token.charAt(0) == delimiters.charAt(i)) {
  176.                 return true;
  177.             }
  178.         }
  179.         return false;
  180.     }
  181.  
  182.     private boolean isOperator(String token) {
  183.         if (token.equals("u-")) {
  184.             return true;
  185.         }
  186.         for (int i = 0; i < operators.length(); i++) {
  187.             if (token.charAt(0) == operators.charAt(i)) {
  188.                 return true;
  189.             }
  190.         }
  191.         return false;
  192.     }
  193.  
  194.     private boolean isFunction(String token) {
  195.         return token.equals("sqrt") || token.equals("cube") || token.equals("pow10");
  196.     }
  197.  
  198.     private int priority(String token) {
  199.         if (token.equals("(")) {
  200.             return 1;
  201.         }
  202.         if (token.equals("+") || token.equals("-")) {
  203.             return 2;
  204.         }
  205.         if (token.equals("*") || token.equals("/")) {
  206.             return 3;
  207.         }
  208.         return 4;
  209.     }
  210.  
  211.     public List<String> parse(String infix) {
  212.         List<String> postfix = new ArrayList<>();
  213.         Deque<String> stack = new ArrayDeque<>();
  214.         StringTokenizer tokenizer = new StringTokenizer(infix, delimiters, true);
  215.         String prev = "";
  216.         String curr = "";
  217.         while (tokenizer.hasMoreTokens()) {
  218.             curr = tokenizer.nextToken();
  219.             if (!tokenizer.hasMoreTokens() && isOperator(curr)) {
  220.                 textField.setText("Invalid exp.");
  221.                 flag = false;
  222.                 return postfix;
  223.             }
  224.             if (curr.equals(" ")) {
  225.                 continue;
  226.             }
  227.             if (isFunction(curr)) {
  228.                 stack.push(curr);
  229.             } else if (isDelimiter(curr)) {
  230.                 if (curr.equals("(")) {
  231.                     stack.push(curr);
  232.                 } else if (curr.equals(")")) {
  233.                     while (!stack.peek().equals("(")) {
  234.                         postfix.add(stack.pop());
  235.                         if (stack.isEmpty()) {
  236.                             textField.setText("Invalid exp. skobki");
  237.                             flag = false;
  238.                             return postfix;
  239.                         }
  240.                     }
  241.                     stack.pop();
  242.                     if (!stack.isEmpty() && isFunction(stack.peek())) {
  243.                         postfix.add(stack.pop());
  244.                     }
  245.                 } else {
  246.                     if (curr.equals("-") && (prev.equals("") || (isDelimiter(prev) && !prev.equals(")")))) {
  247.                         // унарный минус
  248.                         curr = "u-";
  249.                     } else {
  250.                         while (!stack.isEmpty() && (priority(curr) <= priority(stack.peek()))) {
  251.                             postfix.add(stack.pop());
  252.                         }
  253.  
  254.                     }
  255.                     stack.push(curr);
  256.                 }
  257.  
  258.             } else {
  259.                 postfix.add(curr);
  260.             }
  261.             prev = curr;
  262.         }
  263.  
  264.         while (!stack.isEmpty()) {
  265.             if (isOperator(stack.peek())) {
  266.                 postfix.add(stack.pop());
  267.             } else {
  268.                 textField.setText("Invalid exp. skobki");
  269.                 flag = false;
  270.                 return postfix;
  271.             }
  272.         }
  273.         return postfix;
  274.     }
  275.  
  276.     @FXML
  277.     private void clickFinally() {
  278.         String s = textField.getText();
  279.         List<String> expression = parse(s);
  280.     if (flag) {
  281.             expression.stream().forEach((String) -> {
  282.                 if(String.valueOf(calc(expression)).endsWith(".0")) {
  283.                     textField.setText(String.valueOf(calc(expression))
  284.                             .substring(0, String.valueOf(calc(expression))
  285.                                     .length() - 2));
  286.                 } else {
  287.                     textField.setText(String.valueOf(calc(expression)));
  288.                 }
  289.             });
  290.         }
  291.     }
  292.    
  293.     @Override
  294.     public void initialize(URL url, ResourceBundle rb) {        
  295.     }        
  296. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement