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; }
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; }
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; } }
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; }
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; } }