《构建之法》 第二次作业
《构建之法》 第二次作业
git地址 | github链接 |
git用户名 | namehousiqi |
学号后五位 | 62124 |
博客地址 | 个人博客 |
作业链接 | 作业 |
1. 题目简介
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
程序接收一个命令行参数 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
2. 环境配置
由于之前提前安装有visio studio 2013版的,因此为了节省安装软件的时间这里就直接使用该版本的编译器来编写该程序。
先fork了老师要求的在gethub上的题。
之后安装在Windows上安装git:(由于官网下载速度太慢,因此在网上找到非最新版本的Git)
安装完来到本地d盘的下的Test右键打开Git Bash 输入git clone 加项目路径,将项目克隆到本地仓库。
在AchaoCalculator文件夹下创建了自己的一个文件夹,并在里面开始自己的项目。
3. 代码设计思路
就题目来看思路还是比较简单的:
1. 获取用户输入的题目数量n
2. 设计函数实现生成一道算数题,并放入集合中
3. 循环n次调用函数生成n道题
4. 将集合中的题写入文件中
虽然过程是比较简单,但加上对c#和对vs的不熟,写起来还是有一点头疼。
首先遇到的第一个问题,我获取用户输入的时候发现通过input_string != null 不能判断出用户是否进行了空输入,
导致后面判断输入为数字的时候总是出错。后来通过想到直接通过正则表达式"^[0-9]+$"直接对用户的非法输入进行过滤。

之后是生成运算题的算法问题,只依稀记得好像有后缀表达式之类的可以解决四则运算的问题,但emmm时间太长都忘记了,
只记得可以通过栈来实现先进行乘除后加减,因此自己写了一个解决这个题的算法(相当丑)来实现随机生成四则运算题。
核心写完基本上就没有太大的问题了(- . -)
int[] x = new int[4];
int [] c = new int[4];
int t = random.Next(3, 5);//随机生成3-4个数字
int i,j;
Stack<int> xs = new Stack<int>();//数字栈
Stack<int> cs = new Stack<int>();//字符栈
xs.Push(x[0]);
i = 0;//遍历运算符
j = 1;//遍历数字
int temp;
while (j<t&&i<t-1)
{
if (c[i] < 2)//加法或减法时
{
if (c[i] == 1)//减法时
{
cs.Push(0);
xs.Push(0 - x[j++]);
i++;
}
else
{
cs.Push(c[i++]);
xs.Push(x[j++]);
}
}
else
{
if (c[i++] == 2)//乘法时
{
temp = xs.Pop() * x[j++];
}
else//除法时
{
if (x[j] == 0)//被除数为0
{
return false;
}
if (xs.Peek() % x[j] != 0)//结果为小数
{
return false;
}
temp = xs.Pop() / x[j++];
}
xs.Push(temp);
}
}
while (cs.Count > 0)
{
if (cs.Pop() == 0)
{
result = xs.Pop() + xs.Pop();
}
else
{
result = 0 - (xs.Pop() - xs.Pop());
}
xs.Push(result);
}
result = xs.Pop();
if (result < 0)
return false;
str += " = " + result;
list.Add(str);
return true;
}
4. 单元测试及回归测试
这里我是直接使用vs自带的单元测试进行单元测试(调试在敲代码过程中就进行了),在解决方案上右键选择添加->新建项目 进入之后一定先选择左边的测试,再选择右边的单元测试项目。因为vs中还有一个单元测试库,很容易选错。我就是,第一次单元测试的时候选择了单元测试库,结果一直不能引入要测试的项目懵逼了好久。后来百度都是安装各种插件,发现vs2013没有再支持常见的的几种单元测试插件,让人头疼,最后我觉得一个这么大的编译器不可能没有自带的单元测试功能啊,果不其然,就是在添加项目的时候添加成单元测试库了、、、吐血三升。。。教训告诉我,以后用编译器还要再小心一点特别是不熟悉的,一个小步骤出错后面的可能浪费大量时间查错。
首次单元测试时发现多次生成的题目没有覆盖而是被追加上去的:
查代码发现是因为在生成完一次后储存的算术题的集合没有清空
清空后进行回归测试:
测试结果已经没什么问题了。再打开文件看一看:(在测试项目里的/bin/debug文件中,正常的程序在项目的/bin/debug文件中)
保存的是最后一次测试时生成的文件。
5. 效能分析
打开分析->性能和诊断
开始启动进行分析
这里选择生成1000道题目试试
显示正在分析:
5、6分钟以后...发现生成的数据没有多大变化,这是因为写的窗体程序的原因吗?窗口占的比重太大分析不出来。。。
6. 提交到github
通过git status 查看修改了可提交的目录
通过git add . 将所有修改添加到本地缓冲的仓库
通过git commit -m "内容" 给提交附加message,通过git push 将项目推送到github上.
登录github显示出刚提交的内容,点击New pull request 进入提交界面
7. 回顾总结
我们的课程都要用c#写的嘛??表示脑壳疼,C#都忘得差不多了,经常都是边看教程边写,或许vs版本较低吧,用起来出了一堆的问题,
但我感觉收获还是很丰厚。首先就编写过程遇到了一堆的问题,我意识到我耐心还真是挺好,应该说更好了。
然后是技能上的感悟和收获,以前只是逛逛github看看好的项目,但很少动手用git进行项目的操作,借着这次机会更全面得了解了一下git
对版本的操作,练了几次感觉还是很好使用的。然后这次写程序的时候发现我有的算法都开始遗忘了,这给我敲了一个警钟,再怎么基本功还是
得扎实以后才走得远嘛,再然后就是博客,虽然我不太想写1,但借着作业练习写博客对我来说绝对是很好的机会,不然我自己主动写博客估计
得工作以后去了,作业这样安排挺好。
最后就是单元测试,以前基本没使用过单元测试,都是直接写函数调用看结果或者就是打断点调试,这次使用了以后感觉还是“专业”的东西比较好使。
总的来说收获满满 。