wee1`
No notes
Syntax:
No syntax
//RWAT 2009 MathExpressionResolverCLS.cpp
#include "mathexpressionresolvercls.h"
MathExpressionResolverCLS::MathExpressionResolverCLS(QWidget* _parent) : parent(_parent)
{
}
QString MathExpressionResolverCLS::expressionResolver(QString Expression){
QStringList SubExpList; SubExpList.clear();
//testCode ONLY
SubExpList<<Expression;
//RemainingExpression=Expression;
QString FinalFigure=Expression; //Gets returned
/*QStringList SeparatorList; SeparatorList.clear(); SeparatorList<<"("<<")"<<" ";
//split expression into any subexpressions
for(int i=0; i<Expression.count(); i++){
QString Letter=Letter=RemainingExpression.left(1);
if((i>0)&&(SeparatorList.contains(Letter))){
double SubResult=0;
check+=subExpressionResolver(SubExpression, SubResult);
ConsolidatedExpression=ConsolidatedExpression+QString::number(SubResult,'f',12);;
SubExpression="";
continue;
}
else{
SubExpression=SubExpression+Letter
}
}
*/
double Final=0;
int check=0;
for(int i=0;i<SubExpList.count(); i++){
double SubResult=0;
check+=subExpressionResolver(SubExpList[i], SubResult);
Final+=SubResult;
}// for i SubExpList
if(check==0)
FinalFigure=QString::number(Final,'f',3);
else
qDebug()<<"Expression resolver: Not good, check > 0 probably not a number"<<endl;
return FinalFigure;
}//expressionResolver(){
int MathExpressionResolverCLS::subExpressionResolver(QString SubExpression, double& Final){
//Remove all white spaces if there are any left (should not be since Full expression is split on white space)
SubExpression=SubExpression.remove(" ");
int check=0;
QStringList NumberComponentList; NumberComponentList.clear(); NumberComponentList<<"0"<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"7"<<"8"<<"9"<<".";
QStringList OperatorList; OperatorList.clear(); OperatorList<<"*"<<"/"<<"+"<<"-";
QStringList ExpNumberList; ExpNumberList.clear();
QStringList ExpOperatorList; ExpOperatorList.clear();
QString RemainingExpression=SubExpression;
QString CurrentNumber="";
QString Follow="Number";
//Put all numbers into one string (ExpNumberList), and operators into another string (ExpOperatorList).
for(int i=0; i<SubExpression.count(); i++){
QString Letter=RemainingExpression.left(1);
if((i==0)&&(OperatorList.contains(Letter))){ //If the first character is an operator, check that it is "-" and add it to the number that will be built
if(Letter!="-"){
QMessageBox::information(parent,"OSTClient","Expression starts with an invalid operator");
check++;
return check;
}
else{
CurrentNumber=Letter;
Follow="Number";
}
}
else if(NumberComponentList.contains(Letter)){//is it a number?
if(Follow=="Number"){//Append letter to number
CurrentNumber=CurrentNumber+Letter;
}
else if (Follow=="Operator"){//Start a new number
CurrentNumber=Letter;
}
Follow="Number";
}
else if(OperatorList.contains(Letter)){//or is it an operator?
ExpNumberList<<CurrentNumber;//Store the number currently been built
CurrentNumber=""; //clear the number
ExpOperatorList<<Letter;
Follow="Operator";
}
else{//non-valid symbol in expression, cannot resolve
check++;
return check;
}
//remove the leftmost character (Letter)
RemainingExpression=RemainingExpression.right((RemainingExpression.count()-1));
}//for
ExpNumberList<<CurrentNumber;//Store any number currently being built (this is for the last number which is not followed by an operators
//Check that there is exactly one more number in the expression than there are operators
if(ExpNumberList.count()!=(ExpOperatorList.count()+1)){
QMessageBox::information(parent,"OSTClient", "Expression seems incomplete, cannot resolve");
check++;
return check;
}
//qDebug()<<ExpNumberList;
//qDebug()<<ExpOperatorList;
//Process the lists numerically
QStringList RemainingOperatorList=ExpOperatorList;
QList < double > RemainingNumberListD; RemainingNumberListD.clear();
for(int i=0;i<ExpNumberList.count();i++){
RemainingNumberListD<<ExpNumberList[i].toDouble();
}
//qDebug()<<"start calc";
//qDebug()<<RemainingNumberListD;
QList < double > TempNumberList; TempNumberList.clear();
QStringList TempOperatorList; TempOperatorList.clear();
//Multiplication
double Result=RemainingNumberListD[0];
for(int i=0; i<RemainingNumberListD.count()-1;i++){
if(RemainingOperatorList[i]=="*"){
Result=Result*RemainingNumberListD[i+1];
}
else if(RemainingOperatorList[i]=="/"){
Result=Result/RemainingNumberListD[i+1];
}
else{
TempNumberList<<Result;
Result=RemainingNumberListD[i+1];
TempOperatorList<<RemainingOperatorList[i];
}
}//For Multiplication
if(RemainingNumberListD.count()>RemainingOperatorList.count()) TempNumberList<<Result;
RemainingOperatorList.clear(); RemainingOperatorList=TempOperatorList; TempOperatorList.clear();
RemainingNumberListD.clear();
RemainingNumberListD=TempNumberList;
TempNumberList.clear();
//qDebug()<<"after mult";
//qDebug()<<RemainingNumberListD;
//Plus and Minus
Result=RemainingNumberListD[0];
for(int i=0; i<RemainingOperatorList.count();i++){
if(RemainingOperatorList[i]=="+"){
Result=Result+RemainingNumberListD[i+1];
}
else if(RemainingOperatorList[i]=="-"){
Result=Result-RemainingNumberListD[i+1];
}
}//For Plus
//qDebug()<<"after plus";
//qDebug()<<RemainingNumberListD;
Final=Result;
return check;
}//check=subExpressionResolver(BracketList[i], Final);