《构建之法》第二次作业
GIT地址 |
|
GIT用户名 |
OnedayForLi |
学号后五位 |
91410 |
博客地址 |
|
作业链接 |
一、配置环境
之前用过,所以不进行重复配置,vs的配置应该算是蛮简单的,跟着安装步骤一步步走就好了。有一个细节就是尽量不要安装在系统盘,因为它比较占用内存。
配置好的截图如下:
二、克隆项目
1.申请github账号
2.拷贝
进行阿超仓库,点击右上角的fork,就完成啦。
3.开始Git的使用
Git也是很久之前就下载了的,安装过程相对来说也不难,这里推荐一个git安装和使用的教程,超级详细,适合初学者和理解力较弱的朋友们。廖雪峰的git教程。
git安装好了以后,我们要将阿超的四则运算克隆到本地。
首先,复制你的仓库的四则运算的地址
然后,创建一个本地文件夹,这个文件夹的地址没有要求,但是名字最好和自己本次主题相关,方便寻找。
然后右键进入Git Bash Here:
输入git clone +你的仓库地址:
clone成功啦。
三、代码
题目背景:
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
要求:
- 程序接收一个命令行参数 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
基本思路如下:
首先创建计算式
//创建式子的函数 public static string create() { Random random = new Random(); string equation =""; //定义方程式 int OpLeft = 0; int OpRight = 0; int op = 0; int OpNumber = random.Next(2, 4); //决定有几个运算符 OpLeft = random.Next(0, 101); //equation += OpLeft; for (int i = 0; i <(2*OpNumber)+1; i++) //操作数一定比运算符多一个,所以总数是 { if (i % 2 == 0) //当循环到偶数的时候,是数字 { OpRight = random.Next(0, 101); equation += OpRight; } else { //当循环到奇数的时候,是运算符 op = random.Next(0, 4); equation += FuHao(op); } } return equation; } //用随机数来创造符号的函数 public static string FuHao(int number) { string symbol=""; switch (number) { case 0: symbol= "+"; break; case 1: symbol = "-"; break; case 2: symbol = "*"; break; case 3: symbol = "/"; break; } return symbol; }
对创建的式子进行计算的函数:
public static string Count(string str) { DataTable dt = new DataTable(); object obj = dt.Compute(str, ""); while (obj.ToString().Contains("-") || obj.ToString().Contains(".") || str.Contains("/0")) { str = create(); obj = dt.Compute(str, ""); } return str+"="+ obj.ToString(); }
生成文件的函数:
public static void Writefile(string result) { StreamWriter sw = File.AppendText(@"C:\Users\李星晨\Desktop\第二次作业\AchaoCalculator\test.txt"); sw.WriteLine(result); sw.Flush(); sw.Close(); }
主函数:
public static void Main(string[] args) { string result; Console.Write("请输入题目个数:"); int n = int.Parse(Console.ReadLine()); for (int i = 0; i < n; i++) { string equation = create(); result = Count(equation); Console.WriteLine(result); System.Threading.Thread.Sleep(50); //random在不加种子的情况下,使用系统的时针,出现的数字总是会相同 Writefile(result); } Console.Read(); }
运行结果如下:
四、单元测试
1.c#编写好代码后,在界面直接右键创建单元测试:
ps:这里有一个小细节,必须把所有的private类改为public类,否认会弹出以下窗口。
2.然后是进行单元测试,因为我在计算函数中调用了创建函数,所以我着重测试了计算式子的函数
测试代码如下:
public void CountTest() { string str1 = "1+50/2"; string str2 = "20*3-20"; string str3 = "1+57*2"; int ans1 = 26; int ans2 = 40; int ans3 = 115; Assert.AreEqual(Program.Count(str1),ans1); Assert.AreEqual(Program.Count(str2), ans2); Assert.AreEqual(Program.Count(str3), ans3); }
3.测试通过~
四、基本操作
1.断点
断点是我们在调试过程中必不可少的一步
如图,我们在第 37行设置了一个断点,调用一次创建式子的函数就暂停.。
逐步调试,观察各个变量变化的值:
2.条件断点
添加条件,OpRight的初试值为0,执行一次create函数后值发生变化,则隐含的条件为执行一次就达到断点的条件。
达到断电后OpRight=81,符合条件。
3.添加监视
在这一步我选择监视OpRight,从代码中我们可以得知OpRight意为运算符右边的值,是一直在变化的,利用好监视器跟踪OpRight的变化。
添加监视器,一步一步记录OpRight的变化:
两次监视的结果和程序运行出的结果是相对应的,监视器还是很好用的。
五、效能工具介绍
尝试使用效能工具,这里我们测试CPU使用率。
开始测试:
生成分析报告,进一步观察CPU的使用的分配:
因为这次四则运算代码比较简单,CPU的使用并不太明显,所以我增加了大量循环代码,加入主函数中:
for (int i = 0; i < 10000000; i++) { for (int z = 0; z < 1000000; z++) { for (int j = 0; j < 1000000; j++) { if (j % 2 == 0) { j = j + 1; } else { j = j - 1; } } } }
运行了一分钟40秒后结果如下,这时我们可以点停止收集
分析如下:
这个结果就很明显了,main主函数占用的比例是99.03%,这样数据就非常直观,通过这个分析我们可以知道如果我们要改进代码,在主函数改进是最有效率的方法。
通过这个例子,我认为利用性能分析能够很好地帮助我们了解到那个函数内部占用CPU最多,进而我们能够取得最好的改进方式。
六、提交代码
在git中执行git add .和git commit -m "First Commit"命令;
最后Git push。
这时候就可以回到自己的github的仓库里面,找到这次我们写的代码文件,点击此按钮。
上传成功后图片如下:
如果需要重复提交,则重复三个命令即可,但是需要注意的是,需要git commit -m "First Commit"命令改成git commit -m "Second Commit"命令,方便后续在github进行查看。
七、本次感想
- 心得:此时,整个项目基本完成了,真的感触非常多。
上课的时候老师便提出过这个题目背景,问我们需要几天来完成。我记得当时有位同学回答的一天,当时我心里觉得可能用不了一天,现在想来真的眼高手低了。不过,这次项目真的让我学会了很多。
首先是代码上,虽然之前接触过c#不过真的学的很浅,经过一年基本忘得差不多,这次感觉又重拾了c#,尝试c#解决问题。这次的题目虽然看起来十分简单,但是其实内有乾坤,有很多隐含的条件,比如不能除0,运算中的优先级等等,虽然后面的单元测试一次成功,但是前面调试代码真的是一把血一把泪。因为对c#不熟悉,一点点小问题就足以让我卡一个小时,心累。
然后是工具上,c#和git很久之前就下载好了,然后就在我的电脑里面“生灰”,这一次自己独立走了一遍项目流程,觉得收益良多。对vs里很多功能有了更深的理解,像以前就没有用过cpu性能分析和单元测试这种功能,o(╥﹏╥)o。不过现在学会了! git也是一样!
- 经验分享:
(1)当你做一些运算题时,如果你发现你的答案不对但是没有报错,那么很有可能是你的逻辑错误,这个时候你可以画一张流程图或者拿起笔来算一算,沥青你的逻辑,找出错误。在这次实验中我就是这样解决了我卡了一中午的问题o(╥﹏╥)o。
(2)git的命名规范真的非常重要,git是团队合作开发的工具,你的代码和文件不止是你一个人在看,大家也在看,如果命名不规范,会产生大量的不必要的工作。而正确的命名方式,又能使你事半功倍。
(3)要善于发现每个编译器的好用之处,不要局限于浅层和表面,一个顺手的工具是你成功的一半。