Добрый день.
Где взять набор тестовых данных?
В комментариях, я думаю, он не актуальный.
Где его можно взять?
package com.javarush.task.task34.task3404;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.LinkedList;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Рекурсия для мат. выражения
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
solution.recurse("sin(2*(-5+1.5*4)+28)", 0); // Expected output: 0.5 6
// solution.recurse("tan(2025 ^ 0.5)", 0); // Expected output: 0.5 6
// solution.recurse("sin(90)", 3);
// System.out.println(Math.cos(45));
// System.out.println(Math.cos(Math.toRadians(3 + 19*3)));
// System.out.println(Math.toDegrees(Math.PI));
}
public void recurse(final String expression, int countOperation) {
// System.out.println("Очередная итерация. Количество: " + countOperation + " Выражение: " + expression);
final String simpleNumber = "[0-9]+[\\.]?[0-9]*";
String expression2 = expression.replace(" ", "");
// System.out.println("После зачистки пробелов: " + expression2);
Pattern pattern;
Matcher matcher;
// если есть умножение, знаем что делать...
pattern = Pattern.compile(simpleNumber + "[\\*]" + simpleNumber);
matcher = pattern.matcher(expression2);
if (matcher.find()) {
String strToCalc = expression2.substring(matcher.start(), matcher.end());
String[] twoValues = strToCalc.split("[\\*]");
// System.out.println("Первое число: " + twoValues[0]);
// System.out.println("Второе число: " + twoValues[1]);
Double d = Double.valueOf(twoValues[0]) * Double.valueOf(twoValues[1]);
String strResult = String.format("%.2f",d).replace(",", ".");
// System.out.println("Прокидываем");
recurse(expression2.substring(0, matcher.start()) + strResult + expression2.substring(matcher.end( )), countOperation+1) ;
return;
}
// это простой синус
String regexSimpleSinus = "sin[\\(]" + simpleNumber + "[\\)]";
pattern = Pattern.compile(regexSimpleSinus);
matcher = pattern.matcher(expression2);
if(Pattern.matches(regexSimpleSinus, expression2)) {
// System.out.println("Строка является простым синусом");
Double r = Math.sin(Math.toRadians(Double.valueOf(expression2.replace("sin(", "").replace(")", ""))));
System.out.println(Double.valueOf(String.format("%.2f",r).replace(",", ".")) + " " + (countOperation + 1));
// System.out.println(r + " " + (countOperation + 1));
return;
}
// это простой косинус
String regexSimpleCosinus = "cos[\\(]" + simpleNumber + "[\\)]";
pattern = Pattern.compile(regexSimpleCosinus);
matcher = pattern.matcher(expression2);
if(Pattern.matches(regexSimpleCosinus, expression2)) {
// System.out.println("Строка является простым косинусом");
Double r = Math.cos(Math.toRadians(Double.valueOf(expression2.replace("cos(", "").replace(")", ""))));
System.out.println(Double.valueOf(String.format("%.2f",r).replace(",", ".")) + " " + (countOperation + 1));
return;
}
// это простой тангенс
String regexSimpleTan = "tan[\\(]" + simpleNumber + "[\\)]";
pattern = Pattern.compile(regexSimpleTan);
matcher = pattern.matcher(expression2);
if(Pattern.matches(regexSimpleTan, expression2)) {
// System.out.println("Строка является простым тангенсом");
Double r = Math.tan(Math.toRadians(Double.valueOf(expression2.replace("tan(", "").replace(")", ""))));
System.out.println(Math.round(Double.valueOf(String.format("%.2f",r).replace(",", "."))) + " " + (countOperation + 1));
return;
}
// System.out.println("Ликвидация кобок");
pattern = Pattern.compile("[\\(]" + simpleNumber + "[\\)]");
matcher = pattern.matcher(expression2);
if (matcher.find()) {
String strToCalc = expression2.substring(matcher.start() + 1, matcher.end() - 2);
recurse(expression2.substring(0, matcher.start()) + strToCalc + expression2.substring(matcher.end( )), countOperation+1) ;
return;
}
// System.out.println("Ищем отрицательное умножение");
pattern = Pattern.compile(simpleNumber + "[\\*][\\(][\\-]" + simpleNumber + "[\\)]");
matcher = pattern.matcher(expression2);
if (matcher.find()) {
String strToCalc = expression2.substring(matcher.start(), matcher.end());
String[] twoValues = strToCalc.split("[\\*]");
// System.out.println("Первое число: " + twoValues[0]);
// System.out.println("Второе число: " + twoValues[1].replace("(","").replace(")", ""));
Double d = Double.valueOf(twoValues[0]) * Double.valueOf(twoValues[1].replace("(","").replace(")", ""));
String strResult = String.format("%.2f",d).replace(",", ".");
// System.out.println("Прокидываем");
recurse(expression2.substring(0, matcher.start()) + strResult + expression2.substring(matcher.end( )), countOperation+1) ;
return;
}
// System.out.println("Простых умножений не нашли, ищем простые сложения");
pattern = Pattern.compile("[\\-]?" + simpleNumber + "[\\+]" + simpleNumber);
matcher = pattern.matcher(expression2);
if (matcher.find()) {
String strToCalc = expression2.substring(matcher.start(), matcher.end());
String[] twoValues = strToCalc.split("[\\+]");
// System.out.println("Первое число: " + twoValues[0]);
// System.out.println("Второе число: " + twoValues[1]);
Double d = Double.valueOf(twoValues[0]) + Double.valueOf(twoValues[1]);
String strResult = String.format("%.2f",d).replace(",", ".");
// System.out.println("Прокидываем");
recurse(expression2.substring(0, matcher.start()) + strResult + expression2.substring(matcher.end( )), countOperation+1) ;
return;
}
// // если это простое умножение
// String regexSimpleMultiply = simpleNumber + "[\\*]" + simpleNumber;
// if(Pattern.matches(regexSimpleMultiply, expression2)) {
// System.out.println("Строка является простым умножением");
// String[] twoValues = expression2.split("[\\*]");
// System.out.println("Первое число: " + twoValues[0]);
// System.out.println("Второе число: " + twoValues[1]);
// Double d = Double.valueOf(twoValues[0]) * Double.valueOf(twoValues[1]);
// System.out.println(String.format("%.2f",d).replace(",", ".") + " " + (countOperation + 1));
// }
// это простое отрицание
// System.out.println("Ищем простое вычитание");
String regexSimpleMinus ="[\\-]?" + simpleNumber + "[\\-]" + simpleNumber;
pattern = Pattern.compile(regexSimpleMinus);
matcher = pattern.matcher(expression2);
if(matcher.find()) {
String strToCalc = expression2.substring(matcher.start(), matcher.end());
// System.out.println("Работаем со строкой: " + strToCalc);
String[] twoValues = strToCalc.split("[\\-]");
// System.out.println("Первое число: " + twoValues[0]);
// System.out.println("Второе число: " + twoValues[1]);
Double d = Double.valueOf(twoValues[0]) + Double.valueOf(twoValues[1]);
String strResult = String.format("%.2f",d).replace(",", ".");
// System.out.println("Прокидываем");
recurse(expression2.substring(0, matcher.start()) + strResult + expression2.substring(matcher.end( )), countOperation+1) ;
return;
}
// это простое возведение в степень
// System.out.println("Ищем возведение в степень");
String regexSimpleExponentation = simpleNumber + "[\\^]" + simpleNumber;
pattern = Pattern.compile(regexSimpleExponentation);
matcher = pattern.matcher(expression2);
// String regexSimpleExponentation = "5" ;
if(matcher.find()) {
String strToCalc = expression2.substring(matcher.start(), matcher.end());
// System.out.println("Работаем со строкой: " + strToCalc);
String[] twoValues = strToCalc.split("[\\^]");
// System.out.println("Первое число: " + twoValues[0]);
// System.out.println("Второе число: " + twoValues[1]);
Double r = Math.pow(Double.valueOf(twoValues[0]), Double.valueOf(twoValues[1]));
// System.out.println(String.format("%.2f",r).replace(",", ".") + " " + (countOperation + 1));
recurse(expression2.substring(0, matcher.start()) + r.toString() + expression2.substring(matcher.end( )), countOperation+1) ;
return;
}
// System.out.println(countOperation + "Выражение оказалось сложным. Надо упрощать...");
// System.out.println(countOperation + "Необходимо из определенного подвыражения получить новую строку и кинуть вычисление в новый вызов...");
//
// System.out.println(countOperation + "Пробуем найти подслово с умножением...");
//
}
public Solution() {
//don't delete
}
}