wee1`

by 3334 on July 22nd, 2010
No notes
Syntax: No syntax
Show lines - Hide lines - Show in textbox - Download
//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);		
 
 

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS