你能用VB创建一个带数学方程的数组吗?

时间:2017-11-02 10:21:44

标签: arrays vb.net math

我已经尝试了一段时间来创建一个填充了数学方程式的锯齿状数组,如a * b或(a-b)/ c。类似的方程式。我已经创建了一个Windows窗体并且已经工作了很长一段时间,而且我已经到了想要使代码更紧凑的地步。我已经在这里和那里进行了调整,但我似乎在努力制作一个包含这些方程的数组。到目前为止我所拥有的:

Dim mathEqu()() As Object = {
{values(1) / values(15), values(2) - values(1), values(3) - values(4)},
{values(0) * values(15), values(2) - values(0), values(14) / values(7)},

当然这个阵列不起作用,因为我基本上是一个新手,我不知道如何解决它。

'值()'顺便说一句,它是一个数组,包含从文本框中获取的16个不同的值,并且计算缺失值并将其写入包含' 0'的文本框中。 (未被用户触动)。

有没有办法创建一个完全由方程式居住的数组?

请问,如果有什么需要知道的,以便帮助我。

2 个答案:

答案 0 :(得分:0)

我最终做了一个巨大的解决方法,为values()和2个其他布尔数组创建了一个布尔数组,一个用于在mathEqu()中的一个方程可解的时设置一个标志(当所有值都有时)在方程式/表达式中不是0)而另一个用于帮助设置一个标志(就像我说的那样,大量的解决方案)。

这里大概是我的代码中的数学运算方式:

Public Class NPNpositive

    Dim values(15) As Double
    Dim i = 0
    Dim j As Double = 0
    Dim k = 0
    Dim l = 0
    Dim p = 0

// Whenever you click the calculation-button

    Private Sub Calculation_Click(sender As Object, e As EventArgs) Handles Calculation.Click

        Dim tbArray() As TextBox = New TextBox() {IB, IC, IE, .. .., URC, hfe}
        Dim tbBool() As Boolean = New Boolean() {False, False, False, .. .., False, False}
        For Each number In values
            If i < 16 Then
                If Double.TryParse(tbArray(i).Text, j) Then
                    values(i) = j
                End If
            End If
            i += 1
            j = 0
        Next

        Dim mathBool As Boolean()() = {
            New Boolean() {False, False, False},
            New Boolean() {False, False, False},
            New Boolean() {False, False},
            ..,
            ..,
            New Boolean() {False, False}
            New Boolean() {False}}

Calculations:

        i = 0
        j = 0
        k = 0
        p = 0


// Raising a True-flag if the value in values(i) does not equal 0

        For Each n In values
            If Not values(i) = 0 Then
                tbBool(i) = True
            End If
            i += 1
        Next


// Raising a True-flag when an expression is do-able

        Dim mathBoolHelp As Boolean() = {
            tbBool(1) And tbBool(15),
            tbBool(2) And tbBool(1),
            tbBool(3) And tbBool(4),
            tbBool(0) And tbBool(15),
            tbBool(2) And tbBool(0),
            tbBool(14) And tbBool(7),
            tbBool(12) And tbBool(8),
            ..,
            ..,
            tbBool(11) And tbBool(10),
            tbBool(1) And tbBool(7),
            tbBool(1) And tbBool(0)}

// Here is where the calculations are happening

        Dim mathEqu As Double()() = {
            New Double() {values(1) / values(15), values(2) - values(1), values(3) - values(4)},
            New Double() {values(0) * vlaues(15), values(2) - values(0), values(14) / values(7)},
            New Double() {values(12) / values(8), values(0) + values(1)},
            ..,
            ..,
            New Double() {values(11) - values(10), values(1) * values(7)},
            New Double() {values(1) / values(0)}}

i = 0

// This is where things start to look interesting
// The mathBoolHelp puts in flags in the Boolean jagged Array

        For Each m in values
            j = mathBool(i).Length
            For value As Integer = 0 To j - 1
                If mathBoolHelp(p) = True Then
                    mathBool(i)(k) = True
                End If
                k += 1
                p += 1
            Next
            i += 1
            k = 0
        Next

        i = 0
        j = 0
        k = 0

// It checks now in the counter-Boolean Array for a True
// If it finds a true at dimension k, column i, in mathBool()(), it calculates
// the number from the same spot, just from mathEqu()() instead

        For Each m In values
            If values(i) = 0 Then
                j = mathEqu(i).Length
                For value As Integer = 0 To j - 1
                    If mathBool(i)(k) = True Then
                        values(i) = mathEqu(i)(k)
                    End If
                    If Not values(i) = 0 Then
                        GoTo forEnd
                    End If
                    k += 1
                Next
forEnd:
            End If
            i += 1
            k = 0
        Next

这是整个计划的一小部分。主要问题是只计算当在数组中的那个位置计算所需的两个/所有值都不是0.我以前的代码就是这样工作,但它有16个长if语句,各种各样长度。看起来并不好看。

我的问题可能有更好的解决方案,所以在那之前,这样做会很好。

答案 1 :(得分:0)

你可以以迂回的方式做到这一点..

添加对您的计划的引用。在参考窗口中,单击&#34; Com&#34;选项卡并搜索&#34;&#34; Microsoft Script Control 1.0&#34; 。勾选左侧的框,然后单击窗口底部的确定。

然后你只需要定义一个简单的公式字符串数组 - 就像这样......

Dim formula() As String = {"(a+b)/c", "(a^2+b^2)", "a^b"}

添加以下函数,该函数将采用字符串表达式和表达式的参数。然后,它将使用您提供的参数替换公式中的字母,并评估结果表达式。工作完成

Private Function EvaluateExpression(exp As String, Optional a As Double = 0, Optional b As Double = 0, Optional c As Double = 0) As Double
    Dim SC As New MSScriptControl.ScriptControl
    exp = exp.Replace("a", a.ToString)
    exp = exp.Replace("b", b.ToString)
    exp = exp.Replace("c", c.ToString)
    SC.Language = "VBSCRIPT"
    Dim Result As Double = Convert.ToDouble(SC.Eval(exp))
    Return Result
End Function