构建之法第二次作业【使用git和Vs实现四则运算】
【相关信息】
| Q | A |
|---|---|
| GIT地址 | git地址 |
| GIT用户名 | Lin-000 |
| 学号后五位 | 62501 |
| 博客地址 | 博客地址 |
| 作业链接 | 此次作业链接 |
1、项目需求
- 程序接收一个命令行参数 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
2、配置环境
- 声明:以前安装过 VS 2019,(由于重新下载太慢,就没有重新装2017版的),当时安装只选择了 C++,对于C#,可通过
修改->安装多个工具或功能->勾选C#相关,完成C#应用的下载。





- 遇到的问题:在VS2019中安装C#相关工具的时候,起初我没有找到
修改那个选项,每次打开VS,它会直接出现上次编的代码界面,找了下相关博客,简单直接的解决方式就是:把电脑重启,那样VS一打开,就出现有修改选项的界面,就可以下载C#的环境和工具了。
3、克隆项目
- 3.1、在github官网上完成账号注册以后,就打开https://github.com/Cherish599/AchaoCalculator,出现以下界面,点击
fork

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

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


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

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


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


- 这部分没有遇到问题,主要是最后一步创建项目时,若想快速准确的做单元测试,最好选择 .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();
- 控制台运行效果

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

- 遇到的问题:对写入文件这个函数不太熟悉,不知道怎么编,然后百度,找到了方法,当我引用到我的代码中时,起初不能写入文件,就只有控制台显示,然后我发现是写入文件函数放的位置不对,后来可以写入文件,但出现了生成的等式都一样,仔细分析代码,发现是随机种子出现了问题,然后重新修改,最后可以正确的写入符合要求的题目。
5、单元测试过程
5.1、对代码做单元测试时,需要先对每个方法逐一创建单元测试。(也可直接在代码中选中类名,右键,创建单元测试,会出现一个包含所有方法的模板)


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

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


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

=》解决该问题

- Answer 函数测试成功

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

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

- 遇到的问题:单元测试项目和自己的控制台应用代码建立不起来关联,做不了单元测试,然后百度,发现就是因为我最开始建的控制台应用是 .NET Core型,没有创建单元测试这个快捷选项,然后我重新建 .NET Framework应用,解决了该问题。
5.4、性能分析
=》点击 分析 -> 性能探查器 ->cpu使用率 。


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

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

5.5、回归测试

5.6、断点查看中间过程变化
- 我在57、59行设置了断点,目的是为了观察如果等式结果有小数,对应语句的执行顺序

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

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

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

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

总结
- 写到这里,博客终于算是写完了。。。距离学习C#已经过去一年多了,有些规范和语句都模糊了,看了些教程,基本上能够想起来,总的来说,还是不熟悉。单元测试那一块,开始真的有点懵,那个附加依赖项我找了好久,在2019版的VS里面,测试项目右击,它的属性中,根本没有附加依赖项那个选项,然后我在上方工具栏找,还是没有,简直难受,结果就是单元测试项目和我的代码不能建立起联系,更谈不上测试了,然后我就根据测试提示,在测试类的时候,都先把该类的具体实现代码放在测试项目的目录下,这样就建立起了依赖联系,虽然这个过程有点繁琐,但是也是没有办法中的办法了。后来又发现如果起初编代码的时候,创建的项目是 .NET Framework类型的C#项目的话,单元测试会好做的,只需要选中类名,然后右击,选择创建单元测试这个选项就可以了,如果创建的是 .NET Core类型的C#的项目的话,单元测试会很繁琐,就要建立各种依赖。选对类型真的是可以少去很多麻烦呀
构建之法第二次作业【使用git和Vs实现四则运算】的更多相关文章
- <<构建之法>>--第二次作业
GIT地址 https://github.com/Panghu98/AchaoCalculator.git GIT用户名 Panghu98 学号后五位 62632 博客地址 https://www.c ...
- 《构建之法》个人第二次作业之git学习
GIT地址 点一下 GIT用户名 Mretron 学号后五位 62517 博客地址 点一下 作业链接 点一下 在征得陈老师的同意下,使用java面向对象语言+IDEA工具完成本次作业 一.前期配置 虽 ...
- 第二次作业-熟悉git
GIT地址 https://github.com/gentlemanzq/yunsuanhomework GIT用户名 gentlemanzq 学号后五位 62320 博客地址 https://w ...
- 第二次作业:Git的安装与使用
---恢复内容开始--- 本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 1.首先安装git bash软件, ...
- c++生成算式并计算(《构建之法》第一章课后第一题)
c++实现计算器(自动生成算式并计算) 要满足的需求有以下几个: 自动生成随机的四则运算算式,包含括号和小数. 对生成的算式计算出结果. 算式.结果分别存储到不同的文件. 一 生成算式 由上述需求可知 ...
- [第二届构建之法论坛] 预培训文档(C++版)
本博客是第二届构建之法论坛暨软件工程培训活动预培训文档中[适用于结对编程部分的C++版本],需要实验者有一部分C++基础. 目录 Part0.背景 Part1.配置环境 Part2.克隆项目 Part ...
- [第二届构建之法论坛] 预培训文档(Java版)
本博客是第二届构建之法论坛暨软件工程培训活动预培训文档中[适用于结对编程部分的Java版本],需要实验者有一部分Java基础. 目录 Part0.背景 Part1.配置环境 配置JDK Linux 平 ...
- 初窥构建之法——记2020BUAA软工个人博客作业
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 完成一次完整的软件开发经历并以博客的方式记录开发过程的心得掌握 ...
- 【软件工程】《构建之法》 & Git+ & CI/CD
<构建之法> & Git+ & CI/CD 个人阅读作业#2 项目 内容 本作业所属课程 2020春季软件工程(罗杰 任健) 本作业要求 个人阅读作业#2 我的课程目标 具 ...
随机推荐
- ECS适合你吗?
实体组件系统处于预览状态.不建议用于生产. 目前有两个很好的理由使用它. 你想试验 这是令人兴奋的新技术,并且大规模性能提升的承诺正在引诱.试试看.给我们您的反馈.我们很乐意在论坛上与您交谈. 您正在 ...
- ip routing 开启三层路由模式
no ip router是关闭路由协议,no ip routing 是关闭三层的路由工作模式 no ip route是删除某条(静态)路由,比如no ip router 0.0.0.0 0.0.0.0 ...
- Arduino基础入门—1.Hello World
1.首先是下载.安装IDE. https://www.arduino.cc/en/Main/Software 2.连接开发板到电脑. 将UNO R3开发板通过数据线连接到电脑.打开设备管理器查看驱动是 ...
- Windows下直接双击可执行的jar
如果没有设置,那么就是用命令行: jar处在文件夹路径下打开命令行:java -jar xxx.jar 总的来说是有点不方便 首先默认打开jar程序得是相同jdk的java.exe 然后是一闪而过 下 ...
- Reactor系列(二)Flux Mono创建
Flux Mono创建 视频讲解:https://www.bilibili.com/video/av78844777/ FluxMonoTestCase.java package com.exampl ...
- 异构平台mysql-oracle(ogg)安装部署
如图所示:源端采用Mysql库,目标端采用Oracle库 一.OGG安装配置(源端) 1.OGG下载 https://edelivery.oracle.com/EPD/Download/get_f ...
- 你除了在客户端上会使用Cookie,还能使用哪些可以作为数据缓存呢?
问题如标题,直奔主题.介绍下另两种缓存. 1.sessionStorage.localStorage localStorage: 是一种你不主动清除它,它会一直将存储数据存储在客户端的存储方式,即使你 ...
- Kubernetes组件-DaemonSet
⒈简介 Replicationcontroller和ReplicaSet都用于在Kubermetes集群上部署运行特定数量的pod.但是,当某些情况下我们希望在集群中的每个节点上运行同一个指定的pod ...
- Linux系列(15)之进程管理
详细情况查看:https://www.cnblogs.com/dengyungao/p/8523628.html 1.查看进程 有两个命令可以查看进程,分别是ps与top(推荐使用),那他们有什么区别 ...
- php7和PHP5对比的新特性和性能优化
1 抽象语法树( AST) 1)在 PHP5中,从 php 脚本到 opcodes 的执行的过程是: Lexing:词法扫描分析,将源文件转换成 token 流: Parsing:语法分析,在 ...