任务06——封装与单元测试(Markdown版)
模块代码地址
两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了。
封装阶段
public class Core {
public static StringBuffer Suffix(StringBuffer infix){
Stack<Character> stack=new Stack <Character>();
StringBuffer suffix=new StringBuffer();
int i=0;
char tempchar=infix.charAt(i++);
char tempchar2=' ';
try {
while (tempchar!='='){
switch (tempchar){
case '(':
stack.push(tempchar);
tempchar=infix.charAt(i++);
break;
case ')':
while (stack.peek()!='('){
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
if (stack.empty()) {
break;
}
}
if (!stack.empty()) {
stack.pop();
}
tempchar=infix.charAt(i++);
break;
case '+':
case '-':
while (!stack.empty()&&stack.peek()!='('){
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
}
stack.push(tempchar);
tempchar=infix.charAt(i++);
break;
case '×':
case '*':
case '/':
case '÷':
Character ch=new Character(' ');
if (!stack.empty()) {
while((ch=stack.peek()).equals('×')||(ch=stack.peek()).equals('÷'))
{
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
if (stack.empty()) {
break;
}
}
}
stack.push(tempchar);
tempchar=infix.charAt(i++);
break;
case ' ':
tempchar=infix.charAt(i++);
break;
default:
while(tempchar<='9'&&tempchar>='0')
{
suffix.append(tempchar);
tempchar=infix.charAt(i++);
}
suffix.append(' ');
break;
}
}
while(!stack.empty())
{
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
}
suffix.append('\0');
} catch (Exception e) {
e.printStackTrace();
}
return suffix;
}
//根据后缀表达式计算结果(小数格式的String类型)
public static String Calculate(StringBuffer suffix){
int i=0;
char tempchar=suffix.charAt(i++);
double []answer=new double[20];
int top=0,d;
String Answer= null;
try {
while (tempchar!='\0'){
switch (tempchar){
case '+':
answer[top-1]=answer[top-1]+answer[top];
top--;
tempchar=suffix.charAt(i++);
break;
case '-':
answer[top-1]=answer[top-1]-answer[top];
top--;
tempchar=suffix.charAt(i++);
break;
case '*':
case '×':
answer[top-1]=answer[top-1]*answer[top];
top--;
tempchar=suffix.charAt(i++);
break;
case '/':
case '÷':
try {
if(answer[top]!=0)
answer[top-1]=answer[top-1]/answer[top];
else
{
System.out.println("\n\t除零错误!\n");
throw new InvalidExpression("无效的表达式");
}
} catch (InvalidExpression invalidExpression) {
invalidExpression.printStackTrace();
System.exit(0);
}
top--;
tempchar=suffix.charAt(i++);
break;
case ' ':
tempchar=suffix.charAt(i++);
break;
default:
d=0;
while(tempchar>='0'&&tempchar<='9')
{
d=10*d+tempchar-'0';//将数字字符转化为对应的数值
tempchar=suffix.charAt(i++);
}
top++;
answer[top]=d;
break;
}
}
Answer = null;
if (top!=1){
throw new InvalidExpression("无效的表达式");
}
Double an=new Double(answer[top]);
Answer = new String(an.toString());
}catch (InvalidExpression invalidExpression) {
invalidExpression.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return Answer;
}
}
在封装的过程中遇到的困难,以及是如何解决的:
对于封装首先想到几天前学习的软件工程的知识,关于模块的分解、抽象,恰好与本次的任务吻合,可以理论用于实践。上图是我画的UML图,在尝试在学习中,算不上很规范,但能基本看懂大概的结构。
因为之前的代码基于结构化编程,运用函数思想,所以在本次封装过程中很好的将功能抽象出来,这次完成的虽然不是很完美,但后期可以通过老师的指导不断改进。
单元测试阶段
单元测试代码 此处粘贴单元测试代码(用一对 ``` 把代码括起来)
@Before
public void before() throws Exception {
}
@After
public void after() throws Exception {
}
/**
*
* Method: Suffix(StringBuffer infix)
*
*/
@Test
public void testSuffix() throws Exception {
Core s=new Core();
s.Suffix(new StringBuffer("1+2+3="));
s.Suffix(new StringBuffer("1+2×3="));
s.Suffix(new StringBuffer("1+2÷3="));
s.Suffix(new StringBuffer("1÷2×3="));
s.Suffix(new StringBuffer("1÷+2×3="));
s.Suffix(new StringBuffer("1÷2*3="));
s.Suffix(new StringBuffer("1÷0×3="));
s.Suffix(new StringBuffer("1÷2×0="));
}
/**
*
* Method: Calculate(StringBuffer suffix)
*
*/
@Test
public void testCalculate() throws Exception {
Core s=new Core();
s.Calculate(new StringBuffer("1 2 + 3 +"));
s.Calculate(new StringBuffer("1 + 2 + 3 +"));
s.Calculate(new StringBuffer("1 2 +"));
s.Calculate(new StringBuffer("1 2 × 3 +"));
s.Calculate(new StringBuffer("1+ + 2 × 3 +"));
}
}
单元测试运行结果(截图,含测试是否全部通过,代码覆盖率等)
在编写单元测试代码过程中遇到的困难,以及是如何解决的
按照老师提供的教程,一开始看不懂,需要自己慢慢琢磨,Junit包,不知道是哪个,IDEA上找到有好多个,后来自己在网上找一个发现可以用。
下面提供它的下载网址。
链接:http://pan.baidu.com/s/1o84pWQQ 密码:1mda
别的大问题没有,关于对Core的测试,计算表达式都是自己按照规则生成的,不会出现不规则的情况,
所以对于测试情况的全面性没有更深一步进行。
感受(小结)
Junit很方便,测试的时候,不能以编程时的思维方式去看待问题,否则有些问题永远测试不出来。
需要打破常规的思路,不能认为自己的代码运行结果都是对的。
任务06——封装与单元测试(Markdown版)的更多相关文章
- 会议管理心得记录(非markdown版)
前提 本文说的会议特指有开发团队成员参与的会议, 包括但不限于开发.设计.测试.运维.管理岗位的成员. 因为不同工种和行业都有其特殊性,我是一名程序员,并不太了解其他工种和行业的具体情况,不敢妄言. ...
- 关于获取、设置css样式封装的函数入门版
<html> <head> <meta charset="UTF-8"> <title>CSS样式的获取和设置:简单版</ti ...
- 三星S4使用体验(Markdown版)
由于各种原因,前几天把手上的HTC 606w给二手交易了,然后二手买了一只全新的韩版S4蓝色e330s作为主力手机使用.现在主要就用户体验的角度对这只新的手机做次评价. 第一次做手机的评价,不知道写成 ...
- 标准兼容HTML5输入框提示信息的插件iHolder_v0.1.06.21.2014_预览版
由于版面限制,简单说下,详细的内容及在线预览.预览版压缩包,见这里http://levi.cg.am/archives/3507 为什么说是标准兼容: 因为大多数placeholder插件是这样兼容的 ...
- 面向对象的封装(粘贴Markdown代码解决缩进问题)
直接粘贴idea的代码会导致缩进错乱,建议先粘贴到记事本再粘贴到笔记!!! 1.先将属性私有化,再对外提供简单的接口可以访问内部.如set.get方法 2.set方法:修改年龄 public void ...
- 微信JS-API封装接口——node.js版
github:https://github.com/xjnotxj/wechat_interaction_jsapi Wechat JS-API接口 功能: 用于管理和获取微信 JSSDK 生产的ac ...
- 微信网页授权封装接口——node.js版
Wechat 网页授权 授权url:(请在微信客户端中打开此链接体验) xxx为config.js中的WECHAT_DOMAIN 1.scope为snsapi_base xxx/?route=auth ...
- Spring事务(一) Markdown 版
事务 事务的特性(ACID) 原子性(Atomicity) 原子性要求事务所包含的全部操作是一个不可分割的整体,这些操作要么全部提交成功,要么只要其中一个操作失败,就全部"成仁" ...
- mui封装做好的手机版网站为apk
BOSS提到的一个功能,就是把已经做好的手机网站http://xxx.com/m/home/index ,想着看起来应该蛮简单,一个html页面里就一个iframe就好了,然后宽度和高度都设置为100 ...
随机推荐
- ps -ef/ps -aux 查看正在活动的进程
ps -ef 查看正在活动的进程 ps -ef |grep abc 查看含有"abc"的活动进程 ps -ef |grep -v abc 查看不含abc的活动进程 1)ps a 显 ...
- 简易推荐引擎的python实现
代码地址如下:http://www.demodashi.com/demo/12913.html 主要思路 使用协同过滤的思路,从当前指定的用户过去的行为和其他用户的过去行为的相似度进行相似度评分,然后 ...
- 改动图片exif信息
我们先了解一下EXIF: EXIF能够附加于JPEG.TIFF.RIFF等文件之中.为其添加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本号信息. 全部的JPEG文件以字符串"0xF ...
- android-pull方式解析xml文件以及XML文件的序列化
android解析XML ---------------------------基础要像磐石 在android平台上可以使用SAX.DOM和自带的Pull解析器解析xml文件,本文主要介绍使用pull ...
- LeetCode之小孩分糖果
给定一群站好队的小孩而且按某项分值排名(姑且如果为年龄吧),年龄大的要比他身边年龄小的拿的糖要多.求怎么分配糖果使得分配的糖果数最少. 用一个数组从左到右再从右到左的遍历,向前遍历时若右边的比左边的大 ...
- C++语言基础(3)-类和对象
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化.每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数. 一.类的定义 一 ...
- C语言结构体指针的引用问题
在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...
- 关于搭建HTTPS服务器服务
关于 HTTPS 的基本原理大家都已经不再陌生,今天和大家说说如何搭建一个支持 HTTPS 的服务端. 服务端的 HTTPS HTTPS 已经几乎成为了当前互联网推荐的通信方式,它能最大化保证信息传输 ...
- php 图片上传 文件上传 大小 限制
nginx 413 Request Entity Too Large Php无法上传文件 查看php脚本运行用户,写个php脚本 <?php echo shell_exec("id ...
- python笔记2 生成器 文件读写
生成器 一边循环一边计算的机制,称为生成器(Generator). 把一个列表生成式的[]改成(),就创建了一个generator: 创建了一个generator后,通过for循环来迭代它. 著名的斐 ...