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(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对象的转换
- 我们利用+、-、*、/对四则运算符进行分割以得到数字的主体存储进vector对象,start是起始,len-start是所截取的长度-->解决对于两位及两位以上数字的保留
- 在这里*和/等级高于+和-,根据规则优先级不高于stack对象栈顶存放的符号则栈顶元素依次出栈
- 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账户
再进行单元测试
- 新建解决方案,选中单元测试
- 在新建的单元测试项目下选中引用,勾选要测试的对象
- 右键点击单元测试项目,进入属性
回归测试
不断进行bug调试于修改,再回来进行单元测试,并且每完成一个小目标就就行git提交
vs很强大,可以使得开发者更轻松的就行bug查找于调试,还可以查看运行效率以修改代码提高效率
F5进行调试
F9进行断点表记
F11/F10 进行逐步或者逐语句的调试
还可以点击断点,再右键进行条件设置