Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.util.Scanner;
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- do {
- System.out.print("Введите выражение: "); //запрашиваем выражение
- String str = in.nextLine(); //считываем выражение
- if (check_str(str)) { //проверяем выражение на коректность
- System.out.println("Результат: " + calculate(str)); //считаем и выводим ответ
- }
- System.out.print("Введите e для выхода из программы, либой другой символ для повторения: ");
- } while (in.nextLine().compareTo("e") != 0); //Если необходимо, начинаем новый цикл
- }
- public static double calculate(String str) {
- int pos = find_first_mot(str); //получаем позицию самой НЕ приоритетной операции
- if (pos == -1) // строка состоит из выражения в скобка или это число
- if (str.charAt(0) == '(' && str.charAt(str.length() - 1) == ')') //если выражение состоит из скобок
- return calculate(str.substring(1, str.length() - 1)); //считаем внутри скобок
- else
- return Double.parseDouble(str); // если внутри число
- else // если найдена операция, то выполняем ее
- switch (str.charAt(pos)) {
- case '+':
- return calculate(str.substring(0, pos)) + calculate(str.substring(pos + 1));
- case '-':
- return calculate(str.substring(0, pos)) - calculate(str.substring(pos + 1));
- case '*':
- return calculate(str.substring(0, pos)) * calculate(str.substring(pos + 1));
- case '/':
- return calculate(str.substring(0, pos)) / calculate(str.substring(pos + 1));
- }
- return -1;
- }
- public static int find_first_mot(String str) {
- int cnt = 0; // счетчик скобок
- int pos = -1, priority = 100; //pos - позиция элемента, priority - наименьший приоритет
- for (int i = str.length() - 1; i > 0; i--) // проходимся по всему выржению
- if (str.charAt(i) == '(')
- cnt++;
- else if (str.charAt(i) == ')')
- cnt--;
- else if (cnt == 0) // если мы сейчас не в скобка, то обрабатываем символ
- if (priori(str.charAt(i)) < priority)//если оператор имеее меньший приоритет, то обрабатываем его
- if (str.charAt(i) == '+' || str.charAt(i) == '-') //если это минус или плюс, то они имеют наименьший прир. и дальше искать нет необходимости
- return i;
- else {
- pos = i;
- priority = priori(str.charAt(i));
- }
- return priority == 100 ? -1 : pos; //если нет оперторов или все выражение находится в скобка возвращаем -1, иначе pos
- }
- /*
- проверяет строку на коректность
- */
- public static boolean check_str(String str) {
- int n = str.length();
- int cnt = 0;
- for (int i = 0; i < n; i++) {
- if (str.charAt(i) == '(') { // если перед скобкой стоит не скобка или не другая скобка - это некоректно.
- cnt++;
- if (i - 1 >= 0 &&
- !(str.charAt(i - 1) == '*' || str.charAt(i - 1) == '/' ||
- str.charAt(i - 1) == '+' || str.charAt(i - 1) == '-' ||
- str.charAt(i - 1) == '(')){
- System.out.println("Нет действий перед скобкой");
- return false;
- }
- } else if (str.charAt(i) == ')') {// если после скобки стоит не скобка или не другая скобка - это некоректно.
- cnt--;
- if (i + 1 < str.length() &&
- !(str.charAt(i + 1) == '*' || str.charAt(i + 1) == '/' ||
- str.charAt(i + 1) == '+' || str.charAt(i + 1) == '-' ||
- str.charAt(i + 1) == ')')) {
- System.out.println("Нет действий после скобки");
- return false;
- } //если найден неизвестный символ
- } else if (!(str.charAt(i) >= '0' && str.charAt(i) <= '9' ||
- str.charAt(i) == '*' || str.charAt(i) == '/' ||
- str.charAt(i) == '+' || str.charAt(i) == '-')) {
- System.out.println("Неизвестный символ: " + str.charAt(i));
- return false;
- }
- }
- if (cnt != 0) { //в выражении неправильное кол-во скобок
- System.out.println("Не правильное кол-во скобок.");
- return false;
- }
- return true;
- }
- /*
- возвращает приоритет операции
- */
- public static int priori(char mot) {
- switch (mot) {
- case '+':
- case '-':
- return 1;
- case '*':
- case '/':
- return 2;
- default:
- return 101; // для всего остального
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement