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)主函数(用于接收生成题目个数,以及调用其它函数)

  1. public static void Main(string[] args)
  2. {
  3. Console.Write("请输入生成题目个数: ");
  4. n =Convert.ToInt32(Console.ReadLine());
  5. //备份要求的题目个数
  6. int num = n;
  7. while (n>)
  8. {
  9. problem();
  10. }
  11. for (int i = ; i < num; i++)
  12. {
  13. Console.WriteLine(ans[i]);
  14. }
  15. writeFile(num);
  16. }

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

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

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

  1. //测试题目是否合格,将合格题目加入列表
  2. public static Boolean test(string timu)
  3. {
  4. //有除以0时,直接否决
  5. if (timu.Contains("/0"))
  6. return false;
  7. DataTable dt = new DataTable();
  8. object res = dt.Compute(timu, "");
  9. //结果为小数或者负数的,也被否决
  10. if (Convert.ToInt32(res) < ||res.ToString().Contains("."))
  11. return false;
  12. else
  13. {
  14. ans.Add(timu+ "=" +res.ToString());
  15. return true;
  16. }
  17.  
  18. }

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

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

   运行结果如下:

  遇到问题:

  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. Blade 模板

    在Laravel 5.3中,@foreach指令提供了更加强大的功能,在每一个@foreach循环体中都可以调用一个新的$loop变量.该变量是一个stdClass实例,包含了当前循环的元数据信息,让 ...

  2. 《剑指offer》算法题第十天

    今日题目: 数组中的逆序对 两个链表的第一个公共节点 数字在排序数组中出现的次数 二叉搜索树的第k大节点 字符流中第一个不重复的字符 1. 数组中的逆序对 题目描述: 在数组中的两个数字,如果前面一个 ...

  3. js判断是否是app,及版本号

    判断是否是android,ios,qq,wetchat export const Config = {}; Config.ua = navigator.userAgent.toLowerCase(); ...

  4. [CSP-S模拟测试]:最大或(数学)

    题目传送门(内部题141) 输入格式 输入文件包含多组测试数据,第一行为一个正整数$T$,表示数据组数. 接下来$T$行,每行两个正整数$l,r$.数据保证$l\leqslant r$成立. 输出格式 ...

  5. Zjoi2010排列计数Perm

    这东西还是挺有思想的,道听途说一些东西,问问DuanYue同志,然后自己打表画树推了推,就搞出来了. 首先根据p i>p i/2(向下取整)这种形式,如果线段树学的好的人,一定能看出来,这是在唯 ...

  6. Leetcode题目22.括号生成(动态规划-中等)

    题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "( ...

  7. Maven私服搭建及使用-Windows版

    了解有限,目前只针对基础功能介绍,持续更新 一.下载对应的版本(本例版本:nexus-3.7.1-02) https://www.sonatype.com/download-oss-sonatype ...

  8. SSL及TLS

    SSL SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议. ...

  9. java用Annotation注入到成员Bean对象

    java用Annotation注入到成员Bean对象 在使用一些java框架的时候,经常看到一些注解,而且使用注解之后就可以免去一些xml的繁琐配置,本文记录如何通过注解获得成员Bean对象. 一.首 ...

  10. backspace 产生乱码的问题

    1.要使用回删键(backspace)时,同时按住ctrl键(一般情况下会有用,如果没用使用下面的方法)   2.设定环境变量   在bash下:$ stty erase ^? 或者把 stty er ...