个人第2次作业:熟悉使用工具

---恢复内容开始---

1) 博客开头:

GIT地址

 2stLv

GIT用户名

 2stLv

学号后五位

 62313

博客地址

 我的博客

作业链接

 作业链接

(2) 博客内容:

  • 请以博客记录的方式,体现环境配置过程(包括遇到了哪些问题,你是如何解决的)

                 因电脑上本来就安装有VS2017,所以环境配置都是没问题的:

 

 

 

  • 体现你代码设计的思路(注意:请保证代码能够运行通过)
    • 阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。

      作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:

      • 程序接收一个命令行参数n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2  个 到 3 个之间。
      • 由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。
      • 练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt
         中。
      • 当程序接收的参数为4时,以下为一个输出文件示例。

        13+17-1=29
        11*15-5=160
        3+10+4-16=1
        15÷5+3-2=4
        

      这次我们选择使用C#语言,IDE为VS2017.

    • 观看题目先想出要有几个函数,因为要尽量保持主函数中简介,所以要确定其中有一个要产生随机数的函数RandomN(int n)
      private static int RandomN(int n)
      {
      Thread.Sleep(100);//防止生成的伪随机数相同,所以设置时间间隔
      Random random = new Random();
      return random.Next(n);
      }

       

    • 第二个需要一个产生随机符号的函数 Op() 
      private static string Op()
              {
                  Thread.Sleep(100);
                  Random random = new Random();
                  int a = random.Next(4) + 1;
                  switch(a)
                  {
                      case 1:
                          return "+";
                      case 2:
                          return "-";
                      case 3:
                          return "*";
                      case 4:
                          return "/";
                  }
                  return "0";
              }

       这里我不知道怎么用random直接从+-*/里面随机出来,所以我选择了比较笨的方法,用random选出数字然后用switch进行选择,同样的,为了防止生成相同的伪随机数,设置了时间间隔。

    • 下一步就要生成算式了,构造函数 Formula() 
      private static string Formula()
              {
                  string formula;
                  int Operator = RandomN(2) + 2;
                  formula = Convert.ToString(RandomN(100));
                  for (int j = 1; j < Operator + 1; j++)
                  {
                      formula = formula + Op() + Convert.ToString(RandomN(100));
                  }
                  return formula;
              }

       算式中数字永远比符号多一个,所以要在循环(用于产生一个符号与一个数字)外面先生成一个数字,将生成的算式形成string类型返回。

    • 算式有了之后就是计算算式了,这里本来想用循环依次读取string中的内容然后挑出算符利用switch进行计算,但是网上搜到方法有一个DateTable中的Compute可以直接对算式进行计算,所以这里构造函数 CalcByDataTable(string expression) 
      internal static double CalcByDataTable(string expression)
              {
                  DataTable table = new DataTable();
                  string value = table.Compute(expression, "").ToString();
                  return Convert.ToDouble(value);
              }

       最后以double类型返回

    • 算式计算出之后就要检查条件了,看结果是否符合老师要求,这里构造函数 Judge(double result) 
      private static int Judge(double result)
              {
                  if (result<=500&&result>=0&&(result%1)==0)
                  {
                      return 1;
                  }
                  else return 0;
              }

       考虑到一年级不会接触到很大的数,所以刚开始设置的条件中是结果不能大于一百,但是这样产生算式的效率大大降低,改到了500,一年级应该能承受得住,限制条件越多越苛刻生成算式的效率就越低

    • 算式符合要求后就要写入文件中,此处构造函数 WriteTxtToFile(string Strs) 
      public static void WriteTxtToFile(string Strs)
              {
                  if (string.IsNullOrEmpty(Strs))
                      return;
                  if (Directory.Exists("D:subject.txt"))  //如果不存在就创建file文件夹
                  {
                      Directory.CreateDirectory("D:subject.txt");
                  }
                  StreamWriter sw = new StreamWriter("D:subject.txt", true, System.Text.Encoding.Default);
                  sw.WriteLine(Strs);   //写入字符串
                  sw.Close();
              }

       

    • 主函数:
      static void Main(string[] args)
              {
                  int n;
                  Console.Write("请输入你想要得到的算式的数目:");
                  n = Convert.ToInt32(Console.ReadLine());
                  for (int i=0;i<n;)
                  {
                      string formula = Formula();
                      if (Judge(CalcByDataTable(formula)) == 1)
                      {
                          string final;
                          final = formula + "=" + CalcByDataTable(formula);
                          Console.WriteLine(final);
                          WriteTxtToFile(final);
                          i++;
                      }

       主函数中的杂乱元素还是很多,所以后期还想着手对其他函数进行优化,但是时间有限,就先这样吧

    • 运行:产生10条结果:

       

       

       

       能正常运行并输出结果。

    • 存在的问题以及后期改进意见:
      1. 因为限制是100以内的数字,即便不是很大,但是相乘起来结果会很大,相除起来的话结果会很小,这些都会被筛选下去,降低程序的效率,所以后期可以对程序进行改进:当遇到*和/时,下一个随机数在10以内,方便学生计算,也提高程序的效率
      2. 简化main函数中的内容
  • 记录你使用github克隆项目以及提交代码的整个过程(包括遇到的问题,你是如何解决的)
    • 登录到github打开提供的仓库之后  点击clone or download复制链接
    •  

      然后去git官网下载git安装到计算机上,在要存放项目的地方右键运行git bash
       

       

       运行gitbash后在gitbash内输入代码进行项目的拷贝下载

       

       输入的是 git clong "刚才复制的地址"     随后项目就保存在了此目录下

       

      在编写完项目后,再次使用git上传,要先运行“git add"和"git commit"在运行git commit的时候要带-m,然后双引号对项目的描述

      最后用git push进行上传,输入git push之后会弹出来github登录框,进行登录

       

       登陆成功后即上传成功

    •  

      在自己的git仓库里面能看到项目 

       

       点击new pull request进入项目提交界面

       

       因为我的已经提交了,所以没有create pull request按钮了,正常的应该是下面的样子:

       

       点击绿色的按钮即可提交。

  • 记录你对项目进行单元测试和回归测试的过程(包括你遇到的问题,解决的方法是什么)
    • 单元测试:
  1. 对算数运算函数CalcByDataTable(string expression) 进行单元测试,测试4*5+2-1,期望结果为21

     测试通过

  2. 对判断函数Judge(double result) 进行单元测试

     一共有三个测试,第一个测试是函数接收正常范围内数字50,期望结果为1;第二个测试为函数接收不正常范围内数字2.5(分数),期望结果为0;第三个测试是函数接收不正常范围内数字-1(负数),期望结果为0.
    测试通过。

  3. 测试随机生成算式函数的话,因为结果是随机的,所以无法进行固定值,只能把随机部分mock掉再进行测试,对随机数生成函数以及无返回值的写入文件函数也使用mock测试。

     全部测试通过

    • 回归测试:未发现bug故还未进行回归测试
    • 效能分析:
      对CPU使用率进行效能分析:


你对本次工具的熟悉过程,有什么感想?分享你学习到的新知识

这次作业使我学到了很多新的知识,以前从未有过的测试:单元测试,回归测试,效能测试。其中在做单元测试的时候遇到了很多难题,对于有返回值的函数进行测试是非常简单的,但是对于没有返回值,和生成的返回值是随机的函数来说,做起来测试是没有头绪的,上网搜了很多资料,最后知道了对于void和随机函数的测试要使用mock测试,然后又看了很多mock测试的博客,学到了这一方法的强大。

这也是我第一次使用git向github上传送项目,开端还是不错的,望以后加油。

posted @ 2019-09-20 16:59  拿着一斤雷的人  阅读(155)  评论(1编辑  收藏  举报