Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Формула из текста


Автор: eganeev 3.2.2007, 21:26
Кто знает как сделать чтобы, можно было формулу вводить в текстовом поле, а программа ее вычисляла??? Заранее спасибо.

Автор: Данкинг 3.2.2007, 21:32
А подробнее?!

Автор: W4FhLF 3.2.2007, 22:44
http://www.vb.kiev.ua/code/math/ExEvaluator.zip

Автор: eganeev 4.2.2007, 10:10
Цитата(Данкинг @ 3.2.2007,  21:32)
А подробнее?!

есть формула, к примеру 3х+6х-5(ее нужно ввести в текстовом поле), мне надо чтобы я мог значению y присвоить эту формулу.

Автор: Kirill89 4.2.2007, 15:27
Цитата(eganeev @  4.2.2007,  10:10 Найти цитируемый пост)
есть формула, к примеру 3х+6х-5(ее нужно ввести в текстовом поле), мне надо чтобы я мог значению y присвоить эту формулу. 

Через поиск в тексте и множество операторов if , case, while ... 
Алгоритм такой, что ищишь в тексте например все знаки "+", "-", "*", "/", а потом переменные между этимизнаками, если это, напримаер, квадратное уравнение, то алгритм, соответственно будет сложнее...
Если тебе программа нужна, то тебе в центор помощи.

Автор: Кирилл 4.2.2007, 17:07
W4FhLF, что такое CExpressionEvaluator?
Насколько я понимаю, весь секрет в нём.

Автор: Akina 5.2.2007, 10:04
Цитата(eganeev @  4.2.2007,  11:10 Найти цитируемый пост)
мне надо чтобы я мог значению y присвоить эту формулу

Ну и присваивай как строку... а можешь сделать разбор в польскую нотацию и присваивать полученный массив - тогда можно будет даже определить операторы работы с формулами.

Но лучше создать для этого свой класс.

Автор: eganeev 6.2.2007, 08:49
Цитата(Akina @ 5.2.2007,  10:04)
Цитата(eganeev @  4.2.2007,  11:10 Найти цитируемый пост)
мне надо чтобы я мог значению y присвоить эту формулу

Ну и присваивай как строку... а можешь сделать разбор в польскую нотацию и присваивать полученный массив - тогда можно будет даже определить операторы работы с формулами.

Но лучше создать для этого свой класс.

А можно подробнее. Если можно то кодом. Я тока начинающий программист на VB6.

Автор: mihanik 6.2.2007, 15:00
Цитата(eganeev @  6.2.2007,  08:49 Найти цитируемый пост)
Я тока начинающий программист на VB6. 


Если начинающий, то сразу тебе такое не решить.

Начинай с простейшего калькулятора, выполняющего 4 действия: +, -, *, /.
Потом разберись с польской записью (нотацией) выражения (тут немного погуглить придётся).
Примеров в сети много...
Потом уже начинай свою задачу решать...

Автор: Rodman 6.2.2007, 16:44
eganeev, см. польская инверсная запись (польская инверсная нотация)...

метод расчета при помощи стека... простой и мощный вариант...

Автор: JusTalionis 6.2.2007, 17:41
Цитата(eganeev @  6.2.2007,  08:49 Найти цитируемый пост)
А можно подробнее. Если можно то кодом. Я тока начинающий программист на VB6. 
 тогда скачай код, который дал тебе  W4FhLF, загузи его в VB и рассмотри состав; проверь как работает, поэкспериментируй... если ты программист а не лодырь))))

Цитата(Кирилл @  4.2.2007,  17:07 Найти цитируемый пост)
что такое CExpressionEvaluator?
 а это как раз тот самый "класс" о котором говорил Akina. Там уже дан код разбора текстовой строки, типа, если стоит "+", то сложить, если "*", то перемножить, и т. д.

А простых способов перевода 1:1, как, вероятно, ожидал eganeev, в Бейсике нет, потому что текстовая строка - это значение переменной, а вычисляемое выражение (формула) - это имена переменных (и функций), и одно в другое не переводится.

W4FhLF, большое спасибо за ссылку! Огромная работа там проделана...

Автор: W4FhLF 6.2.2007, 18:13
Кстати откопал ещё один исполнитель выражений, реализовано всё одной функцией, более простой вариант. Смотрите в аттаче.




Автор: eganeev 6.2.2007, 20:42
Цитата(JusTalionis @ 6.2.2007,  17:41)


А простых способов перевода 1:1, как, вероятно, ожидал eganeev, в Бейсике нет, потому что текстовая строка - это значение переменной, а вычисляемое выражение (формула) - это имена переменных (и функций), и одно в другое не переводится.

W4FhLF, большое спасибо за ссылку! Огромная работа там проделана...


Я думал в бейсике можно напрямую. Будем изучать код.  Всем спасибо за ответ.

Автор: Pugach 6.3.2007, 20:47
А ведь можно формулу записанную тексом можно присвоить ячейке Excel и снять с нее результат.

Автор: Naghual 7.3.2007, 11:30
Pugach -  это операция на гландах через задний проход!

Автор: mihanik 7.3.2007, 14:27
 smile 

Вот так можно посчитать (1+2)*3 при помощи калькулятора

Код

         set WshShell = WScript.CreateObject("WScript.Shell")
         WshShell.Run "calc"
         WScript.Sleep 100
         WshShell.AppActivate "Calculator"
         WScript.Sleep 100
         WshShell.SendKeys "1{+}"
         WScript.Sleep 500
         WshShell.SendKeys "2"
         WScript.Sleep 500
         WshShell.SendKeys "~"
         WScript.Sleep 500
         WshShell.SendKeys "*3"
         WScript.Sleep 500
         WshShell.SendKeys "~"
         WScript.Sleep 
2500

Потом можно скопировать результат в буфер обмена...
А уж из буфера обмена...  smile 

Автор: Pugach 7.3.2007, 15:15
Ну я просмотрел предложенные коды, по мне так они слишком большие.

Автор: W4FhLF 7.3.2007, 15:46
mihanik, это 5. 

Автор: Naghual 7.3.2007, 16:12
Тогда не соблоговолит ли уважаемый Pugach продемонстрировать что-либо из своего кода?

Автор: Pugach 7.3.2007, 19:57
Через пару недель надеюсь напишу, много работы.
Просто мне нужно реализовать метод Хука-Дживса (поиск минимума функции, зависящей от нескольких параметров)
Пользователь должен ввести функцию, и аргументы ,от которых она зависит.

Как это реализовать с помощью вашего калькулятора я не представляю.

Автор: ama_kid 8.3.2007, 16:58
Pugach
мне кажется, тебе все-таки необходимо понимать твою задачу до конца: тебе нужно реализовать именно МЕТОД или парсинг строки на математические функции? Не имею представления о сложности первой задачи, но вторая является достаточно сложной вещью - я несколько лет назад реализовывал такую для набора символов ['(',')','*','/','+','-','c','o','s','i','n','0'..'9','.','x'] - как видно тут достаточно ограниченный набор - синус, косинус, простейшие математические действия и при этом - подразумевалась функция ОДНОЙ ПЕРЕМЕННОЙ! Т.е. было условие, что пользователь будет вводить функцию в таких символьных рамках. Весь код у меня занял целых пять печатных страниц мелким шрифтом (писал я достаточно оптимально). А ты говоришь, что тебе надо реализовать такой парсинг функции НЕСКОЛЬКИХ ПЕРЕМЕННЫХ, да еще и без ограничивающих функцию условий (по крайней мере ты не уточнил их - значит, пользователь может вводить и экспоненту, и косекансы, и производные с интегралами, да?) да еще и вкупе с методом некоего Хука-Дживса и еще жалуешься, что предлагаемый тебе код слишком большой? smile Ну что же - удачи тебе в собственных поисках философского камня... smile

Автор: Pugach 8.3.2007, 17:48
Поэтому я и хочу задействовать Excel, чтоб в одной ячейке была записана функция, а в других те переменные, от которых она зависит.
Попытаюсь это сделать.

Автор: Kirill89 8.3.2007, 21:31
Цитата(Pugach @  8.3.2007,  17:48 Найти цитируемый пост)
Поэтому я и хочу задействовать Excel, чтоб в одной ячейке была записана функция, а в других те переменные, от которых она зависит.
Попытаюсь это сделать. 

А зачем тогда насиловать VB? Просто создай лист с формулами и их аргументами. smile 

Автор: Pugach 9.3.2007, 19:02
Вот. Предлагаю Вашему вниманию код, на мой взгляд довольно простой.
В text1 вводим формулу (синтаксис длжен точно совпадать с синтаксисом в Excel)
В text2 вводим через запятую переменные
В text3 вводим через запятую значения переменных.
Код

Private Sub Command1_Click()
 Dim PerTxt, Per0Txt, FunctionTxt As String
 Dim n As Single
 Dim x(0 To 10) As String
 Dim x0(0 To 10) As String
 Dim i As Integer
 Dim AppExcel As New Excel.Application
 Dim WBK As Excel.Workbook
 Dim WSH As Excel.Worksheet

 PerTxt = Text2.Text
 Per0Txt = Text3.Text
 FunctionTxt = Text1.Text
   
 Set AppExcel = New Excel.Application
 'AppExcel.Visible = True
  AppExcel.Workbooks.Add
  
 PerTxt = Split(PerTxt, ",")
 Per0Txt = Split(Per0Txt, ",")
 For i = LBound(PerTxt) To UBound(PerTxt)
  x(i) = PerTxt(i)
  x(i) = Trim(x(i))
  x0(i) = Per0Txt(i)
  x0(i) = Trim(x0(i))
  FunctionTxt = Replace(FunctionTxt, x(i), x0(i))
 Next
 
 FunctionTxt = "=" & FunctionTxt
 Range("a1").FormulaLocal = (FunctionTxt)
 Text4.Text = Range("a1").Value
 'óíè÷òîæåíèå:
 Set AppExcel = Nothing
End Sub


Помоему проще некуда

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)