singlepost

Разбор формул << На главную или назад  

Друзья, есть такая задача: написать прогу, которая запрашивает у юзера функцию, например, "y=2*x+6" и массив значений x[], задача проги подсчитать эту функцию используя значения x. Реализовать на С. Меня вот что интересует, при виде задачи, в голове сразу всплывает синтаксический анализатор формул, разбиение строки на лексемы, согласно приоритету операций их суммирование и пр. А вообще, существуют какие-то другие способы подсчета подобных формул, или какие-то нюансы, упрощающие написание анализатора???

21 ответов в теме “Разбор формул”

  1. 7
    Алексей Руденко ответил:

    Извини, не читал предыдущие комменты, просто написал как я это знаю :-(

  2. 6
    Жека Кирпичев ответил:

    Алексей, это то же самое, что я предложил. Алгоритм Дейкстры переводит инфиксную нотацию в постфиксную.

  3. 5
    Алексей Руденко ответил:

    Можно еще польскую нотацию и вычислять на стеке потом

  4. 4
    Олег Савинов ответил:

    хех)) Прикол в том, что препод, который это задал, сказал что необязательно вообще ничего на лексемы разбивать)) И посоветовал мне почитать про указатели)) Аспирант хренов… Не знаю, что он там имел ввиду, но похоже не очень-то думал о том, как сам будет это реализовывать без синтаксического разбора)) Вот я и сидел в полнейшем а*уе, когда он сказал, что можно сделать что-то еще КРОМЕ разбора. А когда я ему пытался сказать про парсер, он вообще не сразу понял, о чем я))))

  5. 3
    Жека Кирпичев ответил:

    См. //en.wikipedia.org/wiki/Operator-precedence_parser – алгоритм Дейкстры, но не тот, что про пути в графе, а тот, что shunting yard.
    Очень красивый, универсальный и простой в реализации алгоритм.

    Но на лексемы, ясен пень, все равно придется разбивать.

  6. 2
    Леонид Максимов ответил:

    существует вариант с написанием конвертера из инфиксной записи в постфиксную (сортировочная станция). нам такое на первом курсе задавали, показывая только схематичный план сортировочной станции.

    UPD: Жека Кирпичев как раз его и предложил.

  7. 1
    Михаил Снетков ответил:

    Просто парсер можно написать, т.е. привести это уравнение к удобному тебе виду, чтобы не заморачиваться дальше этим вопросом ;) Вот что-то подобное, только для школьников :) //acmp.ru/index.asp?main=task&id_task=236 =)

    Если интересно как это реализовано на чистом C, то советую посмотреть исходник gcalctool =) Там просто шикарный набор для работы с формулами + длинная арифметика ;)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.