第二次作业:熟悉使用工具

GIT地址 https://github.com/Dedicate-labors/AchaoCalculator
GIT用户名 Dedicate-labors
学号后五位 61425
博客地址 https://www.cnblogs.com/Liberavi/p/11546016.html
作业链接 https://www.cnblogs.com/harry240/p/11515697.html

(2) 博客内容:

git与vs2017的使用

vs2017的安装

作为最好使用的IDE, vs2017的安装可以说是十分简单
首先下载好一个vs2017指引软件,再打开它:
第二次作业:熟悉使用工具_第1张图片
接着再修改中进行需要的选择,再进行安装:
第二次作业:熟悉使用工具_第2张图片

Git的使用

由于vs2017自带git所以可以很方便与GitHub进行互动
第二次作业:熟悉使用工具_第3张图片
找到这里,点击clone再输入想拉到本地的项目url。
成功以后,找到Demo,进行双击,进入:
第二次作业:熟悉使用工具_第4张图片
在下面进行新建解决方案,成功后点击同步


在我们的sln里面进行代码操作,首先将之前clone下的项目代码Calcluator.h 与 Calculator.cpp进行转移到我们的解决方案下
第二次作业:熟悉使用工具_第5张图片

点击添加,新建项,分别再里面创建Calcluator.h 和 Calculator.cpp文件,再将代码进行复制过去

第二次作业:熟悉使用工具_第6张图片

成功后如图。

我之后对代码进行了运行,由于stdafx.h头文件无法找到,我直接去百度了,
第二次作业:熟悉使用工具_第7张图片
根据其作用,我删除了它且加入了stdlib.h头文件,无报错
第二次作业:熟悉使用工具_第8张图片

之后我发现代码可以运行但结果有错(第一次做到这没在往下看了,所以不知道这是故意的bug);
思路

第二次作业:熟悉使用工具_第9张图片

string Calculator::MakeFormula() {//创建公式
    string formula = ""; //表面出现的公式

    int count = random(1, 3); //公式长度添加  1or2 ;
    int start = 0;//开始计数
    int number1 = random(1, 100);//第一个数字
    formula += to_string(number1);
    int temp = number1;//保存被除数
    while (start <= count) {
        int operation = random(0, 3);//符号
        int number2 = random(1, 100);//第二个数字
        if (op[operation] == "/") {     //排除小数
            float f = static_cast(temp) / static_cast(number2);
            int a = (temp / number2);
            if (f != (temp / number2))
                return MakeFormula();
        }
        formula += op[operation] + to_string(number2);//符号+数字
        temp = number2;
        start++;
    }
    return formula;
}

这里的代码是创建四则运算公式,通过设置一个srand()进行公式的随机产生,通过添加递归进行排除有小数的除法(srand()我放在主函数里了)

之后我对后面对四则运算的解答Solve进行了自己的编写:

string Calculator::FH(char formulaChar) //作用是返回string类型的运算符号
{
    char a[4] = { '+', '-', '*', '/' };
    int i = 0;
    for (i = 0; i < 4; i++)
        if (a[i] == formulaChar)
            break;
    return op[i];
}

string Calculator::Solve(string formula) { // 解决公式:方法:将公式转换为后缀式再求解
    vector *hz = new vector(); //存放后缀表达式
    stack *fh = new stack(); //存放符号
    int start = 0, len = 0;//start 开始, len当前下标
    for (auto formulaChar : formula) {
        if (formulaChar == '+' || formulaChar == '-' || formulaChar == '*' || formulaChar == '/')
        {
            hz->push_back(formula.substr(start, len - start));//处理数字,substr对string对象从start位置开始截取len-start的长度
            start = len + 1;
            if (fh->empty())//处理符号
                fh->push(FH(formulaChar));
            else {
                if ((fh->top() == "+" || fh->top() == "-") && (formulaChar == '*' || formulaChar == '/'))
                    fh->push(FH(formulaChar)); //ok
                else
                {
                    if (formulaChar == '+' || formulaChar == '-') {
                        while (!fh->empty())
                        {
                            hz->push_back(fh->top());
                            fh->pop();
                        }
                        fh->push(FH(formulaChar));
                    }
                    else {
                        hz->push_back(FH(formulaChar));
                    }
                }
            }
        }
        len++;
    }
    hz->push_back(formula.substr(start));//处理最后的数字
    while (!fh->empty())//处理最后的符号
    {
        hz->push_back(fh->top());
        fh->pop();
    }
    //将后缀表达式求解
    stack result;
    int a1, a2;
    for (auto j : *hz)
    {
        if (j == "+" || j == "-" || j == "*" || j == "/")
        {
            if (j == "+")
            {
                a1 = result.top();
                result.pop();
                a2 = result.top();
                result.pop();
                result.push((a1 + a2));
            }
            if (j == "-")
            {
                a1 = result.top();
                result.pop();
                a2 = result.top();
                result.pop();
                result.push((a2 - a1));
            }
            if (j == "*")
            {
                a1 = result.top();
                result.pop();
                a2 = result.top();
                result.pop();
                result.push((a1 * a2));
            }
            if (j == "/")
            {
                a1 = result.top();
                result.pop();
                a2 = result.top();
                result.pop();
                result.push((a2 / a1));
            }
        }
        else
            result.push(atoi(j.c_str()));
    }
    return formula + "=" + to_string(result.top());
}

首先将传入的形参进行后缀转化(数据结构的知识),创建两个容器,一个vector对象存储后缀表达式,stack对象存储符号
中间的编程中我自认为较困难有以下几点:

  • 是对于两位及两位以上数字的保留
  • 是对符号何时的出栈和入栈
  • 对string对象和int对象的转换
  1. 我们利用+、-、*、/对四则运算符进行分割以得到数字的主体存储进vector对象,start是起始,len-start是所截取的长度-->解决对于两位及两位以上数字的保留
  2. 在这里*和/等级高于+和-,根据规则优先级不高于stack对象栈顶存放的符号则栈顶元素依次出栈
  3. atoi(string().c_str())对string对象调用c_str()再进行atoi()就可以转换为对应数字,atoi()是C++不用声明的函数且只对char *对象起作用故对string对象进行c_str()进行转换

编译完成。

int main() {
    int n;
    Calculator *calc = new Calculator();
    string Problem;
    FILE *fp;
    fopen_s(&fp, "Calcuators.txt", "w");
    srand((unsigned int)time(0));
    cout << "请输入你想要几道题?" << endl;
    cin >> n;
    for (int i = 0; i < n; i++) {
        Problem = calc->MakeFormula();
        cout << calc->Solve(Problem) << endl;
        fprintf(fp, "%s\n", (calc->Solve(Problem)).c_str());
    }
    fclose(fp);
    return 0;
}

主函数对class对象的调用

结果:
第二次作业:熟悉使用工具_第10张图片

点击更改,选择全部提交,再进入同步,选择推送,第一次会叫你输入你的GitHub账户
第二次作业:熟悉使用工具_第11张图片

再进行单元测试

  1. 新建解决方案,选中单元测试
  2. 在新建的单元测试项目下选中引用,勾选要测试的对象
  3. 右键点击单元测试项目,进入属性

第二次作业:熟悉使用工具_第12张图片

对编辑进行对应的填写
第二次作业:熟悉使用工具_第13张图片

结果:
第二次作业:熟悉使用工具_第14张图片

回归测试
不断进行bug调试于修改,再回来进行单元测试,并且每完成一个小目标就就行git提交

vs很强大,可以使得开发者更轻松的就行bug查找于调试,还可以查看运行效率以修改代码提高效率
F5进行调试
F9进行断点表记
F11/F10 进行逐步或者逐语句的调试
还可以点击断点,再右键进行条件设置

你可能感兴趣的:(第二次作业:熟悉使用工具)