VB . NET - Calculadora Científica


Que tal uma calculadora cientifica feita no VB .NET ?

Se você pensa que é necessário um código muito complexo para fazer uma calculadora científica vai se espantar ao ver o código desta que eu apresento aqui. O código precisa de refinamento mas mostra que com criatividade você pode fazer coisas incríveis com a linguagem Visual Basic.

Na verdade este código foi praticamente aproveitado como esta de um projeto feito em Visual Basic 6 :  VB 6 - Calculadora Cientifica.

Com certeza pode ser refeito inteiramente usando os novos recursos do VB .NET mas apenas para mostrar que existe uma certa compatibilidade a nível de instruções e lógica o código foi aproveitado em um projeto VB .NET.

Calculadora Científica

Abra o Visual Basic 2008 Express Edition e crie um novo projeto do tipo Windows Forms Application e com o nome de Calculadora;

A seguir altere o nome do formulário form1 para calculadora.vb;

Crie o seguinte leiaute no formulário do projeto:

Efetue as seguintes definições no início do formulário:

Option Strict Off
Option
Explicit On
Imports
VB = Microsoft.VisualBasic

Declare as seguintes variáveis no formulário:

Dim op1 As Double

Dim res As Double

Dim op2 As Double

Dim n As Double

Dim i As Short

Dim operador_Renomeado As String

Dim s As String

Dim c As String

A seguir inclua o código abaixo no formulário:

Private Sub cmdclear_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdclear.Click

    txtResultado.Text = ""

End Sub
 

Private Sub cmddegrad_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmddegrad.Click


Dim Index As Short = cmddegrad.GetIndex(eventSender)

op1 = Val(txtResultado.Text)

Select Case (Index)

Case 0

res = op1 * 3.142 / 180

Case 1

res = 180 * op1 / 3.142

End Select

txtResultado.Text = CStr(res)

End Sub


Private
Sub cmde_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles
cmde.Click

  txtResultado.Text = "2.71828182845904523536"

End Sub

 

Private Sub cmdlog_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdlog.Click

Dim Index As Short = cmdlog.GetIndex(eventSender)

op1 = Val(txtResultado.Text)

Select Case (Index)

Case 0

res = System.Math.Log(op1)

Case 1

res = System.Math.Log(op1) / System.Math.Log(10)

Case 2

res = 10 ^ op1

End Select

txtResultado.Text = CStr(res)

End Sub

 

Private Sub cmdmemory_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdmemory.Click

Dim Index As Short = cmdmemory.GetIndex(eventSender)

Static m As Double

Select Case (Index)

Case 0

m = m + Val(txtResultado.Text)

Case 1

m = m - Val(txtResultado.Text)

Case 2

m = 0

txtResultado.Text = ""

Case 3

txtResultado.Text = CStr(m)

MsgBox(m)

End Select

If m = 0 Then

Text1.Text = ""

Else

Text1.Text = "M"

End If

End Sub

 

Private Sub cmdnumber_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdnumber.Click

Dim Index As Short = cmdnumber.GetIndex(eventSender)

Select Case (Index)

Case 0

txtResultado.Text = txtResultado.Text & "1"

Case 1

txtResultado.Text = txtResultado.Text & "2"

Case 2

txtResultado.Text = txtResultado.Text & "3"

Case 3

txtResultado.Text = txtResultado.Text & "4"

Case 4

txtResultado.Text = txtResultado.Text & "5"

Case 5

txtResultado.Text = txtResultado.Text & "6"

Case 6

txtResultado.Text = txtResultado.Text & "7"

Case 7

txtResultado.Text = txtResultado.Text & "8"

Case 8

txtResultado.Text = txtResultado.Text & "9"

Case 9

txtResultado.Text = txtResultado.Text & "0"

Case 10

txtResultado.Text = txtResultado.Text & "."

Case 11

txtResultado.Text = txtResultado.Text & "A"

Case 12

txtResultado.Text = txtResultado.Text & "B"

Case 13

txtResultado.Text = txtResultado.Text & "C"

Case 14

txtResultado.Text = txtResultado.Text & "D"

Case 15

txtResultado.Text = txtResultado.Text & "E"

Case 16

txtResultado.Text = txtResultado.Text & "F"

End Select

End Sub

 

Private Sub cmdoperation_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdoperation.Click

Dim Index As Short = cmdoperation.GetIndex(eventSender)

On Error GoTo trataerro

Select Case (Index)

Case 0

op1 = Val(txtResultado.Text)

operador_Renomeado = "/"

txtResultado.Text = ""

Case 1

op1 = Val(txtResultado.Text)

operador_Renomeado = "*"

txtResultado.Text = ""

Case 2

op1 = Val(txtResultado.Text)

operador_Renomeado = "+"

txtResultado.Text = ""

Case 3

op1 = Val(txtResultado.Text)

operador_Renomeado = "-"

txtResultado.Text = ""

Case 5

op1 = Val(txtResultado.Text)

operador_Renomeado = "^"

txtResultado.Text = ""

Case 6

op1 = Val(txtResultado.Text)

operador_Renomeado = "%"

txtResultado.Text = ""

Case 7

op1 = Val(txtResultado.Text)

operador_Renomeado = "$"

txtResultado.Text = ""

Case 4

op2 = Val(txtResultado.Text)

Select Case (operador_Renomeado)

Case "+"

res = op1 + op2

Case "-"

res = op1 - op2

Case "*"

res = op1 * op2

Case "/"

res = op1 / op2

Case "^"

res = op1 ^ op2

Case "%"

res = op1 / op2 * 100

Case "$"

res = op1 ^ (1 / op2)

End Select

txtResultado.Text = CStr(res)

op1 = res

End Select

Exit Sub

trataerro:

MsgBox("Erro no processamento.")

End Sub

 

Private Sub cmdpercent_Click()

res = res * 100

txtResultado.Text = CStr(res)

End Sub

 

Private Sub cmdpi_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdpi.Click

txtResultado.Text = CStr(62832 / 20000) '22 / 7

End Sub
 

Private Sub cmdpn_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdpn.Click

res = Val(txtResultado.Text)

res = -(res)

txtResultado.Text = CStr(res)

End Sub
 

Private Sub cmdsqr_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdsqr.Click

Dim Index As Short = cmdsqr.GetIndex(eventSender)

op1 = Val(txtResultado.Text)

Select Case (Index)

Case 0

res = op1 * op1 * op1

Case 1

res = op1 * op1

Case 2

res = System.Math.Sqrt(op1)

Case 3

res = 1 / op1

Case 4

n = 1

For i = 1 To op1

n = i * n

Next i

res = n

End Select

txtResultado.Text = CStr(res)

End Sub

Private Sub cmdtrigno_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdtrigno.Click

Dim Index As Short = cmdtrigno.GetIndex(eventSender)

op1 = Val(txtResultado.Text)

Select Case (Index)

Case 0

res = System.Math.Sin(op1 * 3.142 / 180)

Case 1

res = System.Math.Cos(op1 * 3.142 / 180)

Case 2

res = System.Math.Tan(op1 * 3.142 / 180)

Case 3

res = 1 / System.Math.Tan(op1 * 3.142 / 180)

End Select

txtResultado.Text = CStr(res)

End Sub

Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click

s = txtResultado.Text

c = CStr(Len(s))

If CDbl(c) = 0 Then

txtResultado.Text = ""

Else

c = CStr(CDbl(c) - 1)

txtResultado.Text = VB.Left(s, CInt(c))

End If

End Sub

Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load

txtResultado.Text = "www.macoratti.net"

End Sub

 

E pronto ! podemos testar a calculadora:

Pegue o projeto completo aqui : CalculadoraCientificaNET.zip

Sugestões para melhorar o código:

1- Remova o tratamento de erro On error Goto TrataErro e inclua um Try/Catch (pelo amor de Deus...)
2- Utilize as novas funções para tratar Strings e operações numéricas do VB .NET
3- Analise a possibilidade de aplicar os conceitos de orientação a objeto ao código usado: Classes, Interfaces, Design Patters, etc...
4- Corrija os possíveis bugs que com certeza irão ocorrer durante a sua utilização (eu não testei todas as operações)

Nota: Para saber mais acompanhe os meus artigos:

 Bom Estudo...

Eu sei é apenas Visual Basic , mas eu gosto...


José Carlos Macoratti