Ребят, помогите с задачей! Можете подсказать в какую сторону двигаться? Уже никаких сил нет(
Не могу разобраться с минусами, а также в тестах иногда операция "+" почему-то оказывается в приоритете перед "*".
package com.javarush.task.task34.task3404;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.StringTokenizer;
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(45)", 0); System.out.println("1 1 - expected output");
solution.recurse("tan(-45)", 0); System.out.println("-1 2 - expected output");
solution.recurse("0.305", 0); System.out.println("0.3 0 - expected output");
solution.recurse("0.3051", 0); System.out.println("0.31 - expected output");
solution.recurse("(0.3051)", 0); System.out.println("0.31 - expected output");
solution.recurse("1+(1+(1+1)*(1+1))*(1+1)+1", 0); System.out.println("12 8 - expected output");
solution.recurse("tan(44+sin(89-cos(180)^2))", 0); System.out.println("1 6 - expected output");
solution.recurse("-2+(-2+(-2)-2*(2+2))", 0); System.out.println("-14 8 - expected output");
solution.recurse("sin(80+(2+(1+1))*(1+1)+2)", 0); System.out.println("1 7 - expected output");
solution.recurse("1+4/2/2+2^2+2*2-2^(2-1+1)", 0); System.out.println("6 11 - expected output");
solution.recurse("10-2^(2-1+1)", 0); System.out.println("6 4 - expected output");
solution.recurse("2^10+2^(5+5)", 0); System.out.println("2048 4 - expected output");
solution.recurse("1.01+(2.02-1+1/0.5*1.02)/0.1+0.25+41.1", 0); System.out.println("72.96 8 - expected output");
solution.recurse("0.000025+0.000012", 0); System.out.println("0 1 - expected output");
solution.recurse("-2-(-2-1-(-2)-(-2)-(-2-2-(-2)-2)-2-2)", 0); System.out.println("-3 16 - expected output");
solution.recurse("cos(3 + 19*3)", 0); System.out.println("0.5 3 - expected output");
}
public void recurse(final String expression, int countOperation)
{
String result = getTrigonometry(expression);
if (!result.equals(""))
{
countOperation++;
//System.out.println(result + " " + countOperation);
recurse(result, countOperation);
return;
}
result = calcPow(expression);
if (!result.equals(""))
{
countOperation++;
//System.out.println(result + " " + countOperation);
recurse(result, countOperation);
return;
}
result = calcMulitply(expression);
if (!result.equals(""))
{
countOperation++;
//System.out.println(result + " " + countOperation);
recurse(result, countOperation);
return;
}
result = calcDiv(expression);
if (!result.equals(""))
{
countOperation++;
//System.out.println(result + " " + countOperation);
recurse(result, countOperation);
return;
}
result = calcAdd(expression);
if (!result.equals(""))
{
countOperation++;
//System.out.println(result + " " + countOperation);
recurse(result, countOperation);
return;
}
result = getNumWithoutParenthesis(expression);
if (!result.equals(""))
{
countOperation++;
//System.out.println(result + " " + countOperation);
recurse(result, countOperation);
return;
}
//implement
}
public String getTrigonometry(String example)
{
String regEx = "(sin|cos|tan)\\s?[-]?\\d+[.]?\\d*";
String str = getMatcher(regEx, example);
if (str.equals(""))
return str;
str = str.trim();
double v = 0;
double v1 = Double.parseDouble(str.substring(3)) * Math.PI;
if (str.charAt(0) == 's')
{
v = Math.sin(v1 /180);
MathContext context = new MathContext(5, RoundingMode.CEILING);
BigDecimal result = new BigDecimal(v, context);
v = result.doubleValue();
}
else if (str.charAt(0) == 'c')
{
v = Math.cos(v1 /180);
MathContext context = new MathContext(5, RoundingMode.CEILING);
BigDecimal result = new BigDecimal(v, context);
v = result.doubleValue();
}
else if (str.charAt(0) == 't')
{
v = Math.tan(v1 / 180);
MathContext context = new MathContext(5, RoundingMode.CEILING);
BigDecimal result = new BigDecimal(v, context);
v = result.doubleValue();
}
example = example.replaceFirst(regEx, Double.toString(v));
return example;
}
public String calcMulitply(String example)
{
String regEx = "[-]?\\d+[.]?\\d*\\s?\\*\\s?[-]?\\d+[.]?\\d*";
String str = getMatcher(regEx, example);
if (str.equals(""))
return str;
str = str.trim();
String num1 = str.substring(0, str.indexOf("*"));
String num2 = str.substring(str.indexOf("*") + 1);
double v1 = Double.parseDouble(num1);
double v2 = Double.parseDouble(num2);
double result = v1 * v2;
example = example.replaceFirst(regEx, Double.toString(result));
return example;
}
public String calcPow(String example)
{
String regEx = "[-]?\\d+[.]?\\d*\\s?\\^\\s?[-]?\\d+[.]?\\d*";
String str = getMatcher(regEx, example);
if (str.equals(""))
return str;
str = str.trim();
String num1 = str.substring(0, str.indexOf("^"));
String num2 = str.substring(str.indexOf("^") + 1);
double v1 = Double.parseDouble(num1);
double v2 = Double.parseDouble(num2);
double result = Math.pow(v1, v2);
example = example.replaceFirst(regEx, Double.toString(result));
return example;
}
public String calcDiv(String example)
{
String regEx = "[-]?\\d+[.]?\\d*\\s?\\/\\s?[-]?\\d+[.]?\\d*";
String str = getMatcher(regEx, example);
if (str.equals(""))
return str;
str = str.trim();
String num1 = str.substring(0, str.indexOf("/"));
String num2 = str.substring(str.indexOf("/") + 1);
double v1 = Double.parseDouble(num1);
double v2 = Double.parseDouble(num2);
double result = v1 / v2;
example = example.replaceFirst(regEx, Double.toString(result));
return example;
}
public String calcAdd(String example)
{
String regEx = "[-]?\\d+[.]?\\d*\\s?\\+\\s?[-]?\\d+[.]?\\d*";
String str = getMatcher(regEx, example);
if (str.equals(""))
return str;
str = str.trim();
String num1 = str.substring(0, str.indexOf("+"));
String num2 = str.substring(str.indexOf("+") + 1);
double v1 = Double.parseDouble(num1);
double v2 = Double.parseDouble(num2);
double result = v1 + v2;
example = example.replaceFirst(regEx, Double.toString(result));
return example;
}
public String getNumWithoutParenthesis(String example)
{
String regEx = "\\([-]?\\d+[.]?\\d*\\)";
String str = getMatcher(regEx, example);
if (str.equals(""))
return str;
str = str.trim();
String num = str.substring(1, str.length() - 1);
double v = Double.parseDouble(num);
example = example.replaceFirst(regEx, Double.toString(v));
return example;
}
public String getMatcher(String regEx, String example)
{
Pattern pattern = Pattern.compile(regEx, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(example);
String str = "";
if (matcher.find())
str = matcher.group(0);
return str;
}
public Solution() {
//don't delete
}
}