构建之法--熟悉使用工具

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上妥善的保管代码,避免数据丢失。

posted @ 2019-09-19 13:52  (>▽<)  阅读(164)  评论(2编辑  收藏  举报