上一周的四则运算有bug,这次补充正确代码:

  1. // 中缀转后缀
  2. public String[] SolveOrder(String[] in, HashMap<String, Integer> precedence) {
  3. // 符合逆波兰式(后缀)的输出
  4. int kk=in.length;
  5. String out[] = new String[kk];
  6. int p = 0 ;
  7. // 操作符
  8. Stack<String> ops = new Stack<String>();
  9. for (int i = 0; i < in.length; i++) {
  10. String s = in[i];
  11. // 碰见数值 就放进out数组末尾
  12. if (!precedence.containsKey(in[i])) {
  13. out[p] = s ;
  14. p ++ ;
  15. continue;
  16. }
  17. //如果优先级比栈顶的大
  18. if (ops.isEmpty() || (precedence.get(s) > precedence.get(ops.peek()))) {
  19. ops.push(s);
  20. //break;
  21. }else{
  22. //如果栈顶的比目前的运算符优先级小或者相等 一直出栈到没有或者栈顶 小于当前运算符
  23. while (true ) {
  24. ops.pop();// 出栈得运算符
  25. out[p] = s ;
  26. p ++ ;
  27. if(ops.empty()) break ;//如果栈空了 break
  28. if(precedence.get(ops.peek()) < precedence.get(s)){
  29. break ;//栈顶小于当前的了 break
  30. }
  31. }
  32. out[p] = s ;
  33. p ++ ;
  34. }
  35. }
  36. // 若操作符栈不为空,就依次将剩余的操作符放入out数组
  37. while (!ops.isEmpty()) {
  38. out[p] = ops.peek() ;
  39. p ++ ;
  40. ops.pop() ;
  41. }
  42. return out;
  43. }
  44.  
  45. // 优先级的定义
  46. public HashMap<String, Integer> priorityInfo() {
  47. HashMap<String, Integer> precedence = new HashMap<String, Integer>();
  48. precedence.put("(", 0);
  49. precedence.put(")", 0);
  50. precedence.put("+", 1);
  51. precedence.put("-", 1);
  52. precedence.put("*", 2);
  53. precedence.put("/", 2);
  54. return precedence;
  55. }
  56.  
  57. public double calculateOut(String[] out) {
  58. // 假设满足逆波兰式的输出不为空却长度不为零
  59. int kk=out.length;
  60. System.out.println("转换成后缀表达式是");
  61. for(int o=0;o<kk;o++){
  62. System.out.print(out[o]);
  63. }
  64. System.out.println();
  65. assert (out != null && out.length != 0);
  66. // 操作数栈
  67. Stack<Double> stack = new Stack<Double>();
  68. for (int i = 0; i < out.length; i++) {
  69. if (isNumber(out[i])) {
  70. stack.push(Double.parseDouble(out[i]));
  71. } else {
  72. double v1 = stack.pop();
  73. double v2 = stack.pop();
  74. double result = eval(out[i], v2, v1);
  75. stack.push(result);
  76. }
  77. }
  78. return stack.pop();
  79. }
  80.  
  81. // 判别是否是数字
  82. public boolean isNumber(String s) {
  83. if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"))
  84. return false;
  85. return true;
  86. }
  87.  
  88. public static double eval(String op, double val1, double val2) {
  89. if (op.equals("+"))
  90. return val1 + val2;
  91. if (op.equals("-"))
  92. return val1 - val2;
  93. if (op.equals("/"))
  94. return val1 / val2;
  95. if (op.equals("*"))
  96. return val1 * val2;
  97. throw new RuntimeException("Invalid operator");
  98. }
  99. public static void main(String[] args) {
  100. System.out.println("请输入要计算的算式:");
  101. Scanner sc = new Scanner(System.in);
  102. String inBefore = sc.nextLine();
  103. String[] in = inBefore.split("") ;
  104. int kk=in.length;
  105. System.out.println("您输入的算式是");
  106. for(int o=0;o<kk;o++){
  107. System.out.print(in[o]);
  108. }
  109. System.out.println();
  110. Cal cc = new Cal() ;
  111. HashMap<String, Integer> precedence = cc.priorityInfo();
  112. String[] out = cc.SolveOrder(in, precedence);
  113. System.out.println("所输入的算式结果为:" + cc.calculateOut(out));
  114.  
  115. }

运行结果如下:

单元测试代码如下:

测试中缀转后缀

  1. Cal c1=new Cal();
  2. String inBefore = "1+2*3";
  3. String[] in = inBefore.split("") ;
  4.  
  5. @Test
  6. public void testSolveOrder() {
  7. HashMap<String, Integer> precedence = new HashMap<String, Integer>();
  8. precedence.put("(", 0);
  9. precedence.put(")", 0);
  10. precedence.put("+", 1);
  11. precedence.put("-", 1);
  12. precedence.put("*", 2);
  13. precedence.put("/", 2);
  14. assertEquals("123*+", c1.SolveOrder(in, precedence));
  15. fail("Not yet implemented");
  16. }

测试计算结果是否正确

  1. @Test
  2. public void testCalculateOut() {
  3.   assertEquals("7.0", c1.calculateOut(in));
  4. }

测试是否是数字:

  1. @Test
  2. public void testIsNumber() {
  3. assertEquals("1", "1");
  4. assertEquals("0", "+");
  5. }

测试Eval()单步计算结果:

  1. @Test
  2. public void testEval() {
  3. assertEquals("5", c1.eval("+", 3, 2));
  4. assertEquals("6", c1.eval("*", 3, 2));
  5. assertEquals("1", c1.eval("-", 3, 2));
  6. assertEquals("2", c1.eval("/", 6, 3));
  7. }

运行结果如下:

现在实现的手动输入字符串算式,scanner识别,拆分在进行计算。

四则运算psp:

【week3】四则运算 单元测试的更多相关文章

  1. 5.1 四则运算单元测试j

    由于上个星期请假没上课,这个星期回来才知道作业,时间比较赶,个人能力又不足,作业质量不是很好 Calculator.java import java.util.Scanner; public clas ...

  2. 四则运算——单元测试(测试方法:Right-BICEP )

    一.测试的具体部位 Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? P-是否满足性能要 ...

  3. 软工+C(2017第6期) 最近发展区/脚手架

    // 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...

  4. 软工+C(6): 最近发展区/脚手架

    // 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...

  5. 四则运算之Right-BICEP单元测试

    一. 这篇博客要对上次实现的四则运算进行单元测试,一是检查上次的程序的实现情况,二是巩固单元测试的相关知识.本次进行单元测试用的是Riget-BICEP方法. Riget-BICEP方法: 1.Rig ...

  6. RIGHT-BICEP单元测试——“二柱子四则运算升级版”

    RIGHT-BICEP单元测试 ——“二柱子四则运算升级版” ”单元测试“这对于我们来说是一个全新的专业含义,在上了软件工程这门课,并当堂编写了简单的"求一组数中的最大值"函数的单 ...

  7. 单元测试--四则运算2程序(c++)

    源代码: //2016 3.6 Cheng Qiqin //四则运算改进 #include <iostream> #include<ctime> #include<cst ...

  8. 【week3】词频统计 单元测试

    使用Eclipse 集成的Junit进行单元测试.单元测试的核心包括断言.注解. 测试代码如下: @BeforeClass // 针对所有测试,只执行一次,且必须为static void public ...

  9. BICEP单元测试——随机四则运算升级版

    一.测试方法 6个值得测试的具体部位: Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? ...

随机推荐

  1. python教程(二)·变量

    什么是变量?在百度百科中,变量的解释是: 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过-- 这是一段很长很长的解释,其实,作者认为没必要这么机械式的去理解.简单说,变量 ...

  2. 牛客小白月赛4C——病菌感染

    链接:https://www.nowcoder.com/acm/contest/134/C 来源:牛客网 #include <bits/stdc++.h> using namespace ...

  3. 20154327 Exp4 恶意代码分析

    基础问题回答 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 监控网络连接 监控是否创建新的进程 监控 ...

  4. dsp5509的中断系统

    1. DSP5509有32个中断,中断分为软件中断和硬件中断,同时软件中断不可以屏蔽.软件中断由指令触发.55x在中断时DSP会自动保存ST0_55.ST1_55.ST2_55三个寄存器. 2. 其中 ...

  5. oracle分区表按时间自动创建

    表分区是一种思想,分区表示一种技术实现.当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO.oracle分区表是oracle数据库提供的一种表分区的实现形式.表进行分区后,逻辑上仍然是一张 ...

  6. docker in docker

    docker run --rm可以从一个镜像启动容器,并在容器执行完成后自动删除,这在计算任务中非常有用. 例如,我们通过以下步骤完成计算任务容器的启动: 1 将输入数据通过卷挂载方式连接到计算任务容 ...

  7. 写了个汉字转G代码工具,无描边的那种,市面上没有类似的小软件

    学了不少G代码知识, 将公司废旧的三轴非标设备改造成了一个雕刻机,市面上的小软件不好用 网上下的软件有描边的,字体刻起来太粗,这个比较好用,看图应该都能明白吧, 就自己写了个,“少于150字的随笔不允 ...

  8. Jenkis 无法下载插件问题解决

    在新机器上安装jenkins后,安装插件报如下错误 sun.security.provider.certpath.SunCertPathBuilderException: unable to find ...

  9. 209. First Unique Character in a String

    Description Find the first unique character in a given string. You can assume that there is at least ...

  10. token接口的测法

    接口一般都有权限的校验,一般是需要登录后才可以调用 对于接口的认证,一般通过两种方式来实现1.校验用户请求中是否包含某项指定的cookie2.校验用户的请求的header中是否包含某项指定的字段(to ...