我已经尝试了一段时间来创建一个填充了数学方程式的锯齿状数组,如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'的文本框中。 (未被用户触动)。
有没有办法创建一个完全由方程式居住的数组?
请问,如果有什么需要知道的,以便帮助我。
答案 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