Помогите плиз найти какую-нибудь не сложную программку для решения уравнений, да и не для решения даже, а скорее тупой калькулятор нужен, который бы просто мог использовать методы класса Math, на входе получать например какую-нибудь любую функцию, типа 4*x+sin(2x)+x+(3+cos(x)), и просто считать ответ учитывая скобки.
Вообще вопрос даже больше в том — как организовать ввод такого выражения, не используя собственно разбор выражения (не компилятор же надо ). Как на форме представить такой коструктор выражения я себе представляю — просто "собирать" уравнение из готовых функций нажимая на кнопки "("log10" "*" "tg" "+" "cos" ")" "+" "sin" "+" "cos" и т.п. и отдельно в TextBox задать X. А вот как это представить в виде методов/классов, пока не очень представляю... через делегаты что ли... у кого-нибудь есть мысли?
Здравствуйте, tdebug, Вы писали:
T>Вообще вопрос даже больше в том — как организовать ввод такого выражения, не используя собственно разбор выражения (не компилятор же надо ).
А почему вы не хотите использовать разбор выражений? Это совсем не так страшно, как кажется. В частности, в классической книге Страуструпа "Язык программирования C++" в качестве примера иллюстрирующего основные конструкции C++ используется как раз калькулятор
Здравствуйте, 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
Дерево объектов. Классы будут: базовый абстактный "выражение", и по одному наследнику для каждой операции. Отдельно упомяну, что будет и наследник "выражения" "константа" для представления констант и переменных.
Здравствуйте, psg, Вы писали:
psg>А почему вы не хотите использовать разбор выражений? Это совсем не так страшно, как кажется. В частности, в классической книге Страуструпа "Язык программирования C++" в качестве примера иллюстрирующего основные конструкции C++ используется как раз калькулятор
Да, и у Шилдта в "Справочнике" есть разбор выражений, на C#
Здравствуйте, 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)
{
return4*x+Math.Sin(2x)+x+(3+Math.Cos(x));
}
}
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> return4*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 листа в книге.
AGK>...Т.е. в рантайме реализовывешь предложение Kig-а и можно выражения вводить пользователю ...
Дык я вроде это и написал:
"
Создавать на ходу код ...
Компилировать сгенеренный код и выполнять
"
AGK>И ничего разбирать не надо. Есть один минус можно вставить не только арифметическое выражение но и код.
Это может быть наоборот плюсом — сильно продвинутый калькулятор.
Re[2]: решения уравнений
От:
Аноним
Дата:
14.12.05 20:32
Оценка:
Уважаемый, это классический пример — разбор математических выражении, т.е. простой мат парсер.
я в свое время убил 2 недели на то чтобы его написать.
Посмотри что такое рекурсивный спуск и все что с ним связанно.
Здравствуйте, 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> return4*x+Math.Sin(2x)+x+(3+Math.Cos(x));
kig> }
kig>}
kig>
kig>Компилировать сгенеренный код и выполнять.
Хм. интересная идея. Только где бы ещё почитать про написание такого? Или пример какой-нибудь глянуть... А то никогда не делал компиляции в реалтайме. В MSDN нашёл описание класса Compiler и интерфейса ICodeCompiler, это то что надо?
Здравствуйте, 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)
Только надо быть внимательным скомпиленые ассембли нельзя выгрузить из домена приложения. Можно компилировать и исполнять в другом домене, а потом выгружать уже этот домен.