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

 // 中缀转后缀
public String[] SolveOrder(String[] in, HashMap<String, Integer> precedence) {
// 符合逆波兰式(后缀)的输出
int kk=in.length;
String out[] = new String[kk];
int p = 0 ;
// 操作符
Stack<String> ops = new Stack<String>();
for (int i = 0; i < in.length; i++) {
String s = in[i];
// 碰见数值 就放进out数组末尾
if (!precedence.containsKey(in[i])) {
out[p] = s ;
p ++ ;
continue;
}
//如果优先级比栈顶的大
if (ops.isEmpty() || (precedence.get(s) > precedence.get(ops.peek()))) {
ops.push(s);
//break;
}else{
//如果栈顶的比目前的运算符优先级小或者相等 一直出栈到没有或者栈顶 小于当前运算符
while (true ) {
ops.pop();// 出栈得运算符
out[p] = s ;
p ++ ;
if(ops.empty()) break ;//如果栈空了 break
if(precedence.get(ops.peek()) < precedence.get(s)){
break ;//栈顶小于当前的了 break
}
}
out[p] = s ;
p ++ ;
}
}
// 若操作符栈不为空,就依次将剩余的操作符放入out数组
while (!ops.isEmpty()) {
out[p] = ops.peek() ;
p ++ ;
ops.pop() ;
}
return out;
} // 优先级的定义
public HashMap<String, Integer> priorityInfo() {
HashMap<String, Integer> precedence = new HashMap<String, Integer>();
precedence.put("(", 0);
precedence.put(")", 0);
precedence.put("+", 1);
precedence.put("-", 1);
precedence.put("*", 2);
precedence.put("/", 2);
return precedence;
} public double calculateOut(String[] out) {
// 假设满足逆波兰式的输出不为空却长度不为零
int kk=out.length;
System.out.println("转换成后缀表达式是");
for(int o=0;o<kk;o++){
System.out.print(out[o]);
}
System.out.println();
assert (out != null && out.length != 0);
// 操作数栈
Stack<Double> stack = new Stack<Double>();
for (int i = 0; i < out.length; i++) {
if (isNumber(out[i])) {
stack.push(Double.parseDouble(out[i]));
} else {
double v1 = stack.pop();
double v2 = stack.pop();
double result = eval(out[i], v2, v1);
stack.push(result);
}
}
return stack.pop();
} // 判别是否是数字
public boolean isNumber(String s) {
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"))
return false;
return true;
} public static double eval(String op, double val1, double val2) {
if (op.equals("+"))
return val1 + val2;
if (op.equals("-"))
return val1 - val2;
if (op.equals("/"))
return val1 / val2;
if (op.equals("*"))
return val1 * val2;
throw new RuntimeException("Invalid operator");
}
public static void main(String[] args) {
System.out.println("请输入要计算的算式:");
Scanner sc = new Scanner(System.in);
String inBefore = sc.nextLine();
String[] in = inBefore.split("") ;
int kk=in.length;
System.out.println("您输入的算式是");
for(int o=0;o<kk;o++){
System.out.print(in[o]);
}
System.out.println();
Cal cc = new Cal() ;
HashMap<String, Integer> precedence = cc.priorityInfo();
String[] out = cc.SolveOrder(in, precedence);
System.out.println("所输入的算式结果为:" + cc.calculateOut(out)); }

运行结果如下:

单元测试代码如下:

测试中缀转后缀

        Cal c1=new Cal();
String inBefore = "1+2*3";
String[] in = inBefore.split("") ; @Test
public void testSolveOrder() {
HashMap<String, Integer> precedence = new HashMap<String, Integer>();
precedence.put("(", 0);
precedence.put(")", 0);
precedence.put("+", 1);
precedence.put("-", 1);
precedence.put("*", 2);
precedence.put("/", 2);
assertEquals("123*+", c1.SolveOrder(in, precedence));
fail("Not yet implemented");
}

测试计算结果是否正确

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

测试是否是数字:

@Test
public void testIsNumber() {
assertEquals("1", "1");
assertEquals("0", "+");
}

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

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

运行结果如下:

现在实现的手动输入字符串算式,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. 如何在 EXCEL 2003 插入的方框内打对勾,复选框

    一个方框里带勾的符号是吧第一种:EXCEL里有个插入符号的功能知道吧,打开它在符号那栏(不是特殊符号那栏),下拉字体找到Wingdings字体,在下面的符号中就能找到框中带勾的符号 第二种:在界面点& ...

  2. Dijkstra算法堆优化(vector建图)

    #include<iostream> #include<algorithm> #include<string.h> #include<stdio.h> ...

  3. CSS-cascading stle sheets

    CSS-cascading stle sheets 1.      CSS 什么是CSS?CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式 ...

  4. 20145202马超《网络对抗》Exp6 信息搜集与漏洞扫描

    本实践的目标是掌握信息搜集的最基础技能.具体有(1)各种搜索技巧的应用(2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(4)漏洞扫描:会扫 ...

  5. Caliburn.Micro 杰的入门教程1(翻译)

    Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程 ...

  6. 【BZOJ3991】寻宝游戏(动态规划)

    [BZOJ3991]寻宝游戏(动态规划) 题面 BZOJ 题解 很明显,从任意一个有宝藏的点开始,每次走到相邻的\(dfs\)的节点就行了. 证明? 类似把一棵树上的关键点全部标记出来 显然是要走一个 ...

  7. 北京Uber优步司机奖励政策(11月30日~12月4日)

    用户组:人民优步(适用于12月1日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:htt ...

  8. 北京Uber优步司机奖励政策(11月9日~11月15日)

    用户组:人民优步“关羽组”(适用于11月9日-11月15日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月 ...

  9. mysql int类型的长度值

    整数类型的存储和范围(来自mysql手册) 类型 字节 最小值 最大值     (带符号的/无符号的) (带符号的/无符号的) TINYINT 1 -128 127     0 255 SMALLIN ...

  10. VueJs 学习笔记

    VueJs学习笔记 参考资料:https://cn.vuejs.org/ 特效库:TweenJS(补间动画库)  VelocityJS(轻量级JS动画库) Animate.css(CSS预设动画库) ...