构建之法第二次作业

第二次作业

Git地址 https://github.com/isliudong/AchaoCalculator
GIT用户名 isliudong
学号后五位 062227
博客地址 https://www.cnblogs.com/liudong123/
作业链接 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/homework/7584

作业背景

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

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

  • 程序接收一个 命令行参数 n,然后随机产生n道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0100之间,运算符在 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

作业要求:

  • 请以博客记录的方式,体现环境配置过程(包括遇到了哪些问题,你是如何解决的)
  • 体现你代码设计的思路(注意:请保证代码能够运行通过)
  • 记录你使用github克隆项目以及提交代码的整个过程(包括遇到的问题,你是如何解决的)
  • 记录你对项目进行单元测试和回归测试的过程(包括你遇到的问题,解决的方法是什么)

一:环境配置

1.安装Visual Studio 2017

以前使用过vs2017,所以就不在重复配置了,vs的配置也比较简单基本上按照安装提示操作就可以了。

如图已安装好的vs2017:

2.安装git

下载按提示操作即可

二:代码思路

我的方法比较简单暴力,将操作数,算式符号个数,符号。设置成随机数。如图

        int num1=1, num2=1, num3=1, num4=1;//操作数
        int numop=3;//符号个数
        int optype=1,optype1=1,optype2=2,optype3=3;//操作数类型用数字代表
        char[] op = { '+', '-', '*', '/' };//操作符
        float result=0;//计算值
        string s;//算式字符串

这是主类如图

create函数思想,直接枚举出所有可能,将计算结果存入result,如图展示操作符个数为2的时候,操作数为3犹豫代码过多就不展示了。可以去我的GitHub查看。

 if (numop == 2)
                    switch (optype1)
                    {
                        case 1:
                            switch (optype2)
                            {
                                case 1:
                                    s = num1.ToString() + op[0] + num2.ToString() + op[0] + num3.ToString();
                                    result = num1 + num2 + num3;
                                    break;
                                case 2:
                                    s = num1.ToString() + op[0] + num2.ToString() + op[1] + num3.ToString();
                                    result = num1 + num2 - num3;
                                    break;
                                case 3:
                                    s = num1.ToString() + op[0] + num2.ToString() + op[2] + num3.ToString();
                                    result = num1 + num2 * num3;
                                    break;
                                case 4:
                                    s = num1.ToString() + op[0] + num2.ToString() + op[3] + num3.ToString();
                                    result = num1 + (float)num2 / num3;
                                    break;
                            }
                            break;
                        case 2:
                            switch (optype2)
                            {
                                case 1:
                                    s = num1.ToString() + op[1] + num2.ToString() + op[0] + num3.ToString();
                                    result = num1 - num2 + num3;
                                    break;
                                case 2:
                                    s = num1.ToString() + op[1] + num2.ToString() + op[1] + num3.ToString();
                                    result = num1 - num2 - num3;
                                    break;
                                case 3:
                                    s = num1.ToString() + op[1] + num2.ToString() + op[2] + num3.ToString();
                                    result = num1 - num2 * num3;
                                    break;
                                case 4:
                                    s = num1.ToString() + op[1] + num2.ToString() + op[3] + num3.ToString();
                                    result = num1 - (float)num2 / num3;
                                    break;
                            }
                            break;
                        case 3:
                            switch (optype2)
                            {
                                case 1:
                                    s = num1.ToString() + op[2] + num2.ToString() + op[0] + num3.ToString();
                                    result = num1 * num2 + num3;
                                    break;
                                case 2:
                                    s = num1.ToString() + op[2] + num2.ToString() + op[1] + num3.ToString();
                                    result = num1 * num2 - num3;
                                    break;
                                case 3:
                                    s = num1.ToString() + op[2] + num2.ToString() + op[2] + num3.ToString();
                                    result = num1 * num2 * num3;
                                    break;
                                case 4:
                                    s = num1.ToString() + op[2] + num2.ToString() + op[3] + num3.ToString();
                                    result = num1 * (float)num2 / num3;
                                    break;
                            }
                            break;
                        case 4:
                            switch (optype2)
                            {
                                case 1:
                                    s = num1.ToString() + op[3] + num2.ToString() + op[0] + num3.ToString();
                                    result = (float)num1 / num2 + num3;
                                    break;
                                case 2:
                                    s = num1.ToString() + op[3] + num2.ToString() + op[1] + num3.ToString();
                                    result = (float)num1 / num2 - num3;
                                    break;
                                case 3:
                                    s = num1.ToString() + op[3] + num2.ToString() + op[2] + num3.ToString();
                                    result = (float)num1 / num2 * num3;
                                    break;
                                case 4:
                                    s = num1.ToString() + op[3] + num2.ToString() + op[3] + num3.ToString();
                                    result = (float)num1 / num2 / num3;
                                    break;
                            }
                            break;
                        
                    }

以下为运行实例,输入题目数n

在题目文本中生成如下题目:

在答案文本中生成如下答案:

三:使用github克隆项目以及提交代码

fork项目到自己仓库

克隆项目到本地,由于已经拉取过了,显示为更新

使用git add .命令将所有的修改的文件提交到缓存区

git commit -m “提交代码”

将缓存区代码推送到Git服务器git push

注意:
1.利用 git reset 命令将撤回缓存中的代码。

2.git reset —hard + 版本号,彻底回退到某个版本,本地的代码也会改变上一个版本内容。

四:对项目进行单元测试和回归测试

1.右键选择创建单元测试


默认确定


测试代码如图:

运行测试


测试失败

调试发现原因是取值超范围,数组越界了。
2.回归测试

进行项目代码升级修改后,任然取原来的测试值

问题不再出现测试成功

3.性能分析

对程序进行内存占用分析

4.总结
(1)通过这次作业体验了开发工具的使用方法

(2)过程中遇到了很多困难,c#不熟,GitHub指令操作完全靠现学。提交代码部分遇到很多问题,还好差不多都解决了。百度解决问题的能力又提高了,嘿嘿。

(3)对项目测试有一定了解了,知道怎样方便高效测试代码。收获还挺大的。

posted @ 2019-09-19 11:24  闲乘月上  阅读(128)  评论(3编辑  收藏  举报