VB - Avaliando expressões matemáticas


Para encerrar o ciclo de artigos sobre o Visual Basic e a matemática deste ano , vou mostrar aqui como podemos usar o VB para avaliar e resolver expressões matemáticas.

Vou começar fazendo uma pergunta: É possível fazer um programa em Visual Basic que resolva expressões matemáticas ?? Vou ser mais objetivo. Como eu faria para resolver expressões matemáticas envolvendo operações matemáticas de subtração , adição , divisão , exponenciação , raiz quadrada , etc. ?

A idéia é que o usuário possa entrar com uma expressão matemática em um formulário e que o VB obtenha o resultado da expressão. Vamos a um exemplo :como poderiamos resolver uma expressão como a seguinte:

(-5 ^ 2) * 3 / (SQR(11 - 2 ) * .5) ^ 2

Se você não lembra , os principais operadores e funções matemáticas do VB são :

Operador Significado
+, - Uniário positivo, negativo
+ Adição
- Subtração
* Multiplicação
/ Divisão

Mod

Retorna o resto da divisão entre dois números

As principais funções são:

Funções Matemáticas Significado
SQR Cálcula a raiz quadrada
^ Exponenciação

Na expressão - (-5 ^ 2) * 3 / (SQR(11 - 2 ) * .5) ^ 2 - queremos efetuar o cálcula da expressão acima na seguinte ordem:

  1. - 5 ^ 2 e multiplicar o resultado por 3
  2. Extrair a raiz quadrada da diferença entre 11 e 2 multiplicar por 0,5 e elevar o resultado ao quadrado
  3. Dividir o resultado obtido em 1 pelo resultado obtido em 2

Parece uma tarefa bem complexa , não é mesmo ? Como faremos para resolver isto ?

Calma !!! O Visual Basic sempre tem um 'Ás guardado sob a manga' ...

Podemos descascar este 'abacaxi' de uma maneira bem mais fácil do que você esta imaginando...

Na verdade uma única linha de código é o suficiente para que o Visual Basic avalie expressões matemáticas e nos de o resultado.

Basta você usar o método Eval do objeto ScriptControl . Para ter acesso ao método você vai precisar referenciar o objeto no menu Project-> Components e selecionando a library : Microsoft Script Control 1.0.

O objeto ScriptControl possui além do método Eval outros métodos , propriedades e eventos que , por questão de simplicidade eu não vou abordar neste artigo. Vou portanto me ater ao método Eval :

O método Eval avalia uma expressão e retorna o resultado .Sua sintaxe é a seguinte:

object.Eval(expression)

Onde:

1- Object - é o objeto ScriptControl.
2- expression - é uma string que contém uma expressão a ser avaliada.


Obs: O contexto do método Eval method é determinado pelo objeto. Se o objeto é um módulo o contexto estará restrito ao módulo se o objeto for o ScriptControl o contexto é global.

Criando o projeto

Vamos agora aplicar esta teoria e mostrar que ela funciona, vamos criar um projeto no VB que resolver expressões matemáticas usando o método Eval do objeto ScriptControl.

1 - Crie um novo projeto no Visual Basic e no formulário padrão - que vou chamar de frmavalia.frm - insira os controles : TextBox , CommandButton , frame , label , e o componente ScriptControl , conforme abaixo:

2- Feito isto vamos inserir o código associado aos botões de comando (estou usando um array de controles). O indice 0 refere-se ao botão - Resolver Expressão - que chama o método Eval para resolver a expressão (txtresultado.Text = Resolve_Expressao(txtExpressao.Text) . O índice 1 refere-se ao botão - Novo Cálculo - que limpa os controles do formulário. (eu estou copiando o resultado para a área de transferência)

Private Sub Command1_Click(Index As Integer)
Select Case Index
    Case 0 'resolve expressao

   On Error GoTo trata_erro

   frmResultado.Visible = True
   txtresultado.Text = Resolve_Expressao(txtExpressao.Text)
   Clipboard.SetText txtExpressao.Text & " = " & Trim(txtresultado.Text)
   Exit Sub

trata_erro:
 If Err.Number = 1002 Then
    MsgBox "Erro de sintaxe na expressão , verifique a colocação dos parênteses '( )' !", vbCritical,_ 
"Erro na expressão"
 ElseIf Err.Number = 5 Then
    MsgBox "Operação inválida , !", vbCritical, "Erro na expressão"
 Else
    MsgBox Err.Number & " - " & vbCrLf & Err.Description
 End If

Case 1 ' novo calculo
  frmResultado.Visible = False
  txtExpressao.SetFocus
  txtExpressao.SelStart = 0
  txtExpressao.SelLength = Len(txtExpressao.Text)
End Select

End Sub

3- O código da função - Resolve_Expressão - é o seguinte : A função avalia a expressão usando Eval.

Private Function Resolve_Expressao(expressao As String)
   Resolve_Expressao = ScriptControl1.Eval(expressao)
End Function

Não disse que era apenas uma linha de código !!!

Vamos rodar o projeto e ver se funciona. Abaixo o resultado para a expressão :

((( -5 ^ 2) * 3 )/ ( SQR((11 - 2 )) * .5)) ^ 2

Vamos conferir ?

1- 5 ^ 2 * 3 = 75

2- SQR((11-2)) * 0,5 ^2 = 2,25

Dividindo 75(1) por 2,25(2) temos :

33,333333333

confere com o resultado!!!

Observe que tivemos que utilizar os parênteses para delinear as precedências dos operadores. Se não tomarmos este cuidado o resultado não estará correto.

Quer outro exemplo !!! Que tal avaliar se uma expressão é verdadeira ou falsa ??? Sem problemas... veja..:

Este artigo encerra a série - VB e a matemática - pelos menos por este ano... Até o próximo artigo... (o projeto completo esta no super CD VB)


José Carlos Macoratti