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