Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.05.05;
Скачать: CL | DM;

Вниз

Интерпретатор мат формул.   Найти похожие ветки 

 
Vlad   (2013-01-03 17:01) [0]

Здравствуйте, на курсовую работу предлагают такую тему, как тема сообщения. Колеблюсь - брать или нет. Есть темы для выбора и проще, но чисто интересно заняться этой темой (не знаю по данной  части пока ничего)

Скажите сложно/нет.


 
Mystic ©   (2013-01-03 17:33) [1]

Если под мат. формулами понимаются обычные выражения, то элементарно :)
Ну а так, например, есть такая математическая формула, как уравнения Навье - Стокса. Как ее интерпретировать то?


 
Vlad   (2013-01-03 17:52) [2]


> Mystic ©   (03.01.13 17:33) [1


+,-,*,/,cos,sin,sqr,sqrt итд.
только нужно не на лету считать, а в начале перевести в трехадресный код, а затем выполнить его на мини виртуальной машине.


 
Jeer ©   (2013-01-03 18:35) [3]


> как уравнения Навье - Стокса. Как ее интерпретировать то?



> Vlad   (03.01.13 17:52) [2]
+,-,*,/,cos,sin,sqr,sqrt итд.


Не нужно браться за то, о чем Вы и понятия не имеете.


 
Vlad   (2013-01-03 18:37) [4]


> Jeer ©   (03.01.13 18:35) [3]

Ну так курсовая то на семестр.


 
Jeer ©   (2013-01-03 18:43) [5]

Ну так выбор курсовой д.б. основан на некотором уже осмысленном фундаменте.
А иначе - это поиск черной кошки в темной комнате.


 
Pavia ©   (2013-01-03 19:12) [6]

Бери тема очень простая материала много, кода готового море.
Сделай интерпретатор на подобии MatCad вообще большой плюс будет.


 
Jeer ©   (2013-01-03 21:30) [7]


> Сделай интерпретатор на подобии MatCad


О, да!


 
Фокс Йожин   (2013-01-04 00:39) [8]

Если интересно, нужно решительно брать.


 
Германн ©   (2013-01-04 02:20) [9]


> Vlad   (03.01.13 17:52) [2]
>
>
> > Mystic ©   (03.01.13 17:33) [1
>
>
> +,-,*,/,cos,sin,sqr,sqrt итд.
> только нужно не на лету считать, а в начале перевести в
> трехадресный код, а затем выполнить его на мини виртуальной
> машине.
>

Я бы отказался, ибо не знаю что такое "трехадресный код" и что такое "мини виртуальная машина".


 
брат Птибурдукова   (2013-01-04 11:20) [10]

Если это, как я полагаю, микроассемблер (а именно на эту мысль наводит «трёхадресный код»), то сложности будут в реализации значительно более базовых вещей, а не непосредственно в интерпретации формул... :-)


 
Юрий Зотов ©   (2013-01-04 12:47) [11]

Здесь, по сути, два задания - сначала сделать виртуальную машину, потом компилятор мат. формул под нее. Литературы, конечно, полно (хоть та же книга Дракона), да и примеры в Сети есть, но в целом работа не такая уж простая и не такая уж маленькая. Но очень полезная в смысле повышения уровня.

Поэтому присоединяюсь к [8] - есть смысл браться, если интересно, а если надо просто сделать курсач, то лучше поискать задание попроще.


 
Pavia ©   (2013-01-04 13:29) [12]


> Здесь, по сути, два задания - сначала сделать виртуальную
> машину, потом компилятор мат. формул под нее. Литературы,
>  конечно, полно (хоть та же книга Дракона), да и примеры
> в Сети есть, но в целом работа не такая уж простая и не
> такая уж маленькая. Но очень полезная в смысле повышения
> уровня.Поэтому присоединяюсь к [8] - есть смысл браться,
>  если интересно, а если надо просто сделать курсач, то лучше
> поискать задание попроще.

Что вы человека пугаете.  Ему поставлена задача сделать интерпретатор формул не более того.

3-х адресный код
Это
op x1,x2,x3
где op - оператор x1 результирующая переменная x2,x3 параметры.
Виртуальная машина очень простая. Это одна функция.  Строк на 20. Или сколько там у него операторов?

Остаётся разобраться с тем как разобрать скобки в формуле и приоритеты операторов всё.  Код и комментарии есть в wiki читаем про обратную польскую нотацию. Тоже одна функция.
За вечер можно сделать.


 
брат Птибурдукова   (2013-01-04 13:41) [13]


> Что вы человека пугаете
Обычная ситуация — человек не слишком внятно изложил задачу, так что остальные пытаются угадать, что же он имел в виду.


 
TUser ©   (2013-01-04 13:49) [14]


> Юрий Зотов ©   (04.01.13 12:47) [11]

Имхо, под "виртуальной машиной" тут имеется ввиду интерпретатор выражений в обратной польской записи, а под "компилятором" - соответственно перевод в оную запись из инфиксной. Что совершенно тривиально и на курсовую как-то не тянет.

На ВМиК, если не ошибаюсь, на втором курсе компилятор пишут. Не для формул, а для простого императивного языка.

Касаемо выбора - а остальные темы там какие?


 
Юрий Зотов ©   (2013-01-04 15:44) [15]


> Pavia ©   (04.01.13 13:29) [12]

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


Читаем [2]. Желательно, внимательно. А потом, желательно, думаем, что же такое там написано.


> 3-х адресный код
> Это
> op x1,x2,x3
> где op - оператор x1 результирующая переменная x2,x3 параметры.

Большое спасибо за разъяснения. Правда, лет этак более сорока назад я это знал и даже именно так и программировал, прямо в кодах (правда, двухадресных) - но все равно большое спасибо. Одно только замечание, если позволите: x2 и x3 все же принято называть операндами, а не параметрами.

И теперь самое время задуматься - а кто же этот замечательный трехадресный код выполнять-то  будет? Не Пушкин же - а если не Пушкин, то, видимо, еще кто-то или что-то? И остается только это что-то или взять готовое, или написать самому. Собственно, ту самую виртуальную машину, о которой уже говорилось.


> Остаётся разобраться с тем как разобрать скобки в формуле и
> приоритеты операторов всё.  Код и комментарии есть в wiki читаем про
> обратную польскую нотацию. Тоже одна функция.

Ну, положим, разбор скобок и приоритетов можно сделать и без польской записи, хоть прямой, хоть обратной. Вот при генерации кода для той самой виртуальной машины - тут да, тут польская запись может понадобиться.

А функция действительно может быть одна. Правда, многостраничная и очень плохо читаемая, но зато одна. Да и вообще весь этот курсовик легко можно запихнуть в одну функцию - например, такую:
function Calculаte(Formula: string): extended;
И принести этот исходник самому нелюбимому преподу - пущай разбирается.


За вечер можно сделать.

Вам - возможно. Студенту - вряд ли.


 
Юрий Зотов ©   (2013-01-04 15:56) [16]


> TUser ©   (04.01.13 13:49) [14]

> Имхо, под "виртуальной машиной" тут имеется ввиду интерпретатор
> выражений в обратной польской записи, а под "компилятором"
> - соответственно перевод в оную запись из инфиксной.

Извините, но к этому Вашему ИМХО понятие "трехадресная" как-то не пристегивается. Зато пристегивается нормальная (хотя и очень простая, конечно) трехадресная машина, пример команды для которой дан в [12]. Соответственно, под компилятором надо понимать программу, переводящую исходник формулы в последовательность команд этой машины.


> Что совершенно тривиально и на курсовую как-то не тянет.

Тоже за вечер хотите сделать, в полном объеме?

PS
Шалуны...
(с) Иннокентий Смоктуновский.

PPS
А шапок-то хватит, чтобы закидать?


 
Vlad   (2013-01-04 16:17) [17]

Буду брать, уже сделал за пару дней + - * / c учетом скобок и приоритетов, осталось разобраться с одно параметровыми функциями sin cos итд.

Можно конечно было взять тему и попроще, но тема интересна для повышения квалификации.


 
Vlad   (2013-01-04 16:21) [18]


> Юрий Зотов ©   (04.01.13 15:56) [16]


"Машина" вот такая, смотрите:


procedure StartVM;
var
 i: Integer;
begin
 i := 0;
 while i < Length(TreCod) do
 begin
    case TreCod[i].oper of
      1:  Memory[TreCod[i].rest] := Memory[TreCod[i].op_1] + Memory[TreCod[i].op_2];
      2:  Memory[TreCod[i].rest] := Memory[TreCod[i].op_1] - Memory[TreCod[i].op_2];
      3:  Memory[TreCod[i].rest] := Memory[TreCod[i].op_1] * Memory[TreCod[i].op_2];
      4:  Memory[TreCod[i].rest] := Memory[TreCod[i].op_1] / Memory[TreCod[i].op_2];
      5:  Memory[TreCod[i].rest] := cos(Memory[TreCod[i].op_1]);
      6:  Memory[TreCod[i].rest] := sin(Memory[TreCod[i].op_1]);
          //это SQR
      7:  Memory[TreCod[i].rest] := (Memory[TreCod[i].op_1])*(Memory[TreCod[i].op_1]);
    end;
    Inc(i);
 end;
end;


 
Юрий Зотов ©   (2013-01-04 16:22) [19]


> Vlad   (04.01.13 16:17) [17]
> осталось разобраться с одно параметровыми функциями sin cos итд.

Это будут нечто вроде встроенных микропрограмм виртуальной машины.


 
Vlad   (2013-01-04 16:24) [20]

Memory: array of Real


 
Юрий Зотов ©   (2013-01-04 16:26) [21]

> Vlad   (04.01.13 16:21) [18]

Сами видите - именно микропрограммы SIN и COS у Вас и получились (поскольку трехадресность нарушена).


 
Юрий Зотов ©   (2013-01-04 16:27) [22]


> Vlad   (04.01.13 16:24) [20]

А почему Real, а не Extended? Было бы и быстрее, и точнее.


 
брат Птибурдукова   (2013-01-04 16:32) [23]


> Было бы и быстрее, и точнее.
Только не в 64 бит ;-)


 
Юрий Зотов ©   (2013-01-04 16:37) [24]


> брат Птибурдукова   (04.01.13 16:32) [23]

Почему? Разве Extended - не родной тип сопроцесора по дефолту?


 
Vlad   (2013-01-04 16:38) [25]


> Юрий Зотов ©   (04.01.13 16:27) [22]


Это когда ЯП полно-функциональный писать буду, тогда думать буду о скорости, а пока, в чисто ознакомительный целях, интересен только алгоритм.


 
Юрий Зотов ©   (2013-01-04 16:53) [26]

> Vlad   (04.01.13 16:38) [25]

Если очень малой ценой (простой заменой Real на Extended) можно получить более высокие точность и скорость, то прочему бы не сделать это сразу?


 
брат Птибурдукова   (2013-01-04 16:54) [27]


> Разве Extended - не родной тип сопроцесора по дефолту?
В 64 битах для вычислений с плавающей запятой используются регистры XMM, они 64-битные, так что Extended(32) имеет 80 бит, а Extended(64)=Double, так что не медленнее и не быстрее, зато можно запутаться.


 
Юрий Зотов ©   (2013-01-04 18:01) [28]

> брат Птибурдукова   (04.01.13 16:54) [27]

Хоть MMMXXXYYYZZZ - никакого отношения к тому, о чем шла речь, это не имеет. Потому что речь шла о замене программного типа аппаратным, что всегда даст повышение и скорости, и точности. А в программе останется только один тип  Extended, так что запутаться будет довольно сложно.


 
брат Птибурдукова   (2013-01-04 18:30) [29]


> речь шла о замене программного типа аппаратным
Ещё раз: для 64-битного компилятора "аппаратным" является именно Double.


 
Юрий Зотов ©   (2013-01-04 18:39) [30]


> брат Птибурдукова   (04.01.13 18:30) [29]

Понятно. А как это вытекает из [27] ?


 
Inovet ©   (2013-01-05 02:35) [31]

> [11] Юрий Зотов ©   (04.01.13 12:47)
> Но очень полезная

+


 
Inovet ©   (2013-01-05 03:24) [32]

> [15] Юрий Зотов ©   (04.01.13 15:44)
> Не Пушкин же

Юра, ты отвлёк моё внимание от ветки в другом направлении. Кстати, рекомендую почитать сочинения вышеупомянутого автора.


 
TUser ©   (2013-01-05 13:29) [33]

Для совсем занудного препода можно, наверное, реализовать машину с такими командами как
op <код операции> <операнд_1> <операнд_2>
где для синуса и косинуса <операнд_2> может задавать, например, в радианах или в градусах задан <операнд_1>.


 
O'ShinW ©   (2013-01-05 14:00) [34]

на первом или втором курсе писали "производную"..
задаешь строкой f(x), подсчитывает f`, тоже строкой..
Реализация = рекурсия, и базовый набор правил = своего рода алфавит, который можно расширять.

А можно проще/хитрее/не честно :) (Если нет желания вообще)
программа генерирует вторую программу, компилит и запускает через параметры
А вторая уже считает или возвращает ошибку компиляции, которую показываем как самостоятельно найденную при парсинге
Расчет на то, что никто не будет смотреть как там и что у тебя понаписано.

ууу: гм, у меня тут презентацию по физике приняли
ууу: со спецслайдом "вас зохватили хомяки. здовайтесь"



Страницы: 1 вся ветка

Текущий архив: 2013.05.05;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.007 c
3-1289312052
VikOss
2010-11-09 17:14
2013.05.05
как добавить запись в ClientDataset


15-1356985802
Юрий
2013-01-01 00:30
2013.05.05
С днем рождения ! 1 января 2013 вторник


2-1350923065
vasa777
2012-10-22 20:24
2013.05.05
опции компилятора


2-1350919520
Ламо777
2012-10-22 19:25
2013.05.05
Не могу открыть проект, не находится файл TbsSkinPanel


15-1357331403
Юрий
2013-01-05 00:30
2013.05.05
С днем рождения ! 5 января 2013 суббота