elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Lista de Operadores Matematicos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lista de Operadores Matematicos  (Leído 1,110 veces)
rigorvzla

Desconectado Desconectado

Mensajes: 202


Ver Perfil
Lista de Operadores Matematicos
« 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]);}
espero puedan ayudarme a resolver este problema



En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 2.797


Ver Perfil
Re: Lista de Operadores Matematicos
« Respuesta #1 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.


En línea

Mr. NoBody

Desconectado Desconectado

Mensajes: 20


"You Take The Red Pill - You Stay In Wonderland"


Ver Perfil
Re: Lista de Operadores Matematicos
« Respuesta #2 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. 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
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Validates the syntax of an arithmetic expression.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <example> This is a code example.
  7. ''' <code language="VB.NET">
  8. ''' Dim expr As String = "1 + ABC"
  9. ''' Dim isValid As Boolean = ValidateExpression(expr)
  10. ''' </code>
  11. ''' </example>
  12. ''' ----------------------------------------------------------------------------------------------------
  13. ''' <returns>
  14. ''' <see langword="True"/> if the arithmetic expression does not contain syntax errors,
  15. ''' otherwise, <see langword="False"/>.
  16. ''' </returns>
  17. ''' ----------------------------------------------------------------------------------------------------
  18. <DebuggerStepThrough>
  19. Public Shared Function ValidateExpression(expr As String) As Boolean
  20.  
  21.    Dim calc As New Global.NCalc.Expression(expr)
  22.  
  23.    If calc.HasErrors() Then
  24.        Return False
  25.    End If
  26.  
  27.    Try
  28.        Decimal.TryParse(CStr(calc.Evaluate()), New Decimal)
  29.        Return True
  30.  
  31.    Catch
  32.        Return False
  33.  
  34.    End Try
  35.  
  36. End Function
  37.  

Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Evaluate and return the result of an arithmetic expression.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <example> This is a code example.
  7. ''' <code language="VB.NET">
  8. ''' Dim expr As String = "(1 + (2 - 2)) * (100 / 2.5)" ' = 40
  9. ''' Dim result As Decimal = EvaluateExpression(expr)
  10. ''' </code>
  11. ''' </example>
  12. ''' ----------------------------------------------------------------------------------------------------
  13. ''' <returns>
  14. ''' The resulting value.
  15. ''' </returns>
  16. ''' ----------------------------------------------------------------------------------------------------
  17. ''' <exception cref="Global.NCalc.EvaluationException">
  18. ''' </exception>
  19. ''' ----------------------------------------------------------------------------------------------------
  20. <DebuggerStepThrough>
  21. Public Shared Function EvaluateExpression(expr As String) As Decimal
  22.  
  23.    Dim calc As New Global.NCalc.Expression(expr)
  24.    Dim result As Decimal
  25.  
  26.    If calc.HasErrors() Then
  27.        Throw New Global.NCalc.EvaluationException(message:=calc.Error)
  28.  
  29.    Else
  30.        Try
  31.            result = CDec(calc.Evaluate())
  32.            Return result
  33.  
  34.        Catch ex As Global.NCalc.EvaluationException
  35.            Throw
  36.  
  37.        Catch ex As ArgumentException
  38.            Throw New Global.NCalc.EvaluationException(message:=ex.Message)
  39.  
  40.        Catch ex As Exception
  41.            Throw
  42.  
  43.        End Try
  44.  
  45.    End If
  46.  
  47. End Function

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.
« Última modificación: 9 Febrero 2021, 23:27 pm por Mr. NoBody » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 2.797


Ver Perfil
Re: Lista de Operadores Matematicos
« Respuesta #3 en: 10 Febrero 2021, 02:33 am »

La solución que te ofrece Elek... digo el señor Nobody, es muy válida cuando tengas expresiones enteramente textuales, pero si el contenido procede de entresacar valores de alguna parte que vuelcas sobre un array, es preferible el método que te he descrito... también será más rápido.

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
  1. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  2.        Dim v() As String, o() As String
  3.        Dim resultado As Single
  4.  
  5.        ReDim v(0 To 4), o(0 To 4)
  6.        v(4) = "5" : v(3) = "7" : v(2) = "11" : v(1) = "13" : v(0) = "17"
  7.        o(4) = "/" : o(3) = "-" : o(2) = "+" : o(1) = "*" : o(0) = "+"
  8.  
  9.        resultado = LaClaseDondeLoPongas.Operandos.Totalizar(v, o)
  10.        System.Windows.Forms.MessageBox.Show(resultado.ToString)
  11.    End Sub
  12.  
  13.  

Y el código que realiza todo el trabajo:
Código
  1.  Public Structure Operandos
  2.        Public Total As Single
  3.        Private Operando As Integer
  4.        Private Operador As Operadores
  5.  
  6.        Public Enum Operadores
  7.            OPERADOR_SUMA = 0
  8.            OPERADOR_RESTA = 1
  9.            OPERADOR_MULTIPLICA = 2
  10.            OPERADOR_DIVIDE = 3
  11.        End Enum
  12.  
  13.        Public Shared Function Totalizar(ByRef Valores() As String, ByRef Operadores() As String) As Single
  14.            Dim k As UInt32
  15.            Dim T As New Operandos
  16.            Dim Resul As New Operandos
  17.  
  18.            ' NOTA: se supone que ambos arrays son igual de largos (el primer valor se considera 0, luego se entiende que el operador para el primer operando es '+').
  19.            ' Procesa un operando de cada vez, con el operador asociado sobre el total acumulado
  20.            '    (si entendi mal deberas corregirlo a tus necesidades)
  21.            For k = 0 To Valores.Length - 1
  22.                With T
  23.                    .Operando = Convert.ToInt32(Valores(k))
  24.                    .Operador = ToOperador(Operadores(k))
  25.                    .Total = Resul.Total
  26.                    Resul = (T = Resul)
  27.                End With
  28.            Next
  29.  
  30.            Return Resul.Total
  31.        End Function
  32.  
  33.        Public Shared Operator =(ByVal XY As Operandos, ByVal R As Operandos) As Operandos
  34.            With XY
  35.                Select Case .Operador
  36.                    Case Operadores.OPERADOR_SUMA
  37.                        Try
  38.                            .Total += .Operando
  39.                        Catch ex As Exception
  40.                            System.Windows.Forms.MessageBox.Show(ex.Message)
  41.                        End Try
  42.                    Case Operadores.OPERADOR_RESTA
  43.                        Try
  44.                            .Total -= .Operando
  45.                        Catch ex As Exception
  46.                            System.Windows.Forms.MessageBox.Show(ex.Message)
  47.                        End Try
  48.                    Case Operadores.OPERADOR_MULTIPLICA
  49.                        Try
  50.                            .Total *= .Operando
  51.                        Catch ex As Exception   ' desbordamiento, etc...
  52.                            System.Windows.Forms.MessageBox.Show(ex.Message)
  53.                        End Try
  54.                    Case Operadores.OPERADOR_DIVIDE
  55.                        Try
  56.                            .Total /= .Operando
  57.                        Catch ex As Exception   ' division por 0, etc...
  58.                            System.Windows.Forms.MessageBox.Show(ex.Message)
  59.                        End Try
  60.                End Select
  61.  
  62.                Return XY
  63.            End With
  64.        End Operator
  65.  
  66.        ' Declarar un operador '=' exige declarar tambien otro '<>' (aunque no lo usemos).
  67.        Public Shared Operator <>(ByVal XY As Operandos, ByVal R As Operandos) As Operandos
  68.            Return Nothing
  69.        End Operator
  70.  
  71.        ' Resulta autoexplicativo...
  72.        Private Shared Function ToOperador(ByVal Op As String) As Operadores
  73.            Select Case Op.Trim
  74.                Case "+" : Return Operadores.OPERADOR_SUMA
  75.                Case "-" : Return Operadores.OPERADOR_RESTA
  76.                Case "*" : Return Operadores.OPERADOR_MULTIPLICA
  77.                Case "/" : Return Operadores.OPERADOR_DIVIDE
  78.            End Select
  79.        End Function
  80.  End Structure
  81.  
En línea

rigorvzla

Desconectado Desconectado

Mensajes: 202


Ver Perfil
Re: Lista de Operadores Matematicos
« Respuesta #4 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++)
            {
                string calc = $"{ListaSimbolos[i]}{valores[i]}";
                if (calc.Contains("+"))
                {
                    calculo = calculo + Convert.ToInt32(calc);
                }
                else if (calc.Contains("-"))
                {
                    calculo = calculo + Convert.ToInt32(calc);
                }
                else if (calc.Contains("*"))
                {
                    string ca = calc.Replace("*", " ").Trim();
                    calculo = Convert.ToInt32(calculo) * Convert.ToInt32(ca);
                }

                else if (calc.Contains("/"))
                {               
                    string ca = calc.Replace("/", " ").Trim();
                    calculo = Convert.ToInt32(calculo) / Convert.ToInt32(ca);
                }
            }

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.
En línea

Mr. NoBody

Desconectado Desconectado

Mensajes: 20


"You Take The Red Pill - You Stay In Wonderland"


Ver Perfil
Re: Lista de Operadores Matematicos
« Respuesta #5 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!
« Última modificación: 10 Febrero 2021, 23:42 pm por Mr. NoBody » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 524



Ver Perfil
Re: Lista de Operadores Matematicos
« Respuesta #6 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 +.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda Matematicos!!! « 1 2 »
Programación Visual Basic
IvanUgu 11 3,970 Último mensaje 20 Diciembre 2008, 18:12 pm
por el_c0c0
Ejercicios matemáticos
Ejercicios
@synthesize 2 4,090 Último mensaje 31 Diciembre 2009, 18:59 pm
por MIG80
Matemáticos, ¡os invoco!, pido su ayuda.
Foro Libre
ignorantev1.1 8 2,828 Último mensaje 12 Marzo 2014, 17:24 pm
por programatrix
Siguen las multas a operadores que incluyen a clientes en la lista de morosos...
Noticias
wolfbcn 0 1,021 Último mensaje 21 Mayo 2015, 21:46 pm
por wolfbcn
¿Cuáles son los operadores principales de España? La CNMC publica una lista ...
Noticias
wolfbcn 0 402 Último mensaje 28 Noviembre 2018, 21:32 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines