vb如何将字符串转换为方程计算?

我想用VB设计一个界面:在窗口输入所需的方程(字符串),然后vb能将之转换为真正的方程进行计算,最后用pset绘点得到方程曲线。
比如我输入x^2+y^2=1,vb如何将这个字符串能转化为真正的方程,通过计算画出一个圆??
或者说我随意输入一个f(x,y),vb如何能把它认作一个代数式计算?
(关键是我不想用matlab,mathematic这些大软件...)
求指教!
回复474420502
是任意方程曲线

VERSION 5.00
Begin VB.Form Form1
Caption = "绘制曲线"
ClientHeight = 8520
ClientLeft = 1920
ClientTop = 1635
ClientWidth = 8145
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 8520
ScaleWidth = 8145
Begin VB.Frame Frame2
Caption = "图像"
Height = 6135
Left = 120
TabIndex = 10
Top = 2040
Width = 7815
Begin VB.CommandButton cmdClr
Caption = "清除"
Height = 375
Left = 6600
TabIndex = 13
Top = 5040
Width = 1095
End
Begin VB.PictureBox pic
Height = 5000
Left = 1320
ScaleHeight = 4935
ScaleWidth = 4935
TabIndex = 11
Top = 720
Width = 5000
End
End
Begin VB.Frame Frame1
Caption = "表达式"
Height = 1815
Left = 120
TabIndex = 0
Top = 120
Width = 7815
Begin VB.CommandButton cmdDraw
Caption = "绘制"
Default = -1 'True
Height = 375
Left = 6240
TabIndex = 12
Top = 1200
Width = 1215
End
Begin VB.TextBox y02
Height = 375
Left = 4680
TabIndex = 9
Top = 1200
Width = 1095
End
Begin VB.TextBox y01
Height = 375
Left = 3000
TabIndex = 7
Top = 1200
Width = 975
End
Begin VB.TextBox x02
Height = 375
Left = 1680
TabIndex = 6
Top = 1200
Width = 975
End
Begin VB.TextBox x01
Height = 375
Left = 240
TabIndex = 4
Top = 1200
Width = 855
End
Begin VB.TextBox Text1
Height = 375
Left = 1440
TabIndex = 2
Top = 240
Width = 6135
End
Begin VB.Label Label4
Caption = "<=y<="
Height = 255
Left = 4080
TabIndex = 8
Top = 1200
Width = 735
End
Begin VB.Label Label3
Caption = "<=x<="
Height = 255
Left = 1080
TabIndex = 5
Top = 1200
Width = 615
End
Begin VB.Label Label2
Caption = "x,y范围:"
Height = 255
Left = 240
TabIndex = 3
Top = 840
Width = 855
End
Begin VB.Label Label1
Caption = "输入表达式:"
Height = 255
Left = 240
TabIndex = 1
Top = 240
Width = 1215
End
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Option Base 1
Dim x1 As Single, x2 As Single, y1 As Single, y2 As Single
Dim Equation As String
Dim Trans As Single

Private Sub cmdClr_Click()
pic.Cls
End Sub

Private Sub cmdDraw_Click()
Form1.Enabled = False
x1 = x01.Text: x2 = x02.Text: y1 = y01.Text: y2 = y02.Text
Equation = Text1.Text
If x2 - x1 > y2 - y1 Then
Trans = (x2 - x1) / 500
Else
Trans = (y2 - y1) / 500
End If
Dim i As Integer, j As Integer
Dim test(500, 500) As Boolean
For i = 1 To 500
For j = 1 To 500
test(i, j) = Eq(i, j)
Next
Next
For i = 1 To 500
For j = 1 To 499
If test(i, j) Xor test(i, j + 1) Then pic.PSet (i * 10, j * 10)
If test(j, i) Xor test(j + 1, i) Then pic.PSet (j * 10, i * 10)
Next
Next
Form1.Enabled = True
End Sub

Private Function Eq(i As Integer, j As Integer) As Boolean
Dim x As Single, y As Single
x = i * Trans + x1
y = (500 - j) * Trans + y1
Dim s1 As String, s2 As String
Dim a As Integer
For a = 1 To Len(Equation)
If Mid(Equation, a, 1) = "=" Then Exit For
Next
s1 = Left(Equation, a - 1)
s2 = Mid(Equation, a + 1)
Eq = Calcu(s1, x, y) > Calcu(s2, x, y)
End Function

Private Function Calcu(s As String, x As Single, y As Single) As Single
Dim i As Integer, j As Integer
Do
i = i + 1
If Mid(s, i, 1) = "x" Then
s = Left(s, i - 1) & x & Mid(s, i + 1)
ElseIf Mid(s, i, 1) = "y" Then
s = Left(s, i - 1) & y & Mid(s, i + 1)
ElseIf Mid(s, i, 1) = "" Then
Exit Do
End If
Loop
Do
For i = 1 To Len(s)
If Mid(s, i, 1) = "(" Then
j = i
ElseIf Mid(s, i, 1) = ")" Then
Exit For
End If
Next
If i = Len(s) + 1 Then Exit Do
s = Left(s, j - 1) & Calcu2(Mid(s, j + 1, i - j - 1)) & Mid(s, i + 1)
Loop
Calcu = Val(Calcu2(s))
End Function

Private Function Calcu2(s As String) As String
Dim i As Integer, j As Integer, k As Integer
Dim sgl() As Single, stra() As String * 1
Dim v As String, b As Boolean
ReDim sgl(0 To 0)
For i = 1 To Len(s)
Select Case Mid(s, i, 1)
Case "+", "-", "*", "/", "^"
If b Then
sgl(j) = Val(v)
j = j + 1
ReDim Preserve sgl(0 To j)
ReDim Preserve stra(j)
stra(j) = Mid(s, i, 1)
b = False
v = ""
Else
v = v & Mid(s, i, 1)
End If
Case "E"
b = False
v = v & Mid(s, i, 1)
Case Else
b = True
v = v & Mid(s, i, 1)
End Select
Next
sgl(j) = Val(v)
i = 1
Do While i <= j
If stra(i) = "^" Then
If sgl(i - 1) <= 0 And Int(sgl(i)) <> sgl(i) Then Exit Function
sgl(i - 1) = sgl(i - 1) ^ sgl(i)
For k = i To j - 1
stra(k) = stra(k + 1)
sgl(k) = sgl(k + 1)
Next
j = j - 1
Else
i = i + 1
End If
Loop
i = 1
Do While i <= j
If stra(i) = "*" Then
sgl(i - 1) = sgl(i - 1) * sgl(i)
For k = i To j - 1
stra(k) = stra(k + 1)
sgl(k) = sgl(k + 1)
Next
j = j - 1
ElseIf stra(i) = "/" Then
If sgl(i - 1) = 0 Then Exit Function
sgl(i - 1) = sgl(i - 1) / sgl(i)
For k = i To j - 1
stra(i) = stra(i + 1)
sgl(i) = sgl(i + 1)
Next
j = j - 1
Else
i = i + 1
End If
Loop
i = 1
Do While i <= j
If stra(i) = "+" Then
sgl(i - 1) = sgl(i - 1) + sgl(i)
For k = i To j - 1
stra(k) = stra(k + 1)
sgl(k) = sgl(k + 1)
Next
j = j - 1
ElseIf stra(i) = "-" Then
sgl(i - 1) = sgl(i - 1) - sgl(i)
For k = i To j - 1
stra(i) = stra(i + 1)
sgl(i) = sgl(i + 1)
Next
j = j - 1
End If
Loop
Calcu2 = sgl(0)
End Function

直接输入vb形式的表达式,只能支持+、-、*、/、^以及括号运算
因为是逐点分析,运行较慢,我还没有找到解决方法
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-10
Dim a, b, c As Integer
Dim x, y As Single
Dim d As Double

a = Val(InputBox("输入二次项系数"))
b = Val(InputBox("输入一次项系数"))
c = Val(InputBox("输入常数项"))

d = b ^ 2 - 4 * a * c
If d < 0 Then
MsgBox "方程无解"
ElseIf d = 0 Then
x = -b / (2 * a)
MsgBox "方程有一个解:" & x
Else
x = (-b + Sqr(d)) / (2 * a)
y = (-b - Sqr(d)) / (2 * a)
MsgBox "方程有两个解:" & x & "和" & y
End If
第2个回答  2010-12-10
转换字符串str为int
int(str)
第3个回答  2010-12-10
这实际是一种正则变换。有些复杂的。
搞一个通用的,就变成了易语言。
第4个回答  2010-12-10
单圆 还是任意方程曲线?本回答被网友采纳
相似回答
大家正在搜