【week3】四则运算 单元测试
上一周的四则运算有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】四则运算 单元测试的更多相关文章
- 5.1 四则运算单元测试j
由于上个星期请假没上课,这个星期回来才知道作业,时间比较赶,个人能力又不足,作业质量不是很好 Calculator.java import java.util.Scanner; public clas ...
- 四则运算——单元测试(测试方法:Right-BICEP )
一.测试的具体部位 Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? P-是否满足性能要 ...
- 软工+C(2017第6期) 最近发展区/脚手架
// 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...
- 软工+C(6): 最近发展区/脚手架
// 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...
- 四则运算之Right-BICEP单元测试
一. 这篇博客要对上次实现的四则运算进行单元测试,一是检查上次的程序的实现情况,二是巩固单元测试的相关知识.本次进行单元测试用的是Riget-BICEP方法. Riget-BICEP方法: 1.Rig ...
- RIGHT-BICEP单元测试——“二柱子四则运算升级版”
RIGHT-BICEP单元测试 ——“二柱子四则运算升级版” ”单元测试“这对于我们来说是一个全新的专业含义,在上了软件工程这门课,并当堂编写了简单的"求一组数中的最大值"函数的单 ...
- 单元测试--四则运算2程序(c++)
源代码: //2016 3.6 Cheng Qiqin //四则运算改进 #include <iostream> #include<ctime> #include<cst ...
- 【week3】词频统计 单元测试
使用Eclipse 集成的Junit进行单元测试.单元测试的核心包括断言.注解. 测试代码如下: @BeforeClass // 针对所有测试,只执行一次,且必须为static void public ...
- BICEP单元测试——随机四则运算升级版
一.测试方法 6个值得测试的具体部位: Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? ...
随机推荐
- Nginx初体验(一):nginx介绍
今天我们来介绍一下Nginx. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件(IMAP/POP3)代理服务器 特点: 反向代理,负载均衡,动静分离 首先我们来介绍一下正向代理服务器 ...
- 北京Uber优步司机奖励政策(3月23日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Habse中Rowkey的设计原则——通俗易懂篇
Hbase的Rowkey设计原则 一. Hbase介绍 HBase -> Hadoop Database,HBase是Apache的Hadoop项目的子项目.HBase不同于一般的关系数据库,它 ...
- java nio之channel
一.通道(Channel):由 java.nio.channels 包定义的.Channel 表示 IO 源与目标打开的连接.Channel 类似于传统的“流”.只不过 Channel本身不能直接访问 ...
- 下载Web微信视频
1. 用浏览器(我用Chrome)登录web微信(wx.qq.com) 2. 这个时候如果有人发视频,可以点开播放.用F12打开chrome的调试平台,查看视频源的URL(绿色框的src内容) 3. ...
- 阿里云中linux 下svn服务器安装
摘要: 安装步骤如下: 1.yum install subversion 2.输入rpm -ql subversion查看安装位置,如下图: 我们知道svn在bin目录下生成了几个二进制文件. 输 ...
- svn清理报错:Cleanup failed to process the following paths
这里碰到svn更新时,提示清理,清理时报错: 只需进行以下几个步骤即可解决:(原理即是清除掉svn数据库里的lock记录) 1.下载SQLiteManager,svn用的是sqlite数据库,需要一款 ...
- Git 新建文件并提交
1.创建一个readme.txt. cd /home/cyp/learngit touch readme.txt vim readme.txt 编写内容, wq 保存推出 2.提交步骤 2.1 gi ...
- mysql新手进阶01
生活不止眼前的苟且,还有诗和远方. 请根据给出的数据库表结构来回答相应问题: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EM ...
- Java 递归 反射 正则表达式
一 递归 1. 就是函数自身调用自身 (就是在栈内存中不断的加载同一个函数) 2. 什么时候用递归呢? 当一个功能被重复使用 而每一次使用该功能时的参数不确定 都由上次的功能元素结果来确定 简单说: ...