git地址 https://github.com/Jason98w
git用户名 Jason98w
学号后5位 72323
博客地址 https://www.cnblogs.com/jason5689/
作业链接 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2793

声明:

本次博客部分细节内容参考了ChildishChange的博客

博客地址:https://www.cnblogs.com/ChildishChange/p/10398212.html

项目背景:

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

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

程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。

练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。

项目的完成过程

1.配置环境

安装能进行编码,单元测试,效能分析等功能的工具VS2017,并用已学到的C#语言进行项目的开发。

在此处勾选则可进行进一步开发。

Tips:最后不要将安装路径设置为C盘

配置环境的问题:

配置环境的操作步骤很简单,就需要注意安装路径要有足够的空间去放置VS2017。

2.克隆项目

1.在Github中拷贝本次项目中班级指定的仓库,将指定仓库的内容拷贝到自己的仓库中。

2.安装将仓库内容拷贝到本地的工具Git

Git-windows版本下载地址:点击此处

Tips:按自身电脑操作系统的位数进行选择

下载安装完成后,新建一个文件夹来保存仓库中的文件,打开文件夹,在文件夹空白区域点击右键,选择Git Bash Here,输入git clone + 仓库的地址,可以直接复制下来,但是Git中不能允许直接Ctrl+v进行粘贴,只能通过右键然后paste进行粘贴,输入完成后按回车就可以了

细节步骤如下:

打开文件夹,新建一个文件夹,命名为自己的github用户名

如果是第一次使用 Git,请需要在git命令行中使用如下两条命令配置自己的个人邮箱与 Commit 时的用户名,这里的邮箱和用户名最好与 Github 账号保持一致。

  git config --global user.name "你的用户名"

  git config --global user.email 你的邮箱号

接下来接连使用

git add .(注意这一个小点)

   git commit -m "换成你想命名的分支名称"(如:git commit -m "Hello")

即可利用 Git 记录下所有的改动。

克隆项目的问题:

1.注册和使用Github刚开始有点不熟练

2.利用git进行clone时不知道<clone url>是什么

3.git命令语句的使用经常出现错误,通过百度相关问题得到解决

 

3.代码设计:

针对项目的要求进行分析,设计,然后在进行编码,满足项目的需求。

过程:

将编码的路径设置为上一步创建好的文件夹中

代码设计思路:

Step1:利用formula()函数生成一个随机序列的等式,其中运算符的个数也同样是随机的(2-3个)

Step2:将formula()返回的等式传入Solve()函数中进行求解,返回等式+计算结果(如:3*4+5=17),若计算结果为小数或等式包含÷0操作则重新生成

Step3:调用calculator()函数生成指定数量的等式,并通过Fwrite()函数写入到本地文件中

部分代码见下图:

 //生成等式
public static string formula()
{
int opNumber = ;
int firstNum = ;
int nextNum = ;
int opNum = ; string result = null;
Random rd = new Random(); firstNum = (int)rd.Next(, );
opNumber = (int)rd.Next(, );
result += firstNum; for (int i = ; i < opNumber; i++)
{
nextNum = (int)rd.Next(, );
opNum = (int)rd.Next(, );
result = result + Operator[opNum] + nextNum;
} return result;
}

生成等式的函数 

 //求解生成的等式,调用Computer函数
public static string Solve(string msg)
{ DataTable dt = new DataTable();
object ob = null;
ob = dt.Compute(msg, "");
//不能出现小数和除0操作,若出现则重新生成
while (ob.ToString().Contains(".") || msg.Contains("/0"))
{ msg = formula();
ob = dt.Compute(msg, "");
}
return msg + "=" + ob.ToString();
}

求解的函数

  //写入文件到记事本
public static bool Fwrite(String msg)
{
try
{
StreamWriter sw = new StreamWriter("F:\\result.txt");
sw.Write(msg);
sw.Close();
return true;
}
catch
{
Console.WriteLine("保存文本文件出错!");
return false;
}
}

写入文件的函数

这次项目的难点就是生成随机序列的等式,并且计算结果不能为小数,等式中不能包含÷0运算,就需针对可能的结果进行判断处理,直到满足项目的需求。

代码运行结果:

代码能够满足项目的各种需求,达到正常运行的标准,但还需要进行单元测试,进行跟细的分析。

代码设计的问题:

1.在生成随机运算符个数上处理不当,反复修改了很多次

2.在等式求解的过程中,用到很多方法都不合适,对以前学到的知识有所遗忘,需复习数据结构与C#的相关内容

3.两个函数相互调用导致运行出错,stackoverflow,需注意编程的细节问题

4.单元测试

用单元测试来保证代码中的各个类与函数的正确性,从而保证整个项目的稳定性,此次测试运用VS2017搭载的测试环境来进行

1.首先要将所有私有的类和函数都改为共有的(private->public),然后对需要测试的函数或类创建单元测试,类似于C#中组件的调用。

创建成功则会自动添加对类的引用

如果没有完成修改则会弹出如下提示信息

创建好单元测试后,就能对指定函数或类进行测试了,下面对该项目中的Solve()函数进行测试,具体测试代码如下:

接下来,判断函数是否满足测试的代码

观察测试结果,注意提示信息

出现错误,找出原因,对代码进行修改后,继续测试,直到代码准确无误

显示正确信息,则函数通过单元测试,后对其他函数或类进行测试,操作步骤相似,修改测试条件即可.

该项目的所有函数都通过测试

单元测试问题:

1.没有将类和函数改成public就创建单元测试,导致一直出现错误信息

2.对函数的测试,没有满足所有出现的情况,只是简单的测试

3.代码的规范性对单元测试的影响很大

 

5.基本操作(断点和监视器的使用)

断点和监视器的使用对于程序的调试有着很重要的作用,可以很快很准确的找出程序的错误原因和出现错误的位置,从而根据调试的结果去重新修改程序,满足程序的正确性。

断点使用方法

鼠标点击窗体左边缘,形成一个红色的一点即可

然后点击调试图标或按F5就能开始对程序的调试了

调试过程中会用到这样的一个调试框,通过逐语句图标使程序一句一句运行,达到调试的效果。观察变量的值是否满足程序设计的要求,找到出现问题的原因。

监视器的使用方法

对需要一直观察的变量,可以通过添加监视的方式,更好的到达调试的效果

随着程序的执行,监视的变量则会一直处于监视的状态,来观察其值的变化

条件断点的使用

能够更加快捷的达到程序员需要看到的结果,从而更快的判断程序是否合理,或者找到错误的原因

基本操作的问题:

1.断点位置的标记的合理性存在问题,需要不断实践,熟练掌握方法

2. 准备观察,调试过程中变量值的变化则是调试的关键

 

6.回归测试

回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。

该项目中,在之前的单元测试过程,就运用到了回归测试,修改源代码之后,对其重新进行单元测试,并且修改后的代码仍然要满足单元测试的正确性,达到回归测试的目的

回归测试问题:

1.养成修改代码之后,就对其重新进行单元测试的习惯,将程序效能优化的修改才是所需要的

7.效能分析

此次的效能分析运用了VS2017自带的性能探查器

选择CPU使用率作为此项目的分析目标

之后就可以对代码进行效能分析了,具体执行图如下

还可查看更为详细的效能分析报告

效能分析会帮助程序员从机器的运行角度方面去思考程序的运行效率,对程序的优化有着重要作用

 

8.提交代码

 

在完成项目的源代码与单元测试工作以后,即可将代码上传到Github上,在最初的文件夹目录中打开Git

在使用该命令前,请确保所有本地的改动都已经addcommit了。可以用

git status来检查:

若出现这样的效果图就可以执行 git push命令了,将程序提交到Github中

输入自己的Github的账号密码就可以成功的完成提交了

在完成 push 后,我们就可以开始向源仓库(即阿超的仓库)发起 Pull Request(指发起请求给仓库贡献代码)。打开你 Fork 后的项目主页,如图所示,点击按钮New pull request

此时点击 Create pull request 即可发起请求。等待仓库主人阿超通过审核后,你的代码就可以成功合并进阿超的仓库,至此就完成了整个教程。

请求结果如下图:

感悟总结:

呼呼,这次的作业是真的麻烦呀,代码已经好久没敲过了,有点生疏了,数据结构的知识也有点忘记了,然后就是各种翻书找资料,终于把这次的作业做完了,~~    但是还是有很多收获的,第一次进行这么全面的去完成一个小项目,学会了Github的使用,对代码进行单元测试,回归测试,效能分析,对程序的仔细调试等等,更深入的了解了软件工程这一专业并不只是简单的敲代码,而是一个工程项目,需要计划明确,合理分工才能做出满意的产品。

发现Github还有很多其他大佬分享的源代码,值得去借鉴学习,~~  下次作业继续加油咯~

熟悉使用Github,VS进行项目的开发(第二次作业)的更多相关文章

  1. 使用GitHub进行协同项目开发和开源项目贡献

    本教程致力于摆脱git命令行快速的学习使用GitHub. 此次是GitHub课程的第三次课程,也是最后一次课程.推荐进行按照次序查看本次教程.上篇文章:程序员,一起玩转GitHub版本控制,超简单入门 ...

  2. 利用GitHub来进行团队协作开发项目

    首先: 1.项目组长要在GitHub创建一个仓库 2.组长git clone仓库地址到本地   3.组长在本地克隆到的项目里面创建一个Django项目  4.在当前项目下进行git add以及git ...

  3. 如何从eclipse中下载并导入Github上的项目

    eclipse导入项目,方法就是点击File ->Import,选择Existing Projects into Workspace 但前提是,你导入的这个项目原本就是用eclipse的构建的, ...

  4. vue项目的开发

    vue项目的开发 我们已经通过命令行创建了一个vue项目,并且打开了这个项目.下面是这个文件的src文件夹,这个文件夹放了整个项目的核心代码. 一.vue文件的用处简介. 1.assets文件夹,用来 ...

  5. 在GitHub上管理项目

    在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...

  6. 把VSO作为GitHub上JavaScript项目的免费CI服务器

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软变得更加开放后,走向开放的不仅有.NET运行时.IDE工具,还有ALM服务器核心组 ...

  7. github优秀开源项目大全-iOS

    github优秀开源项目大全-iOS APR 25TH, 2014 前言 本文旨在搜集github上优秀的开源项目 本文搜集的项目都是用于iOS开发 本文会持续更新… 完整客户端 ioctocat g ...

  8. AngularJS初探:搭建PhoneCat项目的开发与测试环境

    AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. 对于PhoneCat项目的 ...

  9. 搭建PhoneCat项目的开发与测试环境

    AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. 获取源代码 PhoneCa ...

随机推荐

  1. Docker 学习4 Docker容器虚拟化网络概述

    一.docker 虚拟化网络概述 1.OVS: OpenVSwitch,不仅能模拟二层网络,还能模拟三层网络,或者VLAN,VXLAN,流控 SDN软件定义网络技术等. 2.overlay netwo ...

  2. CMD运行命令每次都要进入很麻烦

    20:35:52 win+r  输入regedit 进入注册表 找到HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor项 创建AutoRun ...

  3. vue 组件的定义

    1.什么是组件? 组件的出现,就是为了拆分vue实例的代码量的,能够让我们以不同的组件来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可. 2.组件化和模块化的不同? 模块化: ...

  4. 绕最新版安全狗-附上sqlmap的tamper

    在t00ls 里面我发的,放博客分享 记录一下 小菜写文章,太菜 希望大佬放过我!  主要分享一下,绕狗的思路环境:windows7 + phpstudy + safedog v4.0  + Mysq ...

  5. 2016-3-1 安装Hexo过程中遇到的问题

      查找问题地址: http://hexo.io/docs/troubleshooting.html   1.通过npm安装hexo运行命令:sudo npm install -g hexo 出现这个 ...

  6. PHP 关于判断输入日期是否合法

    合法要求 一年仅十二个月 4,6,9,11月仅30天,1,3,5,7,8,10,12月仅31天 闰年2月29天,否则28天 输入的变量年,月,日为数字 代码: <?php //PHP中判断输入的 ...

  7. Linux查看端口号是否使用

    netstat -lntup|grep 80 如果令命无法执行 yum install net-tools

  8. 2分钟读懂大数据框架Hadoop和Spark的异同

    转自:https://www.cnblogs.com/reed/p/7730313.html 谈到大数据,相信大家对Hadoop和Apache Spark这两个名字并不陌生.但我们往往对它们的理解只是 ...

  9. hadoop源码学习(二)之ZooKeeper

    要能够熟练使用hadoop,就得对其原理和源码有些了解.hadoop中比较重要的概念是NameNode,DataNode,去看这些类时,又会发现其使用了ZooKeeper包,这样就可以将hadoop的 ...

  10. python+SQLAlchemy+爬虫

    python+SQLAlchemy+爬虫 前面分享了SQLAlchemy的知识,这次我共享一下学习用python开发爬虫再把爬出来的数据放到用SQLAlchemy的数据库上面的知识,当然我这个是带测试 ...