Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Графики Добавлено: 18.04.05 12:26  

Автор вопроса:  Vilya | Web-сайт: нету | ICQ: 232995216 
Я вот делаю программу для построения и исследования графиков, кто с таким сталкивался, подскажите плиз как лучше реализовать алгоритм построения, а то с моим алгоритмом очень сложные графики строятся неправильно.
Потом исследования: я начал исследовать "на глаз", то есть с погрешностью, я щас пытаюсь сделать через производную, но не очень-то получается. Помогите плиз кто может, вопрос жизни и смерти!!!

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #1 Добавлено: 18.04.05 15:37
а то с моим алгоритмом очень сложные графики строятся неправильно.


В смысле твой парсер считает криво? Или рисуется не так?

я щас пытаюсь сделать через производную, но не очень-то получается


Тебе нужен парсер для вычисления производных?

Ответить

Номер ответа: 2
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #2
Добавлено: 18.04.05 19:40
Ну с рисованием ладно, как-нибудь сам разберусь, а вот с производными, короче да, для вычисления производных

Ответить

Номер ответа: 3
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #3 Добавлено: 18.04.05 20:16
Контрол для вычисления производных полетел в vit-sh@yandex.ru

Ответить

Номер ответа: 4
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #4
Добавлено: 18.04.05 20:24
Ловлю

Ответить

Номер ответа: 5
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #5
Добавлено: 18.04.05 21:02

Поймал. Там куча функций, ты откуда брал это всё? можешь весь пример дать, а то не разбиру в каком порядке функции использовать.

Ответить

Номер ответа: 6
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #6
Добавлено: 18.04.05 22:44
А, всё, не надо, я всё понял, ты просто не представляешь как я тебе благодарен.....

Ответить

Номер ответа: 7
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #7
Добавлено: 18.04.05 23:21
А, ещё, можно ли такое сделать с переменной чтобы она не переходила в экспонициальную(<по-моему правильно) форму, короче с буквой E, а оставалась обычной?

Ответить

Номер ответа: 8
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #8 Добавлено: 19.04.05 07:23
Э-э-э...
Поточнее можешь? Че-то я не въехал

Ответить

Номер ответа: 9
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #9
Добавлено: 19.04.05 16:04
Ну например есть число 1.00234567-E2 - это экспонициальная форма. А мне надо чтобы оно в неё не переходило, а оставалось 0.00000000001

Ответить

Номер ответа: 10
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #10
Добавлено: 19.04.05 16:06
Если у каво есть, дайте всё-таки код для вычисления строки с +,-,*,/,^,sin,cos,tg,ctg,(),||
Кто реально поможет отблагодарю!!!

Ответить

Номер ответа: 11
Автор ответа:
 Pashenko



ICQ: 176176951 

Вопросов: 14
Ответов: 655
 Профиль | | #11 Добавлено: 19.04.05 17:28
экспонициальную(<по-моему правильно)

Может быть всё-таки "экспоненциальную"?

Ответить

Номер ответа: 12
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #12
Добавлено: 19.04.05 20:10
не важно

Ответить

Номер ответа: 13
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #13 Добавлено: 20.04.05 07:27
Есть класс для вычисления выражений + - * / е еще чегото. Если надо, то могу
поискать.

Ответить

Номер ответа: 14
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #14 Добавлено: 21.04.05 10:04
Да на! Но нефиг народ обманывать!

Автор: некий Гергерт Сергей (не я)


Файл класса *.cls


VERSION 1.0 CLASS

BEGIN

MultiUse = -1 'True

Persistable = 0 'NotPersistable

DataBindingBehavior = 0 'vbNone

DataSourceBehavior = 0 'vbNone

MTSTransactionMode = 0 'NotAnMTSObject

END

Attribute VB_Name = "Expression"

Attribute VB_GlobalNameSpace = False

Attribute VB_Creatable = True

Attribute VB_PredeclaredId = False

Attribute VB_Exposed = False

Option Explicit

Private Const MyName As String = "ExpressionClass"

'Класс для вычисления выражений в строковой форме

'(c) Гергерт Сергей, 2003

'Магадан, 04.07.2003 01:10

'Всё, иду спать...

Private Const Plus As String = "+"

Private Const Minus As String = "-"

Private Const Mult As String = "*"

Private Const Div As String = "/"

Private Const DivInt As String = "\"

Private Const Power As String = "^"

Private Const LeftPar As String = ";("

Private Const RightPar As String = ";)"

Public Enum ExprErrors

exprNoError

exprErrorParentheses

exprErrorInvalidExpression

exprErrorUnknownFunction

End Enum

Public Function Value(ByVal E As String) As Double

Attribute Value.VB_UserMemId = 0

Dim i As Long

Dim tmpLng As Long, tmpStr As String


E = LCase$(Replace(E, " ", vbNullString))

E = Replace(E, RightPar + LeftPar, RightPar + Mult + LeftPar)


'Сначал убедимся, что скобки расставлены верно.

'Идём слева направо. Открывающая скобка - плюс 1,

'закрывающая - минус 1. Всё время должно быть >=0, а в конце =0


For i = 1 To Len(E)

tmpStr = Mid$(E, i, 1)

If tmpStr = LeftPar Then

tmpLng = tmpLng + 1

ElseIf tmpStr = RightPar Then

tmpLng = tmpLng - 1

End If

If tmpLng < 0 Then Err.Raise exprErrorParentheses, MyName, "Parentheses do
not match"

Next

If tmpLng Then Err.Raise exprErrorParentheses, MyName, "Parentheses do not
match"


Value = CalcSummand(E)

End Function

Private Function CalcSummand(S As String) As Double

Dim i As Long, minPrior As Byte, minPriorPos As Long

Dim NestingLevel As Long, tmpStr As String


'Не пустая ли строка?

If Len(S) = 0 Then Exit Function 'выходим с нулём


'Проверяем, не являются ли самые внешние скобки лишними

Do While LISP(S)

Loop


'Ищем первый оператор с минимальным приоритетом на текущем уровне
вложенности

minPrior = 2

For i = 1 To Len(S)

Select Case Mid$(S, i, 1)

Case LeftPar

NestingLevel = NestingLevel + 1

Case RightPar

NestingLevel = NestingLevel - 1

Case Plus, Minus

If NestingLevel = 0 Then

minPrior = 0

minPriorPos = i

Exit For

End If

Case Mult, Div, DivInt

If NestingLevel = 0 Then

If minPrior = 2 Then

minPrior = 1

minPriorPos = i

Else

If minPriorPos = 0 Then minPriorPos = i

End If

End If

Case Power

If NestingLevel = 0 Then

If minPrior = 2 And minPriorPos = 0 Then minPriorPos = i

End If

End Select

Next


If minPriorPos = 0 Then

'Сие означает, что операторов на текущем уровне вложенности нет.

'Это, в свою очередь, означает, что либо операнд есть число,

'либо он есть функция.

CalcSummand = IsFunction(S)

If CalcSummand >= 0 Then

Exit Function 'операнд был числом, и он вычислен

Else

'Операнд был функцией. Других вариантов нет, т.к. ошибка генерится в
IsFunction

'Переменная minPriorPos нам больше не нужна по прямому назначению.

'Поэтому заюзаем её для других целей. Просто очень капризная рекурсия

'в VB, стэк экономим-с...

minPriorPos = InStr(S, LeftPar)

tmpStr = Left$(S, minPriorPos - 1)

'Вот почему нельзя вызывать CallByName от модуля?

'Сколько бы гемора исчезло...

Select Case tmpStr

Case "abs"

CalcSummand = Abs(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "atn"

CalcSummand = Atn(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "cos"

CalcSummand = Cos(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "exp"

CalcSummand = Exp(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "log"

CalcSummand = Log(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "sgn"

CalcSummand = Sgn(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "sin"

CalcSummand = Sin(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "sqr"

CalcSummand = Sqr(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case "tan"

CalcSummand = Tan(CalcSummand(Mid$(S, minPriorPos + 1, Len(S) -
minPriorPos - 1)))

Case Else

Err.Raise exprErrorUnknownFunction, MyName, "Unknown function " +
UCase$(tmpStr) + " detected"

End Select

End If

Else

'Нашли искомый оператор. Рекурсия...

If minPriorPos = 1 Then 'выражение типа -expr

tmpStr = Left$(S, 1)

If tmpStr = Plus Or tmpStr = Minus Then

CalcSummand = IIf(tmpStr = Minus, -1, 1) * CalcSummand(Mid$(S, 2))

Else

Err.Raise exprErrorInvalidExpression, MyName, "Expression is invalid"

End If

Else 'обычное a +-*/\^ b

Select Case Mid$(S, minPriorPos, 1)

Case Plus

CalcSummand = CalcSummand(Left$(S, minPriorPos - 1)) + CalcSummand(Right$(S,
Len(S) - minPriorPos))

Case Minus

CalcSummand = CalcSummand(Left$(S, minPriorPos - 1)) - CalcSummand(Right$(S,
Len(S) - minPriorPos))

Case Mult

CalcSummand = CalcSummand(Left$(S, minPriorPos - 1)) * CalcSummand(Right$(S,
Len(S) - minPriorPos))

Case Div

'Ошибку деления на ноль VB сгенерит и без нас...

CalcSummand = CalcSummand(Left$(S, minPriorPos - 1)) / CalcSummand(Right$(S,
Len(S) - minPriorPos))

Case DivInt

CalcSummand = CalcSummand(Left$(S, minPriorPos - 1)) \ CalcSummand(Right$(S,
Len(S) - minPriorPos))

Case Power

CalcSummand = CalcSummand(Left$(S, minPriorPos - 1)) ^ CalcSummand(Right$(S,
Len(S) - minPriorPos))

Case Else

'В принципе, этого возникать не должно никогда...

Err.Raise exprErrorInvalidExpression, MyName, "Expression is invalid"

End Select

End If

End If

End Function

Private Function LISP(ByRef S As String) As Boolean

Dim i As Long, tmp As Long


'LISP = Lots of Idiot Silly Parentheses!

'Фанаты языка LISP в шоке и готовят помидоры... :)


'Если уровень скобок по ходу выражения опустится до нуля,

'и это будет не конец выражения, то начальные и конечные

'скобки нужны, поскольку принадлежат разным группам.

'Иначе их можно удалить.


If Left$(S, 1) = LeftPar And Right$(S, 1) = RightPar Then

For i = 1 To Len(S)

If Mid$(S, i, 1) = LeftPar Then

tmp = tmp + 1

ElseIf Mid$(S, i, 1) = RightPar Then

tmp = tmp - 1

If tmp = 0 And i <> Len(S) Then Exit Function

End If

Next

Else

Exit Function

End If


'Скобки нужно удалить

S = Mid$(S, 2, Len(S) - 2)

LISP = True

End Function

Private Function IsFunction(F As String) As Double

'Функция - несколько подряд идущих букв и выражение в скобках.

'И больше ничего! Выражение типа "функция + функция" сюда попадать не
должно,

'по логике основной части программы

Dim i As Long


'правильность скобок гарантируется вызывающим кодом, поэтому достаточно

'проверить наличие одной, а не обоих

i = InStr(F, LeftPar)

If i = 0 Then

'Явно не функция. Может, число?

For i = 1 To Len(F)

If InStr("0123456789.", Mid$(F, i, 1)) = 0 Then Exit For

Next

If i = Len(F) + 1 Then IsFunction = Val(F) Else Err.Raise
exprErrorInvalidExpression, MyName, "Expression is invalid"

'логика программы такова, что отрицательное число вычисляется

'как (-)(expression), поэтому здесь всегда результат положительный,

'и можно использовать отрицательные числа как флаги

Exit Function

End If


'левая (а значит, и правая) скобки есть, и это не начальные ненужные скобки.

'Слева от левой скобки должнно быть имя функции. Его правильность будет

'анализировать вызывающий код

IsFunction = -1 'Флаг, что функция

End Function


Ответить

Номер ответа: 15
Автор ответа:
 Vilya



ICQ: 232995216 

Вопросов: 12
Ответов: 63
 Web-сайт: нету
 Профиль | | #15
Добавлено: 21.04.05 13:11
Это я уже видел, сне dNW послал - он первый кандидат на получение приза

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам