LINUX.ORG.RU

калькулятор на питоне

 


0

3

Доброго времени суток, господа! я тут питон изучаю и решил запилить свой калькулятор http://pastebin.com/GYxshCve но не могу придумать алгоритм, который учитывал бы приоритет операций. смотрел алгоритм ОПЗ, но там пользователю придется вводить задачу примерно так: 6 46 27 - +. но мне кажется, что правильно было бы, чтобы пользователь вводил выражениее нормально 6 + 6 - 27. А пилить функцию, которая приводила бы выражение к виду, понятному ОПЗ, это мне кажется похоже на костылирование. Помогите с алгоритмом, плз.

Ответ на: комментарий от yoghurt

На хаскеле с батарейками делается так:

import Text.Parsec
import Text.Parsec.Expr

expr = buildExpressionParser table factor
       <?> "expression"

table = [[op "*" (*) AssocLeft, op "/" div AssocLeft]
        ,[op "+" (+) AssocLeft, op "-" (-) AssocLeft]
        ]
 where op s f assoc = Infix (do{ string s; return f}) assoc


factor = do{ char '('; x <- expr; char ')'; return x}
         <|> number
         <?> "simple expression"

number = do{ ds <- many1 digit; return (read ds)}
         <?> "number"

calc :: String -> Either ParseError Integer
calc s = parse expr "" s
ghci> calc "1+2*3"
Right 7
ghci> calc "(1+2)*3"
Right 9

Если интересует сама реализация рекурсивного спуска, где-то в начале Страуструпа есть.

yoghurt ★★★★★
()

А пилить функцию, которая приводила бы выражение к виду, понятному ОПЗ, это мне кажется похоже на костылирование.

Это не костылирование, а так и должно быть. Вот алгоритм

http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Vovka-Korovka ★★★★★
()

ОПЗ очень простая хрень, как и трансляция инфиксного выражения в постфиксное. Делал в 8 классе, вроде.

Еще можно рекурсивный спуск заюзать, тоже годная вещь.

Deleted
()

есть классический метод Дейкстры до которого многие сам догадываются:

заводишь 2 стека ...

qulinxao ★★☆
()

ну и да перевод из инфикса(со скобками) в постфикс обязательный этап

qulinxao ★★☆
()

Самый звездатый алгоритм это алгоритм Пратта: http://effbot.org/zone/tdop-index.htm

Он сложный для вкуривания, но умеет гораздо больше остальные алгоритмы которые я знаю. Например, он различает унарный и бинарные минусы и различает право- и левоассоциативные операторы. Да и вообще на нём можно написать парсер для ЯП типа питона (см. пример по ссылке).

true_admin ★★★★★
()

Алгоритм сортировочной станции. И делай сразу деревья.

Kuzy ★★★
()
Ответ на: комментарий от hizel

я планирую его учить, но мне посоветовали сначала питон т.к. прост, потом хаскель и потом только лисп

rukojob
() автор топика
Ответ на: комментарий от Deleted

я понял)) только где ты это у меня нашел, я что-то не вижу

rukojob
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.