构建之法--熟悉使用工具
GIT地址 | MyGit |
---|---|
GIT用户名 | liuxingbumie2014 |
学号后五位 | 62408 |
博客地址 | 博客 |
作业链接 | 链接 |
1.配置过程
配置过程没什么问题,从官网下载安装程序,勾选.Net桌面开发即可。如下图
2.代码设计的思路
- 获取随机算式
Random rd = new Random(Guid.NewGuid().GetHashCode());
operatorNum = rd.Next(2, 4);//运算符个数
for (j = 0; j < operatorNum; j++) {
sb.Append(rd.Next(0, 101));
sb.Append(opera[rd.Next(0, 4)]);
}
sb.Append(rd.Next(0, 101));
- 排除除数为0的算式
//check dividend 0
if (sb.ToString().Contains("/0")) {
i--;
continue;
}
- 设计一个Compute类将算式转化为后缀表达式并求值
//中缀表达式转后缀表达式
public void DoTrans() {
for (int i = 0; i < input.Length; i++) {
if(input[i] >= '0' && input[i] <= '9') {
while(input[i] >= '0' && input[i] <= '9') {
post[z++] = input[i++];
if (i == input.Length) {
break;
}
}
post[z++] = '#';
i--;
}else if (input[i]=='+' || input[i]=='-') {
OperationOpStack(input[i], 1);
} else if (input[i] == '*' || input[i] == '/') {
OperationOpStack(input[i], 2);
}
}
while (opStack.Count != 0) {
post[z++] = opStack.Pop();
}
}
//运算符栈操作
public void OperationOpStack(char opThis, int prec1) {
while (opStack.Count != 0) {
char opTop = opStack.Pop();
int prec2;
if (opTop == '+' || opTop == '-') {
prec2 = 1;
} else {
prec2 = 2;
}
//比较优先级
if (prec2 < prec1) {
opStack.Push(opTop);
break;
} else {
post[z++] = opTop;
}
}
opStack.Push(opThis);
}
//后缀表达式求值
public double Calculate() {
num=new Stack<double>();//操作数堆栈
double a = 0, b = 0;
for(int i = 0;i<z;i++) {
if (post[i] >= '0' && post[i] <= '9') {
int tmp = 0;
while (post[i] >= '0' && post[i] <= '9') {
tmp = tmp * 10 + Convert.ToInt32(post[i] - '0');
i++;
}
num.Push(tmp);
}else if (post[i] == '#') {
continue;
} else {
a = num.Pop();
b = num.Pop();
num.Push(Operate(b, a, post[i]));
}
}
return num.Pop();//最后的结果为栈顶元素
}
//计算结果
public double Operate(double first, double second, char op) {
double res = 0;
switch (op) {
case '+':
res = first + second;
break;
case '-':
res = first - second;
break;
case '*':
res = first * second;
break;
case '/':
res = first / second;
break;
default:
break;
}
return res;
}
- 得到结果并排除结果为小数负数的算式
if (result.ToString().Contains(".") || result<0) {
i--;
continue;
}
sb.Append('=');
sb.Append(result);
- 将算式输出
- 完整代码见Git
3.github克隆项目
- 1、fork项目 点击Clone or download 复制链接
- 2、克隆到本地项目 git clone +链接
4.单元测试
-
在方法处右键,点击创建单元测试(注意方法和类必须为pubic),不然会出现以下提示
-
点击菜单栏的测试->运行->所有测试 左侧绿色勾表示测试通过,测试Operate函数,测试四则运算。测试结果通过
-
测试Calculate函数,,验证输入算术式能否得到正确的结果。测试结果通过
5.效能分析
- 硬编码n为一百万
- 点击菜单栏 分析->性能探查器 勾选CPU测试率 开始 效能分析。即使程序没跑完,效能分析也能强行结束。让程序跑几分钟,点击停止收集
- 下图是效能分析报告
- 要想获得更详细的报告,点击上图中的创建详细的报告...,创建完成后进入一个后缀为 .vspx 的文件,如下图所示
- 点进Calculator.Program.Main 可以看见函数占用时间的百分比,从而优化代码
6.提交代码
-
使用git status查看本地改动是否add和commit
-
将工作区"新建/修改"的文件添加到暂存区
-
将暂存区内容添加到本地库
-
使用 push 命令后,会弹出一个窗口要求登录 Github,此时输入 Github 的 用户名或邮箱 与 密码 即可成功 push。
-
完成 push 后,向源仓库发起 Pull Request,点击 New pull request
-
点击 Create pull request 即可发起请求
-
git常用命令
git status //查看工作区,暂存区状态
git branch//显示所有分支
git add . //将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录
git commit -m "分支" //将暂存区内容添加到本地库
git push //将本地版本库的分支推送到远程服务器上对应的分支
7.问题&解决
- 使用后缀表达式求值时遇到瓶颈,因为一般的后缀表达式求值的操作数都是个位数,后来参考了该博客解决了问题,在遍历算式字符串时当遍历的字符是数字时继续遍历,直到不是数字为止。将得到的数字拼成一个数字然后在后缀字符串中以‘#’分割。
8.总结
以前我以为只要编写能运行的程序就行,现在我知道得编写单元测试、回归测试来保证代码的正确性,因为现实中不一定总遇到合法的输入,进行单元测试能提高代码的健壮性。同时进行效能分析,发现哪些代码更耗时间,方便修改和提升效率。Git也很强大,能够在本地和github上妥善的保管代码,避免数据丢失。