《构建之法》作业二:熟练掌握工具

0次代码作业——阿超的四则运算器

本次博客信息

Git地址 https://github.com/1517043456
Git用户名 1517043456
学号后五位 54221
博客地址 https://www.cnblogs.com/isHao/
作业链接 个人第2次作业:熟悉使用工具
  • 作业背景简介

part 1、配置环境

  由于自己曾经学过C#所以自己很早就下载安装好了Visual Studio 2017

  已经安装好了,就谈谈自己在使用vs2017的体验吧。首先,不愧是收费的IDE,对于各种编程语言的兼容很棒!一个IDE可以集成了多种编译环境(听说最新的VS连Java都集成进去了)也太强了吧!!其他的功能像大多数IDE一样,体验都差不多。当初在同时使用eslipse和VS时,就明显觉得VS体验更好一点,无论是代码的提醒,还是一些编写规范的提醒都让人感觉很适用,没有一点抵触。

part2、克隆项目

  (1)本次作业需要使用GitHub和git。这两样管理工具,都是自己曾经接触过的,但是仅仅局限于接触,也就是仅仅从GitHub上clone and download,克隆下载一些别人的代码来使用或者学习!

  单击fork后,自己就能向将阿超的四则运算库拷贝到自己的同名仓库中,向仓库提交代码了!
  (2)在本地使用git克隆仓库,方便后续的提交。对于git,自己之前是使用TortoiseGit的。这也是一个本地的源代码管理工具,也可以向GitHub提交自己的代码。功能和git差不多。很多人亲切的称它为“小乌龟”。
这就是“小乌龟”链接GitHub的一个界面:

   当然,本次是使用git。所以我特意去安装和下载了git。安装和下载的教程,网上有太多,就不在重复介绍了,这里开始直接使用git克隆本次作业到本地。
A,第一步:从GitHub上获得项目的仓库克隆地址

B,第二步:使用git将项目克隆到本地
在我的电脑中或者任意一个盘中右键选择git Bash here,就会出现一个git的类似于shell指令的界面,输入指令git clone <从GitHub复制的地址>。完成该指令后就可以看到GitHub上项目的同名文件已经创建好了。

注意:虽然说,进入到我的电脑中任意一个盘中,右键使用Git Bash here都可以将GitHub上的文件clone到这里,但是最好还是自己新建一个特定的文件夹,来进行这个操作,因为目前作为一个低端的“码农”,收拾文件就像收拾屋子一样。还是分类有条理的放好,以免后续的不必要操作。
C,第三步,创建自己的项目文件夹并完成git相关配置

在刚才clone下来的文件中新建一个和GitHub账号同名的文件夹。
在这里直接也试了一下使用git的命令行创建新的文件夹。

果然在指令上和Linux是相似的!tab补全指令用着很舒服!
D,第三步:由于自己是第一次使用git,所以需要配置自己的个人邮箱与 Commit 时的用户名。
指令:
  git config --global user.name “你的用户名”
  git config --global user.email “你的邮箱号”
  
E,第四步,创建一个C#项目到第二步的项目文件中
  
  part2的小结:自己第一次使用git,还是每一步都十分谨慎,生怕这里出错了影响到后面的操作。
  好在一路流畅的配置完成了,自己在这个过程中也算是被动的驱使着入了门。在这个过程中,两个值的注意的点:

  • (1),Git Bash here 最好是自己先创建一个文件夹来作为仓库存放后续的代码。
  • (2),git的命令行控制工具适用Linux的指令。

part4,代码设计

思路简介:这个题目,看到首先想到的是使用栈来解决。但是后面觉得栈有点太麻烦了,自己时间紧迫就换了一个简单的方式实现。这个简单的方式主要是使用了DataTable的compute函数。

DataTable.Compute()方法:

作用
计算用来传递筛选条件的当前行上的给定表达式。
格式
Object Compute (string expression,string filter)
参数
expression:要计算的表达式。 expression 参数需要聚合函数。
filter:要限制在表达式中进行计算的行的筛选器。 如:“Menu_ID=5” //表示Menu_ID為5的行
返回值
為Object型,为计算结果。
Expression说明
Expression 属性的一个用途是创建计算出的列。 第二个用途是创建聚合列。类似于计算出的值,聚合基于 DataTable 中的整个行集执行操作。
表达式语法
在创建表达式时,使用 ColumnName属性(表中列的名稱)来引用表中的列。

  1. 首先创建一个类来获取一个表达式,类似于:x + y - z 或者 x * y - z / d。
  • 先将运算符保存到数组中,再使用random实现随机的运算符效果,同理获得0—100的随机数
    代码解释如下:
  • 通过StringBuilder来拼接一个需要的表达式
  • 代码如下:
//随机获取一个运算符
        public string getOperator(int i) {
            String[] OperatorsType = { "+","-","*","/"};
            return OperatorsType[i];
        }
        //返回一个四则运算式
        public string getAnExpression() {
            //用于获取随机数
            //int seeds = 1;
            Random rd = new Random();
            StringBuilder sb = new StringBuilder();
            //运算符个数(2个或3个)
            int operatorNum = (int)rd.Next(2,4);
            //作为数组下标获取运算符
            int operators;
            //数值
            int num;
            int nextNum = rd.Next(0, 100);
            for (int i = 0; i < operatorNum; i++) {
                num = rd.Next(0, 101);
                operators = rd.Next(0,4);
                sb.Append(num).Append(getOperator(operators));
                //由于random在时间随机,因此停滞10毫秒
                System.Threading.Thread.Sleep(10);
            }
            sb.Append(nextNum);
            return sb.ToString();
        }
  1. 计算获得的表达式
  • 这里主要是使用DataTable.Compute()方法将获得的表达式计算结果
  • 这里需要进行一次判断,转换为字符串后判断结果是否含小数点和被除数位0以及结果是否为负数(作业博客下面有人问到,我就自己将其在判断中去掉负数了)的情况。
  • 代码如下:
        public string GetResult()
        {
            ExpressionsFactory ef = new ExpressionsFactory();
            DataTable dt = new DataTable();
            string expression = ef.getAnExpression();
            //使用compute进行计算
            Object result = dt.Compute(expression,"");
            //如果结果含有小数点,或者表达式中有除以0,或者结果为负数在获取一个计算式
            while (result.ToString().Contains(".") || expression.Contains("/0")
                ||result.ToString().Contains("-")) {
                expression = ef.getAnExpression();
                result = dt.Compute(expression,"");
            }
            //返回一个拼接好的字符串
            return expression+"="+result.ToString();
        }
  1. 写入文件
  • 写入文件主要使用的是StreamWriter
        public void WriteTxt(string result)
        {
            try
            {
                string txtfile = "F:\\subject.txt";
                StreamWriter sw = new StreamWriter(txtfile);
                sw.Write(result);
                sw.Flush();
                sw.Close();
                Console.WriteLine("写入完毕!");
            }
            catch (Exception e) {
                Console.WriteLine("文件写入失败!");
            }
        }
  1. 运行结果

小结:

  • 最近学习和使用的是java,因此太久没写C#了,使得自己对于C#和VS的操作前期用了一点时间去适应。但好在虽然没有对象,但面向对象的思想是不存在语言隔阂的,自己也很快用代码实现了自己的设想,并能够成功运行。
  • 自己在拼接一个表达式时花费了较长的时间,由于随机的的个数使得自己老是有点问题。总想着不能很死板的去拼接,那样效率比较低。好在自己最后还是理清楚了顺序和关系解决了问题。
  • 最大的收获便是知道了一个dataTable.compute()方法,使用起来很方便,直接自己区分运算符和数值还能得出结果。

part5,单元测试

  1. 创建单元测试项目
  • 在原来项目的解决方案处右键—>添加—>新建项目
  • 在弹出的新建项目下现在单元测试创建一个CalculatorUnitTest项目。(已更正!)
  1. 将单元测试和需要测试项目引用
  2. 错误的出现
    原本我按部就班的一步步进行操作,到了这步突然弹出错误心里一紧!(百度了一下,没找到这是什么情况,于是回溯了前面的步骤!)

    当一切就重新弄好后又开始新的测试

    又开始面向百度测试,后面发现需要将将类和私有方法都改为public
  3. 开始测试
    然后根据错误或者警告来优化代码。

    测试结束:

小结:

  这次的测试可真是一波三折!十分难受。还是vs和C#不熟悉的原因!

  • 首先需要注意C#在VS中分为了两种窗体应用!.core.framework!这两个的不同会使得Randmo函数不同。
  • 单元测试需要将类和方法的private改为public

Part6、一些基本调试方法的使用

  1. 断点的使用
      断点,一个从C语言就开始使用的调试手段。十分的有效且简单。我室友老说程序不是写出来的是调出来的,而调就需要使用到断点。
  • 点击需要断点的代码行对应边框------->F5------->进入调试界面

    在这个过程中主要使用到的操作:逐语句,逐过程,跳出。
    在这里插入图片描述
    在控制台下就可以看到我们定义的变量的值,这里十分的有用,你可以看看你的赋值操作是否成功进行
  1. 监视的使用
  • 选中需要监视的变量 —》右键-----》添加监视
  • 就可以在监视里看到我们监视的变量的了,可以同时监视多个变量。

part7、回归测试

回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。

回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中,新版本的连续发布使回归测试进行的更加频繁,而在极端编程方法中,更是要求每天都进行若干次回归测试。因此,通过选择正确的回归测试策略来改进回归测试的效率和有效性是很有意义的。(来源:百度)
修改代码后再次进行测试查看是否因为修改了代码导致了新的错误。

part8、效能分析

这里使用的是VS自带的效能分析器

  1. 步骤
  • 选择分析----->性能探查器
  • 选择CPU使用率来作为指标
  • 正在进行的效能分析
  • 效能分析结果
  • 更加详细的效能分析 可以看到你每个函数方法里被调用占CPU的效率。以此为依据来修改你的代码和改进算法!

part8,提交代码

  1. 首先,需要在你项目文件下右键鼠标,然后点击git bush here
  2. 使用git addgit commit命令
  3. 使用git push提交。
    这里需要输入一次GitHub的密码和账号,由于我在配置文件中写入了GitHub的密码和账号因此就不需要再输入了
  4. 提交成功后到GitHub去查看
  5. 并且pull new request提交到自己fork的源仓库
  6. 提交成功,等待审核。

part9、小结

  这次作业真的是踩了无数的坑!因此也消耗了大量的时间去弄这个。C#的窗体应用有.NET core.NET framework的区别。两者在本次的作业中自己感受到的区别:

  1. random的不同。前者的random.next()是每次调用都会随机获取一次。而后者则是在时间上区分统一时间的随机数不会发生变回,需要设置种子或者使用线程使他短暂的停滞一下。
  2. .NET core.NET framework两者的测试方法不同。
    总结来说,程序员还是需要细致,精确!
发布了32 篇原创文章 · 获赞 10 · 访问量 3710

猜你喜欢

转载自blog.csdn.net/H1517043456/article/details/100975679