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

||||||||||
|:--|:--|
|GIT地址|https://github.com/Shen-MoMo/AchaoCalculator|
|GIT用户名|Shen-MoMo|
|学号后五位|学习现代软件工程思想,体验软件开发的过程,以及开发过程中文档的撰写|
|博客地址|傻墨的博客|
|作业链接|作业要求|

项目背景

一、环境配置过程

1.Visual Studio 2017

作为常用的开发工具,VS是程序员电脑必备的工具之一,因为本机已经安装了VS,不方便再次安装,所以安装过程在此不赘述太多。详细的安装过程可以参照此博客
注意事项:
①选择社区版可以不用破解,直接使用。
②VS本身较大,安装时最好不要选择系统盘。

2.GitHub

首先在GitHub网站上注册GitHub账号。通过网址转到阿超的仓库,并点击右上角的Fork,将项目拷贝到自己的同名仓库中。
接着点击右上角的绿色按钮处可以找到一个可克隆的链接(https://github.com/Shen-MoMo/Calculator.git),是我们Fork后的仓库地址。

左上角切换默认分支为c++,然后右键目录打开Git Bash,输入git clone <链接>。
或者下载桌面版GitHub,克隆项目后,在上端选择c++分支。

新建一个文件夹,重命名为我的GitHub 账号名

随后按照要求,新建项目等操作。运行程序获得结果如下图

使用Git记录,记录下所有的改动。


第一张图第一次使用git add .时,发生了报错,原因在于没有关闭VS(ide编辑器),文件处于被占用的状态,所以没有权限进行操作。
以上操作是跟着教程中做的,后来才发现与作业要求的不一样,按照作业要求重新配置后开始下一项。

二、代码设计思路

在最初的代码测试中,出现了如图所示的情况

可以发现,不仅生成的10个算式相同,第一个数和第二个数也相同,反复测试多次,还是得到同样的结果。
查阅资料后原来是因为Random进行伪随机数的算法是固定的,所以根据同一个种子计算出的数字必然是一样的。而以当代计算机的运行速度,该循环几乎是在瞬间完成的,种子一致,所以会出现10次循环输出同一随机数的情况。
所以我使用guid创建种子,以此来避免出现上述的情况。

byte[] buffer = Guid.NewGuid().ToByteArray();//生成字节数组
int iRoot = BitConverter.ToInt32(buffer, 0);//利用BitConvert方法把字节数组转换为整数
Random rd = new Random(iRoot);//以这个生成的整数为种子

Program.cs

class Program
{
    static void Main(string[] args)
    {
        int n;
        Formula f;

        n = int.Parse(Console.ReadLine());
        for (int i = 0; i < n;)
        {
            string formula = Formula.makeFormula();
            if (formula != "")
            {
                Console.WriteLine(formula);
                FormulaFile.printFile(formula);
                i++;
            }
        }
        Console.ReadLine();
    }
}

Formula.cs##

public class Formula
{
    public static string makeFormula()//随机生成算式
    {
        string formula = "";
        byte[] buffer = Guid.NewGuid().ToByteArray();//生成字节数组
        int iRoot = BitConverter.ToInt32(buffer, 0);//利用BitConvert方法把字节数组转换为整数
        Random rd = new Random(iRoot); //以这个生成的整数为种子
        int[] num = new int[4] { rd.Next(1, 100),
                                 rd.Next(1, 100),
                                 rd.Next(1, 100),
                                 rd.Next(1, 100) }; //初始化四个随机数
        int[] operation = new int[3] { rd.Next(0, 3),
                                       rd.Next(0, 3),
                                       rd.Next(0, 3) };//初始化三个运算符
        int count = rd.Next(1, 3); //初始化运算符个数

        formula = doFormula(num, operation, count);//生成算式
        int result = Solve.solve(num, operation, count);//计算结果
        if (result < 0) return "";
        return formula + "=" + result.ToString();//返回结果
    }
    static string doFormula(int[] num, int[] operation, int count)//生成算式,返回算式字符串
    {
        string formula = "";
        string[] op = new string[4] { "+", "-", "*", "/" };
        //运算符号的字符串数组,通过operation来匹配
        formula += num[0].ToString();
        for (int i = 0; i < count; i++)
        {
            formula += op[operation[i]] + num[i + 1];
        }
        return formula;
    }
}

FormulaFile.cs##

class FormulaFile
{
    public static void printFile(string formula)
    {
        string path = @"F:\GIT项目\AchaoCalculator\formula.txt";//保存路径
        System.IO.FileInfo fileInfo = new System.IO.FileInfo(path);
        System.IO.StreamWriter streamWriter = fileInfo.AppendText();//字符输出流
        streamWriter.WriteLine(formula);
        streamWriter.Close();
    }
}

Solve.cs##

class Solve
{
    public static int solve(int[] num, int[] operation, int count)//计算算式
    {
        int result = num[0];
        //先算乘除
        for (int i = 0; i < count; i++)
        {
            switch (operation[i])
            {
                case 0: break;//"+"
                case 1: break;//"-"
                case 2: num[i + 1] = num[i] * num[i + 1]; num[i] = 0; break;//"*"
                case 3: num[i + 1] = num[i] / num[i + 1]; num[i] = 0; break;//"/"
            }
        }
        //再算加减
        for (int i = 0; i < count; i++)
        {
            if (operation[i] == 1)
            {
                if (num[i] == 0)
                    num[i + 2] = -num[i + 2];
                else
                    num[i + 1] = -num[i + 1];
            }
            result += num[i + 1];
        }
        return result;
    }
}

代码完成后进行上传后,可以在客户端版的Github上看到代码开发版本的迭代。

三、单元测试和回归测试

要创建单元测试,首先右键单击解决方案,选择添加->新建项->修改单元测试项目名称->确定


随后添加引用,使测试项目依赖于主项目。

右键单击想要测试的类,选择创建单元测试。

但由于选择的类是非公开的,所以弹出了以下窗口。

这是因为该类不是公开的,所以需要将该类定义为public。

再重复上一步即可生成单元测试文件。

四、感想

这次的作业,一开始卡在了代码上。由于太久未使用C#编程,有许多语法都忘记了,只有现学现用。在设计代码时,头脑不清醒走到了死胡同耽误了不少时间,最后简化代码达到非负的要求。
使用Git来作为源码管理工具非常的方便,上传和下载的速度也比较快,小型的项目可以很快克隆下来学习。熟练使用Git来练习源码编写,对学习的帮助非常大。
推荐使用桌面版Github,相比Git Bash命令行,桌面版更加直观,可以组建小组共同开发同一个项目,还可以看到每一次版本更新的内容,更方便管理。

posted @ 2019-09-20 13:20  傻墨  阅读(204)  评论(0编辑  收藏  举报