2013-12-08 2 views
0

Есть ли какая-либо функция в C++ (включенная в какую-либо библиотеку или заголовочный файл), которая будет считать выражение из строки?Функция для подсчета выражения

Предположим, что у нас есть строка, которая равна 2 + 3 * 8 - 5 (но она взята с клавиатуры пользователя, поэтому мы не знаем, какое выражение это будет именно при написании кода), и мы хотим, чтобы эта функция co подсчитала ее, но конечно, в правильном порядке (1. мощность/корень 2. раза/деление 3. увеличение/уменьшение).

Я попытался взять все числа в массив из int и операторов в массив символов (хорошо, на самом деле векторы, потому что я не знаю, сколько чисел и операторов он будет содержать), но я Не уверен, что делать дальше.

Обратите внимание, что я спрашиваю, есть ли какая-либо функция, уже написанная для этого, если нет, я просто попробую еще раз.

+0

Этот раздел [Решение уравнения переменной, заданного пользователем] (http: // stackoverflow.com/questions/16577756/solve-a-variable-equation-defined-by-the-user) может оказаться полезным. –

ответ

1

По подсчетам , Я беру это, чтобы означать «оценивать выражение».

Вам необходимо использовать генератор парсера, такой как boost :: spirit, чтобы сделать это правильно. Если вы попробуете написать это вручную, я гарантирую боль и страдания для всех участников.

Попробуйте посмотреть здесь для калькулятора приложений, есть несколько:

http://boost-spirit.com/repository/applications/show_contents.php

Есть также несколько простых грамматик калькулятор стиля в повышение :: дух примеров.

+0

Спасибо, я попробую это :). – Fiodor

+0

Вместо того, чтобы ссылаться на эту старую страницу примера, вы могли бы ссылаться на соответствующий существующий вопрос :) http://stackoverflow.com/questions/15123412/how-to-verify-algebraic-statements-using-boostspirit – sehe

+0

Кодирование 4- калькулятор калькулятор прост и полезен. –

0

Вы должны будете сделать это самостоятельно, так как не существует стандартная библиотека, которая обрабатывает разрешение

уравнения инфикса Если вы, пожалуйста, включите код для того, что вы пытаетесь, и мы можем помочь вам

+0

Если у вас нет проблем с производительностью, вызов внешнего приложения для этого - хороший вариант. Проверьте опцию popen() и 'bc'. – nyrl

+0

@nyrl, что довольно умно - я просто отвечал, если что-то ** стандартное ** существует, и пока я уверен, что нет. Поскольку вопрос может быть неопределенным, предложите это решение, если вы хотите объяснить popen –

1

Неудивительно, что другие передо мной не перенаправили вас на this particular algorithm, который легко реализовать и преобразует вашу строку в эту специальную вещь под названием Reverse Polish Notation (RPN). Вычислительные выражения в RPN просты, сложная часть реализует Shunting Yard, но это что-то сделано много раз, и вы можете найти много учебников по этому вопросу.

Краткий обзор алгоритмов:

  1. PRN - RPN способ писать выражения, устраняет необходимость в скобках, таким образом, это позволяет упростить вычисление. Практически говоря, чтобы вычислить одно такое выражение, вы перемещаете строку слева направо, сохраняя стек операндов. Всякий раз, когда вы встречаете операнд, вы вставляете его в стек. Всякий раз, когда вы встречаете токен операции, вы вычисляете его результат на последних двух операндах (если операция двоичная, последний, только если она унарная) и вставлять ее в стек. Промойте и повторите до конца строки.

  2. Shunting Yard действительно намного сложнее просто просмотреть, и если я попытаюсь выполнить эту задачу, этот ответ в конечном итоге будет похож на статью Википедии, которую я связал выше, поэтому я сохраню эту проблему для нас обоих.

Tl; DR; Пойдите, прочитайте ссылки в первом предложении.

+0

Я собираюсь попробовать это, но так как я новичок в программировании и не очень хорошо разбираюсь в математике (младшая школа), я не уверен, пойму ли я это. Но, как я уже сказал, я попытаюсь это сделать :). – Fiodor

Смежные вопросы