GIT地址 https://github.com/slothph
GIT用户名 slothph
学号后五位    62323
博客地址  https://www.cnblogs.com/slothph/
作业链接 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/homework/7584

一、项目背景

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

作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:

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

二、配置环境

  回忆去年暑假安装VS,确实遇到许多问题,导致安了三天才将其安装好,留给我的经验教训就是,在安装时,认真查看安装提示,哪怕是英文的,也得仔细查看,我第一次安时,多点了几个功能安装,结果导致下载内容过多,连续下载5小时也没下好,还导致我的C盘空间只剩下了10个G,只能点击取消安装,取消过程又是1个小时,取消后还得检查是否有残留,必须要卸载干净才能保证再次安装成功,第二次安装时就学聪明了,只点击了C#和C++以及相关联组件,下载加安装一共才3小时,完成。

  这是我安装完毕的2015版本VS(专业版)

三、克隆项目

  1、先在GitHub上申请自己的GitHub账号,并创建一个属于自己的仓库

  输入阿超的仓库地https://github.com/Cherish599/AchaoCalculator,访问阿超的仓库,点击右上角的Fork,即可将阿超的库拷贝到自己的同名仓库中

  2、将其拷贝到自己库中

  

  3、在自己电脑上安装Git,下载地址

  依次点击 DownLoads ->Windows,网页弹出下载提示,开始下载(下载速度较慢),之后正常安装即可

  遇到的问题:

  直接点击GIit官网下载超慢,而且难以下载成功(我分别用浏览器和迅雷直接点击下,始终失败),后面百度查询方法,按下F12获取下载的网址,在迅雷中新建任务链接,不出20秒就下载完成

  安装好后,新建一个文件夹作为源代码的仓库,进入文件夹,在空白处右键鼠标,选择Git Bash Here

  输入git clone +仓库地址即可克隆一个仓库到自己的文件夹内

  进入克隆的文件夹内,新建一个命名为自己GitHub用户名的文件夹,

  Tips:git bash中的命令操作与Linux很相似,指令输错后,可按方向键“上键”重复上一次的指令

四、代码设计

  1、打开VS,创建C#控制台应用程序

  注意保存位置为上一步中,创建的以自己github命名的文件夹内,名称我取的phCalculator

  2、设计代码

  根据项目背景,设计了如下四个方法

  (1)主函数(用于接收生成题目个数,以及调用其它函数)

 public static void Main(string[] args)
{
Console.Write("请输入生成题目个数: ");
n =Convert.ToInt32(Console.ReadLine());
//备份要求的题目个数
int num = n;
while (n>)
{
problem();
}
for (int i = ; i < num; i++)
{
Console.WriteLine(ans[i]);
}
writeFile(num);
}

  (2)生成题目方法(用于利用随机数生成题目)

 //生成题目
public static void problem()
{ Random rad = new Random();
int yunsuan_num =(int)rad.Next(, );//取2到3的随机数,作为运算符的个数
int x = ;
string timu = null;
while(x<yunsuan_num)//得到与运算符个数一致的0-100的数字,并放入字符串中
{
int num = (int)rad.Next(, );
string yunsuan = fuhao[(int)rad.Next(, )];
timu =timu+num.ToString() + yunsuan;
x++;
}
//再取一个随机数作为最后一个被运算的数字
timu += (int)rad.Next(, );
//休眠一段,防止随机数一致
Thread.Sleep();
if (test(timu))//进行测试并计算结果,满足要求的,才会使n减一
n--;
}

  (3)测试题目是否合格(否决不合格的题目,并计算合格题目的结果,加入字符串列表中)

 //测试题目是否合格,将合格题目加入列表
public static Boolean test(string timu)
{
//有除以0时,直接否决
if (timu.Contains("/0"))
return false;
DataTable dt = new DataTable();
object res = dt.Compute(timu, "");
//结果为小数或者负数的,也被否决
if (Convert.ToInt32(res) < ||res.ToString().Contains("."))
return false;
else
{
ans.Add(timu+ "=" +res.ToString());
return true;
} }

  (4)写入文件(将字符串列表中合格的题目写入文件中)

  //将列表ans中所有的题目,写入到txt文件中
public static void writeFile(int num)
{
string path = @"D:\GitBase\AchaoCalculator\slothph\problem.txt";
StreamWriter sw = new StreamWriter(path);
for(int i=;i<num;i++)
{
sw.WriteLine(ans[i]);
}
sw.Close();
}

   运行结果如下:

  遇到问题:

  1、为防止多次打开关闭文件,一次性将生成的题目写入文件,就是用字符串列表将符合要求的题目暂存起来,后面依次写入文件中

  2、对C#的一些基本知识遗忘了,读入整数不应该直接Console.Read(),这样得到的是第一个字符,而不是数字,应该写Convert.ToInt32(Console.ReadLine());强转成int型

  3、在随机生成算数题目时,所有的题目都是一样的,百度看了许多博客,才知道是由于调用函数过快,导致生成的随机数没有发生变化,这时候就需要延迟一段时间,利用 Thread.Sleep(30);进行休眠,需要添加命名空间using System.Threading;

  4、得出算式结果的函数参考了助教Jason5689的博客,才知道有Compute这一好用的函数,立马去查它的参数、用法、返回值(如下图所示)

五、单元测试

  直接右键鼠标选择创建单元测试,会显示如下提示

  需要先将类和方法都改为公共的 ,再创建。

  为了方便各项测试,我将上方的代码重构一下,划分为四个类

  在想要测试的类或方法右边右键鼠标,选择创建单元测试

  自动创建内容如下:

  编写单元测试代码如下:

  运行测试

  测试结果如下

  使用方法错误,要用AreEqual,更改测试代码,继续测试

  测试通过。

六、回归测试

  该测试是在更改了旧代码之后,再次进行单元测试, 但要注意,修改后的代码要保证单元测试成功。

  遇到问题:

  测试时,我写的test()方法返回的是布尔类型,难以测试算式算出的结果是否正确,于是我在Test类中定义了一个属性 public static string test_timu; 专门用于保存当前合格的题目,测试时就利用该属性与正确题目作对比,一致证明计算结果正确。

七、效能分析

  利用vs的性能探查器

  选择CPU使用率,开始

  对其效能分析如下

  详细分析报告如下

八、上传代码

  在AchaoCalculator 文件夹下,右键鼠标,git bash here,输入git add . 将项目文件添加到版本控制中

  输入git commit -m 提交修改

  输入 git push ,提交到GitHub中

  登录自己的github,可以看到代码已经提交到仓库中

  之后,向阿超的仓库进行pull

  再点击按钮 New pull request

  等待审核通过后,我的代码就可以成功合并进阿超的仓库。

  遇到问题:

  我在pull我的仓库后,就一直保持在Checking mergeability中,几个小时也没变,看同学都只是check几秒就可以create pull request,于是我再提交了一次,还是一直ckeck,最后解决办法很简单,看了下github上方的提示,提示不支持我当前使用的浏览器。。。于是我换了谷歌浏览器,两秒check完成,之后就没意外了,看来我应该多使用谷歌浏览器。

总结:

  这次的作业花费了不少时间,开始做之前,以为代码会耗费最多时间,结果一个晚上就弄出了能实现的初版,反倒是其它操作用了更久,操作完成后很有成就感,在此过程中,简单学习了下git的用法,和Linux很像,很有趣,单元测试时,由于我初版的代码全写在一个类中,没法测试,只能重构一下,这时候才发现对C#类的知识遗忘了很多,完成后能正确运行让我舒了一口气。

  如果我开始分类写的话,就可以写完一个类、方法就进行单元测试,不用苦哈哈的自己Console.WriteLine();了,单元测试是真的感觉很有用;不过这次自己写的代码类与类之间耦合度有点高,还可以继续改进的。

  这次的作业让我改变了一点对软件工程的固有思想,代码重要的同时,各项工具和使用,协调、 编译器除了编译运行之外的功能等等,都是我们需要去了解和探索的地方。

参考资料:

[2019BUAA软工助教]第0次代码作业——ChildishChange

https://www.cnblogs.com/jason5689/p/10604778.html

C#中DataTable中的Compute方法使用收集

C# DataTable.Compute()用法

熟悉GitHub、VS工具的使用(《构建之法》第二次作业)的更多相关文章

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

    [相关信息] Q A GIT地址 git地址 GIT用户名 Lin-000 学号后五位 62501 博客地址 博客地址 作业链接 此次作业链接 1.项目需求 程序接收一个命令行参数 n,然后随机产生 ...

  2. <<构建之法>>--第二次作业

    GIT地址 https://github.com/Panghu98/AchaoCalculator.git GIT用户名 Panghu98 学号后五位 62632 博客地址 https://www.c ...

  3. 201871010109-胡欢欢-实验一-软件工程的准备(初识github及《现代软件工程-构建之法》)

    项目 内容 课程班级博客链接 2021年春软件工程课程班(2018级计算机科学与技术) 这个作业要求链接链接 实验一软件工程准备 我的课程学习目标 了解github的基本使用,学习markdown编辑 ...

  4. 《构建之法》课程进度之Github、Travis等工具融入篇

    <构建之法>里有一个16周的软件工程课程进度设计.本文在该基本设计的基础上,围绕github.com(源码管理).travis-ci.org(持续集成).单元测试工具.日志工具.少数实用U ...

  5. JSON工具类的构建(前端版本)

    前言 在前后端交互的选择上,之前一直采用的是模板引擎(因为我只负责后端). 而这次的一个算是作业吧,前后端都是我,所以就研究了一下JSON交互在java web的应用(主要是前端). 优缺点 因为我是 ...

  6. 用持续集成工具Travis进行构建和部署

    用持续集成工具Travis进行构建和部署 用持续集成工具Travis进行构建和部署 摘要:本文简单说明了如何使用持续集成工具Travis进行构建和部署的过程. 1. 概述 持续集成(Continuou ...

  7. 《构建之法》——GitHub和Visual Studio的基础使用

    git地址 https://github.com/microwangwei git用户名 microwangwei 学号后五位 62214 博客地址 https://www.cnblogs.com/w ...

  8. JSON工具类的构建(后端版本)

    前言 在前后端交互的选择上,之前一直采用的是模板引擎(因为我只负责后端). 而这次的一个算是作业吧,前后端都是我,所以就研究了一下JSON交互在java web的应用(主要是前端). 优缺点 前后端耦 ...

  9. EXCEL,熟悉又不熟悉的项目管理工具

    EXCEL,熟悉又不熟悉的项目管理工具 如何利用excel做轻量级的项目管理 教你用Excel进行项目管理

  10. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

随机推荐

  1. jquery toggle()方法 语法

    jquery toggle()方法 语法 作用:toggle() 方法用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件.该方法也可用于切换被选元素的 hide() 与 sho ...

  2. CSS的水平居中和垂直居中

    水平居中如果不太熟悉盒子模型的话属实不太好理解,其实就是控制其他属性来让border之内的内容被控制在父容器中间就行了,最经典的就是使用{margin: 0  auto}了,控制其上下外边框为0,左右 ...

  3. flask框架(十一): 蓝图

    蓝图用于为应用提供目录划分: 一:上目录结构 二:上代码 <!DOCTYPE html> <html lang="en"> <head> < ...

  4. sh_13_字典的应用场景

    sh_13_字典的应用场景 # 使用 多个键值对,存储 描述一个 物体 的相关信息 —— 描述更复杂的数据信息 # 将 多个字典 放在 一个列表 中,再进行遍历 card_list = [ {&quo ...

  5. Spring Boot教程(三十九)使用MyBatis注解配置详解(2)

    增删改查 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例: public interface U ...

  6. Vue_(组件)实例方法

    Vue.js实例方法/生命周期 传送门 常用的实例方法 数据: 传送门 vm.$set:设置属性值 vm.$delete:删除属性值 vm.$watch:观测数据变化 生命周期 vm.$mount:手 ...

  7. TCP层close系统调用的实现分析

    在调用close系统调用关闭套接字时,如果套接字引用计数已经归零,则需继续向上层调用其close实现,tcp为tcp_close:本文仅介绍tcp部分,前置部分请参考本博关于close系统调用的文章: ...

  8. 认识git的简单命令

    一.课程目的 教大家学会it的简单命令(老师建议 English 的前后要加空格) 二.认识 git 命令 整篇文章都是用语雀写的. 解释了(使用git)绑定gitee的操作 https://www. ...

  9. JvmOverloads kotlin(14)(转)

    在Kotlin中@JvmOverloads注解的作用就是:在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法.可能还是云里雾里,直接上代码,代码解释一切:如果 ...

  10. echarts修改X,Y轴上的颜色

     分为2.0和3.0 一.2.0 修改的代码: x轴: xAxis : [ { type : 'category', data : ['<30','30-','40-','50-','60-', ...