Advertisement
Ansaid

Калькулятор

Sep 12th, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.51 KB | None | 0 0
  1. package com.company;
  2. import java.lang.String;
  3. import java.lang.Double;
  4. import java.util.ArrayList;
  5.  
  6. class Stack implements Priority_operations{
  7.     private ArrayList <String> formula_str = new ArrayList<>();
  8.     private StringBuilder formula;
  9.     private int SIZE;
  10.     //private int SIZE_str = 0;
  11.     private ArrayList <Double> digits = new ArrayList<>();
  12.     private ArrayList <String> operations = new ArrayList<>();
  13.  
  14.     Stack(){ }
  15.  
  16.     void set_formula(String formula){
  17.         this.formula = new StringBuilder(formula);
  18.     }
  19.  
  20.     StringBuilder get_formula(){
  21.         return formula;
  22.     }
  23.  
  24.     void formula_toStringArray(){
  25.         StringBuilder temp = new StringBuilder();
  26.  
  27.  
  28.         int mark_start  = 0;// Две метки начала и конца числа
  29.         int mark_end = 0;
  30.  
  31.         if(formula.charAt(0) == '-'){ // если первым минус, то сразу его в число
  32.             mark_end = 1;
  33.             while(mark_end != formula.length() && formula.charAt(mark_end) != '+' && formula.charAt(mark_end) != '-' && formula.charAt(mark_end) != '/' && formula.charAt(mark_end) != '*' && formula.charAt(mark_end) != '(')
  34.                 mark_end++;
  35.  
  36.             for (int i = mark_start; i < mark_end; i++)
  37.                 temp.append(formula.charAt(i));  // между началом и концом записывать символы в темп
  38.  
  39.             formula_str.add(temp.toString());
  40.             mark_start = mark_end + 1;
  41.             temp = new StringBuilder();
  42.         }
  43.  
  44.         for(int i = mark_end; i < SIZE; i++){
  45.             if(formula.charAt(i) == '+' || formula.charAt(i) == '-' || formula.charAt(i) == '/' || formula.charAt(i) == '*' || formula.charAt(i) == '(' || formula.charAt(i) == ')'){ //если найден знак или скобка
  46.                 mark_end = i; // концу присваиваем индекс первого занака
  47.                 for (int j = mark_start; j < mark_end; j++)
  48.                     temp.append(formula.charAt(j));  // между началом и концом записывать символы в темп
  49.  
  50.                 if(!temp.toString().equals("")) { // если темп не пустой, то заносим темп в массив
  51.                     formula_str.add(temp.toString());
  52.                     //SIZE_str++;
  53.                 }
  54.  
  55.                 formula_str.add(String.valueOf(formula.charAt(mark_end))); // заносим операцию в массив
  56.                 //SIZE_str++;
  57.                 temp = new StringBuilder(); // обнуляем темп
  58.                 mark_start = mark_end + 1; // старт теперь после конца
  59.             }
  60.         }
  61.         mark_end = SIZE; // конец в конце строки
  62.         for (int j = mark_start; j < mark_end; j++) // записываем последнее число в темп
  63.             temp.append(formula.charAt(j));
  64.         if(!temp.toString().equals("")) { //если темп не пустой, то заносим в массив
  65.             formula_str.add(temp.toString());
  66.             //SIZE_str++;
  67.         }
  68.  
  69.  
  70.         for (int i = 1; i < formula_str.size() - 1; i++){ //если после скобки отрицательное число
  71.             if(formula_str.get(i - 1).equals("(") && formula_str.get(i).equals("-") && !formula_str.get(i + 1).equals("(")) { //если после скобки '-'
  72.                 formula_str.set(i, formula_str.get(i) + formula_str.get(i + 1));
  73.                 formula_str.remove(i + 1);
  74.             }
  75.         }
  76.     }
  77.  
  78.     boolean check_formula(){
  79.         boolean error = false;
  80.         String buffer = formula.toString();
  81.         buffer = buffer.replace(',', '.'); // смена ',' на '.'
  82.         buffer = buffer.replace(" ", ""); //удаление пробелов
  83.         formula = new StringBuilder(buffer);
  84.  
  85.         if(formula.toString().isEmpty())
  86.             return true;
  87.  
  88.         SIZE = formula.length();
  89.  
  90.         if(SIZE > 100) // проверка на длину
  91.             error = true;
  92.  
  93.         if((formula.charAt(0) > 40 && formula.charAt(0) < 48) && formula.charAt(0) != '-') // первый символ число или '(' или '-'
  94.             error = true;
  95.  
  96.         if(formula.charAt(SIZE - 1) > 39 && formula.charAt(SIZE - 1) < 48 && formula.charAt(SIZE - 1) != ')')  // последний символ число или ')'
  97.             error = true;
  98.  
  99.         for(int i = 0; i < SIZE - 1; i++){  // проверка на два знака подряд
  100.             if((formula.charAt(i) == '+' || formula.charAt(i) == '-' || formula.charAt(i) == '*' || formula.charAt(i) == '/' || formula.charAt(i) == '.') &&
  101.                     (formula.charAt(i + 1) == '+' || formula.charAt(i + 1) == '-' || formula.charAt(i + 1) == '*' || formula.charAt(i + 1) == '/' || formula.charAt(i + 1) == '.'))
  102.                 error = true;
  103.  
  104.             if(formula.charAt(i) == '(' && formula.charAt(i + 1) == ')') //проверка на пустые скобки
  105.                 error = true;
  106.  
  107.             if(formula.charAt(i) == '(' && (formula.charAt(i + 1) == '+' || formula.charAt(i + 1) == '*' || formula.charAt(i + 1) == '/')) // проверка после '(' не знак, кроме '-'
  108.                 error = true;
  109.  
  110.             if((formula.charAt(i) == '-' || formula.charAt(i) == '+' || formula.charAt(i) == '*' || formula.charAt(i) == '/') && formula.charAt(i + 1) == ')') // провекрка перед ')' не знак
  111.                 error = true;
  112.         }
  113.  
  114.         int open = 0;
  115.         int close = 0;
  116.        
  117.         for(int i = 0; i < SIZE; i++) {
  118.             if (!(formula.charAt(i) > 39 && formula.charAt(i) < 58 && formula.charAt(i) != ' ')) // проверка на допустимые символы
  119.             {
  120.                 error = true;
  121.                 break;
  122.             }
  123.  
  124.             if(i != 0 && formula.charAt(i) == '(' && (formula.charAt(i - 1) != '+' && formula.charAt(i - 1) != '-' && formula.charAt(i - 1) != '*' && formula.charAt(i - 1) != '/' &&  formula.charAt(i - 1) != '(')) // проверка на то, что перед '(' есть знак  или '('
  125.                 error = true;
  126.  
  127.             if(i != SIZE - 1 && formula.charAt(i) == ')' && (formula.charAt(i + 1) != '+' && formula.charAt(i + 1) != '-' && formula.charAt(i + 1) != '*' && formula.charAt(i + 1) != '/' && formula.charAt(i + 1) != ')')) // проверка на то, что после ')' есть знак или ')'
  128.                 error = true;
  129.  
  130.             if(formula.charAt(i) == '(') // подсчет скобочек
  131.                 open++;
  132.             if(formula.charAt(i) == ')')
  133.                 close++;
  134.  
  135.             if(close > open) { // сначала должна идти открывающаяся скобка
  136.                 error = true;
  137.                 break;
  138.             }
  139.         }
  140.  
  141.         if(open != close) // проверка на соответствие скобочек
  142.             error = true;
  143.  
  144.         return error;
  145.     }
  146.  
  147.     private int priority(String operation){
  148.         switch (operation){
  149.             case "+":
  150.                 return PLUS;
  151.             case "-":
  152.                 return MINUS;
  153.             case "*":
  154.                 return MULTIPLICATION;
  155.             case "/":
  156.                 return DIVISION;
  157.             default:
  158.                 return 0;
  159.         }
  160.     }
  161.  
  162.     private double operate(double first, double second, String operate){
  163.         switch (operate){
  164.             case "+":
  165.                 return first + second;
  166.             case "-":
  167.                 return first - second;
  168.             case "*":
  169.                 return first * second;
  170.             case "/":
  171.                 return first / second;
  172.             default:
  173.                 return 5;
  174.         }
  175.     }
  176.  
  177.     double  result() {
  178.         String given_element;
  179.         double first;
  180.         double second;
  181.  
  182.         for(int i = 0; i < formula_str.size(); i++){
  183.             given_element = formula_str.get(i);
  184.             switch (given_element) {
  185.                 case "+":
  186.                 case "-":
  187.                 case "/":
  188.                 case "*":
  189.                     if (operations.isEmpty()) {
  190.                         operations.add(given_element);
  191.                     } else {
  192.                         while (!operations.isEmpty() && digits.size() > 1 && priority(given_element) <= priority(operations.get(operations.size() - 1))) {
  193.                             second = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
  194.                             digits.remove(digits.size() - 1);
  195.                             first = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
  196.                             digits.remove(digits.size() - 1);
  197.  
  198.                             digits.add(operate(first, second, operations.get(operations.size() - 1)));
  199.                             operations.remove(operations.size() - 1);
  200.                         }
  201.                         operations.add(given_element);
  202.                     }
  203.                     break;
  204.                 case "(":
  205.                     operations.add(given_element);
  206.                     // if(formula_str.get(i + 1).equals("-"))
  207.                     if( i > 0 && formula_str.get(i - 1).equals("-") && formula_str.get(i).equals("(")){
  208.                         if(i == 1) {
  209.                             digits.add(0.0);
  210.                             break;
  211.                         }
  212.                         if(formula_str.get(i - 2).equals("(")) {
  213.                             digits.add(0.0);
  214.                             break;
  215.                         }
  216.                     }
  217.  
  218.                     break;
  219.                 case ")":
  220.                     while (!operations.get(operations.size() - 1).equals("(") && digits.size() > 1) {
  221.                         second = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
  222.                         digits.remove(digits.size() - 1);
  223.                         first = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
  224.                         digits.remove(digits.size() - 1);
  225.  
  226.                         digits.add(operate(first, second, operations.get(operations.size() - 1)));
  227.                         operations.remove(operations.size() - 1);
  228.                     }
  229.                     operations.remove(operations.size() - 1);
  230.                     break;
  231.                 default:
  232.                     digits.add(Double.parseDouble(given_element));
  233.                     break;
  234.             }
  235.         }
  236.  
  237.         while(!operations.isEmpty() && digits.size() > 1){
  238.             second = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
  239.             digits.remove(digits.size() - 1);
  240.             first = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
  241.             digits.remove(digits.size() - 1);
  242.  
  243.             digits.add(operate(first, second, operations.get(operations.size() - 1)));
  244.             operations.remove(operations.size() - 1);
  245.         }
  246.  
  247.         double result = digits.get(0);
  248.         formula_str.clear();
  249.         digits.clear();
  250.         operations.clear();
  251.         return result;
  252.     }
  253.  
  254.     void get_operations(){
  255.         for(int i = 0; i < operations.size(); i++){
  256.             System.out.println(operations.get(i));
  257.         }
  258.     }
  259.  
  260.     void get_formula_str(){
  261.         for(int i = 0; i < formula_str.size(); i++){
  262.             System.out.println(formula_str.get(i));
  263.         }
  264.     }
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement