ONP - problem z mnożeniem i dzieleniem


(Phinsectoman) #1

Siemka!

Mam problem. Moja klasa w onp oblicza bez problemu wiele działań, ale ma problem przy takich: 3/5*2. 

W czym problem? Powinna najpierw podzielić 3/5 a potem pomnożyć wynik przez 2. Niestety. Robi na odwrót. 

Oto moja klasa:

QString onp::RPN(QString operation)
{
       //operation=popraw_string(operation);
       QStack <QChar> stos;
       int i=0;

       while(operation.length()>i)
       {
           if(operation[i]>='0'&&operation[i]<='9')
           {
               while((operation[i]>='0'&&operation[i]<='9')||operation[i]=='.')
               {
                   result.push_back(operation[i]);
                   i++;
               }
           }
           result.push_back(" ");
           if(stos.size()>0)
           {
               if(operation[i]=='+'||operation[i]=='-')
               {
                   while(stos.top()!='(')
                   {
                      result.push_back(stos.top());
                      stos.pop();
                      result.push_back(" ");
                      if(stos.size()==0)
                      {
                          break;
                      }
                  }
                  stos.push(operation[i]);
                  i++;
              }
              else if(operation[i]=='/'||operation[i]=='*')
              {
                  while(stos.top()!='('&&stos.top()=='^')
                  {
                      result.push_back(stos.top());
                      stos.pop();
                      result.push_back(" ");
                      if(stos.size()==0)
                      {
                          break;
                      }
                  }
                  stos.push(operation[i]);
                  i++;
              }
              else if(operation[i]=='^')
              {
                  stos.push(operation[i]);
                  i++;
              }
              else if(operation[i]=='(')
              {
                  stos.push(operation[i]);
                  i++;
              }
              else if(operation[i]==')')
              {
                  while(stos.top()!='('&&stos.size()>1)
                  {
                      result.push_back(stos.top());
                      result.push_back(" ");
                      stos.pop();
                  }
                  if(stos.size())
                  {
                      stos.pop();
                  }
                  i++;
              }
           }
           else
           {
               stos.push(operation[i]);
               i++;
           }
       }
       while(stos.size())
       {
           if(stos.top()!=')')
           {
               result.push_back(stos.top());
               result.push_back(" ");
           }
           stos.pop();
       }
       return result;
}

double onp::RPN_wynik(QString string)
{
    QStack <double> stos;
    QString pom2="";
    int i=0;
    double a=0,b=0,pom=0;

    while(string.length()>i)
    {
        if(string[i]>='0'&&string[i]<='9')
        {
            while(string[i]!=' ')
            {
                pom2.push_back(string[i]);
                i++;
            }
            stos.push(pom2.toDouble());
            pom2="";
        }
        if(string[i]=='+')
        {
            a=stos.pop();
            b=stos.pop();
            pom=a+b;
            stos.push(pom);
            i++;
        }
        else if(string[i]=='-')
        {
            a=stos.pop();
            b=stos.pop();
            pom=b-a;
            stos.push(pom);
            i++;
        }
        else if(string[i]=='*')
        {
            a=stos.pop();
            b=stos.pop();
            pom=a*b;
            stos.push(pom);
            i++;
        }
        else if(string[i]=='/')
        {
            a=stos.pop();
            b=stos.pop();
            if(a!=0)
            {
                pom=b/a;
                stos.push(pom);
                i++;
            }
            else
            {
                return INFINITY;
            }
        }
        else if(string[i]=='^')
        {
            a=stos.pop();
            b=stos.pop();
            pom=pow(b,a);
            stos.push(pom);
            i++;
        }
        else if(string[i]==' ')
        {
            i++;
        }
    }
    return stos.pop();
}

Wiecie może w czym problem?

Problem pokonany. Pytanie jak się zmierzyć z liczbami ujemnymi w zadanym wyrażeniu? Np.: 3+-2*3


(kostek135) #2

Najprościej przejść przez całość. Jeśli dwa znaki arytmetyczne występują obok siebie wstawić pomiędzy nie 0 i całość od 0 z drugim znakiem i drugim składnikiem wziąć w nawias, np.: 3+(0-2)*3. Po takim wstępnym prze-parsowaniu wykonać standardową procedurę.