C# - Avaliando expressões numéricas


 Neste artigo vamos veremos avaliar expressões numéricas usando a linguagem C#.

Hoje vou apresentar outro exemplo de programa de realiza a avaliação de expressões numéricas informadas pelo usuário em um programa Windows Forms.

A expressão numérica deve envolver apenas as variáveis x e y e usar as operações de adição (+), subtração (-) , divisão (/) e multiplicação ( * ). Assim para expressão aque usa uma potenciação, você deve usar a multiplicação. Exemplo:  x ^ 2  deve ser expresso como : x * x.

Mais uma vez vamos usar os recursos do CodeCOM que fornece tipos que representam muitos dos tipos mais comuns de elementos de código-fonte. Também vamos usar Reflection para obter informações de metadados.

Vou deixar nas referências o link de outros artigos que já escrevi sobre o assunto.

Recursos Usados:

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um projeto usando o template Windows Desktop -> Windows Forms App(.NET Framework) e informe o nome AvaliaExpressMatematica;

A camada de interface com o usuário é o formulário Form1 que possui os seguintes controles:

  • 3 Labels
  • 4 TextBox
    • txtEquacao
    • txtValoX
    • txtValorY
    • txtResultado
  • 1 Button - btnCalcular

Os namespaces usados no formulário são:

using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Windows.Forms;


No início do formulário vamos declarar as variáveis do tipo DataView e CurrencyManager:

private DataView dv;
private CurrencyManager cm;

No evento Click do botão de comando - btnCalcular - inclua o código abaixo:

      private void btnCalcular_Click(object sender, EventArgs e)
      {
            // Transforma a equação em uma função
            string funcao =
                "public static class Avaliador" +
                "{" +
                "    public static double Avaliar(double x, double y)" +
                "    {" +
                "        return " + txtEquacao.Text + ";" +
                "    }" +
                "}";
            // Compila a função
            CodeDomProvider code_provider = CodeDomProvider.CreateProvider("C#");
            // Gera um assembly não executável na memória
            CompilerParameters parametros = new CompilerParameters();
            parametros.GenerateInMemory = true;
            parametros.GenerateExecutable = false;
            // Compila o código
            CompilerResults resultados =
                code_provider.CompileAssemblyFromSource(parametros, funcao);
            // Se houver erros exibe os erros
            if (resultados.Errors.Count > 0)
            {
                string msg = "Erro ao compilar a expressão informada.";
                foreach (CompilerError compiler_error in resultados.Errors)
                {
                    msg += "\n" + compiler_error.ErrorText;
                }
                MessageBox.Show(msg, "Erro na Expressão ", MessageBoxButtons.OK, 
                    MessageBoxIcon.Error);
            }
            else
            {
                // Obtem o tipo da classe Avaliador
                Type tipo_Avaliador = resultados.CompiledAssembly.GetType("Avaliador");
                // Obtem o objeto MethodInfo descrevendo o método Avaliar
                MethodInfo metodo_info = tipo_Avaliador.GetMethod("Avaliar");
                // Cria a lista de parãmetros
                object[] metodo_parametros = new object[]
                {
                    double.Parse(txtValorX.Text),
                    double.Parse(txtValorY.Text)
                };
                // Executa o metodo
                double resultado_equacao = (double)metodo_info.Invoke(null, metodo_parametros);
                // Exibe o resultado retornado
                txtResultado.Text = resultado_equacao.ToString();
            }
        }

Pronto ! Executando o projeto iremos obter o seguinte resultado:

Pegue o projeto aqui :    AvaliaExpressoMatematica.zip

"Combati o bom combate, acabei a carreira, guardei a fé.
Desde agora, a coroa da justiça me está guardada, a qual o Senhor, justo juiz, me dará naquele dia;
e não somente a mim, mas também a todos os que amarem a sua vinda. "
2 Timóteo 4:7,8

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti