豆子第一次代码作业:第二次作业
GIT地址 |
|
GIT用户名 |
|
学号后5位 |
62306 |
博客地址 |
|
作业链接 |
https://edu.cnblogs.com/campus/ xnsy/2019autumnsystemanalysisanddesign/homework/7584 |
本次实验采用Visual Studio 2017版本进行开发,安装过程如下:
1.百度网盘链接:pan.baidu.com/s/1_HycbxXqRfptMYEaho02bg 提取码:srpx2.将下载好的安装包解压到当前文件夹:
3.打开安装包文件夹:
4.右键点击以管理员的身份运行
5.点击继续
6.由于VS内存占用较大,最好修改存储位置,将其安装在非系统盘目录。
7.选择要下载的组件,本次作业运用的是C#语言,所以这里勾上了C#的组件:
8.耐心等一段时间
9.点击以后再说
10.可以更改颜色主题,这里豆子改成了深色主题,然后就可以启动啦~
###Part 1遇到的问题 在安装VS2017的时候刚开始把安装路径放在了C盘,导致在安装的时候报出需要释放C盘空间才能继续安装(幸好报了,不然C盘就炸了,呼~) ##Part 2 克隆项目 1.首先下载Git 下载地址:选择Windows下载
2.选择与电脑位数相同的安装包下载
3.进行安装:
3.按照步骤依次进行安装,安装完成后在桌面会有Git Bash以及Git GUI的快捷方式,右键桌面空白处会发现如图:
4.在桌面空白处右键点击进入Git Bash Here,出现如图所示的窗口:
配置用户名:git config --global uesr.name "github注册时的用户名"
配置用户邮箱:git config --global user.email "github注册时的邮箱"
注:在Git Bash上是无法进行ctrl+v进行复制的,豆子请教了一下度娘,可以采用insert键进行复制。
也可以通过下面两个命令来检查是否配置成功:
git config user.name
git config user.email5.输入阿超仓库的网址https://www.cnblogs.com/harry240/p/11515697.html
点击右上角的Fork,将其拷贝到自己的同名仓库中,如图:
6.克隆到对应的文件夹,复制仓库的HTTP地址:
进入到相应的文件夹,输入git clone +仓库的HTTP:
再来看看文件夹,很愉快地成功了~:
新建一个文件夹,重命名为自己地仓库名:
7.创建项目。由于本次作业要求用C#编写程序,所以这里选择C#控制台应用程序,位置放在刚刚新建的文件夹所在的路径,解决方案名称可以为Calculator:
8.接下来接连使用git add. 和git commit -m "分支名称"可以用来保存更改:
###Part 2遇到的问题 在安装Github的时候基本没有什么大问题,在进行仓库克隆的时候刚开始没有按照助教给的步骤进行,而是直接采用在终端输入代码来进行仓库的直接克隆,饶了一大转,最后删除了原来克隆好的分支,再按照助教给的,先克隆到自己的仓库,然后再克隆自己的仓库。最后可以在本机的文件夹中找到项目了。使用git的终端命令行的时候还不太熟练需要多多尝试一下接下来的上传仓库。 ##Part 3 编码阶段 ###题目: 阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求: - 程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。 - 由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。 - 练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。总体思路:本次编码采取C#语言;
1.首先,确定需求。自己要先输入生成的题目数,所以决定采用int.Parse(Console.ReadLine())来确定题目数字
2.接下来通过循环产生相应的题目数
3.那么现在的重点就是如何产生算式并计算出结果
4.进入到产生算数的函数,要求产生的数字在0和100之间、运算符的个数在2到3个。由此知道要采用随机函数来生成对应的运算数和运算符的个数。
5.生成运算数和运算符数过后,还要随机生成运算符的类型,所以用了一个 public string Sybx(int num)函数来判断生成的符号类型,1代表“+”,2代表“-”,3代表“*”,4代表“/”。
6.式子的各个部分准备好后就是怎么连接起来了,决定采用循环连接,由于生成的均为字符串类型所以直接用“+”进行连接即可。
7.最后的等号左边的式子用一个字符串变量存起来(豆子这里用的变量为s)再用计算函数public string result(string s)(C#有一个自带的方法可以计算四则运算)这样就可以返回计算结果啦
8.得到相应的式子以及计算结果后,再来判断式子不能出现分母为0的情况,最后的结果不能出现小数。
9.如果不满足8中的两个条件就不进行输出操作,并且将循环的i减1用以保证最后产生的算式的个数为用户输入的个数。
代码:
生成算式函数:
//生成一个具体的等式
int symbolnum;//符号个数
public string setequal()
{
string s = null;//用以记录最后生成算术题
int figure;//随机生成的数字
string symbol;//随机生成的符号
int n;//用以判断生成的符号
int i;
//采用Random类
Random rd = new Random(Guid.NewGuid().GetHashCode());//使用Guid的哈希码作为种子值
symbolnum = rd.Next(2, 4);//随机生成符号个数在2个到3个之间
figure = rd.Next(0, 101);//产生的一个数
s = s + figure.ToString();//先接上第一个数字
for (i=0;i< symbolnum;i++)
{
n =rd.Next(1, 5);//随机产生符号编号
symbol = Sybx(n);//翻译成符号
s = s + symbol;
figure= rd.Next(0, 101);
s = s + figure.ToString();
}
return s;
}
判断生成符号类型函数
//判断符号类型
public string Sybx(int num)
{
if(num==1)
{
return "+";
}
if(num==2)
{
return "-";
}
if(num==3)
{
return "*";
}
if(num==4)
{
return "/";
}
else
{
return "";
}
}
计算结果函数:
//计算函数
public string result(string s)
{
DataTable dt = new DataTable();
return dt.Compute(s, "false").ToString();
}
拼接算式和结果函数:
public class fun
{
public string cv(string equation)
{
jisuan x = new jisuan();
int u;//判断是否分母为0
int nm;
int weizhi = 0;
string last = null;//最终产生的结果
string rt = null;//计算结果字符串
u = equation.IndexOf(" ");//不能出现分母为0的情况
if (u == -1)
{
rt = x.result(equation);
weizhi = rt.IndexOf(".");//不能出现结果为小数的情况
if (weizhi == -1)
{
last = equation + "=" + rt;
return last;
}
else
{
return " ";
}
}
else
{
return " ";
}
}
}
主函数将最后的结果写入文件
class Program
{
static void Main(string[] args)
{
string bg = null ;
string h = null;
string equation = null;//产生的式子
int nm = int.Parse(Console.ReadLine());//输入生成的算式的个数
fun f = new fun(); //Console.WriteLine(nm.ToString());
for (int i = 0; i < nm; i++)
{
jisuan x = new jisuan();
equation = x.setequal();
bg = f.cv(equation);
if(bg!=" ")
{
h = h + bg + "
";
}
else
{
i--;
continue;
}
}
Console.WriteLine(h);
System.IO.File.WriteAllText("E:/subject.txt",h, Encoding.Default);
Console.ReadKey();
}
}
总程序如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace Calculator
{
class jisuan
{
int symbolnum;//符号个数
//生成一个具体的等式
public string setequal()
{
string s = null;//用以记录最后生成算术题
int figure;//随机生成的数字
string symbol;//随机生成的符号
int n;//用以判断生成的符号
int i;
//采用Random类
Random rd = new Random(Guid.NewGuid().GetHashCode());//使用Guid的哈希码作为种子值
symbolnum = rd.Next(2, 4);//随机生成符号个数在2个到3个之间
figure = rd.Next(0, 101);//产生的一个数
s = s + figure.ToString();//先接上第一个数字
for (i = 0; i < symbolnum; i++)
{
n = rd.Next(1, 5);//随机产生符号编号
symbol = Sybx(n);//翻译成符号
s = s + symbol;
figure = rd.Next(0, 101);
s = s + figure.ToString();
}
return s;
}
public string Sybx(int num)//判断符号
{
if (num == 1)
{
return "+";
}
if (num == 2)
{
return "-";
}
if (num == 3)
{
return "*";
}
if (num == 4)
{
return "/";
}
else
{
return "";
}
}
//计算函数
public string result(string s)
{
DataTable dt = new DataTable();
return dt.Compute(s, "false").ToString();
}
}
class fun
{
public string cv(string equation)
{
jisuan x = new jisuan();
int u;//判断是否分母为0
int nm;
int weizhi = 0;
string last = null;//最终产生的结果
string rt = null;//计算结果字符串
u = equation.IndexOf(" ");//不能出现分母为0的情况
if (u == -1)
{
rt = x.result(equation);
weizhi = rt.IndexOf(".");//不能出现结果为小数的情况
if (weizhi == -1)
{
last = equation + "=" + rt;
return last;
}
else
{
return " ";
}
}
else
{
return " ";
}
}
}
class Program
{
static void Main(string[] args)
{
string bg = null ;
string h = null;
string equation = null;//产生的式子
int nm = int.Parse(Console.ReadLine());//输入生成的算式的个数
fun f = new fun(); //Console.WriteLine(nm.ToString());
for (int i = 0; i < nm; i++)
{
jisuan x = new jisuan();
equation = x.setequal();
bg = f.cv(equation);
if(bg!=" ")
{
h = h + bg + "
";
}
else
{
i--;
continue;
}
}
Console.WriteLine(h);
System.IO.File.WriteAllText("E:/subject.txt",h, Encoding.Default);
Console.ReadKey();
}
}
}
Part 3遇到的问题
1.一开始不知道C#自带有一个可以计算四则运算的方法,刚开始是打算用栈的办法来做,然后考虑优先级,写了很久发现 不是一点点的复杂。所以决定试试有没有可以直接计算四则运算的函数,没想到一查就查到了,最后决定采用这个方法来计算四则运算。其实自己还想了一个思路就是把“*”和“/”分成A类,把“+”和“-”分成B类,这样A和B的位置也最多只有8种,一种一种情况来写按照逻辑来说还是行得通。如图:
2.随机生成对应的式子的时候,如果想要生成5个式子,前面两个是不一样的,后面的式子就都和第二个式子一样,于是我想是不是随机种子的问题,于是问了问度娘,发现可以Random产生随机数不重复只能用以数字区间不大的情况,于是决定采用计时周期作为时间种子这样就可以避免产生重复的数字。但是以时间线作为种子进行伪随机运算,当计算运行速度过快时,导致所有的随机种子都是一个值,经过了一系列的周折后,终于找到了一种解决方式使用Guid的哈希码作为种子值,就不会重复了。
3.在写入txt文件的时候,比如我想输入5个等式就会发现最后的txt文件并不会接连存入而是会刷掉现存的然后再存入当前循环的,于是我决定将循环的所有结果都存在一个字符串里面,最后再存入到txt文件当中,这样就可以得到最后的结果啦。
Part 4 单元测试
1.将所有的类都改为公有的。
如果不将类改为公有的就会出现下列情况:
2.选中要测试的函数或者类名右键单击选择创建单元测试。
3.写好测试代码再进行测试:
出现测试错误,继续修改测试代码:
对test函数进行测试,测试成功:
再对Sybx函数进行测试,测试成功:
对cv函数进行测试,测试成功:
Part 4遇到的问题
1.刚开始没有把类改为公有的导致不能生成单元测试,将类改为公有的过后就可以创建单元测试了。
2.由于最先的代码不便于单元测试,所以更改了很多,把每个不一样功能的函数尽量分隔开来,单元测试的代码就好写了很多。
Part 5 基本操作
1.断点,设置断点非常简单,在要设置断点的行号旁用鼠标单击一下就行了(注意要点到与右侧编辑器颜色明显不同的区域)
2.单步运行,点击调试->开始调试
逐语句调试
在下面的窗口还可以直接看到变量随着调试值的变化
3.监视,可以自己操作去监视一些变量。
在下方的界面就会只显示监视变量的值进行实时的观察。
4.条件断点:某些断点在某些条件下成立
满足条件断点生效:
###Part 5遇到的问题 1.在设置断点的时候刚开始的时候设置在了必须要手动输入的那一行就导致整个调试程序不能运行,于是选择自己赋值然后执行下面的步骤。 2.在进行监视变量设置的时候没有在调试阶段,导致无法设置监视变量,设置监视变量的时候一定要处于调试阶段才行。Part 6 回归测试
修改完所有的Bug之后,运行一遍之前所有的单元测试样例。看看是否所有的测试都可以通过:
可以看到所有的测试均通过,回归测试很好的完成了。
Part 6遇到的问题
回归测试对于最后验证测试代码以及代码的正确性具有很重要的作用。最后的测试案例全部通过。
Part 7 效能分析
VS当中内置有效能工具,名叫性能探查器。
为了查看程序的执行效率,选择测试CPU使用率->开始:
等待分析一段时间后,停止收集,最后就会产生一份效能分析报告:
上图可以看出Main函数占用的CPU达到了30%多,如果想要查看更加详细的分析报告,点击创建详细报告:
这样就会打开一个.vspx文件
点进Main函数:
这样就可以看到每行代码占用的CPU时间:
Part 7遇到的问题
学会了如何进行效能分析,更加清楚地了解到了某个函数占用的CPU时间,以及对每个函数内每行代码占用比例有了一定的认识,对于改进代码的运行效率有很大的帮助。
Part 8 提交代码
1.进入到文件夹->右键Git Bash
2.输入git add .以及git commit -m "分支名称"
3.为了确保都已经进行了git add和gt commit操作,可以使用git status来进行验证:
4.出现nothing commit就可以进行push操作了,最后出现如图的成功提示:
5.完成push操作后,向源仓库发起Pull Request(简称 PR ,指发起请求给仓库贡献代码)。打开你 Fork 后的项目主页,点击New pull request
6.点击后会出现如下界面:
7.正确命名:
8.成功提交:
Part 8遇到的问题
1.由于之前用过一次git,所以在最后push的时候没有弹出登录页面直接就push成功了。
2.还要注意一些命名问题,在commit的时候可以进行。
Part 9 小感想
经过这次的博客作业,学会了怎么去安装vs以及git。还编了程序,很愉快的一次体验。在git方面还是不太懂一些操作,这一次完整地进行了克隆还有上传,对git也学习到了很多。在代码方面也遇到了很多瓶颈,比如太多的功能都放在主函数导致最后测试的时候很难写测试代码,所以以后在写代码的时候要尽量把每个部分的功能分开来进行操作。