Título: Lista de Operadores Matematicos Publicado por: rigorvzla en 9 Febrero 2021, 18:19 pm Hola a todos, estoy en un problema, creo una lista de tipo string, donde guardo los simbolos matematicos, (+) (-) (*) (/), quiero usarlos para que hagan su funcion de acuerdo a lo que pido, pero no encuentro como hacerlo.
actualemnte esta asi Código: calculo = calculo + Convert.ToInt32(valores[i]); pero lo necesito asi Código: for{ calculo = calculo ListaSimbolo[i] Convert.ToInt32(valores[i]);} Título: Re: Lista de Operadores Matematicos Publicado por: Serapis en 9 Febrero 2021, 21:41 pm Los operadores no son variables.
...pero, en .NET puedes sobrecargar los operadores o definir los propios. Podrías implementar un operador 'Operar(x,y,z)', donde uno de los parámetros fuera precisamente el operador a utilizar (basado en una enumeración), los otros parámetros serían los propios del operador. en realidad equivaldría a una función donde pasas esos parámetros y allí mediante un 'select case' evalúa la expresión con el operador elegido. La ventaja de definir e implementar un operador es que se puede usar de la manera concreta que precises. Título: Re: Lista de Operadores Matematicos Publicado por: Mr. NoBody en 9 Febrero 2021, 21:42 pm No pierdas el tiempo ni reinventes la rueda, utiliza un evaluador de expresiones matemáticas. O bien eliges utilizar la función Eval de javascript (mediante el motor de JS de .NET), o bien eliges utilizar la librería de terceros NCalc:
Eval y NCalc son metodologías que implican un tiempo lento de inicialización, pero ambas son robustas, a prueba de fallos. Aquí puedes ver el sofisticado procedimiento de análisis o data parsing y compilación de una expresión matemática con NCalc: https://github.com/ncalc/.../NCalcParser (https://github.com/ncalc/ncalc/blob/master/Evaluant.Calculator/NCalcParser.cs). En general, evaluar expresiones con NCalc es bastante más rápido que con Eval, esto sobre todo se nota al medir el tiempo de ejecución cuando llevamos a cabo muchas operaciones de forma consecutivas en búcle, y en fin, es una solución open-source. Ejemplo propio en VB.NET para validar sintaxis, y evaluar expresión: Código
Código
Importante: NCalc no se limita solamente a evaluar expresiones de tipos numéricos, sino que además puede evaluar otros tipos como DateTime y comparaciones de caracteres entre strings, pero las funciones ValidateExpression y EvaluateExpression del código de arriba funcionarán de forma correcta solamente con los tipos simples numéricos, es decir integrales o de punto flotante ( https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/value-types#built-in-value-types ) ya que es el uso que se le pretende dar. Si prefieres hacerte el guiso por ti mismo, aquí tienes otras alternativas en C# (ordenados por fecha de antiguedad):
Saludos. Título: Re: Lista de Operadores Matematicos Publicado por: Serapis en 10 Febrero 2021, 02:33 am La solución que te ofrece
Te pongo un ejemplo, tu completa, corrige allí donde precises y haz los cambios que necesites... Primero el código de ejemplo... cuyo resultado arroja 45. (LaClaseDondeLoPongas hace referencia a una clase donde coloques el código de la siguiente sección) Código
Y el código que realiza todo el trabajo: Código
Título: Re: Lista de Operadores Matematicos Publicado por: rigorvzla en 10 Febrero 2021, 18:17 pm MUCHISIMAS MUCHISIMAS GRACIAS!!! Elektro mucho tiempo sin saber de ti, q bueno estas vivo aun jeje , ya me pondre con ello de inmediato a ver como optimizar el codigo , de todos modos les compartire la solucion que encontre de momento.
Código: for (int i = 0; i < valores.Length; i++) Explico de manera rapida, creo una lista de los signos que pido en su respectivo orden, luego obtengo cada numero y evaluo el simbolo que tiene cada valor para asi , ejecutar dicha operacion matematica, creanlo o no, me ha servido , pero si , con Ncalc simplifico esto estaria espectacular. Nuevamente gracias y me pondre con esto. saludos a todos los q me ayudaron, gracias. Título: Re: Lista de Operadores Matematicos Publicado por: Mr. NoBody en 10 Febrero 2021, 23:11 pm les compartire la solucion que encontre de momento. Si quieres micro-optimizar ese código entonces quizás podrías tratar de aplicar el ejemplo del usuario Serapis ya que ha invertido tiempo en hacerlo y es más completo o sofisticado que la solución actual que aplicaste, donde su ejemplo de usar Select Case / switch es más apropiado (y también más elegante, dicho sea de paso) que utilizar un bloque de condicionales else + contains ya que tienes un set de símbolos o valores fijos ( https://www.geeksforgeeks.org/switch-vs-else/ ). Además deberías intentar tener presente utilizar la asignación compuesta del operador de suma (+=) en tu variable "calculo" ( https://www.tutorialspoint.com/compound-assignment-operators-in-chash ), lo cual no optimiza el código pero simplifica bastante la comprensión del código fuente. De todas formas a mi no me convence el enfoque que ambos le dieron, en tu caso fíjate que al final estás tratanto con varias funciones de tratamiento de cadenas de texto como string.replace y string.trim, y luego haciendo distintas operaciones sobre un mismo valor numérico, para eso sería preferible que directamente lo simplificases construyendo un string completo con la expresión matemática y pasárselo a NCalc, pero bueno, por otro lado pienso que cualquier opción o solución es igual de válida mientras el resultado sea exitoso. pero si , con Ncalc simplifico esto estaria espectacular Poder se podría siempre y cuando le des el enfoque de construir un string / expresión matemática en lugar de hacerlo como lo estás haciendo actualmente, pero ya no merece la pena mientras tu código actual te funcione de forma exitosa no hay necesidad real de desecharlo o adaptarlo para hacer las cosas de forma distinta. Lo que yo te diría es que intentes considerar NCalc para futuras necesidades, por que te podrá venir de perlas. Saludos! Título: Re: Lista de Operadores Matematicos Publicado por: Tachikomaia en 10 Febrero 2021, 23:54 pm Yo veo un error en el "-". En los otros 3 símbolos se repiten 2 veces, pero en este caso hay un +.
|