Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

JAVA, помогите выполнить задание с мат. функциями

Вика Столповская Ученик (198), на голосовании 1 год назад
Задание: написать программу, которая принимает на вход строку, содержащую математическое выражение (например, "2 * (3 + 4) / 5 - 1"), и вычисляет его значение с помощью класса Math. Программа должна учитывать приоритет операций и скобки, а также обрабатывать возможные ошибки ввода (например, недопустимые символы, деление на ноль, непарные скобки).
Пример работы программы:
Введите математическое выражение: 2 * (3 + 4) / 5 - 1
Результат: 1.4

Введите математическое выражение: sin(30) + cos(60)
Результат: 1.0

Введите математическое выражение: 3 / (2 - 2)
Ошибка: деление на ноль

Введите математическое выражение: (2 + 3
Ошибка: непарные скобки

Введите математическое выражение: abc
Ошибка: недопустимые символы
Голосование за лучший ответ
Анальный Дебошир Профи (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();
}
}
Вика СтолповскаяУченик (198) 1 год назад
а можно попроще? на уровне 1 курса
Анальный Дебошир Профи (869) Вика Столповская, убери из кода все проверки на ошибки
АлександрИскусственный Интеллект (301687) 1 год назад
совершенно левая программа
скорми ей
2*2+3*3
и удивляйся результату...
Похожие вопросы