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

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

项目背景

j7DMVwnZAh4ORH2.png

一、环境配置过程

1.Visual Studio 2017

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

2.GitHub

首先在GitHub网站上注册GitHub账号。通过网址转到阿超的仓库,并点击右上角的Fork,将项目拷贝到自己的同名仓库中。
接着点击右上角的绿色按钮处可以找到一个可克隆的链接(https://github.com/Shen-MoMo/Calculator.git),是我们Fork后的仓库地址。
9m5qKZF1nujDA4w.png
左上角切换默认分支为c++,然后右键目录打开Git Bash,输入git clone 。
或者下载桌面版GitHub,克隆项目后,在上端选择c++分支。
IFSfpCok3cYyWK2.png
新建一个文件夹,重命名为我的GitHub 账号名
vB9J7WkgTOI5r2x.png
随后按照要求,新建项目等操作。运行程序获得结果如下图
AigaOn8m2btysT4.png
使用Git记录,记录下所有的改动。
6bzvdW5DlTS9uwU.png
CqGKcZ5RQgPxilr.png
第一张图第一次使用git add .时,发生了报错,原因在于没有关闭VS(ide编辑器),文件处于被占用的状态,所以没有权限进行操作。
以上操作是跟着教程中做的,后来才发现与作业要求的不一样,按照作业要求重新配置后开始下一项。

二、代码设计思路

在最初的代码测试中,出现了如图所示的情况
xBDOqjdNpvRog1h.png
可以发现,不仅生成的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上看到代码开发版本的迭代。
1784875-20190920131720052-750271561.png

三、单元测试和回归测试

要创建单元测试,首先右键单击解决方案,选择添加->新建项->修改单元测试项目名称->确定
mwbUMC2NiKFAELa.png
kWgTHJhaCpxoYtI.png
随后添加引用,使测试项目依赖于主项目。
WMk2D3Cb18hVQSz.png
右键单击想要测试的类,选择创建单元测试。
z9SRtnNXugETLxD.png
但由于选择的类是非公开的,所以弹出了以下窗口。
XVToxPMey6nsRCp.png
这是因为该类不是公开的,所以需要将该类定义为public。
PQ7o9fmukJCcUdq.png
再重复上一步即可生成单元测试文件。
BKpT3mgnyYoPjMq.png

四、感想

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

转载于:https://www.cnblogs.com/sm644245985/p/11545056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值