当前位置:   article > 正文

利用java实现一个简易计算器的功能_java 写一个字符串带计算 自动计算

java 写一个字符串带计算 自动计算

实现目标:

能进行简易的加减乘除运算,符合运算规则

分析:

1.在输入的一串字符串表达式中,如s = ”1+(3-1)*(1+1)/2",必须先计算括号内的结果,所以,我们可以将括号内的结果先计算出来,将其放进数组中,然后再计算乘法和除法,也是将结果放进数组中,共三个数组。

2.实现运算功能。

代码实现:

  1. import java.util.Scanner;
  2. import java.util.regex.Matcher;
  3. public class Calculator_01 {
  4. public static void main(String[] args) {
  5. //定义变量
  6. String s = "1+(3-1)*(1+1)/2";
  7. int sum = 0;
  8. char flag = '(';
  9. //字符串也可以使用一下代码输入
  10. // Scanner input = new Scanner(System.in);
  11. // s = input.nextLine();
  12. //如果碰到括号,调用test_brackets这个函数
  13. s = test_brackets(s);
  14. //如果碰到*,调用test_xing这个函数
  15. s = test_xing(s);
  16. //如果碰到/,调用test_chu这个函数
  17. s = test_chu(s);
  18. //当加减乘除最后都化解成 s = ”num1 + num1 + num1 +.....“ (其他三种就不写上来了,一样)
  19. //再调用test_for来算最后的结果
  20. sum =test_for(0,s.length(),0,s,flag);
  21. //最后将结果打印出来
  22. System.out.println(sum);
  23. }
  24. //计算括号里的数的函数,如(2+3)*(3+3)
  25. public static String test_brackets(String s){
  26. int num = 1;
  27. char flag = '+';
  28. int acout = 0;
  29. //循环s字符串,如果碰到右括号,那么b就加一,这样就可以知道一共要计算多少个括号了
  30. for (int i = 0;i < s.length();i++){
  31. char s2 = s.charAt(i);
  32. switch (s2){
  33. case '(':
  34. acout += 1;
  35. break;
  36. }
  37. }
  38. //定义一个数组,存在括号里计算出的值
  39. int[] _num = new int[acout];
  40. //for循环往数组添加结果
  41. for (int j = 0; j < acout; j++) {
  42. //如果碰到括号,就先将括号里的值计算出来,放到数组中
  43. int first = s.indexOf("(");
  44. int last = s.indexOf(")");
  45. _num[j] = test_for(first + 1, last, 0, s, flag);
  46. //substring函数,取字符串中想取的字符,通过加号将其拼接起来
  47. //比如,上面用test_for函数已经计算出了第一个括号里的值了
  48. //那么下面的s就是,从第0位开始取,first就是括号代表的位置,
  49. // 比如7*(8+2)*(3+2),从第0位(也就是7)开始取,注意这里取不到first,所以只能取到first的前一位,也就是左括号前面一位字符
  50. //s的表达式就是 7* + (8+2) + (3+2),然后再循环,直到碰到括号,就会将括号里的值通过test_for计算出来再存放到数组中
  51. s = s.substring(0,first) + _num[j] + s.substring(last + 1);
  52. }
  53. //通过上面的for循环,已经将计算出来的结果存放进数组里了,这时候的表达式就是7*10*5了,括号已经没有了
  54. //然后在main函数里直接调用test_for就可以将这个表达式就算出来了
  55. return s;
  56. }
  57. //先计算乘法的函数 如1+3*2,先算3*2,实现思路和上面函数相同,不多注释
  58. public static String test_xing(String s){
  59. int acout = 0;
  60. char flag = '(';
  61. for (int i = 0;i < s.length();i++){
  62. char s2 = s.charAt(i);
  63. switch (s2){
  64. case '*':
  65. acout += 1;
  66. break;
  67. }
  68. }
  69. int[] _num1 = new int[acout];
  70. for (int j = 0;j < acout;j++){
  71. int start = s.indexOf("*");
  72. _num1[j] = test_for(start-1,start+2,0,s,'(');
  73. s = s.substring(0, start - 1) + _num1[j] + s.substring(start+2);
  74. }
  75. return s;
  76. }
  77. //先计算除法的函数 如1+4/2,先算4/2,实现思路和上面函数相同,不多注释
  78. public static String test_chu(String s){
  79. int acout = 0;
  80. char flag = '(';
  81. for (int i = 0;i < s.length();i++){
  82. char s2 = s.charAt(i);
  83. switch (s2){
  84. case '/':
  85. acout += 1;
  86. break;
  87. }
  88. }
  89. int[] _num1 = new int[acout];
  90. for (int j = 0;j < acout;j++){
  91. int start = s.indexOf("/");
  92. _num1[j] = test_for(start-1,start+2,0,s,'(');
  93. s = s.substring(0, start - 1) + _num1[j] + s.substring(start+2);
  94. }
  95. return s;
  96. }
  97. //定义函数,进行两个数的运算
  98. public static int test_switch(char flag,int num1,int num2) {
  99. // num2.matches("^[0-9]{1,7}$");
  100. switch (flag){
  101. case '(':
  102. //如果flag!=+ - * /,则将num2赋值给num1
  103. if(num2 == 0){
  104. num1 += 9;
  105. }else {
  106. num1 = num2;
  107. }
  108. break;
  109. case '+':
  110. if(num2 == 0){
  111. num1 += 9;
  112. }else {
  113. num1 += num2;
  114. }
  115. break;
  116. case '-':
  117. if(num2 == 0){
  118. num1 -= 9;
  119. }else {
  120. num1 -= num2;
  121. }
  122. break;
  123. case '*':
  124. if(num2 == 0){
  125. num1 *= 10;
  126. }else {
  127. num1 *= num2;
  128. }
  129. break;
  130. case '/':
  131. if(num2 == 0){
  132. num1 /= 10;
  133. }else {
  134. num1 /= num2;
  135. }
  136. break;
  137. }
  138. return num1;
  139. }
  140. public static int test_for(int star, int end, int num1, String s, char flag) {
  141. for (int i = star; i < end; i++) {
  142. char s1 = s.charAt(i);
  143. switch (s1) {
  144. case '+':
  145. flag = '+';
  146. break;
  147. case '-':
  148. flag = '-';
  149. break;
  150. case '*':
  151. flag = '*';
  152. break;
  153. case '/':
  154. flag = '/';
  155. break;
  156. case '(':
  157. //如果碰到括号,就先将括号里的数机进行计算
  158. int result = test_for(star, end, 0, s, flag);
  159. num1 = test_switch(flag, num1, result);
  160. break;
  161. default:
  162. num1 = test_switch(flag, num1, Integer.parseInt(s1 + ""));
  163. }
  164. }
  165. return num1;
  166. }
  167. }

存在问题:

1当计算超过10的数,不会识别,也就是说,算式  12+11*(8+3)/(15-4)   这种不会将12当成12来运算,会将12拆分成1和2进行相加。

2.(((2+2)*3)-2)/5 这种多括号表达式也无法实现,所以,功能有待完善。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/848212
推荐阅读
相关标签
  

闽ICP备14008679号