C++算法代码无法正确编译

4si2a6ki  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(164)

我写这段代码是为了一个项目,来计算一个算法方程,如果它的字符串中没有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,情况正好相反,我得到的求值结果是正确的假,但不是实际的正确值。

khbbv19g

khbbv19g1#

你的算法比你写的要多得多,很明显,它的目标不是寻找a,而是计算整个数学表达式。
此外,你的算法是有缺陷的在许多方面,我只是指出一些在这里:
1.输入的if

string alg;
if(!alg.find('a')) {

始终为真,因为alg中从来没有“a”,因为alg就在前一行创建为空。
1.这只是复制整个字符串

szz = expression.size();
alg = expression.copy(0, szz);

并且100%等价于string alg = expression;
1.不需要for循环

for (i = 0; i <= szz; ++i) {
   alg.find_first_of('*/%');

因为find_first_of做了它所宣传的事情,并且已经在字符串本身上循环。
1.你只需要丢弃alg.find_first_of('*/%');的返回值,你想写int operator_position = alg.find_first_of('*/%');,然后你知道在alg[operator_position]有一个*/%
1.您有多个此类行

isdigit(alg[i] - '*')

但我很明显这不是你想要的。从你的代码逻辑来看,我理解你需要知道alg中的子字符串是一个数字(还是一个包含+-*/%的表达式)。你的语句只作用于一个字符
1.其他潜在问题。
你描述的实际问题可以很容易地解决:

bool Evaluate(const string& expression, int& value){
    if (expression.find('a')!=string::npos) {
       // whatever it means to "contain the value" ????
       return false;
    }
    value = 0;
    return true;
}
  • 但是 * 这将没有合理的目的,我相信你真的只是歪曲了所提出的实际问题......

下面是我所推断的实际相关问题和算法:问:用字符串计算数学表达式并返回答案,因此“2*6+4-6/2”应该返回13,如果你想实现这一点,你需要迭代函数调用Evaluate,我建议使用double Evaluate(const string& expression)

  • 你计算你的字符串是否包含+-中的任何一个。如果是,你迭代计算两个独立的部分(使用expression.substr(start,length)),在operator_position之前(见上面的提示)。然后根据+-对两个结果进行相加或相减。你返回结果。
  • (else)计算字符串中是否包含*/%,如果包含,则迭代计算operator_position前后的两个独立子字符串,然后对这两个值进行乘、除或模运算并返回结果。
  • 如果以上两个都不是,那么剩下的表达式必须是number,并且您将字符串转换为double(std::stod(expression))并返回它。

这个迭代算法会神奇地正确计算任何数学表达式。

相关问题