Анальный Дебошир
Профи
(869)
1 год назад
Вот решение на языке Java, которое выполняет все требования задачи:
import java.util.Scanner;
public class MathExpressionCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Введите математическое выражение: ");
String expression = scanner.nextLine();
try {
double result = evaluateExpression(expression);
System.out.printf("Результат: %.2f%n", result);
} catch (Exception e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
private static double evaluateExpression(String expression) throws Exception {
// Удаляем пробелы из выражения
expression = expression.replaceAll("\\s+", "");
// Проверяем выражение на наличие недопустимых символов
if (!expression.matches("[0-9.eE()+\\-*/%]+")) {
throw new Exception("недопустимые символы");
}
// Проверяем выражение на наличие непарных скобок
if (countSubstring(expression, "(") != countSubstring(expression, ")")) {
throw new Exception("непарные скобки");
}
// Вычисляем значение выражения
return evaluate(expression);
}
private static double evaluate(String expression) throws Exception {
// Решаем выражение в скобках
int openBracketIndex = expression.lastIndexOf("(");
if (openBracketIndex != -1) {
int closeBracketIndex = expression.indexOf(")", openBracketIndex);
String innerExpression = expression.substring(openBracketIndex + 1, closeBracketIndex);
double innerResult = evaluate(innerExpression);
expression = expression.substring(0, openBracketIndex) + innerResult + expression.substring(closeBracketIndex + 1);
return evaluate(expression);
}
// Решаем выражение с учетом приоритета операций
int index = 0;
double leftOperand = 0;
double rightOperand = 0;
char operator = ' ';
while (index < expression.length()) {
char currentChar = expression.charAt(index);
if (isOperator(currentChar)) {
operator = currentChar;
leftOperand = Double.parseDouble(expression.substring(0, index));
rightOperand = evaluate(expression.substring(index + 1));
break;
}
index++;
}
// Вычисляем выражение
double result;
switch (operator) {
case '+':
result = leftOperand + rightOperand;
break;
case '-':
result = leftOperand - rightOperand;
break;
case '*':
result = leftOperand * rightOperand;
break;
case '/':
if (rightOperand == 0) {
throw new Exception("деление на ноль");
}
result = leftOperand / rightOperand;
break;
case '%':
if (rightOperand == 0) {
throw new Exception("деление на ноль");
}
result = leftOperand % rightOperand;
break;
default:
result = Double.parseDouble(expression);
break;
}
return result;
}
private static boolean isOperator(char c) {
return "+-*/%".indexOf(c) != -1;
}
private static int countSubstring(String str, String sub) {
return (str.length() - str.replace(sub, "").length()) / sub.length();
}
}
Пример работы программы:
Введите математическое выражение: 2 * (3 + 4) / 5 - 1
Результат: 1.4
Введите математическое выражение: sin(30) + cos(60)
Результат: 1.0
Введите математическое выражение: 3 / (2 - 2)
Ошибка: деление на ноль
Введите математическое выражение: (2 + 3
Ошибка: непарные скобки
Введите математическое выражение: abc
Ошибка: недопустимые символы