рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рд░реНрд╕рд░ рд╕реВрддреНрд░



рд╢реБрдн рджрд┐рди, рдкреНрд░рд┐рдп рдЦрд╛рдмрд░реЛрд╡рдЪрд┐рдпреЛрдВ!

рдореИрдВ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдХрд░ "рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рд╡рд┐рдзрд┐" рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдпрд╣ рдЖрд▓реЗрдЦ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ :)) рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдпрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдиреАрдВрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдореИрдВ рдХрдЯреМрддреА рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ


рдЯреА


рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдорд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВ рдЬреЛ:


рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рдЙрдк-рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЛ рдХреЗрд╡рд▓ рдЙрд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдЖрдЧреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдпрджрд┐ рд╢рд░реНрддреЗрдВ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рддреЛ рд╣рдо рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдХреА рдХрдЪреНрдЪреЗ рдкрд╛рда рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдирд┐рд╖реНрдкрд╛рджрди рддрдм рддрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд╛рда рдЕрднреА рднреА рд╣реИ, рдпрд╛ рдпрджрд┐ рдХреЛрдИ рдЙрдкрдЯреИрдм рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрдорд╛рдУрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рднреА рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред рдЙрдкрдорд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред
рдЪреВрдВрдХрд┐ рд╣рдо рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реЛрдВ рдХреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
  1. рд╕рдорд╛рд░реЛрд╣ рдФрд░ рдЪрд░
  2. рдХреЛрд╖реНрдардХ
  3. рдЧреБрдгрд╛ рдФрд░ рднрд╛рдЧ
  4. рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛рд╡


рдордХреНрдЦреА



рдЦреИрд░, рдЕрдм рдмрд╛рдд рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рд╢реЗрд╖ рд░реЗрдЦрд╛ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдЙрд╕рдХреЗ рджрд╛рдВрддреЛрдВ рдореЗрдВ рдХрд╛рдЯрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдЧрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред
рдХреБрд▓ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдмрд╛рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП
рдФрд░ рддрдерд╛рдХрдерд┐рдд рдмреИрдЯрд░реА, рдЧрдгрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЬрд░реВрд░рдд рд╣реИ? рдЪрд▓реЛ рдХрд░рддреЗ рд╣реИрдВ!
class Result { public double acc; public String rest; public Result(double v, String r) { this.acc = v; this.rest = r; } } 


рдЕрдм рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛрддреЗ рдХреЗ рд╕рд╛рде:
рдкрд╣рд▓реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╣рдо рдХрд╣реЗрдВрдЧреЗ рд╡рд╣ рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓рд╛ рдЙрдк-рдХрд╛рд░реНрдп рд╣реИред
рдЙрдкрд╢реАрд░реНрд╖рдХ, рдмрджрд▓реЗ рдореЗрдВ, рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд╛рда рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдирдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдЙрдк-рдореБрдЦреМрдЯреЗ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд░рдо рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдпрд╛ рд╣рдо рдПрдХ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдкрд░ рдареЛрдХрд░ рдЦрд╛рддреЗ рд╣реИрдВред

рдЬреЛрдбрд╝ / рдШрдЯрд╛рд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рд╕реЗ, рд╣рдо рдЧреБрдгрди / рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдВрдЧреЗ

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд░реЗрдВ, рдПрдХ рдРрд╕рд╛ рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдПрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛рд╡ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ:

 public class MatchParserPlusMinus { public MatchParserPlusMinus(){} public double Parse(String s) throws Exception { Result result = PlusMinus(s); if (!result.rest.isEmpty()) { System.err.println("Error: can't full parse"); System.err.println("rest: " + result.rest); } return result.acc; } private Result PlusMinus(String s) throws Exception { Result current = Num(s); double acc = current.acc; while (current.rest.length() > 0) { if (!(current.rest.charAt(0) == '+' || current.rest.charAt(0) == '-')) break; char sign = current.rest.charAt(0); String next = current.rest.substring(1); acc = current.acc; current = Num(next); if (sign == '+') { acc += current.acc; } else { acc -= current.acc; } current.acc = acc; } return new Result(current.acc, current.rest); } private Result Num(String s) throws Exception { int i = 0; int dot_cnt = 0; boolean negative = false; //       if( s.charAt(0) == '-' ){ negative = true; s = s.substring( 1 ); } //      while (i < s.length() && (Character.isDigit(s.charAt(i)) || s.charAt(i) == '.')) { //   ,        ! if (s.charAt(i) == '.' && ++dot_cnt > 1) { throw new Exception("not valid number '" + s.substring(0, i + 1) + "'"); } i++; } if( i == 0 ){ // -       throw new Exception( "can't get valid number in '" + s + "'" ); } double dPart = Double.parseDouble(s.substring(0, i)); if( negative ) dPart = -dPart; String restPart = s.substring(i); return new Result(dPart, restPart); } } 


рдФрд░ рдЬрдм рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реЛ:
  MatchParserPlusMinus pm = new MatchParserPlusMinus(); String f = "10-8+2+6"; try{ System.out.println( "PlusMinus: " + pm.Parse(f) ); }catch(Exception e){ System.err.println( "Error while parsing '"+f+"' with message: " + e.getMessage() ); } 


рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛:
PlusMinus: 10.0


рдЗрд╕ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ (рдЖрдк рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрд╕реЗрд╕рдлрдВрдХреНрд╢рди рдореЗрдВ рдЗрд╕реА рд╢рд░реНрдд рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):

рдореИрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдерд╛ (рдЗрд╕рд▓рд┐рдП "рдЙрдкрдпреЛрдЧреА" рдХреЛрдб рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛), рдЕрдиреНрдпрдерд╛, рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :)

рдпрд╣рд╛рдБ рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рд╡рд░реНрдЧ рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ:
 public class MatchParser { private HashMap<String, Double> variables; public MatchParser() { variables = new HashMap<String, Double>(); } public void setVariable(String variableName, Double variableValue) { variables.put(variableName, variableValue); } public Double getVariable(String variableName) { if (!variables.containsKey(variableName)) { System.err.println( "Error: Try get unexists variable '"+variableName+"'" ); return 0.0; } return variables.get(variableName); } public double Parse(String s) throws Exception { Result result = PlusMinus(s); if (!result.rest.isEmpty()) { System.err.println("Error: can't full parse"); System.err.println("rest: " + result.rest); } return result.acc; } private Result PlusMinus(String s) throws Exception { Result current = MulDiv(s); double acc = current.acc; while (current.rest.length() > 0) { if (!(current.rest.charAt(0) == '+' || current.rest.charAt(0) == '-')) break; char sign = current.rest.charAt(0); String next = current.rest.substring(1); current = MulDiv(next); if (sign == '+') { acc += current.acc; } else { acc -= current.acc; } } return new Result(acc, current.rest); } private Result Bracket(String s) throws Exception { char zeroChar = s.charAt(0); if (zeroChar == '(') { Result r = PlusMinus(s.substring(1)); if (!r.rest.isEmpty() && r.rest.charAt(0) == ')') { r.rest = r.rest.substring(1); } else { System.err.println("Error: not close bracket"); } return r; } return FunctionVariable(s); } private Result FunctionVariable(String s) throws Exception { String f = ""; int i = 0; //      //       while (i < s.length() && (Character.isLetter(s.charAt(i)) || ( Character.isDigit(s.charAt(i)) && i > 0 ) )) { f += s.charAt(i); i++; } if (!f.isEmpty()) { //  -  if ( s.length() > i && s.charAt( i ) == '(') { //      -   Result r = Bracket(s.substring(f.length())); return processFunction(f, r); } else { //  -   return new Result(getVariable(f), s.substring(f.length())); } } return Num(s); } private Result MulDiv(String s) throws Exception { Result current = Bracket(s); double acc = current.acc; while (true) { if (current.rest.length() == 0) { return current; } char sign = current.rest.charAt(0); if ((sign != '*' && sign != '/')) return current; String next = current.rest.substring(1); Result right = Bracket(next); if (sign == '*') { acc *= right.acc; } else { acc /= right.acc; } current = new Result(acc, right.rest); } } private Result Num(String s) throws Exception { int i = 0; int dot_cnt = 0; boolean negative = false; //       if( s.charAt(0) == '-' ){ negative = true; s = s.substring( 1 ); } //      while (i < s.length() && (Character.isDigit(s.charAt(i)) || s.charAt(i) == '.')) { //   ,        ! if (s.charAt(i) == '.' && ++dot_cnt > 1) { throw new Exception("not valid number '" + s.substring(0, i + 1) + "'"); } i++; } if( i == 0 ){ // -       throw new Exception( "can't get valid number in '" + s + "'" ); } double dPart = Double.parseDouble(s.substring(0, i)); if( negative ) dPart = -dPart; String restPart = s.substring(i); return new Result(dPart, restPart); } //     ,       private Result processFunction(String func, Result r) { if (func.equals("sin")) { return new Result(Math.sin(Math.toRadians(r.acc)), r.rest); } else if (func.equals("cos")) { return new Result(Math.cos(Math.toRadians(r.acc)), r.rest); } else if (func.equals("tan")) { return new Result(Math.tan(Math.toRadians(r.acc)), r.rest); } else { System.err.println("function '" + func + "' is not defined"); } return r; } } 


рдФрд░ рдЬрдм рдмреБрд▓рд╛рдпрд╛:

  String[] formulas = new String[] { "2+2*2", "2+X*2", "sin(90)+4-cos(0)", "2--4", "2**3*5-----7", "3.5.6-2" }; MatchParser p = new MatchParser(); p.setVariable("X", 2.0 ); for( int i = 0; i < formulas.length; i++){ try{ System.out.println( formulas[i] + "=" + p.Parse( formulas[i] ) ); }catch(Exception e){ System.err.println( "Error while parsing '"+formulas[i]+"' with message: " + e.getMessage() ); } } 

рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛:
2+2*2=6.0
2+X*2=6.0
sin(90)+4-cos(0)=4.0
2--4=6.0
Error while parsing '2**3*5-----7' with message: can't get valid number in '*3*5-----7'
Error while parsing '3.5.6-2' with message: not valid number '3.5.'


рдЖрдк рдпрд╣рд╛рдВ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж flexoid рдЬрд╣рд╛рдВ рдЖрдк рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ)
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In122397/


All Articles