Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1357158607
Юрий
2013-01-03 00:30
2013.05.05
С днем рождения ! 3 января 2013 четверг


15-1356899402
Юрий
2012-12-31 00:30
2013.05.05
С днем рождения ! 31 декабря 2012 понедельник


15-1356975725
ННН
2012-12-31 21:42
2013.05.05
Как сделать видимость загрузки большого кол-ва данных?


15-1356961544
CodeInsight
2012-12-31 17:45
2013.05.05
Как отстыковать дизайнер форм в Delphi XE3?


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский