【问题标题】:Can you create an array with mathematical equations in VB?你能在VB中用数学方程创建一个数组吗?
【发布时间】:2018-04-14 19:56:20
【问题描述】:

一段时间以来,我一直在尝试创建一个充满数学方程式的锯齿状数组,例如 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)},

等等

这个数组自然不行,而且由于我基本上是菜鸟,我不知道如何修复它。

'values()' 是一个数组,顺便说一下,包含从文本框中获取的 16 个不同的值,缺失值被计算并写入包含“0”(用户未触及)的文本框中。

有没有办法创建一个仅由方程组成的数组?

如果您需要知道什么来帮助我,请务必询问。

【问题讨论】:

  • 欢迎来到 StackExchange。请更准确地说明“数学方程”的含义。您的意思是使用特定值评估的表达式,因此结果是一个数字,这就是您在示例中的意思吗?字符串是否足够,每个字符串都存储表达式(例如“a * b”)?或者您是否需要更数学的东西,您还不知道要使用的值,但可以很容易地将它们代入表达式以获得结果?
  • 使用 List(Of List(Of Integer)) 怎么样?或者无论这些数字的数据类型是什么。
  • @RoryDaulton 您好,感谢您的欢迎!对不起,是的。它就像一个表达式,其中一个数组(值)存储值,然后在这些方程中使用。这就是为什么到目前为止,我在表达式中使用 values(n)。我想您可以使用诸如“a * b”之类的表达式来引用,而不是让它说“值(2)*值(8)”(指的是值数组)。通过一些解决方法,它可能会起作用,但如果有任何其他存储表达式的方法,就像我的示例中那样,我更喜欢这种方法。
  • @F0r3v3r-A-N00b 它们存储为 Double,但是是的。你可能只是给了我一个想法。不一定是一个列表,但它绝对应该工作,考虑到“值(9)+值(13)”是指2个双数被加在一起。
  • 您存储的不是数学方程,而是方程的结果,只是简单的正常双精度值。

标签: arrays vb.net math


【解决方案1】:

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

添加对您的程序的引用。在引用窗口中单击“Com”选项卡并搜索“”Microsoft Script Control 1.0”。勾选它左侧的框,然后单击窗口底部的“确定”。

那么你只需要定义一个简单的公式字符串数组——就像这样..

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

【讨论】:

    【解决方案2】:

    我最终做了一个巨大的解决方法,为 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 语句和各种长度。而且不好看。

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

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2014-01-19
      • 2011-11-14
      相关资源
      最近更新 更多