Пример #1
0
        private void escreverSeq(FilaLista <string> inf, FilaLista <string> pos)
        {
            char letra = 'A';

            string[] vet = pos.ToArray(); //lista de pósfixa
            lblExpres.Text += "Posfixa: ";

            for (int i = 0; i < vet.Length; i++) //enquanto não acabou o vetor
            {
                if (IsOp(vet[i]))                //se for operação
                {
                    lblExpres.Text += vet[i];    //armazena na string
                }
                else //se não for operação
                {
                    lblExpres.Text += letra++; //armazena a letra e incrementa
                }
            }

            lblExpres.Text += "\n" + "Infixa: ";
            letra           = 'A';
            vet             = inf.ToArray();     //lista de infixa

            for (int i = 0; i < vet.Length; i++) //enquanto não acabou o vetor
            {
                if (IsOp(vet[i]))                //se for operação
                {
                    lblExpres.Text += vet[i];    //armazena na string
                }
                else //se não for operação
                {
                    lblExpres.Text += letra++; //armazena a letra e incrementa
                }
            }
        }
Пример #2
0
        private void escreverSeq(FilaLista <string> inf, FilaLista <string> pos)
        {
            char letra = 'A';

            string[] vet = pos.ToArray();
            lblExpres.Text += "Posfixa: ";
            for (int i = 0; i < vet.Length; i++)
            {
                if (IsOp(vet[i]))
                {
                    lblExpres.Text += vet[i];
                }
                else
                {
                    lblExpres.Text += letra++;
                }
            }
            lblExpres.Text += "\n" + "Infixa: ";;
            letra           = 'A';
            vet             = inf.ToArray();
            for (int i = 0; i < vet.Length; i++)
            {
                if (IsOp(vet[i]))
                {
                    lblExpres.Text += vet[i];
                }
                else
                {
                    lblExpres.Text += letra++;
                }
            }
        }
Пример #3
0
        private double CalcularResultado(FilaLista <string> expre)
        {
            PilhaLista <double> valores = new PilhaLista <double>();
            double v1 = 0, v2 = 0, result = 0;

            string[] vet = expre.ToArray();

            for (int c = 0; c < vet.Length; c++)                              //for até o fim do vetor
            {
                if (!IsOp(vet[c]))                                            //se não for operação
                {
                    valores.Empilhar(double.Parse(vet[c].Replace('.', ','))); //empilha e troca ponto por vírgula
                }
                else
                {
                    v1 = valores.Desempilhar();        //desempilha o 1º valor
                    v2 = valores.Desempilhar();        //desempilha o 2º valor

                    switch (vet[c])                    //switch do valor caso seja operção
                    {
                    case "+": result = v2 + v1; break; //se for + soma

                    case "-": result = v2 - v1; break; //se for - subtrai

                    case "*": result = v2 * v1; break; //se for * multiplica

                    case "/":                          //se for divisão
                        if (v1 == 0)
                        {
                            throw new DivideByZeroException("Divisão por 0"); //se for 0 joga exceção
                        }
                        result = v2 / v1; break;                              //se não for zero calcula

                    case "^": result = Math.Pow(v2, v1); break;               //se for ^ faz potência
                    }
                    valores.Empilhar(result);                                 //empilha o resultado
                }
            }

            return(valores.Desempilhar()); //no fim desempilha o resultado final
        }
Пример #4
0
        private double CalcularResultado(FilaLista <string> expre)
        {
            PilhaLista <double> valores = new PilhaLista <double>();
            double v1 = 0, v2 = 0, result = 0;

            string[] vet = expre.ToArray();

            for (int c = 0; c < vet.Length; c++)
            {
                if (!IsOp(vet[c]))
                {
                    valores.Empilhar(double.Parse(vet[c].Replace('.', ',')));
                }
                else
                {
                    v1 = valores.Desempilhar();
                    v2 = valores.Desempilhar();
                    switch (vet[c])
                    {
                    case "+": result = v2 + v1; break;

                    case "-": result = v2 - v1; break;

                    case "*": result = v2 * v1; break;

                    case "/":
                        if (v1 == 0)
                        {
                            throw new DivideByZeroException("Divisão por 0");
                        }
                        result = v2 / v1; break;

                    case "^": result = Math.Pow(v2, v1); break;
                    }
                    valores.Empilhar(result);
                }
            }

            return(valores.Desempilhar());
        }
Пример #5
0
        private void btnIgual_Click(object sender, EventArgs e)
        {
            FilaLista <string>  infixa  = new FilaLista <string>();
            FilaLista <string>  posfixa = new FilaLista <string>();
            PilhaLista <string> ops     = new PilhaLista <string>(); //declara e instancia as 3 listas
            string expressao            = txtVisor.Text;             //expressão a ser calculada

            for (int i = 0; i < expressao.Length; i++)               //for até o fim da expressão
            {
                string elemento = "";

                if (!IsOp(expressao[i].ToString())) //se não for uma operção
                {
                    elemento = "";
                    int inicial = i;
                    while (inicial + elemento.Length < expressao.Length && (!IsOp(expressao[inicial + elemento.Length].ToString()) || expressao[inicial + elemento.Length] == '.')) //enquanto não acabou a expressão, não for operação ou não for ponto
                    {
                        elemento += expressao[inicial + elemento.Length];                                                                                                           //incrementa o elemento com o valor da posição específic da expressão
                    }
                    i = inicial + elemento.Length - 1;
                    posfixa.Enfileirar(elemento); //enfileira na posfixa o elemento
                }
                else //se for operação
                {
                    elemento = expressao[i] + "";

                    while (!ops.EstaVazia() && TemPrecedencia(ops.OTopo()[0], elemento[0])) //enquanto não estiver vazia e tiver precedência
                    {
                        char op = ops.OTopo()[0];
                        if (op == '(')
                        {
                            break;
                        }
                        else //se não for abre parenteses
                        {
                            posfixa.Enfileirar(op + ""); //enfileira
                            ops.Desempilhar(); //desempilha
                        }
                    }

                    if (elemento != ")")        //se não for fecha parenteses
                    {
                        ops.Empilhar(elemento); //empilha
                    }
                    else //se for
                    {
                        ops.Desempilhar(); //desempilha
                    }
                }
                if (elemento != "(" && elemento != ")") //se não for parenteses
                {
                    infixa.Enfileirar(elemento);        //enfileira o elemento
                }
            }

            while (!ops.EstaVazia())           //enquanto não estiver vazia
            {
                string op = ops.Desempilhar(); //pega o primeiro da pilha

                if (op != "(" && op != ")")    //se não for parenteses
                {
                    posfixa.Enfileirar(op);    //enfileira
                }
            }

            escreverSeq(infixa, posfixa);                              //escreve na tela as sequências
            txtResultado.Text = CalcularResultado(posfixa).ToString(); //calcula e escreve o resultado
        }
Пример #6
0
        private void btnIgual_Click(object sender, EventArgs e)
        {
            FilaLista <string>  infixa  = new FilaLista <string>();
            FilaLista <string>  posfixa = new FilaLista <string>();
            PilhaLista <string> ops     = new PilhaLista <string>();
            string expressao            = txtVisor.Text;

            for (int i = 0; i < expressao.Length; i++)
            {
                string elemento = "";

                if (!IsOp(expressao[i].ToString()))
                {
                    elemento = "";
                    int inicial = i;
                    while (inicial + elemento.Length < expressao.Length && (!IsOp(expressao[inicial + elemento.Length].ToString()) || expressao[inicial + elemento.Length] == '.'))
                    {
                        elemento += expressao[inicial + elemento.Length];
                    }
                    i = inicial + elemento.Length - 1;
                    posfixa.Enfileirar(elemento);
                }
                else
                {
                    elemento = expressao[i] + "";
                    while (!ops.EstaVazia() && TemPrecedencia(ops.OTopo()[0], elemento[0]))
                    {
                        char op = ops.OTopo()[0];
                        if (op == '(')
                        {
                            break;
                        }
                        else
                        {
                            posfixa.Enfileirar(op + "");
                            ops.Desempilhar();
                        }
                    }

                    if (elemento != ")")
                    {
                        ops.Empilhar(elemento);
                    }
                    else
                    {
                        ops.Desempilhar();
                    }
                }
                if (elemento != "(" && elemento != ")")
                {
                    infixa.Enfileirar(elemento);
                }
            }
            while (!ops.EstaVazia())
            {
                string op = ops.Desempilhar();
                if (op != "(" && op != ")")
                {
                    posfixa.Enfileirar(op);
                }
            }
            escreverSeq(infixa, posfixa);
            txtResultado.Text = CalcularResultado(posfixa).ToString();
        }