fork download
  1. //package practis;
  2.  
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6.  
  7. public class Main {
  8. private enum CharType {
  9. number, plus, minus, asta, slash, equal;
  10. }
  11. private static final String ERROR_MSG = "数式が不正です。";
  12. public static void main(String args[]) {
  13. System.out.println(calc("12+00009="));// 21
  14. System.out.println(calc("+9-1="));// 8
  15. System.out.println(calc("-2-4="));// -6
  16. System.out.println(calc("=12+"));// エラー
  17. }
  18.  
  19. private static String calc(String calc) {
  20. if(!isIllegalArg(calc)) {
  21. return ERROR_MSG;
  22. }
  23.  
  24. //文字列が正常な場合、計算結果を文字列にして返す
  25. return innerCalc1(calc);
  26. }
  27.  
  28. private static boolean isIllegalArg(String arg) {
  29. Pattern pattern = Pattern.compile("^(\\+|-)?.*(\\+|-|\\*|/).*=$");
  30. Matcher matcher = pattern.matcher(arg);
  31. return matcher.find();
  32. }
  33.  
  34. /**
  35.   * 数式を計算して、その結果を文字列で返す。
  36.   * @param arg 例:"4+2="
  37.   * @return 計算結果の文字列表現 例:"6"
  38.   */
  39. private static String innerCalc1(String arg) {
  40. double x = 0;
  41. double y = 0;
  42. CharType operate = null;//演算子
  43.  
  44. //数式を、数字と演算子に分解する
  45. int max = arg.length();
  46. boolean x_entered = false;
  47. boolean xIsMinus = false;
  48. for(int i = 0; i < max; i++) {
  49. if(i == 0) {
  50. //一文字目が+だった場合、それを無視する
  51. if(arg.charAt(0) == '+') continue;
  52. //一文字目が-だった場合、xを負の数値にするフラグを立てる
  53. if(xIsMinus = arg.charAt(0) == '-') continue;
  54. }
  55.  
  56. switch(checkCharType(arg.charAt(i))) {
  57. case number:
  58. //数字xを取り出す
  59. if(!x_entered) {
  60. x = x * 10;
  61. x = x + Integer.valueOf(String.valueOf(arg.charAt(i)));
  62. } else {
  63. //数字yを取り出す
  64. y = y * 10;
  65. y = y + Integer.valueOf(String.valueOf(arg.charAt(i)));
  66. }
  67. break;
  68. case equal://'='の場合
  69. break;
  70. default://足し算なのか、引き算なのか、掛け算なのか、割り算なのか記憶
  71. operate = checkCharType(arg.charAt(i));
  72. //次の数字は数値y
  73. x_entered = true;
  74. break;
  75. }
  76. }
  77. //一文字目が-だった場合、xを負の値にする
  78. if(xIsMinus) x = x * -1;
  79. //取り出した数字と演算子を元に計算を行う
  80. return innerCalc2(x, y, operate);
  81. }
  82.  
  83. private static CharType checkCharType(char c) {
  84. try {
  85. Integer.valueOf(String.valueOf(c));
  86. return CharType.number;
  87. } catch (NumberFormatException e) {
  88. switch(c) {
  89. case '+':
  90. return CharType.plus;
  91. case '-':
  92. return CharType.minus;
  93. case '*':
  94. return CharType.asta;
  95. case '/':
  96. return CharType.slash;
  97. case '=':
  98. return CharType.equal;
  99. default:
  100. throw new AssertionError();
  101. }
  102. }
  103. }
  104.  
  105. /**
  106.   * xとyを計算し、結果を文字列として返す
  107.   * @param x
  108.   * @param y
  109.   * @param operate 演算子
  110.   * (CharType.plus, CharType.minus, CharType.asta, CharType.slash のいずれか)
  111.   * @return 計算結果
  112.   */
  113. private static String innerCalc2(double x, double y, CharType operate) {
  114. double answer = 0;
  115. switch(operate) {
  116. case plus:
  117. answer = x + y;
  118. break;
  119. case minus:
  120. answer = x - y;
  121. break;
  122. case asta:
  123. answer = x * y;
  124. break;
  125. case slash:
  126. answer = x / y;
  127. break;
  128. default://引数が不正
  129. }
  130. return String.valueOf(answer);
  131. }
  132. }
  133.  
Success #stdin #stdout 0.04s 213312KB
stdin
Standard input is empty
stdout
21.0
8.0
-6.0
数式が不正です。