构建之法第二次作业【使用git和Vs实现四则运算】

【相关信息】

QA
GIT地址git地址
GIT用户名Lin-000
学号后五位62501
博客地址博客地址
作业链接此次作业链接

1、项目需求

  • 程序接收一个命令行参数 n,然后随机产生 n 加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0100 之间,运算符在 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


2、配置环境

  • 声明:以前安装过 VS 2019,(由于重新下载太慢,就没有重新装2017版的),当时安装只选择了 C++,对于C#,可通过 修改-> 安装多个工具或功能->勾选C#相关,完成C#应用的下载

1785029-20190916213035547-1224012788.png

1785029-20190916212552904-189711471.png

1785029-20190916102908807-279070967.jpg

1785029-20190918192110405-1149715549.png

  • git的下载地址:https://git-scm.com/downloads,使用Git,桌面快捷方式界面如下,打开就可以使用,详细的安装教程可参考:https://blog.csdn.net/jyd0124/article/details/99616536

1785029-20190920095837460-704422081.jpg

  • 遇到的问题:在VS2019中安装C#相关工具的时候,起初我没有找到修改那个选项,每次打开VS,它会直接出现上次编的代码界面,找了下相关博客,简单直接的解决方式就是:把电脑重启,那样VS一打开,就出现有修改选项的界面,就可以下载C#的环境和工具了。

3、克隆项目

  • 3.1、在github官网上完成账号注册以后,就打开https://github.com/Cherish599/AchaoCalculator,出现以下界面,点击 fork

1785029-20190916103233541-772410573.png

  • 出现以下界面后,点击 clone or download -> 地址后的复制标签,就会在电脑本地文件夹中出现这些文件

1785029-20190916101559104-1165882686.png

  • 3.2、(关于git的使用)若初次使用 git ,则应该先设置好用户名和邮箱

1785029-20190916221238610-911746088.png

1785029-20190916221244735-69942022.png

=》如果以前已经设置过用户名和邮箱,可通过以下命令查看

1785029-20190918184217288-1869590235.png

  • 3.3、完成基本配置信息设置之后,在 d:/test目录下,右击,使用 git Bash here,在 git 里面输入以下命令,将项目克隆到本地。并在该目录下新建一个和 github 同名的文件夹

1785029-20190916210859787-915365934.jpg

1785029-20190916101642525-1796332583.png

  • 3.4、在 VS 2019中创建项目(选择 .NET Framework 项目方便后面测试 )

1785029-20190919124056293-1270933611.png

1785029-20190919124106228-216663857.png

  • 这部分没有遇到问题,主要是最后一步创建项目时,若想快速准确的做单元测试,最好选择 .Net Framework类型的控制台应用,而不是 .NET Core类型的控制台应用。

4、代码设计思路

  • 随机生成运算符:把 +、-、*、/ 运算符放在一个运算符数组中,通过 Random 随机生成下标数字(0、1、2、3),通过随机数字,来取数组对应下标的值。
  • 随机生成运算题目:操作数也同样通过 Random 来随机生成。根据需求,不难发现运算符(+、-、*、/) 的总个数总是比操作数的总个数少一个,所以应该先生成第一个随机操作数,用空字符串拼接,然后进入循环,生成2组或3组 【运算符 操作数】,再进行字符串拼接,生成等式。
  • 计算等式结果:将生成的等式字符串,作为参数传入到计算答案的函数(Answer函数)中,实现具体的计算。
  • 筛选出符合要求的等式:在每一次尚未生成完整的等式时,就把临时计算结果,作为参数,传入到 check() 函数中,目的是为了保证运算过程中没有结果为负的情况,即筛选出符合要求的等式,最终再打印输出。

5、具体代码设计

  • 生成运算题目
public void Title(int n)   // 生成等式题目
{
            Random rd = new Random();
            string[] S = { "+", "-", "*", "/" };
            for (int i = 0; i < n; i++)
            {
                int opNum = rd.Next(3, 4); // 运算符个数
                int num1 = rd.Next(1, 101); // 第一个数
                string str = null;
                str += num1;
                for (int j = 0; j < opNum; j++)
                {
                    string temp_result;
                    int num2 = rd.Next(1, 101);
                    int opNumber = rd.Next(0, 4); // 运算符数组下标
                    str += S[opNumber] + num2; // str为等式字符串
                    temp_result = Answer(str);
                    // temp_result保存临时结果
                    // final_result为等式最后答案
                    if (temp_result.ToString().Contains("-"))
                    {
                        str = null;
                        str += num1;
                        j = 0;
                    }
                }
                string final_result = Answer(str);
                if (Check(str, final_result) == 2)
                {
                    i--;
                }
                else
                {
                    Console.Write(str + "=");
                    Console.WriteLine(final_result);
                }
            }
}
  • 计算结果函数
public string Answer(string s)
{
            DataTable dt = new DataTable();
            string result = dt.Compute(s, "false").ToString();
            return result;
}
  • 筛选出符合要求的等式
public int Check(string s1, string s2)
{
            // s1为等式,s2为等式结果
            if (!s1.Contains("/0") && !s2.ToString().Contains("."))
            {
                return 1;
            }
            else
            {
                return 2;
            }
}
  • 写入文件
StreamWriter sw = new StreamWriter(@"D:\subject.txt");
Console.SetOut(sw);
Console.WriteLine("需要生成的题目数为:"+n);
c.Title(n);
sw.Flush();
sw.Close();
  • 控制台运行效果

1785029-20190918202249719-565661767.png

  • 写入文件效果(这是两次运行的截图,所以题目不一样)

1785029-20190919143000892-790633226.png

  • 遇到的问题:对写入文件这个函数不太熟悉,不知道怎么编,然后百度,找到了方法,当我引用到我的代码中时,起初不能写入文件,就只有控制台显示,然后我发现是写入文件函数放的位置不对,后来可以写入文件,但出现了生成的等式都一样,仔细分析代码,发现是随机种子出现了问题,然后重新修改,最后可以正确的写入符合要求的题目。

5、单元测试过程

5.1、对代码做单元测试时,需要先对每个方法逐一创建单元测试。(也可直接在代码中选中类名右键创建单元测试,会出现一个包含所有方法的模板)

1785029-20190918223952719-1705246232.png

1785029-20190918224101130-717578007.png

5.2、出现以下模板,则该方法的单元测试创建成功

1785029-20190918224130250-1468574258.png

5.3、为每个测试方法添加好测试代码之后,可在 测试资源管理器 中测试该方法

1785029-20190919124518373-2015115722.png

1785029-20190919124540335-1828008841.png

  • 对给Answer 函数添加好测试代码之后,对该函数进行测试,发现出现了问题

1785029-20190918223014061-1045796822.png

=》解决该问题

1785029-20190919202340063-1398416515.png

  • Answer 函数测试成功

1785029-20190919202533731-1548962929.png

  • 接着对Check 函数进行测试,测试成功

1785029-20190919202548550-1780643723.png

  • 然后对Title 函数进行测试,测试成功

1785029-20190919202507217-1787364642.png

  • 遇到的问题:单元测试项目和自己的控制台应用代码建立不起来关联,做不了单元测试,然后百度,发现就是因为我最开始建的控制台应用是 .NET Core型,没有创建单元测试这个快捷选项,然后我重新建 .NET Framework应用,解决了该问题。

5.4、性能分析
=》点击 分析 -> 性能探查器 ->cpu使用率

1785029-20190918192402585-1256795853.png1785029-20190918192412041-1436956415.png

=》可以初步查看性能分析结果

1785029-20190919124843035-213927930.png

=》点击 打开详细信息 ,可查看具体的分析信息

1785029-20190919124926168-237040247.png

5.5、回归测试

1785029-20190919202438316-1169667381.png

5.6、断点查看中间过程变化

  • 我在57、59行设置了断点,目的是为了观察如果等式结果有小数,对应语句的执行顺序

1785029-20190919202719161-492677535.png

  • 上图状态下,按下F11,会转到28行执行,符合逻辑。

1785029-20190919203026333-199566514.png

7、提交项目

  • 把与 github 同名的文件夹提交到github上,可通过git add .,然后 git commit -m "部分说明信息",即把暂存区的代码提交,通过 git push提交

1785029-20190919210746882-203334469.png

  • 登录到自己的 github 中,找到对应的 Repositories,点击 New pull Request

1785029-20190919210853976-1110251164.png

  • 再点击Create pull Request,即发送请求,等待审核,合并代码

1785029-20190919211153601-1732578103.png

总结

  • 写到这里,博客终于算是写完了。。。距离学习C#已经过去一年多了,有些规范和语句都模糊了,看了些教程,基本上能够想起来,总的来说,还是不熟悉。单元测试那一块,开始真的有点懵,那个附加依赖项我找了好久,在2019版的VS里面,测试项目右击,它的属性中,根本没有附加依赖项那个选项,然后我在上方工具栏找,还是没有,简直难受,结果就是单元测试项目和我的代码不能建立起联系,更谈不上测试了,然后我就根据测试提示,在测试类的时候,都先把该类的具体实现代码放在测试项目的目录下,这样就建立起了依赖联系,虽然这个过程有点繁琐,但是也是没有办法中的办法了。后来又发现如果起初编代码的时候,创建的项目是 .NET Framework类型的C#项目的话,单元测试会好做的,只需要选中类名,然后右击,选择创建单元测试这个选项就可以了,如果创建的是 .NET Core类型的C#的项目的话,单元测试会很繁琐,就要建立各种依赖。选对类型真的是可以少去很多麻烦呀

转载于:https://www.cnblogs.com/LIn000/p/11525889.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值