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 } } }
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++; } } }
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 }
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()); }
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 }
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(); }