Форум: "Прочее";
Текущий архив: 2013.05.05;
Скачать: [xml.tar.bz2];
ВнизИнтерпретатор мат формул. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.004 c