构建之法第二次作业

第二次作业

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:

1741653-20190918214705850-966795061.png

2.安装git

下载按提示操作即可
1741653-20190918231401036-635482842.png

二:代码思路

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

        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;//算式字符串

这是主类如图
1741653-20190920101215629-896166415.png
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

1741653-20190918231448127-1705320201.png

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

1741653-20190918231510444-998595976.png

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

1741653-20190918231521698-1624923018.png

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

fork项目到自己仓库
1741653-20190918232202751-1697044503.png
克隆项目到本地,由于已经拉取过了,显示为更新
1741653-20190918233118604-48625912.png
使用git add .命令将所有的修改的文件提交到缓存区
1741653-20190918233441509-172138539.png
git commit -m “提交代码”
1741653-20190918235643722-1709294217.png

将缓存区代码推送到Git服务器git push
1741653-20190919000302482-825988956.png

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

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

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

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

1741653-20190918234318130-1700559745.png
默认确定

1741653-20190918234329217-2111739046.png

1741653-20190918234347834-1605948247.png
测试代码如图:

1741653-20190920102123866-797514868.png

运行测试

1741653-20190918234603291-717521479.png
测试失败

1741653-20190920102146147-1318762051.png

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

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

1741653-20190918235047048-2104007547.png

问题不再出现测试成功

1741653-20190918235145392-2087289995.png

3.性能分析

对程序进行内存占用分析

1741653-20190920105335576-857927430.png

1741653-20190920105319364-1439412978.png

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

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

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

转载于:https://www.cnblogs.com/liudong123/p/11545561.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值