powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как распознать формулу из строковой переменной!
10 сообщений из 10, страница 1 из 1
Как распознать формулу из строковой переменной!
    #32764006
Красотка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые дамы и господа!
Проблема вот в чем: допустим есть формула записанная пользователем в строку, нужно енту формулу распознать( плюсики, минусики, деление, умножение, exp(), синусики и т.д.) и подсчитать.
Если у кого есть готовые алгоритмы на каком-либо языке(лучше VB, С++)
не сочтите за труд помочь поставленной в тупик девушке.
С уважением!
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32764113
Осел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В книге Шилдта "Полный справочник по C# есть простой пример парсинга "синтаксический анализ методом рекурсиного спуска".
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32765335
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32765537
Фотография Max Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КрасоткаУважаемые дамы и господа!
Проблема вот в чем: допустим есть формула записанная пользователем в строку, нужно енту формулу распознать( плюсики, минусики, деление, умножение, exp(), синусики и т.д.) и подсчитать.
Если у кого есть готовые алгоритмы на каком-либо языке(лучше VB, С++)
не сочтите за труд помочь поставленной в тупик девушке.
С уважением!
При определённых правилах твоей игры возможен расчёт посредством объекта Excel.Application
Смотри сама:
1. Открываешь Excel
2. Загоняешь свою строку в какую-либо ячейку в свойство Formula
3. Считываешь результат из свойства Value.
4. Если ошибка, то узнаёшь какая.
5. Закрываешь Excel
Усё.
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32765590
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
раз пошла в ход "тяжелая артиллерия" :)

можно сгенерить код класса на VB.NET/C#, в котором вычисляется статический метод с исх. формулой (CodeDOM)

откомпилировать его динамически (GenerateInMemory)

в полученной сборке вызвать метод и получить результат
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32765822
msde
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>кузя
Можно привести код этой "тяжелой артиллерии", если он не очень большой :-)
плз
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32765840
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению на VB кода нет, только на C# (переписывать - ошибок насажать) - законченное консольное приложение.
подход, примерно везде одинаков - в рамках средств, предоставляемых MS :)

"с синусиками и косинусиками"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;

class CSEvaluationClass
{
  [STAThread]
  static void Main(string[] args)
  {
    string expression1="2+sin(77/3.1415)/0.271";
    Console.WriteLine("{0} = {1}", expression1, Evaluator(expression1));
    
    string expression2="1-cos(81/3.1415)/1.272";
    Console.WriteLine("{0} = {1}", expression2, Evaluator(expression2));
  }

  static double Evaluator(string expression)
  { 
    // компилятор кода C#
    ICodeCompiler       cs=(new CSharpCodeProvider().CreateCompiler());
    // параметры компиляции: DLL в памяти
    CompilerParameters	cp=new CompilerParameters();
    cp.ReferencedAssemblies.Add("system.dll");
    cp.GenerateExecutable =false; // создать DLL
    cp.GenerateInMemory   =true;  // создать в памяти
		
    // текст программы на C#:
    string code=string.Empty;
    code+="using System;";
    code+="namespace CSEvaluator";
    code+="{ public class Evaluate";
    code+="  { public  double GetResult(){ return(\r\n"+expression+"\r\n); }";
    code+="    private double sin(double x){ return(Math.Sin(x)); }";
    code+="    private double cos(double x){ return(Math.Cos(x)); }";
    code+="  }";
    code+="}";
    
    // компиляция исходного кода и получение сборки
    CompilerResults cr=cs.CompileAssemblyFromSource(cp, code);
    if(cr.Errors!=null && cr.Errors.Count>0) // ? ошибки 
    { for(int i=0; i<cr.Errors.Count; i++)
	Console.WriteLine("Col {0} - {1}", cr.Errors[i].Column, cr.Errors[i].ErrorText);
      return(0.0);
    }
    
    try // создать объект и вызвать метод для вычисления выражения
    { object ob=cr.CompiledAssembly.CreateInstance("CSEvaluator.Evaluate");
      return((double)ob.GetType().InvokeMember("GetResult", BindingFlags.InvokeMethod, null, ob, new object[]{}));
    } 
    catch(Exception ex){ Console.WriteLine(ex.Message); return(0.0); }
  }
}

более полные и продвинутые примеры таких "калькуляторов" есть на www.codeproject.com
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32769637
crowler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще как вариант, если с базой данных общаетесь то можно сделать так
Select Sin(x)+sqrt(x)-58*x - sqrt(x);

добавить параметр х
выполнить запрос
строку select можно формировать динамически из кода как угодно, основное чтобы синтиксис представления формул совпадал с sql`ым.
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32769884
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 crowler
отличная мысль. можно использовать базу mdb (в случае чего - создавать пустую динамически через adox). а в jet'e со всякими функциями - богато :)
и вычислять выражения через ExecuteScalar.
...
Рейтинг: 0 / 0
Как распознать формулу из строковой переменной!
    #32771003
crowler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всегда пожалуйста.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как распознать формулу из строковой переменной!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]