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. The Semantics of Constructors(拷贝构造函数之编译背后的行为)

    本文是 Inside The C++ Object Model's Chapter 2  的部分读书笔记. 有三种情况,需要拷贝构造函数: 1)object直接为另外一个object的初始值 2)ob ...

  2. 用electrion打包angular成桌面应用

    用electrion官网的不行. 还好,可以直接照搬 https://github.com/maximegris/angular-electron 安装必要的库 npm i --save-dev el ...

  3. 服务不支持 chkconfig 的解决办法

    在chkconfig --add servername的时候老是提示服务不支持 chkconfig 经过查找,解决办法如下. 1.脚本tomcatstart前三行如下: #!/bin/bash #ch ...

  4. python-matplotlib-2

    figure的使用 x = np.linspace(-1, 1, 50) y1 = 2 * x + 1 #figure 1 plt.figure() plt.plot(x, y1) # figure ...

  5. Python - 工具:将大图切片成小图,将小图组合成大图

    训练keras时遇到了一个问题,就是内存不足,将 .fit 改成 .fit_generator以后还是放不下一张图(我的图片是8192×8192的大图==64M).于是解决方法是将大图切成小图,把小图 ...

  6. 使用 VS2015 编译并调试 ffmpeg

    导读 ffmpeg 是音频处理方面非常强大非常有名的开源项目了,然而如 雷神 所说,“FFMPEG 难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大, ...

  7. tensorflow源码分析——BasicLSTMCell

    BasicLSTMCell 是最简单的LSTMCell,源码位于:/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py.BasicLSTMC ...

  8. Selenium chromeDriver 下载地址

    http://chromedriver.storage.googleapis.com/ http://npm.taobao.org/mirrors/chromedriver/

  9. linux常用20条命令

    1.cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切换到 ...

  10. redis数据类型为key的常用命令

    redis默认自带16个库select 7切换到redis第8个数据库dbsize查看reids有几个keykeys *查看所有k,vclear清空控制台FLUSHDB清空当前数据库的kvFLUSHA ...