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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  calculadora por jerarquia ()*/+- ...C#...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: calculadora por jerarquia ()*/+- ...C#...  (Leído 47,231 veces)
clipto

Desconectado Desconectado

Mensajes: 27


Ver Perfil WWW
Re: calculadora por jerarquia ()*/+- ...C#...
« Respuesta #20 en: 1 Agosto 2009, 01:29 am »

bueno he estado pendiente de estos post porque me gustaria emplear las pilas (para casos como este u otros) pero buscando en internet encontre esto:



pero mi duda consiste esque ese ejemplo muesta que toma desde el ultimo valor y va calculado, pero mi duda consiste enque ahi esta organizado pero en una cadena desorganizada por lo menos la siguiente:
((5*8)-2)+5-7

donde segun las pilas empesaria por el ultimo valor, pero por jerarquia deberia empezar por 5*8 desde los primeros valores hasta el ultimo; y expresiones mas complejas como la dicha por raul338
 6 + (8 + 3) - [6 * (3 + 2) + 5] * (2 * 10 / 5) + (5 * ((2 * 6) + 2)

entonces ¿es necesario que esten organizadas las expresiones para que las pilas funcionen?


En línea

h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: calculadora por jerarquia ()*/+- ...C#...
« Respuesta #21 en: 1 Agosto 2009, 03:37 am »

Creo que uno no siempre comienza con el último valor, ya que hay métodos en listas enlazadas para encontrar un elemento el cual "analizar" o en este caso, resolver.

Nuevamente,disculpas si me equivoco..


En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: calculadora por jerarquia ()*/+- ...C#...
« Respuesta #22 en: 1 Agosto 2009, 16:16 pm »

La ayudita de clipto me sirvio, y creo encontrar el error jeje.... y estuve pensando, estamos mal en no tomar en cuenta los parentesis como deberian ser tomados!!!!
Nosotros en matematicas que hacemos si vemos un parentesis, corchetes o llaves???? Primero resolvemos lo que esta dentro y despues continuamos. Asi que, en la pila podria quedar asi
6 + (8 + 3) - (6 * (3 + 2) + 5) * (2 * 10 / 5) + (5 * ((2 * 6) + 2)

Citar
1: +6
2: (8 + 3)
3: - (6 * (3 + 2) + 5) * (2 * 10 / 5)
4: (5 * ((2 * 6) + 2)

luego, con un parser que estoy creando, deberia crearse otra pila, asi

Citar
1: +6
2: // Una pila dentro de otra pila, medio lioso, pero asi se me ocurrio xD
   2.1: +8
   2.2: +3
3:
   3.1: +6 * (3 + 2) + 5
   3.2: *+(2 * 10 / 5)
4:
   4.1: +5 * (2 * 6)
   4.2: +2

3º vuelta:

Citar
1: +6
2: +11
3:
   3.1:
       3.1.1: +6 * (3+2)
       3.1.2: +5
   3.2: *
       3.2.1: +2
       3.2.2: *+10
       3.2.3: /+5
4:
   4.1: +5 * (2 * 6)
       4.1.1: +5
       4.1.2: * (2 * 6)
   4.2: +2
y como siga....
Se entiende lo que quiero hacer??? Ya casi tengo mi expresion regular para detectar ecuaciones ^^, lo que si me va a hacer un poco dificil el tema de la separacion (las vueltas), usare recursividad (no me digan que es mala, eso era en epocas cuando todos tenian 64 mb ram, ahora que todos tienen 512 o mas¿No tienen suficiente memoria para gastarla? :xD)
En línea

h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: calculadora por jerarquia ()*/+- ...C#...
« Respuesta #23 en: 1 Agosto 2009, 17:05 pm »

Raul, en wikipedia también había un ejemplo, no lo quice poner, pero en esa página está toda la info acerca de pilas.

Éxitos con tu trabajo.
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: calculadora por jerarquia ()*/+- ...C#...
« Respuesta #24 en: 3 Agosto 2009, 21:00 pm »

 :o Lo Logre!!!  ;D :P

Costo un poco.... lo hice ayer (domingo a la tarde jeje) y tenia un problema con los numeros negativos que hoy ya resolvi....aunque no he probado todo tipo de operaciones xD. Eso si....solo soporta los siguentes operadores: + * - / ( )
No soprota potenciación, ahora intentare agregarle esa funcion jeje
Como funciona?? (rapidamente explicado) Divide en terminos, si el termino es numerico suma o resta, si es una multiplicacion o division y/o con parentesis se analiza otra vez (usando recursividad).
No esta totalmente testeado, es MUY posible que encuentre algun error jeje, sigo trabajando en esta calcu

Como usarlo?? Simple, llaman a Eval("5+3*9") por ejemplo y esta le retorna un valor double (en caso de que haya decimales)....


que no se diga mas..aca el codigo  :xD
Código
  1. Imports System.Text.RegularExpressions
  2.  
  3. Module Module1
  4.  
  5.    Sub Main()
  6.        Dim opcion As String = ""
  7.        Console.WriteLine("Ingrese una operacion combinada o 'end' para salir")
  8.  
  9.        Do
  10.            opcion = Console.ReadLine()
  11.  
  12.            If opcion = "end" Then Exit Do
  13.  
  14.            Try
  15.                Console.WriteLine("Resultado: " & Eval(opcion).ToString("N"))
  16.            Catch ex As Exception
  17.                Console.ForegroundColor = ConsoleColor.White
  18.                Console.WriteLine("Error: " & ex.Message)
  19.                Console.ForegroundColor = ConsoleColor.Gray
  20.            End Try
  21.        Loop
  22.    End Sub
  23.  
  24.    Public Function Eval(ByVal operacion As String) As Double
  25.        Dim resp As Double = 0D
  26.        Dim temp As Double = 0D
  27.  
  28.        operacion = operacion.Replace(" ", "")
  29.        operacion = operacion.Replace(".", ",")
  30.  
  31.        Dim RegexObj As New Regex( _
  32.            "(?<Termino>[+\-]?  (?: \d [\d,*/]* | \( [\d,+\-*/]* \) (?: [*/] \d | [*/] \( [\d,+\-*/]* \) )* ) )", _
  33.            RegexOptions.IgnorePatternWhitespace)
  34.        If RegexObj.IsMatch(operacion) Then
  35.            Dim MatchResults As MatchCollection = RegexObj.Matches(operacion)
  36.            Dim MatchResult As Match = MatchResults(0)
  37.            Dim termino As String
  38.            For i As Int32 = 0 To MatchResults.Count - 1
  39.                termino = MatchResult.Groups("Termino").Value
  40.                If IsNumeric(termino) Then
  41.                    temp = Double.Parse(termino)
  42.                Else
  43.                    ' No podemos pasarle +(5+5)*2 porque lo tomaria como termino y entraria en un bucle infinito
  44.                    ' asi que le extraemos el signo, por defecto le ponemos como positivo y despues le volvemos al
  45.                    ' signo que debe tener
  46.                    Dim signo As Integer = 1
  47.  
  48.                    If termino.Substring(0, 1) = "-" Then
  49.                        signo = -1
  50.                        termino = termino.Substring(1)
  51.                    ElseIf termino.Substring(0, 1) = "+" Then
  52.                        signo = 1
  53.                        termino = termino.Substring(1)
  54.                    End If
  55.                    temp = ResolverTermino(termino)
  56.  
  57.                    temp *= signo ' Multiplicamos por -1 para cambiar el signo, por 1 para mantenerlo igual
  58.                End If
  59.  
  60.                resp += temp
  61.                MatchResult = MatchResult.NextMatch()
  62.            Next
  63.  
  64.            Return resp
  65.        Else
  66.            Throw New Exception("La operacion no pudo ser reconocida")
  67.        End If
  68.    End Function
  69.  
  70.    Function ResolverTermino(ByVal Termino As String) As Double
  71.        Dim resp As Double = 0D
  72.        Dim temp As Double = 0D
  73.  
  74.        Dim RegexObj As New Regex("(?<Termino> [\+\-]?\( .* \) | [\*\/] \d*\,?\d* | [\+\-]? \d*\,?\d* )", RegexOptions.IgnorePatternWhitespace)
  75.  
  76.        If RegexObj.IsMatch(Termino) Then
  77.  
  78.            Dim MatchResults As MatchCollection = RegexObj.Matches(Termino)
  79.            Dim MatchResult As Match = MatchResults(0)
  80.            Dim subTermino As String
  81.            For I As Int32 = 0 To MatchResults.Count - 2
  82.                subTermino = MatchResult.Groups("Termino").Value
  83.                If IsNumeric(subTermino) Then
  84.                    resp = Double.Parse(subTermino)
  85.                Else
  86.                    Select Case subTermino.Substring(0, 1)
  87.                        Case "*"
  88.                            temp = Double.Parse(subTermino.Substring(1))
  89.                            resp *= temp
  90.                        Case "/"
  91.                            temp = Double.Parse(subTermino.Substring(1))
  92.                            resp /= temp
  93.                        Case Else
  94.                            resp = Eval(Regex.Match(subTermino, "\((?<Operacion>.*)\)").Groups("Operacion").Value)
  95.                    End Select
  96.                End If
  97.                MatchResult = MatchResult.NextMatch
  98.            Next
  99.            Return resp
  100.        Else
  101.            Throw New Exception("Parte de la operacion no pudo ser reconocida")
  102.        End If
  103.    End Function
  104. End Module

Esta en vb.net.....pero es facilmente convertible, cuando este bien terminado y sin bugs (por ejemplo, ahora no se puede poner "((1+2)*3)*4)" porque lo rompes jajaja) lo convertire a C# con mis propias manos xD

Cualquier ayuda se agradece  ;D

EDIT: Arreglado el tema de los espacios, y el punto (que es una coma en realidad)
« Última modificación: 3 Agosto 2009, 21:34 pm por raul338 » En línea

h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: calculadora por jerarquia ()*/+- ...C#...
« Respuesta #25 en: 4 Agosto 2009, 00:39 am »

Excelente  ;-)

Apenas tenga un tiempito le hecharé un ojo.

Un saludo!
En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Así es la jerarquía del sistema de archivos de Linux mostrada en una sola imagen
Noticias
wolfbcn 0 1,441 Último mensaje 16 Febrero 2015, 18:23 pm
por wolfbcn
Establecer jerarquía en controles Treeview
Programación Visual Basic
Serapis 8 5,721 Último mensaje 19 Mayo 2018, 22:26 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines