#include <string>
#include <sstream>
#include <string.h>
#include <iostream>
#include <istream>
using namespace std;
double CalculationResults(const string&);//将表达式的结果计算出来,如:2+3*4
double Calculation(double, double, char);
//四则运算
int main(int argc, char* argv[])
{
double dSum = 0;
string strArithmetic;
string strStart, strEnd;
stringstream ss;
strArithmetic = argv[1];
strArithmetic = "(1+2*3+4/5+6-7/8)";
string::size_type nStart = 0;
string::size_type nEnd = 0;
while (true)
{
strStart = strEnd = strArithmetic;
nStart = strStart.rfind('(');//查找最后一个
if (nStart == string::npos)
{
break;
}
nEnd = strArithmetic.find(')', nStart);//查找当前位置的之后的第一个
strStart.resize(nStart);//截取(之前的部分
strEnd = strEnd.substr(nEnd+1);//获取)之后的部分
if (string::npos != nEnd)
{
dSum = CalculationResults(strArithmetic.substr(nStart+1, nEnd - nStart - 1));
}
else
{
printf("input error\n");
return -1;
}
//将前得到的结果进行拼接
ss.clear();
ss << strStart;
ss << dSum;
ss << strEnd;
strArithmetic.clear();
ss >> strArithmetic;
}
dSum = CalculationResults(strArithmetic);
cout << "四则运算的结果为: " << dSum << endl;
getchar();
return 0;
};
double CalculationResults(const string& strCalculate)
{
double dSum = 0;
string::size_type nPos = strCalculate.find_first_of("*/");//查找第一个*或/
if (nPos != string::npos)
{
string::size_type nPrev = strCalculate.find_last_of("+-", nPos - 1);//查找nPos之前的一个运算符下标,可以得到nPos之前的数值
if (string::npos == nPrev)// *或/是第一个运算符
{
dSum = Calculation(atof(&strCalculate[0]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
else
{
dSum = Calculation(atof(&strCalculate[nPrev]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
}
else//没有*或/运算
{
nPos = strCalculate.find_first_of("+-");//查找第一个+或-
if (nPos != string::npos)
{
dSum = Calculation(atof(&strCalculate[0]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
}
string::size_type nStartPos= 0;
string::size_type nEndPos = 0;
//查找是否还有运算
nStartPos = strCalculate.find_last_of("+-*/", nPos - 1);//查找nPos之前的一个运算符
nEndPos = strCalculate.find_first_of("+-*/", nPos + 1);//查找nPos之后的一个运算符
if (nStartPos != string::npos || nEndPos != string::npos)
{//将结果重新拼接字符串,继续递归调用本函数
stringstream ss;
if (nStartPos != string::npos)
{
ss << strCalculate.substr(0, nStartPos+1);
}
ss << dSum;
if (nEndPos != string::npos)
{
ss << strCalculate.substr(nEndPos);
}
string strTmp;
ss >> strTmp;
dSum = CalculationResults(strTmp);
}
return dSum;
}
double Calculation(double dNum1, double dNum2, char cSymbol)
{
switch (cSymbol)
{
case '+':
return dNum1+dNum2;
break;
case '-':
return dNum1-dNum2;
break;
case '*':
return dNum1*dNum2;
break;
case '/':
if (dNum2 == 0)
{
printf("can not divide by zero\n");
exit(-1);
}
return dNum1/dNum2;
break;
default:
break;
}
return 0;
}
#include <sstream>
#include <string.h>
#include <iostream>
#include <istream>
using namespace std;
double CalculationResults(const string&);//将表达式的结果计算出来,如:2+3*4
double Calculation(double, double, char);
//四则运算
int main(int argc, char* argv[])
{
double dSum = 0;
string strArithmetic;
string strStart, strEnd;
stringstream ss;
strArithmetic = argv[1];
strArithmetic = "(1+2*3+4/5+6-7/8)";
string::size_type nStart = 0;
string::size_type nEnd = 0;
while (true)
{
strStart = strEnd = strArithmetic;
nStart = strStart.rfind('(');//查找最后一个
if (nStart == string::npos)
{
break;
}
nEnd = strArithmetic.find(')', nStart);//查找当前位置的之后的第一个
strStart.resize(nStart);//截取(之前的部分
strEnd = strEnd.substr(nEnd+1);//获取)之后的部分
if (string::npos != nEnd)
{
dSum = CalculationResults(strArithmetic.substr(nStart+1, nEnd - nStart - 1));
}
else
{
printf("input error\n");
return -1;
}
//将前得到的结果进行拼接
ss.clear();
ss << strStart;
ss << dSum;
ss << strEnd;
strArithmetic.clear();
ss >> strArithmetic;
}
dSum = CalculationResults(strArithmetic);
cout << "四则运算的结果为: " << dSum << endl;
getchar();
return 0;
};
double CalculationResults(const string& strCalculate)
{
double dSum = 0;
string::size_type nPos = strCalculate.find_first_of("*/");//查找第一个*或/
if (nPos != string::npos)
{
string::size_type nPrev = strCalculate.find_last_of("+-", nPos - 1);//查找nPos之前的一个运算符下标,可以得到nPos之前的数值
if (string::npos == nPrev)// *或/是第一个运算符
{
dSum = Calculation(atof(&strCalculate[0]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
else
{
dSum = Calculation(atof(&strCalculate[nPrev]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
}
else//没有*或/运算
{
nPos = strCalculate.find_first_of("+-");//查找第一个+或-
if (nPos != string::npos)
{
dSum = Calculation(atof(&strCalculate[0]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
}
string::size_type nStartPos= 0;
string::size_type nEndPos = 0;
//查找是否还有运算
nStartPos = strCalculate.find_last_of("+-*/", nPos - 1);//查找nPos之前的一个运算符
nEndPos = strCalculate.find_first_of("+-*/", nPos + 1);//查找nPos之后的一个运算符
if (nStartPos != string::npos || nEndPos != string::npos)
{//将结果重新拼接字符串,继续递归调用本函数
stringstream ss;
if (nStartPos != string::npos)
{
ss << strCalculate.substr(0, nStartPos+1);
}
ss << dSum;
if (nEndPos != string::npos)
{
ss << strCalculate.substr(nEndPos);
}
string strTmp;
ss >> strTmp;
dSum = CalculationResults(strTmp);
}
return dSum;
}
double Calculation(double dNum1, double dNum2, char cSymbol)
{
switch (cSymbol)
{
case '+':
return dNum1+dNum2;
break;
case '-':
return dNum1-dNum2;
break;
case '*':
return dNum1*dNum2;
break;
case '/':
if (dNum2 == 0)
{
printf("can not divide by zero\n");
exit(-1);
}
return dNum1/dNum2;
break;
default:
break;
}
return 0;
}

