Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Небольшой вопрос по C#.


Автор: MCMK 12.5.2006, 10:57
Доброго времени суток!

Вопрос следующий: 
Необходима программа для решения интегралов. Решение в консольном приложении написал. Но это все необходимо сделать на форме. Как я представил это - textBox для ввода самого подынтегрального уравнения, кнопочка для решения и например label для вывода ответа... 
  В итоге столкнулся с проблемой: Не могу организовать ввод с помощью textBox. Т.е. не могу сделать так, чтобы  программа распознавала введенное не как обычный текст, а как уравнение... 
Надеюсь понятно объяснил. Если нет, постараюсь еще раз, только скажите... (язык C#)

Заранее спасибо!  

smile 

 

Автор: ivashkanet 12.5.2006, 11:01
Цитата(MCMK @  12.5.2006,  10:57 Найти цитируемый пост)
 Т.е. не могу сделать так, чтобы  программа распознавала введенное не как обычный текст, а как уравнение... 

А в консоли ты это сделал???
ИМХО, тут так же будет.
P.S. Код в студию 

Автор: MCMK 12.5.2006, 12:09
В консоли задается в самом тексте программы, а не вводиться smile

 

Автор: ivashkanet 12.5.2006, 12:59
Цитата(MCMK @  12.5.2006,  12:09 Найти цитируемый пост)
В консоли задается в самом тексте программы, а не вводиться

Ах, так...
Тогда придется анализироватьтекстовую строку и вытаскивать из нее функцию.
Даже не знаю чем тебе помочь  smile 
Дело это довольно таки трудоемкое, ИМХО. smile 
Хотя я могу ошибаться smile  

Автор: MCMK 12.5.2006, 13:36
Надеюсь на твою последнюю строку! smile

Хотелось бы услышать еще советы! 

Автор: MFSham 12.5.2006, 13:44
Когда я делал что-то подобное, то реализовывал этот метод
http://algolist.manual.ru/syntax/revpn.php
Только мне надо было не интеграл, а просто решить уравнение. В твоем случае этот метод будет ресурсоемкий, т.к. каждый раз придется анализировать строку при изменении аргумента. 

Автор: MCMK 12.5.2006, 19:20
MFSham, Спасибо!

Это единственный способ???  smile  

Автор: Void 12.5.2006, 19:44
Цитата(MFSham @  12.5.2006,  15:44 Найти цитируемый пост)
В твоем случае этот метод будет ресурсоемкий, т.к. каждый раз придется анализировать строку при изменении аргумента.

Один раз генерируем в байт-код простейшей стековой машины, потом функция вычисляется существенно быстрее. Можно еще сгенерить метод с помощью System.Reflection.Emit.
MCMK, собственно, если интеграл берется численно, то берем библиотечку вычисления выражений в рантайме с http://www.codeproject.com/csharp/runtime_eval.asp или любую другую, что найдет http://www.google.ru/search?q=C%23+expression+compilation+library&start=0&ie=utf-8&oe=utf-8. Если аналитически — проблема крайне сложная, и разбор выражения в AST будет самой простой задачей. 

Автор: ivashkanet 12.5.2006, 19:45
Цитата(MCMK @  12.5.2006,  19:20 Найти цитируемый пост)
Это единственный способ???

В любом случае нужно делать анализ строки, этот, ИМХО, неплохой.
Можешь поискать готовый алгоритм на C#.
Где не знаю  smile  

Автор: MFSham 12.5.2006, 19:46
Еще можно представить строку в виде дерева. Этот вариант будет намного лучше, т.к. дерево строится только один раз. 
Сам не реализовывал. Попробуй на бумажке представить функцию в виде дерева, думаю алгоритм поймешь сам. 

Автор: Void 12.5.2006, 19:52
Кстати, можно взять еще http://www.codeproject.com/csharp/spart.asp (аналог Boost.Spirit на C#). Полноценный генератор парсеров вроде http://www.ssw.uni-linz.ac.at/Coco/ в данном случае, имхо, overkill. 

Автор: MCMK 12.5.2006, 20:25
Спасибо всем огромное!!!

Буду ковырять...   smile  

Автор: ffldove 16.5.2006, 17:51
подскажите что-то неправильно в class что именно как ввести с клавиатуры n если можно пишите на мыло ffldove@yandex.ru
Код
#include <iostream.h>
class object
{  
int n;
double a[n];
double m[n][n];
public:
object (int);
~object();
void postr();
void vv();
void viv();
};
object::object(int l)
{
cin>>l;
n=new int l;
}
void vv()
{
for (int i=0;i<n;i++)
for (int o=0;o<n;o++)
cin>>l.m[i][o];
}
void postr()
{
int i,l;
i=0;
l=0;
for (i=0;i<n;i++)
{
if (m[i][i]<0) while (m[i][l]>0)
{
a[i]=m[i][l];
l++;
}
else
for (int j=i;j<n;j++)
if (m[i][j]>0) a[i]=m[i][j];
}
}
void main ()
{
object l;
l.vv();
l.postr();
l.viv();
}
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)