构建之法——第二次作业:熟悉工具的使用

《构建之法》第二次作业

GIT地址

git地址

GIT用户名

 OnedayForLi

       学号后五位

 91410

             博客地址

 我的博客

             作业链接

第二次作业链接

一、配置环境

之前用过,所以不进行重复配置,vs的配置应该算是蛮简单的,跟着安装步骤一步步走就好了。有一个细节就是尽量不要安装在系统盘,因为它比较占用内存。

扫描二维码关注公众号,回复: 7322714 查看本文章

配置好的截图如下

二、克隆项目

1.申请github账号

2.拷贝

进行阿超仓库,点击右上角的fork,就完成啦。

3.开始Git的使用

Git也是很久之前就下载了的,安装过程相对来说也不难,这里推荐一个git安装和使用的教程,超级详细,适合初学者和理解力较弱的朋友们。廖雪峰的git教程。

git安装好了以后,我们要将阿超的四则运算克隆到本地。

首先,复制你的仓库的四则运算的地址

然后,创建一个本地文件夹,这个文件夹的地址没有要求,但是名字最好和自己本次主题相关,方便寻找。

然后右键进入Git Bash Here:

输入git clone +你的仓库地址:

clone成功啦。

三、代码

题目背景:

阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。

要求:

  • 程序接收一个命令行参数 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

基本思路如下:

首先创建计算式

        //创建式子的函数
        public static string create()
        {
            Random random = new Random();
            string equation ="";                   //定义方程式
            int OpLeft = 0;
            int OpRight = 0;
            int op = 0;
            int OpNumber = random.Next(2, 4);       //决定有几个运算符
            OpLeft = random.Next(0, 101);
            //equation += OpLeft;
            for (int i = 0; i <(2*OpNumber)+1; i++) //操作数一定比运算符多一个,所以总数是
            {
                if (i % 2 == 0)                     //当循环到偶数的时候,是数字
                {
                    OpRight = random.Next(0, 101);
                    equation += OpRight;
                }
                else
                {                                   //当循环到奇数的时候,是运算符
                    op = random.Next(0, 4);
                    equation += FuHao(op);
                }
            }
            return equation;
        }
        //用随机数来创造符号的函数
        public static string FuHao(int number) {
            string symbol="";
            switch (number)
            {
                case 0:
                    symbol= "+";
                    break;
                case 1:
                    symbol = "-";
                    break;
                case 2:
                    symbol = "*";
                    break;
                case 3:
                    symbol = "/";
                    break;
            }
            return symbol;
        }

对创建的式子进行计算的函数:

        public static string Count(string str) {   

            DataTable dt = new DataTable();  
            object obj = dt.Compute(str, "");
            while (obj.ToString().Contains("-") || obj.ToString().Contains(".") || str.Contains("/0"))
            {
                str = create();
                obj = dt.Compute(str, "");
            }
            return str+"="+ obj.ToString();
        }

生成文件的函数:

        public static void Writefile(string result)
        {
            StreamWriter sw = File.AppendText(@"C:\Users\李星晨\Desktop\第二次作业\AchaoCalculator\test.txt");
            sw.WriteLine(result);
            sw.Flush();
            sw.Close();
        }

主函数:

        public static void Main(string[] args)
        {
            string result;
            Console.Write("请输入题目个数:");
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                string equation = create();
                result = Count(equation);
                Console.WriteLine(result);
                System.Threading.Thread.Sleep(50);        //random在不加种子的情况下,使用系统的时针,出现的数字总是会相同
                Writefile(result);
            }
            Console.Read();                                    

        }

运行结果如下:

四、单元测试

1.c#编写好代码后,在界面直接右键创建单元测试:

ps:这里有一个小细节,必须把所有的private类改为public类,否认会弹出以下窗口。

2.然后是进行单元测试,因为我在计算函数中调用了创建函数,所以我着重测试了计算式子的函数

测试代码如下:

        public void CountTest()
        {
            string str1 = "1+50/2";
            string str2 = "20*3-20";
            string str3 = "1+57*2";
            int ans1 = 26;
            int ans2 = 40;
            int ans3 = 115;
            Assert.AreEqual(Program.Count(str1),ans1);
            Assert.AreEqual(Program.Count(str2), ans2);
            Assert.AreEqual(Program.Count(str3), ans3);
        }

3.测试通过~

四、基本操作

1.断点

断点是我们在调试过程中必不可少的一步

如图,我们在第 37行设置了一个断点,调用一次创建式子的函数就暂停.。

逐步调试,观察各个变量变化的值:

2.条件断点

添加条件,OpRight的初试值为0,执行一次create函数后值发生变化,则隐含的条件为执行一次就达到断点的条件。

达到断电后OpRight=81,符合条件。

3.添加监视

在这一步我选择监视OpRight,从代码中我们可以得知OpRight意为运算符右边的值,是一直在变化的,利用好监视器跟踪OpRight的变化。

添加监视器,一步一步记录OpRight的变化:

两次监视的结果和程序运行出的结果是相对应的,监视器还是很好用的。

五、效能工具介绍

尝试使用效能工具,这里我们测试CPU使用率。

开始测试:

生成分析报告,进一步观察CPU的使用的分配:


因为这次四则运算代码比较简单,CPU的使用并不太明显,所以我增加了大量循环代码,加入主函数中:

            for (int i = 0; i < 10000000; i++)
            {
                for (int z = 0; z < 1000000; z++)
                {
                    for (int j = 0; j < 1000000; j++)
                    {
                        if (j % 2 == 0)
                        {
                            j = j + 1;
                        }
                        else
                        {
                            j = j - 1;
                        }

                    }
                }
            }

运行了一分钟40秒后结果如下,这时我们可以点停止收集

分析如下:

这个结果就很明显了,main主函数占用的比例是99.03%,这样数据就非常直观,通过这个分析我们可以知道如果我们要改进代码,在主函数改进是最有效率的方法。

通过这个例子,我认为利用性能分析能够很好地帮助我们了解到那个函数内部占用CPU最多,进而我们能够取得最好的改进方式。

六、提交代码

在git中执行git add .和git commit -m "First Commit"命令

最后Git push。

这时候就可以回到自己的github的仓库里面,找到这次我们写的代码文件,点击此按钮

上传成功后图片如下:

 

如果需要重复提交,则重复三个命令即可,但是需要注意的是,需要git commit -m "First Commit"命令改成git commit -m "Second Commit"命令,方便后续在github进行查看。

七、本次感想

  • 心得:此时,整个项目基本完成了,真的感触非常多。

上课的时候老师便提出过这个题目背景,问我们需要几天来完成。我记得当时有位同学回答的一天,当时我心里觉得可能用不了一天,现在想来真的眼高手低了。不过,这次项目真的让我学会了很多。

首先是代码上,虽然之前接触过c#不过真的学的很浅,经过一年基本忘得差不多,这次感觉又重拾了c#,尝试c#解决问题。这次的题目虽然看起来十分简单,但是其实内有乾坤,有很多隐含的条件,比如不能除0,运算中的优先级等等,虽然后面的单元测试一次成功,但是前面调试代码真的是一把血一把泪。因为对c#不熟悉,一点点小问题就足以让我卡一个小时,心累。

然后是工具上,c#和git很久之前就下载好了,然后就在我的电脑里面“生灰”,这一次自己独立走了一遍项目流程,觉得收益良多。对vs里很多功能有了更深的理解,像以前就没有用过cpu性能分析和单元测试这种功能,o(╥﹏╥)o。不过现在学会了!  git也是一样!

  • 经验分享:

(1)当你做一些运算题时,如果你发现你的答案不对但是没有报错,那么很有可能是你的逻辑错误,这个时候你可以画一张流程图或者拿起笔来算一算,沥青你的逻辑,找出错误。在这次实验中我就是这样解决了我卡了一中午的问题o(╥﹏╥)o。

(2)git的命名规范真的非常重要,git是团队合作开发的工具,你的代码和文件不止是你一个人在看,大家也在看,如果命名不规范,会产生大量的不必要的工作。而正确的命名方式,又能使你事半功倍。

(3)要善于发现每个编译器的好用之处,不要局限于浅层和表面,一个顺手的工具是你成功的一半。

猜你喜欢

转载自www.cnblogs.com/ForOnedayy/p/11551693.html