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

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指引软件,再打开它:

接着再修改中进行需要的选择,再进行安装:

Git的使用

由于vs2017自带git所以可以很方便与GitHub进行互动

找到这里,点击clone再输入想拉到本地的项目url。
成功以后,找到Demo,进行双击,进入:

在下面进行新建解决方案,成功后点击同步


在我们的sln里面进行代码操作,首先将之前clone下的项目代码Calcluator.h 与 Calculator.cpp进行转移到我们的解决方案下

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

成功后如图。

我之后对代码进行了运行,由于stdafx.h头文件无法找到,我直接去百度了,

根据其作用,我删除了它且加入了stdlib.h头文件,无报错

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

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<float>(temp) / static_cast<float>(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<string> *hz = new vector<string>(); //存放后缀表达式
	stack<string> *fh = new stack<string>(); //存放符号
	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<int> 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对象的调用

结果:

点击更改,选择全部提交,再进入同步,选择推送,第一次会叫你输入你的GitHub账户

再进行单元测试

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

对编辑进行对应的填写

结果:

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

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

posted @ 2019-09-19 16:25  Dedicate_labors  阅读(252)  评论(2编辑  收藏  举报
……