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

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

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

в полученной сборке вызвать метод и получить результат
...
Рейтинг: 0 / 0
03.11.2004, 06:21
    #32765822
msde
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распознать формулу из строковой переменной!
>кузя
Можно привести код этой "тяжелой артиллерии", если он не очень большой :-)
плз
...
Рейтинг: 0 / 0
03.11.2004, 07:19
    #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
04.11.2004, 20:21
    #32769637
crowler
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распознать формулу из строковой переменной!
еще как вариант, если с базой данных общаетесь то можно сделать так
Select Sin(x)+sqrt(x)-58*x - sqrt(x);

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


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