예제 #1
0
Elemento * Operacion::procesarStringHijo(string string) {
	Elemento * resultado;
	eliminarParentesisInnecesarios(string);
	if (indiceMenorPrecedencia(string) == -1) {
		resultado = new Operando(stod(string));
	} else {
		resultado = new Operacion(string);
	}
	return resultado;
}
예제 #2
0
Elemento * Operacion::descomponer() {

	Elemento * resultado;
	int indice = indiceMenorPrecedencia(operacion);

	if (indice == -1) {
		resultado = new Operando(stod(operacion));
	} else {
		//hacer diagrama con una operacion para entender como descomponrlay que elemento crear
		//Agregar los nuevos operadores
		string izq = operacion.substr(0, indice);
		string cen = operacion.substr(indice, 1);
		string der = operacion.substr(indice + 1, operacion.length() - indice - 1);

		switch (cen[0]) {
		case 'sin':
			resultado = new OperadorSen();
			break;
		case 'cos':
			resultado = new OperadorCos();
			break;
		case 'tan':
			resultado = new OperadorTan();
			break;
		case 'log':
			resultado = new OperadorLn();
			break;
		case '+':
			resultado = new OperadorSuma();
			break;
		case '-':
			resultado = new OperadorResta();
			break;
		case '/':
			resultado = new OperadorDivision();
			break;
		case'*':
			resultado = new OperadorMultiplicacion();
			break;
		case '^':
			resultado = new OperadorElevacion();
			break;
		case 'FUNC':
			resultado = new OperadorFuncion();
			break;
		default:
			resultado = NULL;
			break;
		}

		resultado->setHijoIzquierdo(procesarStringHijo(izq));
		resultado->setHijoDerecho(procesarStringHijo(der));
	}
	return resultado;
}
예제 #3
0
NodoArbol<Elemento *> * Operacion::descomponer() {

	NodoArbol <Elemento *> * resultado = NULL;
	Elemento * elementoResultado = NULL;
	int indice = indiceMenorPrecedencia(operacion);
	string cen = operacion.substr(indice, 1);

	if (indice == -1) {
		elementoResultado = new Operando(stod(operacion));
		resultado = new NodoArbol<Elemento *>(elementoResultado);
		return resultado;
	}
	else if (indice == 0 && cen == "F"){
		//string cen = operacion.substr(indice, 1);
		elementoResultado = new OperadorFuncion();
		resultado = new NodoArbol<Elemento *>(elementoResultado);
		string der = operacion.substr(indice + 2, operacion.length() - indice - 2);
		istringstream ss(der);
		string token;
		while (getline(ss, token, ',')) {

			resultado->agregarHijo(procesarStringHijo(token));
			return resultado;
		}
	}
	else if (indice == 0){
		string cen = operacion.substr(indice, 1);
		string der = operacion.substr(indice + 1, operacion.length() - indice - 1);

		switch (cen[0]) {
		case 's':
			elementoResultado = new OperadorSen();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		case 'c':
			elementoResultado = new OperadorCos();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		case 't':
			elementoResultado = new OperadorTan();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		case 'l':
			elementoResultado = new OperadorLn();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		default:
			resultado = NULL;
			break;
		}

		resultado->agregarHijo(procesarStringHijo(der));
		return resultado;
	}
	else{
		string izq = operacion.substr(0, indice);
		string cen = operacion.substr(indice, 1);
		string der = operacion.substr(indice + 1, operacion.length() - indice - 1);

		switch (cen[0]) {
		case '+':
			elementoResultado = new OperadorSuma();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		case '-':
			elementoResultado = new OperadorResta();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		case '/':
			elementoResultado = new OperadorDivision();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		case'*':
			elementoResultado = new OperadorMultiplicacion();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		case '^':
			elementoResultado = new OperadorElevacion();
			resultado = new NodoArbol<Elemento *>(elementoResultado);
			break;
		default:
			resultado = NULL;
			break;
		}

		resultado->agregarHijo(procesarStringHijo(izq));
		resultado->agregarHijo(procesarStringHijo(der));
		return resultado;
	}

}
예제 #4
0
NodoArbol<Elemento *> * Operacion::descomponer() {

	Elemento * resultado;
	NodoArbol<Elemento *> * resultadoNodo;
	int indice = indiceMenorPrecedencia(operacion);
	string cen = operacion.substr(indice, 1);
	if (indice == -1) {
		resultado = new Operando(stod(operacion));
		//return new NodoArbol<Elemento *>(resultado);
	}
	else {		
		if (cen == "f"){
			resultado = new OperadorFunction();
			string a = operacion.substr(indice + 2, operacion.length() - indice - 1);
			istringstream op(a);
			string operando;
			while (getline(op, operando, ',')){
				resultadoNodo->setNode(new NodoArbol<Elemento *>(resultado));
				return resultadoNodo;
			}
		}
		else {
			if (cen == "s" || cen == "c" || cen == "t" || cen == "l"){
				string a = operacion.substr(indice, 1);
				string b = operacion.substr(indice + 1, operacion.length() - indice - 1);

				switch (cen[0]) {
				case 's':
					resultado = new OperadorSeno();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);// debe agregar nuevo nodo que contenga la operacion
					break;
				case 'c':
					resultado = new OperadorCoseno();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				case 't':
					resultado = new OperadorTangente();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				case 'l':
					resultado = new OperadorLogNatural();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				default:
					resultado = NULL;
					break;
				}
				resultadoNodo->setNode(new NodoArbol<Elemento *>(procesarStringHijo(b)));
				return resultadoNodo;
			}
			else {
				string a = operacion.substr(0, indice);
				string b = operacion.substr(indice, 1);
				string c = operacion.substr(indice + 1, operacion.length() - indice - 1);

				switch (cen[0]) {
				case '+':
					resultado = new OperadorSuma();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				case '-':
					resultado = new OperadorResta();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				case'*':
					resultado = new OperadorMultiplicacion();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				case '/':
					resultado = new OperadorDivision();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				case '^':
					resultado = new OperadorExponencial();
					resultadoNodo = new NodoArbol<Elemento *>(resultado);
					break;
				default:
					resultado = NULL;
					break;
				}
				resultadoNodo->setNode(new NodoArbol<Elemento *>(procesarStringHijo(a)));
				resultadoNodo->setNode(new NodoArbol<Elemento *>(procesarStringHijo(c)));
			}
		}
	}
	return resultadoNodo;
}
예제 #5
0
NodoArbol<Elemento*> * Operacion::descomponer() {

	NodoArbol<Elemento*> * resultado;
	Elemento * res;
	int indice = indiceMenorPrecedencia(operacion);
	string centro = operacion.substr(indice, 1);

	if (indice == -1) {
		res = new Operando(stod(operacion)); //convierto el string a double para poder procesarlo
		resultado = new NodoArbol<Elemento*>(res);
		return resultado;
	} 
	else if (indice == 0 && centro == "F") {
		res = new OperadorFuncion();
		resultado = new NodoArbol<Elemento *>(res);
		string derecha = operacion.substr(indice + 2, operacion.length() - indice - 2);
		istringstream strDer(derecha); //Procesarlo como objeto string
		string marcador;
		while (getline(strDer, marcador, ',')) {
			resultado->agregarHijo(procesarStringHijo(marcador));
			return resultado;
		}
	}
	else if (indice == 0){
		string centro = operacion.substr(indice, 1);
		string derecha = operacion.substr(indice + 1, operacion.length() - indice - 1);

		switch (centro[0]) {
		case 's':
			res = new OperadorSeno();
			resultado = new NodoArbol<Elemento *>(res);
			break;
		case 'c':
			res = new OperadorCoseno();
			resultado = new NodoArbol<Elemento *>(res);
			break;
		case 't':
			res = new OperadorTangente();
			resultado = new NodoArbol<Elemento *>(res);
			break;
		case 'l':
			res = new OperadorLogaritmo();
			resultado = new NodoArbol<Elemento *>(res);
			break;
		default:
			resultado = NULL;
			break;
		}

		resultado->agregarHijo(procesarStringHijo(derecha));
		return resultado;
	}
	else {

		string izquierda = operacion.substr(0, indice);
		string centro = operacion.substr(indice, 1);
		string derecha = operacion.substr(indice + 1, operacion.length() - indice - 1);

		switch (centro[0]) {
		case '+':
			res = new OperadorSuma();
			resultado = new NodoArbol<Elemento*>(res);
			break;
		case '-':
			res = new OperadorResta();
			resultado = new NodoArbol<Elemento*>(res);
			break;
		case '/':
			res = new OperadorDivision();
			resultado = new NodoArbol<Elemento*>(res);
			break;
		case'*':
			res = new OperadorMultiplicacion();
			resultado = new NodoArbol<Elemento*>(res);
			break;
		default:
			resultado = NULL;
			break;
		}

		resultado->agregarHijo(procesarStringHijo(izquierda));
		resultado->agregarHijo(procesarStringHijo(derecha));
		return resultado;
	}
}