public double Division(Valor val)
 {
     res = val.Valor1 / val.Valor2;
     return(res);
 }
 public double Resta(Valor val)
 {
     res = val.Valor1 - val.Valor2;
     return(res);
 }
 public double Multiplicacion(Valor val)
 {
     res = val.Valor1 * val.Valor2;
     return(res);
 }
Пример #4
0
        private void PolonesInvertido(string expressao)
        {
            if (expressao.Length != 0)
            {
                int  cont = 0;
                bool number = false, operador = false;

                while (cont < expressao.Length && (Valor.IsNumber(expressao[cont]) || expressao[cont].Equals(',')))
                {
                    cont++;
                    number = true;
                }

                while (cont < expressao.Length && Operador.IsEspecial(expressao[cont].ToString()) && Operador.IsOperator(expressao[cont].ToString()) && number == false)
                {
                    cont++;
                    operador = true;
                }

                if (cont < expressao.Length && !number && (expressao[cont].Equals('(') || !Operador.IsEspecial(expressao[cont].ToString())))
                {
                    operador = true;
                }

                if (operador == true)
                {
                    Operador aux;
                    if (cont > 0)
                    {
                        aux = new Operador(expressao.Substring(0, cont));
                    }
                    else
                    {
                        aux = new Operador(expressao.Substring(0, 1));
                    }

                    if (aux.Op.Equals("("))
                    {
                        pilhaOperadores.Empilhar(null);
                        operador = false;
                        if (cont > 0)
                        {
                            PolonesInvertido(expressao.Substring(cont));
                        }
                        else
                        {
                            PolonesInvertido(expressao.Substring(cont + 1));
                        }
                        return;
                    }

                    if ((pilhaOperadores.OlharTopo() == null || pilhaOperadores.OlharTopo().CompareTo(aux) < 0) && !aux.Op.Equals(")"))
                    {
                        pilhaOperadores.Empilhar(aux);
                        operador = false;
                        if (cont > 0)
                        {
                            PolonesInvertido(expressao.Substring(cont));
                        }
                        else
                        {
                            PolonesInvertido(expressao.Substring(cont + 1));
                        }
                        return;
                    }
                    else
                    {
                        Operador auxOp;
                        if (aux.Prioridade != 0)
                        {
                            do
                            {
                                if (pilhaOperadores.OlharTopo() != null)
                                {
                                    auxOp = (Operador)pilhaOperadores.Desempilhar();
                                }
                                else
                                {
                                    auxOp = null;
                                }

                                if (auxOp != null)
                                {
                                    saida.Inserir(auxOp);
                                }
                            } while (auxOp != null);

                            pilhaOperadores.Empilhar(aux);
                        }
                        else
                        {
                            do
                            {
                                auxOp = (Operador)pilhaOperadores.Desempilhar();

                                if (auxOp != null)
                                {
                                    saida.Inserir(auxOp);
                                }
                            } while (auxOp != null);
                        }
                        operador = false;
                        if (cont > 0)
                        {
                            PolonesInvertido(expressao.Substring(cont));
                        }
                        else
                        {
                            PolonesInvertido(expressao.Substring(cont + 1));
                        }
                        return;
                    }
                }

                if (number == true)
                {
                    string auxString = expressao.Substring(0, cont);
                    if (Valor.IsNumber(auxString))
                    {
                        saida.Inserir(new Valor(double.Parse(auxString)));
                        number = false;
                        PolonesInvertido(expressao.Substring(cont));
                        return;
                    }
                    else
                    {
                        erro   = true;
                        number = false;
                    }
                }
            }
            else
            {
                while (pilhaOperadores.OlharTopo() != null)
                {
                    saida.Inserir(pilhaOperadores.Desempilhar());
                }
            }
        }