Что является самым простым способом вычисления выражения infix с использованием языка C?
Предположим, что пользователь вводит выражение инфикса в виде строки?
Что может быть самым простым ( Проще всего я имею в виду shortes t) способ оценивать результат этого выражения с использованием языка C?
Вероятные пути конвертируют его в постфикс, а затем используют стек. Но это довольно долгий процесс.
Есть ли способ использования таких функций, как atoi() или eval(), что облегчит задачу?
Ответы
Ответ 1
Разумеется, самый поучительный способ (и, возможно, даже самый простой, как только вы знаете, как) научиться писать собственный рекурсивный парсер спуска. Парсер для инфиксных выражений в C не очень длинный.
Вот один из отличных сообщений в блоге Эли Бендерски о разборе. (Это один из тех, которые наиболее важны для вас, но я настоятельно рекомендую их все). Он содержит исходный код для парсера для выражения infix - по общему признанию, в Python, а не C, но преобразование должно быть довольно простым, Многому научимся в этом процессе.
Ответ 2
C не имеет встроенной функции "eval", но есть библиотеки, которые ее предоставляют.
Я бы очень рекомендовал использовать TinyExpr. Это бесплатный и открытый код C, который реализует математическую оценку из строки. TinyExpr - это только 1 C файл, и это около 500 строк кода. Я не думаю, что вы найдете более короткий или более простой способ, который на самом деле завершен (а не только пример с игрушкой).
Вот полный пример его использования, который должен демонстрировать, насколько это просто:
#include "tinyexpr.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%f\n", te_interp("5 * 5", 0)); //Prints 25
return 0;
}
Если вы хотите самостоятельно построить решатель выражения, я бы рекомендовал в качестве отправной точки взглянуть на исходный код TinyExpr. Это довольно чисто и легко следовать.
Ответ 3
вам нужно проанализировать строку. там нет eval()
в C (как в большинстве статических языков), поэтому вам нужно либо написать собственный парсер, либо найти какую-нибудь библиотеку, чтобы помочь.
поскольку большинство простых в использовании парсеров для С++, а не C, я бы предпочел использовать полный встраиваемый язык. мой абсолютный фаворит Lua, который может быть невероятно легким, если вы не включаете библиотеки. Кроме того, синтаксис лучше, чем C, поэтому вашим пользователям может понравиться это лучше.
конечно, Lua - это полномасштабный язык программирования, поэтому он может оказаться неприемлемым, или, может быть, он может помочь другим способом (чтобы упростить расширение вашего приложения).
Ответ 4
Один чистый (возможно, не короткий) способ сделать это - построить дерево, как это сделал бы компилятор.
Например, скажем, у вас есть выражение "2 + 3". "+" - это голова. "2" будет левым ребенком, а "3" будет правильным ребенком.
Поскольку каждое выражение оценивается значением, это дерево может быть расширено для бесконечно сложных выражений: его просто нужно сортировать в порядке приоритетности для каждого оператора. Операторы с низким приоритетом (например, "+" идут вверху, в то время как операторы с высоким приоритетом (например, "*" ) идут снизу. Затем вы оцениваете выражения на дереве снизу вверх.
Ответ 5
Вам нужно построить интерпретатор некоторого языка сценариев.
Ответ 6
Преобразуйте строку в массив токенов, которые являются операндами и операторами.
Преобразуйте массив токенов infix в массив реверсивного польского обозначения.
После того, как уравнение находится в RPN, вы можете вырезать токены из стека и работать с ними.
Взгляните на статью Википедии на Обратная польская нотация. Он показывает, как выполнить преобразование и расчет.
Ответ 7
Проще всего, с помощью которого вы имеете в виду кратчайший, вы имеете в виду наиболее быстрый код? Если это так, создайте строку и передайте ее другому процессу через popen или аналогичный. Если вы не хотите внешнего процесса, вставьте интерпретатор lua, как предложил Хавьер. +1 к Хавьеру, поскольку это, вероятно, то, что вы хотите.