решения уравнений
От: tdebug Беларусь  
Дата: 13.12.05 16:46
Оценка:
Помогите плиз найти какую-нибудь не сложную программку для решения уравнений, да и не для решения даже, а скорее тупой калькулятор нужен, который бы просто мог использовать методы класса Math, на входе получать например какую-нибудь любую функцию, типа 4*x+sin(2x)+x+(3+cos(x)), и просто считать ответ учитывая скобки.
Вообще вопрос даже больше в том — как организовать ввод такого выражения, не используя собственно разбор выражения (не компилятор же надо ). Как на форме представить такой коструктор выражения я себе представляю — просто "собирать" уравнение из готовых функций нажимая на кнопки "("log10" "*" "tg" "+" "cos" ")" "+" "sin" "+" "cos" и т.п. и отдельно в TextBox задать X. А вот как это представить в виде методов/классов, пока не очень представляю... через делегаты что ли... у кого-нибудь есть мысли?
Re: решения уравнений
От: psg  
Дата: 13.12.05 17:38
Оценка:
Здравствуйте, tdebug, Вы писали:

T>Вообще вопрос даже больше в том — как организовать ввод такого выражения, не используя собственно разбор выражения (не компилятор же надо ).


А почему вы не хотите использовать разбор выражений? Это совсем не так страшно, как кажется. В частности, в классической книге Страуструпа "Язык программирования C++" в качестве примера иллюстрирующего основные конструкции C++ используется как раз калькулятор
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: решения уравнений
От: psg  
Дата: 13.12.05 17:39
Оценка:
Здравствуйте, psg, Вы писали:

psg>Здравствуйте, tdebug, Вы писали:


T>>Вообще вопрос даже больше в том — как организовать ввод такого выражения, не используя собственно разбор выражения (не компилятор же надо ).


psg>А почему вы не хотите использовать разбор выражений? Это совсем не так страшно, как кажется. В частности, в классической книге Страуструпа "Язык программирования C++" в качестве примера иллюстрирующего основные конструкции C++ используется как раз калькулятор


Я имел в виду "калькулятор с разбором выражения".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: решения уравнений
От: Аноним  
Дата: 14.12.05 09:42
Оценка:
Здравствуйте, tdebug, Вы писали:

T> Помогите плиз найти какую-нибудь не сложную программку для решения уравнений, да и не для решения даже, а скорее тупой калькулятор нужен, который бы просто мог использовать методы класса Math, на входе получать например какую-нибудь любую функцию, типа 4*x+sin(2x)+x+(3+cos(x)), и просто считать ответ учитывая скобки.

T>Вообще вопрос даже больше в том — как организовать ввод такого выражения, не используя собственно разбор выражения (не компилятор же надо ). Как на форме представить такой коструктор выражения я себе представляю — просто "собирать" уравнение из готовых функций нажимая на кнопки "("log10" "*" "tg" "+" "cos" ")" "+" "sin" "+" "cos" и т.п. и отдельно в TextBox задать X. А вот как это представить в виде методов/классов, пока не очень представляю... через делегаты что ли... у кого-нибудь есть мысли?

Знаком с понятием дерева? Наверное, да. Тогда с классами и методами всё просто

2*x + ln(4*sin(x)):

выражение
  сложение
    произведение
      2
      x
    логарифм натуральный
      произведение
        произведение
          4
          синус
            x


Дерево объектов. Классы будут: базовый абстактный "выражение", и по одному наследнику для каждой операции. Отдельно упомяну, что будет и наследник "выражения" "константа" для представления констант и переменных.
Re[2]: решения уравнений
От: Badenweiler Россия http://helloimyourmind.com/
Дата: 14.12.05 10:20
Оценка:
Здравствуйте, psg, Вы писали:

psg>А почему вы не хотите использовать разбор выражений? Это совсем не так страшно, как кажется. В частности, в классической книге Страуструпа "Язык программирования C++" в качестве примера иллюстрирующего основные конструкции C++ используется как раз калькулятор


Да, и у Шилдта в "Справочнике" есть разбор выражений, на C#
:: Hello, I'm your mind [[Bjork — Isobel]]
Re: решения уравнений
От: kig Россия  
Дата: 14.12.05 13:31
Оценка:
Здравствуйте, tdebug, Вы писали:

T> Помогите плиз найти какую-нибудь не сложную программку для решения уравнений, да и не для решения даже, а скорее тупой калькулятор нужен, который бы просто мог использовать методы класса Math, на входе получать например какую-нибудь любую функцию, типа 4*x+sin(2x)+x+(3+cos(x)), и просто считать ответ учитывая скобки.

T>Вообще вопрос даже больше в том — как организовать ввод такого выражения, не используя собственно разбор выражения (не компилятор же надо ). Как на форме представить такой коструктор выражения я себе представляю — просто "собирать" уравнение из готовых функций нажимая на кнопки "("log10" "*" "tg" "+" "cos" ")" "+" "sin" "+" "cos" и т.п. и отдельно в TextBox задать X. А вот как это представить в виде методов/классов, пока не очень представляю... через делегаты что ли... у кого-нибудь есть мысли?

Ну если не использовать разбор выражений, то может как раз проще использовать компилятор?

Создавать на ходу код с эквивалентной заменой — sin на Math.Sin, cos на Math.Cos и т.д. Тогда введенное выражение, например 4*x+sin(2x)+x+(3+cos(x)), будет выглядить примерно так:


public class MyCalc
{
  public double Calc(double x)
  {
    return 4*x+Math.Sin(2x)+x+(3+Math.Cos(x));
  }
}


Компилировать сгенеренный код и выполнять.
Re[2]: решения уравнений
От: AlexGK Россия  
Дата: 14.12.05 18:13
Оценка:
kig>Ну если не использовать разбор выражений, то может как раз проще использовать компилятор?

kig>Создавать на ходу код с эквивалентной заменой — sin на Math.Sin, cos на Math.Cos и т.д. Тогда введенное выражение, например 4*x+sin(2x)+x+(3+cos(x)), будет выглядить примерно так:



kig>
kig>public class MyCalc
kig>{
kig>  public double Calc(double x)
kig>  {
kig>    return 4*x+Math.Sin(2x)+x+(3+Math.Cos(x));
kig>  }
kig>}
kig>


kig>Компилировать сгенеренный код и выполнять.


Усовершенствую идею(для ввода выражений):
Описываешь текстом класс что-то типа

string _clasText = @"
public class Paramter{
   string _name;
   string _value;
   public string Name{
      get{ return _name;}
      set{ _name = value;}
   }
   public string Value{
      get{ return _name;}
      set{ _name = value;}
   }
}
public class Evaluator{
  private double Sin(double Arg){
      return Math.Sin(Arg);
  }
  private double Cos(double Arg){
      return Math.Cos(Arg);
  }
  private double Ln(double Arg){
      return Math.Ln(Arg);
  } 
  double x,y,z;

  //........  и т.д. - все нужные тебе функции";
.....
  public double EvalMethod(){
     return expr;
  }  
}
"

Короче, фомируешь такой код где прежде присваиваешь значения X y и Z, вместо Expr втсавляешь выражение, динамически компилируешь, и в случае отсутствия ошибко компиляции получаешь динамическую сборку, в которой будет твой динамический тип, вызываешь через отражение метод EvalMethod() и получаешь результат. Т.е. в рантайме реализовывешь предложение Kig-а и можно выражения вводить пользователю
И ничего разбирать не надо. Есть один минус можно вставить не только арифметическое выражение но и код.
Присоеднияюсь к другим насчет Страуструпа — ничего страшного нет, попробуй реащизовать разбор — это интересно, тем более код небольшой 2 листа в книге.
Re[3]: решения уравнений
От: AlexGK Россия  
Дата: 14.12.05 18:17
Оценка:
Поправочка: там есть класс Paramter — он не нужен... были мысли по использованию динамического списка параметров, но потом ушли сами собой..
Re: решения уравнений
От: postfix  
Дата: 14.12.05 20:25
Оценка:
есть такая штука как польская запись (обход дерева)
Re[3]: решения уравнений
От: kig Россия  
Дата: 14.12.05 20:26
Оценка:
Здравствуйте, AlexGK, Вы писали:


AGK>...Т.е. в рантайме реализовывешь предложение Kig-а и можно выражения вводить пользователю ...


Дык я вроде это и написал:

"
Создавать на ходу код ...

Компилировать сгенеренный код и выполнять
"

AGK>И ничего разбирать не надо. Есть один минус можно вставить не только арифметическое выражение но и код.


Это может быть наоборот плюсом — сильно продвинутый калькулятор.
Re[2]: решения уравнений
От: Аноним  
Дата: 14.12.05 20:32
Оценка:
Уважаемый, это классический пример — разбор математических выражении, т.е. простой мат парсер.
я в свое время убил 2 недели на то чтобы его написать.
Посмотри что такое рекурсивный спуск и все что с ним связанно.
Re[2]: решения уравнений
От: tdebug Беларусь  
Дата: 14.12.05 22:08
Оценка:
Здравствуйте, kig, Вы писали:

kig>Ну если не использовать разбор выражений, то может как раз проще использовать компилятор?

kig>Создавать на ходу код с эквивалентной заменой — sin на Math.Sin, cos на Math.Cos и т.д. Тогда введенное выражение, например 4*x+sin(2x)+x+(3+cos(x)), будет выглядить примерно так:
kig>
kig>public class MyCalc
kig>{
kig>  public double Calc(double x)
kig>  {
kig>    return 4*x+Math.Sin(2x)+x+(3+Math.Cos(x));
kig>  }
kig>}
kig>


kig>Компилировать сгенеренный код и выполнять.


Хм. интересная идея. Только где бы ещё почитать про написание такого? Или пример какой-нибудь глянуть... А то никогда не делал компиляции в реалтайме. В MSDN нашёл описание класса Compiler и интерфейса ICodeCompiler, это то что надо?
Re: решения уравнений
От: squiz  
Дата: 14.12.05 23:17
Оценка:
здесь есть Mathparser, вроде то чего вам хо.
Never underestimate those behind you...
Re[3]: решения уравнений
От: Maniac_Mansion Россия  
Дата: 15.12.05 08:15
Оценка:
Здравствуйте, tdebug, Вы писали:

T> Хм. интересная идея. Только где бы ещё почитать про написание такого? Или пример какой-нибудь глянуть... А то никогда не делал компиляции в реалтайме. В MSDN нашёл описание класса Compiler и интерфейса ICodeCompiler, это то что надо?


генерация из исходного кода sourceCode:

CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();

CompilerParameters cp = new CompilerParameters();

cp.ReferencedAssemblies.Add( "System.dll" );
//плюс еще необходимые референсы

cp.GenerateExecutable = false;

cp.GenerateInMemory = true;

CompilerResults cr = compiler.CompileAssemblyFromSource(cp, sourceCode);


далее можно у скомпиленой ассембли взять нужный класс
Type executer = cr.CompiledAssembly.GetType("MyClassFullName");

а потом через рефлекшен создать объект и выполнить неоходимый метод Calc(double x)

Только надо быть внимательным скомпиленые ассембли нельзя выгрузить из домена приложения. Можно компилировать и исполнять в другом домене, а потом выгружать уже этот домен.

про домены приложения можно посмореть здесь: http://www.rsdn.ru/article/dotnet/appdomains.xml
Автор(ы): Андрей Корявченко
Дата: 12.06.2003
Статья рассказывает о доменах приложений (Application Domains) в .NET Framework.
Приводятся примеры работы с доменами приложений, а также сравнение производительности и потребляемых ресурсов приложений, загружаемых в отдельные процессы и отдельные домены приложений, находящиеся в одном процессе.
Re[2]: решения уравнений
От: tdebug Беларусь  
Дата: 17.12.05 14:46
Оценка:
Здравствуйте, squiz, Вы писали:

S>здесь есть Mathparser, вроде то чего вам хо.


Спасибо большое!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.