Mayo 22, 2018, 07:39:52 am

Autor Tema: Resuelve ecuaciones [C# AVANZADO]  (Leído 5592 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Rakzo-Fimbres

  • Yo vivo en CPH
  • ***
  • Mensajes: 645
  • Sexo: Masculino
  • Q.E.P.D. Misha :)
    • Ver Perfil
Resuelve ecuaciones [C# AVANZADO]
« en: Enero 03, 2011, 06:27:12 pm »
Este programa fue de utilidad en la aplicación de algunas estructuras de datos como You are not allowed to view links. Register or Login y You are not allowed to view links. Register or Login (si no tienes idea sobre estas estructuras, será mejor que comiences analizarlas antes de proceder).

El programa funcionará de una manera idéntica a lo que lo haría un compilador, respetando la jerarquía de operadores que está en la ecuación.


Funcionamiento del programa
La lógica del programa es simple. Una vez creadas las clases pila y cola (en el proyecto se conocen stack y y queue), éstas son convertidas a otro tipo de expresiones llamadas postfijas.

  • Los humanos solemos ver las ecuaciones de esta forma: A+(B*C)  y a éstos se les conoce expresión infija.
  • La computadora resuelve las expresiones en postfijo, que de la expresión infija anterior se convierte a: ABC*+

¿Notan la diferencia?, obviamente la expresión se ha transformado completamente, de tal manera que la mayoría de los operandos se encuentran a la izquierda y los operadores a la derecha.

Pero lo más importante, es que en este tipo de expresiones ya no hay necesidad de verificar jerarquías en los operadores porque la expresión en sí ya está ordenada.

Lógicamente esto es sorprendemente, debido a qué el programa ya no checará dónde está el paréntesis más profundos, entre otros casos. Sino que sólamente lo leerá de izquierda a derecha y los irá metiendo a una pila hasta que encuentre un operador, y éste se evaluará y se insertará recursivamente a la pila hasta que ya no queden elementos por leer. Y el último elemento que quede en la pila, ése es el resultado.

Código
Suelo progamar en inglés, así que si no sabes, no vale más que tengas un diccionario a la mano.

Código: You are not allowed to view links. Register or Login
    public static class Equation
    {
        public static double ResolveEquation(string equation)
        {
            Queue<char> queue = Infix2Postfix(equation);
            double result = SolvePostfix(queue);

            return (result);
        }

        private static Queue<char> Infix2Postfix(string expressionInfix)
        {
            char symbol;
            Stack<char> stack = new Stack<char>(expressionInfix.Length);
            Queue<char> queue = new Queue<char>(expressionInfix.Length);

            for (int i = 0; i < expressionInfix.Length; i++)
            {
                symbol = expressionInfix[i];

                if (symbol == '(')
                {
                    stack.Push(symbol);
                }
                else if (symbol == ')')
                {
                    while ((char)stack.Peek != '(')
                    {
                        queue.Enqueue(stack.Pop());
                    }

                    stack.Pop();
                }
                else if (symbol != '+' && symbol != '-' && symbol != '*' && symbol != '/' && symbol != '^')
                {
                    queue.Enqueue(symbol);
                }
                else
                {
                    while (stack.IsStackEmpty() == false && ComparePriority(symbol, (char)stack.Peek) <= 0)
                    {
                        queue.Enqueue(stack.Pop());
                    }

                    stack.Push(symbol);
                }
            }

            while (!stack.IsStackEmpty())
            {
                queue.Enqueue(stack.Pop());
            }

            return (queue);
        }

        private static double SolvePostfix(Queue<char> queue)
        {
            double A, B, result;
            char symbol;
            Stack<object> stack = new Stack<object>(queue.Count);

            while (!queue.IsQueueEmpty())
            {
                symbol = (char)queue.Dequeue();

                if (symbol != '+' && symbol != '-' && symbol != '*' && symbol != '/' && symbol != '^')
                {
                    stack.Push(symbol);
                }
                else
                {
                    B = Convert.ToDouble(stack.Pop().ToString());
                    A = Convert.ToDouble(stack.Pop().ToString());

                    switch (symbol)
                    {
                        case '^': result = System.Math.Pow(A, B); break;
                        case '/': result = A / B; break;
                        case '*': result = A * B; break;
                        case '-': result = A - B; break;
                        case '+': result = A + B; break;
                        default: throw new InvalidOperationException("Operator unknown");
                    }

                    stack.Push(result);
                }
            }

            return (Convert.ToDouble(stack.Peek.ToString()));
        }

        private static int ComparePriority(char symbol1, char symbol2)
        {
            int A = 0, B = 0;

            switch (symbol1)
            {
                case '^': A = 3; break;
                case '*':
                case '/': A = 2; break;
                case '-':
                case '+': A = 1; break;
                case '(': A = 0; break;
            }

            switch (symbol2)
            {
                case '^': B = 3; break;
                case '*':
                case '/': B = 2; break;
                case '+':
                case '-': B = 1; break;
                case '(': B = 0; break;
            }

            if (A == B)
                return (0);
            else if (A > B)
                return (1);
            else
                return (-1);
        }
    }

Notas aclaratorias
Desgraciadamente, el programa sólo lee números por caracter, es decir sólo lee dígitos y no números de más de un dígito.

Ya es por tu propia cuenta si quieres agregar este detalle (porque lógicamente no es un error). Y por supuesto, acepto críticas.

Si deseas descargar la aplicación: You are not allowed to view links. Register or Login
« Última modificación: Enero 06, 2011, 07:19:59 pm por Rakzo-Fimbres »
You are not allowed to view links. Register or Login

Desconectado EveLicetA

  • Me das tu IP?
  • *
  • Mensajes: 4
  • Sexo: Femenino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:Resuelve ecuaciones [C# AVANZADO]
« Respuesta #1 en: ſeptiembre 13, 2011, 08:22:46 am »
Hola veo que tu programa en c#
como puedo convertirla a c++
ya lo intente pero hace falta una parte
antes del primer public
asi que necesito que me ayudes!!!
porfa contestame!!! ;D


xx
Alguien resuelve mi duda?

Iniciado por paramo

5 Respuestas
1521 Vistas
Último mensaje Marzo 31, 2007, 03:12:34 pm
por TiTuS
question
ecuaciones

Iniciado por yilou

2 Respuestas
685 Vistas
Último mensaje Febrero 18, 2015, 06:35:02 am
por Zpukx
exclamation
Ecuaciones

Iniciado por JesusUS18

7 Respuestas
2812 Vistas
Último mensaje Agosto 25, 2010, 03:26:45 pm
por JesusUS18
thumbup
Microsoft Hyper-V resuelve la papeleta

Iniciado por Bl@ster25

0 Respuestas
810 Vistas
Último mensaje Junio 24, 2008, 09:39:51 am
por Bl@ster25
exclamation
Resuelve tus dudas sobre FOR Aquí.

Iniciado por JaAViEr

26 Respuestas
7679 Vistas
Último mensaje Marzo 18, 2010, 08:57:32 am
por ---saster---
exclamation
Ecuaciones de Rectas

Iniciado por Tulivar

0 Respuestas
1320 Vistas
Último mensaje Octubre 15, 2009, 07:52:26 pm
por Tulivar
grin
Ecuaciones v 0.01 1er grado.

Iniciado por RockoX

1 Respuestas
1284 Vistas
Último mensaje Abril 21, 2009, 02:01:37 pm
por nacherfaller
question
ecuaciones de 3º grado

Iniciado por Emotion$

3 Respuestas
2160 Vistas
Último mensaje Abril 25, 2009, 05:17:16 am
por carlmycol
exclamation
Ecuaciones de 2° grado

Iniciado por Sthefano02

4 Respuestas
1870 Vistas
Último mensaje Julio 18, 2010, 05:07:58 pm
por Sthefano02
resuelto
Calcular ecuaciones

Iniciado por JesusUS18

2 Respuestas
1123 Vistas
Último mensaje Agosto 20, 2010, 01:39:14 pm
por JesusUS18