Автор вопроса: Bonapart | Web-сайт:team16.tut.su | ICQ: 175256
Я делаю программу для построения графиков, можете помочь найти и посчитать функции Sin,Cos,Tg,Ctg,Arctg ... и подобные . Выделить из текста и посчитать.
Вот код может кому надо
Проблема в том что у меня не получается вообще выделять функции из строки, и в том что в VB нету функций arcsin,arccos,целая часть,дробная часть,sign. Помогите кто может..
Public Function inter(stroka As String) As Double
'Деление строки на элементы
k = 0
Dim funk() As Byte, per() As Double
For i = 1 To Len(stroka)
b = Mid(stroka, i, 1)
If b = "+" Or b = "-" Or b = "*" Or b = "/" Then
If b = "-" And tmp = "" Then GoTo jg
k = k + 1
ReDim Preserve funk(k)
ReDim Preserve per(k)
If b = "+" Then funk(k) = 4
If b = "-" Then funk(k) = 3
If b = "*" Then funk(k) = 2
If b = "/" Then funk(k) = 1
per(k) = tmp
tmp = ""
Else
jg:
tmp = tmp + b
End If
Next i
ReDim Preserve per(k + 1)
per(k + 1) = tmp
'For p = 1 To UBound(funk)
'MsgBox per(p)
'MsgBox funk(p)
'Next
'MsgBox (per(p))
lk = 1
Do While lk <= UBound(funk)
If funk(lk) = 2 Then
per(lk) = per(lk) * per(lk + 1)
For k = lk + 1 To UBound(per) - 1
per(k) = per(k + 1)
Next k
ReDim Preserve per(UBound(per) - 1)
For k = lk To UBound(funk) - 1
funk(k) = funk(k + 1)
Next k
ReDim Preserve funk(UBound(funk) - 1)
Else
lk = lk + 1
End If
Loop
Do While UBound(funk) > 0
lk = 1
Do While lk <= UBound(funk)
If funk(lk) = 1 Then
per(lk) = per(lk) / per(lk + 1)
For k = lk + 1 To UBound(per) - 1
per(k) = per(k + 1)
Next k
ReDim Preserve per(UBound(per) - 1)
For k = lk To UBound(funk) - 1
funk(k) = funk(k + 1)
Next k
ReDim Preserve funk(UBound(funk) - 1)
Else
lk = lk + 1
End If
Loop
lk = 1
Do While lk <= UBound(funk)
If funk(lk) = 3 Then
per(lk) = per(lk) - per(lk + 1)
For k = lk + 1 To UBound(per) - 1
per(k) = per(k + 1)
Next k
ReDim Preserve per(UBound(per) - 1)
For k = lk To UBound(funk) - 1
funk(k) = funk(k + 1)
Next k
ReDim Preserve funk(UBound(funk) - 1)
Else
lk = lk + 1
End If
Loop
lk = 1
Do While lk <= UBound(funk)
If funk(lk) = 4 Then
per(lk) = per(lk) + per(lk + 1)
For k = lk + 1 To UBound(per) - 1
per(k) = per(k + 1)
Next k
ReDim Preserve per(UBound(per) - 1)
For k = lk To UBound(funk) - 1
funk(k) = funk(k + 1)
Next k
ReDim Preserve funk(UBound(funk) - 1)
Else
lk = lk + 1
End If
Loop
Loop
inter = per(1)
End Function
Public Function mat(a As String) As String
s1 = ""
ni = InStrRev(a, ""
' If Mid(a, i2, 1) = "" Then ni = i 'запоминает положение последней )
If ni > 0 Then
i2 = InStrRev(a, "" 'если встречает (, значит это и есть самая глубокая ( )
For j = i2 + 1 To ni
If Mid(a, j, 1) = "" Then
b = Mid(a, 1, i2 - 1) + Trim(Str(inter(Trim(s1)))) + Mid(a, 2 + i2 + Len(s1), Len - j) '
' delete(a,i,2+len(s1)) 'удаляет исходную скобку…
' insert(rasstr(s1),a,i) '… и вставляет вместо нее значение скобки
'возвращается выше на скобку и продолжает далее цикл
s1 = ""
mat = mat(Trim(b))
Else
s1 = s1 + Mid(a, j, 1)
End If
Next j
End If
mat = inter 'расчет конечного результата
End Function
Ааа.. Ну дык используй это: http://vbnet.ru/forum/show.aspx?id=163253
Или какую-нибудь другую библиотеку типа MTParser.
Надобность в написании функции пропадает. Проверено
з.ы. так как вб и вбскрипт не поддерживают всего что тебе нужно, то мтпарсер будет лучше.