我写这段代码是为了一个项目,来计算一个算法方程,如果它的字符串中没有a,我应该返回值,并且返回false,如果它有a,我应该返回值= 0,并且返回true,这都是在一个bool函数中完成的。
#include <string>
#include <sstream>
bool Evaluate(const string& expression, int& value){
int a;
int b;
int c;
int d;
int e;
string valueA;
string valueB;
string valueC;
string valueD;
string valueE;
int y;
int z;
unsigned int i;
stringstream x;
int szz;
string alg;
if(!expression.find('a')) {
szz = expression.size();
alg = expression.copy(0, szz);
for (i = 0; i <= szz; ++i) {
alg.find_first_of('*/%');
if (isdigit(alg[i] - '*')) {
a = alg.find('*');
y = a - 1;
z = a + 1;
valueA = alg.substr(y, z);
a = stoi(valueA);
x << a;
valueA = x.str();
alg.replace(y, 2, valueA);
}
if (isdigit(alg[i] - '/')) {
b = alg.find('/');
y = b - 1;
z = b + 1;
valueB = alg.substr(y, z);
b = stoi(valueB);
x << b;
valueB = x.str();
alg.replace(y, 2, valueB);
}
value = stoi(alg);
return false;
}
else{
value = 0;
return true;
}
}
我希望得到正确的值和正确的真/假,如果方程中有a,我得到的结果是正确的0,但不是求值结果(真/假),如果方程中没有a,情况正好相反,我得到的求值结果是正确的假,但不是实际的正确值。
1条答案
按热度按时间khbbv19g1#
你的算法比你写的要多得多,很明显,它的目标不是寻找
a
,而是计算整个数学表达式。此外,你的算法是有缺陷的在许多方面,我只是指出一些在这里:
1.输入的
if
始终为真,因为
alg
中从来没有“a”,因为alg
就在前一行创建为空。1.这只是复制整个字符串
并且100%等价于
string alg = expression;
1.不需要for循环
因为
find_first_of
做了它所宣传的事情,并且已经在字符串本身上循环。1.你只需要丢弃
alg.find_first_of('*/%');
的返回值,你想写int operator_position = alg.find_first_of('*/%');
,然后你知道在alg[operator_position]
有一个*/%
。1.您有多个此类行
但我很明显这不是你想要的。从你的代码逻辑来看,我理解你需要知道alg中的子字符串是一个数字(还是一个包含+-*/%的表达式)。你的语句只作用于一个字符
1.其他潜在问题。
你描述的实际问题可以很容易地解决:
下面是我所推断的实际相关问题和算法:问:用字符串计算数学表达式并返回答案,因此“2*6+4-6/2”应该返回13,如果你想实现这一点,你需要迭代函数调用
Evaluate
,我建议使用double Evaluate(const string& expression)
:+-
中的任何一个。如果是,你迭代计算两个独立的部分(使用expression.substr(start,length)
),在operator_position
之前(见上面的提示)。然后根据+
或-
对两个结果进行相加或相减。你返回结果。*/%
,如果包含,则迭代计算operator_position
前后的两个独立子字符串,然后对这两个值进行乘、除或模运算并返回结果。number
,并且您将字符串转换为double(std::stod(expression)
)并返回它。这个迭代算法会神奇地正确计算任何数学表达式。