Страница 1 из 1

Нужен совет

Добавлено: 30 авг 2009, 06:14
Nik ADA
Ребята нужна помощь, есть задачка не простая, нужно в одном окне вводить в текстовое поле формулу скажем

Код: Выделить всё

4*r^2 либо b*c*sin(A)/2
в другом окне нужно вести переменные

Код: Выделить всё

от ворсулы видно что переменная это r, во второй формуле больше переменных
после ввода он выдавал результат помогите реализовать, скажем ввод и выод это не проблема, проблема заключаеться в определении количества переменных и вункций выполнения (операторов *,+,- и т.д. их может быть разное количество)

Re: Нужен совет

Добавлено: 30 авг 2009, 06:36
EducatedFool
В Excel это реализуется достаточно просто:

Код: Выделить всё

[color=darkblue]Sub[/color] test()
    f = InputBox("Введите формулу", , "4*r^2")
    r = InputBox("Введите значение R", , "5")
    MsgBox "Результат: " & Application.Evaluate(Replace(f, "r", r))
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
Но надо учитывать множество нюансов, и проверять формулы/значения на корректность.

Re: Нужен совет

Добавлено: 30 авг 2009, 07:30
Nik ADA
дело в том что не кто не знает какая будет формула и какие будет переменные (названия букв) то есть просто поле ввода, для формулы (TextBox) скажем, и такое же поле или несколько в зависимости от переменных поля для ввода данных.

То есть при воде в формулу
b*c*sin(A)/2
он для ввода данных выдал всего 2 поля ввода данных для B и для C.

загвозка в том что неизвестно какая будет введена формула.

Re: Нужен совет

Добавлено: 30 авг 2009, 08:38
EducatedFool
Так, что ли, надо?

Изображение

Можете вводить любую формулу - поля для ввода присутствующих в ней переменных отобразятся автоматически.

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

Вот весь код:

Код: Выделить всё

[color=darkblue]Dim[/color] arr, coll [color=darkblue]As[/color] Collection

[color=darkblue]Private[/color] [color=darkblue]Sub[/color] CommandButton1_Click()
    txt = Me.TextBox_Main
    [color=darkblue]For[/color] [color=darkblue]Each[/color] w [color=darkblue]In[/color] coll
        txt = Replace(txt, w, Значение(w))
    [color=darkblue]Next[/color]
    Me.TextBox_tmp = txt: [color=darkblue]On[/color] [color=darkblue]Error[/color] [color=darkblue]Resume[/color] [color=darkblue]Next[/color]
    Me.TextBoxResult = Application.Evaluate(Replace(txt, ",", "."))
[color=darkblue]End[/color] [color=darkblue]Sub[/color]

[color=darkblue]Private[/color] [color=darkblue]Sub[/color] TextBox_Main_Change()
    ПоискПеременных (Me.TextBox_Main)
[color=darkblue]End[/color] [color=darkblue]Sub[/color]

[color=darkblue]Sub[/color] ПоискПеременных([color=darkblue]ByVal[/color] txt [color=darkblue]As[/color] [color=darkblue]String[/color])
    СписокФункций = Array("sin", "cos", "tg", "exp")
    ЦифрыИСимволы = "0123456789+-*/^()"
    [color=darkblue]For[/color] [color=darkblue]Each[/color] w [color=darkblue]In[/color] СписокФункций: txt = Replace(txt, w, " "): [color=darkblue]Next[/color]
    [color=darkblue]For[/color] i = 1 [color=darkblue]To[/color] Len(ЦифрыИСимволы): txt = Replace(txt, Mid(ЦифрыИСимволы, i, 1), " "): [color=darkblue]Next[/color]

    arr = Split(Application.Trim(txt), " ")
    Me.TextBoxResult = Application.Trim(txt)
    [color=darkblue]Set[/color] coll = [color=darkblue]New[/color] Collection: [color=darkblue]On[/color] [color=darkblue]Error[/color] [color=darkblue]Resume[/color] [color=darkblue]Next[/color]
    [color=darkblue]For[/color] [color=darkblue]Each[/color] w [color=darkblue]In[/color] arr
        coll.Add w, [color=darkblue]CStr[/color](w)
    [color=darkblue]Next[/color]
    [color=darkblue]For[/color] i = 1 [color=darkblue]To[/color] 7
        Me.Controls("Textbox" & i).Visible = coll.Count >= i
        Me.Controls("Label" & i).Visible = coll.Count >= i
        Me.Controls("Label" & i).Caption = UCase(coll(i)) & " = "
    [color=darkblue]Next[/color]
[color=darkblue]End[/color] [color=darkblue]Sub[/color]

[color=darkblue]Private[/color] [color=darkblue]Sub[/color] UserForm_Initialize()
    Me.TextBox_Main = "12*a+a/c+d^2-sin(e*c)"
[color=darkblue]End[/color] Sub

[color=darkblue]Function[/color] Значение([color=darkblue]ByVal[/color] w [color=darkblue]As[/color] [color=darkblue]String[/color]) [color=darkblue]As[/color] [color=darkblue]Double[/color]
    [color=darkblue]On[/color] [color=darkblue]Error[/color] [color=darkblue]Resume[/color] [color=darkblue]Next[/color]
    [color=darkblue]For[/color] i = 1 [color=darkblue]To[/color] 7
        [color=darkblue]If[/color] Me.Controls("Label" & i).Caption = UCase(w) & " = " [color=darkblue]Then[/color]
            Значение = [color=darkblue]CDbl[/color](Replace(Me.Controls("Textbox" & i), ".", ","))
            [color=darkblue]Exit[/color] [color=darkblue]Function[/color]
        [color=darkblue]End[/color] [color=darkblue]If[/color]
    [color=darkblue]Next[/color]
[color=darkblue]End[/color] [color=darkblue]Function[/color]

Re: Нужен совет

Добавлено: 30 авг 2009, 08:50
Nik ADA
в точку, тока вопрос переменные A C D E и текстовые поля ставяться у меня :(

Re: Нужен совет

Добавлено: 30 авг 2009, 08:54
EducatedFool
а как сделать так что бы он сам их создавал столько сколько нужно если там не 4 переменных а всего 3 или 2 или больше.
Просто ввести другую формулу в соответствующее поле на форме:

Изображение


По умолчанию вводится формула 12*a+a/c+d^2-sin(e*c)

Код: Выделить всё

[color=darkblue]Private[/color] [color=darkblue]Sub[/color] UserForm_Initialize()
    Me.TextBox_Main = "12*a+a/c+d^2-sin(e*c)"
[color=darkblue]End[/color] [color=darkblue]Sub[/color]
Поэтому отображаются поля для 4-х переменных.
Максимум для данной версии программы - 7 переменных.

Re: Нужен совет

Добавлено: 30 авг 2009, 09:28
Nik ADA
Огромное спасибо EducatedFool помог решить задачку. тему можно закрыть