Предположим вводы данных пользователем инфиксное выражение как строка? Что могло быть самым легким (Самым легким, я имею в виду самое короткое), способ оценить результат того выражения с помощью языка C?
Вероятные пути преобразовывают его в постфикс затем при помощи стеков. Но скорее долгий процесс. Есть ли какой-либо способ использовать функции, такие как atoi () или оценка (), который мог сделать задание легче?
вам нужно проанализировать строку. нет eval ()
в C (как и в большинстве статических языков), поэтому вам нужно либо написать свой собственный парсер, либо найти какую-нибудь библиотеку для помощи.
поскольку наиболее простые в использовании парсеры предназначены для C ++ и не C, я бы предпочел использовать полностью встраиваемый язык. Мне больше всего нравится Lua , который может быть невероятно легким, если вы не включите библиотеки. кроме того, синтаксис лучше, чем у C, поэтому вашим пользователям он может понравиться больше.
Конечно, Lua - это полноценный язык программирования, поэтому он может быть неуместным или может помочь другим способом (чтобы ваше приложение проще расширить).
Один чистый (возможно, не короткий) способ сделать это - построить дерево, как это сделал бы компилятор.
Например, скажем, у вас есть выражение «2 + 3». «+» Будет головой. «2» будет левым дочерним элементом, а «3» - правым ребенком.
Поскольку каждое выражение оценивается как значение, это дерево можно расширить для бесконечно сложных выражений: его просто нужно отсортировать в порядке приоритета для каждого оператора. Операторы с низким приоритетом (например, '+' идут вверху, а операторы с высоким приоритетом (например, '*') - внизу. Затем вы оцениваете выражения в дереве снизу вверх.
Преобразовать строку в массив токенов, которые являются операндами и операторами. Преобразуйте массив инфиксных токенов в массив обратной польской нотации. После того, как уравнение находится в RPN, вы можете извлекать токены из стека и работать с ними.
Взгляните на статью в Википедии о обратной польской нотации . Здесь показано, как выполнить преобразование и расчет.
Вам необходимо встроить интерпретатор некоторого языка сценариев.
Под самым простым, что вы подразумеваете под самым коротким, вы подразумеваете самый быстрый код? Если да, создайте строку и передайте ее другому процессу через popen или подобное. Если вам не нужен внешний процесс, вставьте интерпретатор lua, как предложил Хавьер. +1 Хавьеру, так как это, вероятно, то, что вы хотите.
Безусловно, наиболее поучительный способ (и, возможно, даже самый простой, если вы знаете, как) - это научиться писать свои собственные рекурсивный анализатор спуска . Синтаксический анализатор для инфиксных выражений в C не очень длинный.
Вот одна из ряда отличных сообщений в блоге Эли Бендерски о синтаксическом анализе. (Этот вариант наиболее важен для вас, но я настоятельно рекомендую их всех.) Он содержит исходный код для синтаксического анализатора инфиксных выражений - по общему признанию, на Python, а не на C, но преобразование должно быть довольно простым, и вы ' Я многому научусь в процессе.