【问题标题】:How can I make a VB.NET MDAS Calculator?如何制作 VB.NET MDAS 计算器?
【发布时间】:2021-02-22 12:53:50
【问题描述】:

我已有代码,但不知道如何添加 MDAS 功能。这是我的代码:

Public Class Form1
'variables-----------------------------------------------------------------------------
Dim inp As Double = 0
Dim oprtn As String
Dim expr As Boolean = False
'numbers and decimal input-----------------------------------------------------------------------------
Private Sub Button_Click(sender As Object, e As EventArgs) Handles Number1.Click, Number9.Click, Number8.Click, Number7.Click, Number6.Click, Number5.Click, Number4.Click, Number3.Click, Number2.Click, Number0.Click, Period.Click
    Dim num As Button = sender
    If ((TextBox1.Text = "0") Or (expr)) Then
        TextBox1.Clear()
        TextBox1.Text = num.Text
        expr = False
    ElseIf (num.Text = ".") Then
        If (Not TextBox1.Text.Contains(".")) Then
            TextBox1.Text = TextBox1.Text + num.Text
        End If
    Else
        TextBox1.Text = TextBox1.Text + num.Text
    End If
End Sub
'operators button-----------------------------------------------------------------------------
Private Sub oprtrs(sender As Object, e As EventArgs) Handles PlusSign.Click, MinusSign.Click, MultiplySign.Click, DivideSign.Click
    Dim operations As Button = sender
    If (inp <> 0) Then
        Equals.PerformClick()
        expr = True
        oprtn = operations.Text
        Label1.Text = inp & "   " & oprtn
    Else
        oprtn = operations.Text
        inp = Double.Parse(TextBox1.Text)
        expr = True
        Label1.Text = inp & "   " & oprtn
    End If
End Sub
'equals button-----------------------------------------------------------------------------
Private Sub Equal_Click(sender As Object, e As EventArgs) Handles Equals.Click
    Label1.Text = ""
    Select Case oprtn
        Case "+"
            TextBox1.Text = (inp + Double.Parse(TextBox1.Text)).ToString()
        Case "-"
            TextBox1.Text = (inp - Double.Parse(TextBox1.Text)).ToString()
        Case "*"
            TextBox1.Text = (inp * Double.Parse(TextBox1.Text)).ToString()
        Case "/"
            TextBox1.Text = (inp / Double.Parse(TextBox1.Text)).ToString()
    End Select

    inp = Double.Parse(TextBox1.Text)
    oprtn = ""
End Sub
'other buttons-----------------------------------------------------------------------------
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Backspace.Click
    If TextBox1.Text < " " Then
        TextBox1.Text = Mid(TextBox1.Text, 1, Len(TextBox1.Text) - 1 + 1)
    Else
        TextBox1.Text = Mid(TextBox1.Text, 1, Len(TextBox1.Text) - 1)
    End If
End Sub

Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Clear.Click
    TextBox1.Text = "0"
End Sub

Private Sub Button15_Click(sender As Object, e As EventArgs) Handles ClearEverything.Click
    TextBox1.Text = "0"
    Label1.Text = ""
End Sub

Private Sub Button20_Click(sender As Object, e As EventArgs) Handles Prcent.Click
    Dim percent As Double
    percent = Convert.ToDouble(TextBox1.Text) / Convert.ToDouble(100)
    TextBox1.Text = System.Convert.ToString(percent)
End Sub

Private Sub Button21_Click(sender As Object, e As EventArgs) Handles SqrRoot.Click
    Dim squared As Double
    squared = Math.Sqrt(TextBox1.Text)
    TextBox1.Text = System.Convert.ToString(squared)
    Label1.Text = "Sqr(" & System.Convert.ToString(squared) & ")"
End Sub

Private Sub Button22_Click(sender As Object, e As EventArgs) Handles RaiseTwo.Click
    Dim expo2 As Double
    expo2 = Convert.ToDouble(TextBox1.Text) * Convert.ToDouble(TextBox1.Text)
    TextBox1.Text = System.Convert.ToString(expo2)
End Sub

Private Sub Button23_Click(sender As Object, e As EventArgs) Handles RaiseThree.Click
    Dim expo3 As Double
    expo3 = Convert.ToDouble(TextBox1.Text) * Convert.ToDouble(TextBox1.Text) * Convert.ToDouble(TextBox1.Text)
    TextBox1.Text = System.Convert.ToString(expo3)
End Sub

Private Sub Button24_Click(sender As Object, e As EventArgs) Handles OneOver.Click
    Dim ov1 As Double
    ov1 = Convert.ToDouble(1.0 / Convert.ToDouble(TextBox1.Text))
    TextBox1.Text = System.Convert.ToString(ov1)
End Sub

结束类

这几乎就是我所做的一切,它按预期工作,但它不遵循 MDAS,它优先考虑乘法,然后是除法,然后是加法,然后是减法。我的设计是这样的:

I started with the interface first then code, I haven't really designed it yet. This is just to give you an idea what is already coded or included in the code. Every button functions as should be.

【问题讨论】:

  • 您始终可以利用 DataTable 的 Compute 方法:Dim table = New DataTable() Dim result = table.Compute("1 + 2 * 3 / 4", Nothing) ' result = 2.5
  • 我必须对每个数字组合都这样做吗?我将在考试中获得随机数,如果我要为每种组合制作一个,这将很难猜到。有没有办法简单地告诉程序优先考虑 MDAS?
  • 我不关注。如果你有一个表达式,只需将它作为Compute 方法中的第一个参数传递。
  • 表达式是随机的,基本上是数字和运算符的任意组合。假设我正在尝试重新制作 Google 的计算器(没有 sin cos tan 等),其中当您输入 2 + 3 * 2 时,它等于 8(MDAS 规则)。我制作的计算器将其回答为 2 + 3 = 5 * 2 = 10(非 MDAS 规则)。谢谢你的回复,我很感激。
  • 用有意义的名字命名你的控件,你的代码会更容易阅读和维护。

标签: vb.net math calculator


【解决方案1】:

这就是大卫所说的。

需要的代码很少。

Public Class ExpressionCalculator
    Private Sub Buttons_Click(sender As Object, e As EventArgs) Handles ButtonPlus.Click, ButtonMultiply.Click, ButtonMinus.Click, ButtonDot.Click, ButtonDivide.Click, Button9.Click, Button8.Click, Button7.Click, Button6.Click, Button5.Click, Button4.Click, Button3.Click, Button2.Click, Button10.Click, Button1.Click
        Dim tb = DirectCast(sender, Button)
        TextBox1.Text &= tb.Text
    End Sub

    Private Sub ButtonCalculate_Click(sender As Object, e As EventArgs) Handles ButtonCalculate.Click
        Dim table = New DataTable()
        Dim result = table.Compute(TextBox1.Text, Nothing)
        TextBox1.Text = result.ToString
    End Sub
End Class

【讨论】:

  • 我不知道!非常感谢大卫和玛丽。一直以来,它只需要这么短的代码,这非常了不起。再次为缺乏理解道歉,我在过去几天才开始 vb.net 并且仍在尝试了解更多信息。希望你有一个美好的一天,保持安全和健康!
猜你喜欢
  • 2012-09-23
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2018-08-19
相关资源
最近更新 更多