Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
1

Выполнить строку

27.06.2009, 13:13. Просмотров 4089. Ответов 35
Метки нет (Все метки)

Здравствуйте, подскажите наиболее простой вариант решения проблемы.
Есть строка типа
(65+24)+f1(53+13)+f1(110-42)+f1(s1((35462+510)/17)+19)+(-s1((112-48))+9)+f1(s1((60615-115)/5)-2)+f1(s1((10010-10))-34)+(-s1((117-36))+12)+f1(66+18)+f1(s1((118365+450)/15)-17)+f1(s1((7585-16))+19)+f1(99-25)+f1(s1((30236+40)/4)-22)+f1(38+36)+f1(s1((3571+29))+39)+f1(s1((311780+720)/20)-38)+f1(s1((79209-117)/13)+22)
Нужно ее выполнить
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2009, 13:13
Ответы с готовыми решениями:

Выполнить код, записанный в строку
... (как execute_string() в Game Maker) - например, float a = f (b);, и допустим b = "return 1 /...

Ввести символьную строку. Выполнить переворот каждого слова в строке
Ввести символьную строку. Выполнить переворот каждого слова в строке (заменив первую букву с...

Как запустить командную строку, выполнить команду и считать полученные данные
Добрый вечер. Подскажите как запустить командную строку, выполнить команду и считать полученные...

Выполнить бегущую строку
3. Дано слово (например, «Внимание!»). Выполнить бегущую строку (движение - справа до конца экрана)

35
Айхрень...
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,078
27.06.2009, 13:15 2
не знаю встроенных в С++ способов импорта строки в выражение, но можно напистаь простенький парсер с использованием строковых операций С++.
0
123 / 121 / 0
Регистрация: 30.03.2009
Сообщений: 766
27.06.2009, 13:17 3
сконвертить в обратную польскую запись

а дальше выолнить уже гораздо проще
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
27.06.2009, 15:06  [ТС] 4
Да вот уже нашел обратную запись. Сижу правлю.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
27.06.2009, 16:05 5
Польской записи недостаточно. Тут есть ещё и вызовы функций
А по поводу разбора выражений посмотреть можно тут: Представление выражения в двоичном дереве посты 3 и 5
0
123 / 121 / 0
Регистрация: 30.03.2009
Сообщений: 766
27.06.2009, 16:13 6
какая разница - операция или функция? просто операция - функция от двух переменных, а просто функция - от одной переменной, фактически она тоже операция, только унитарная

к примеру, нет никакой принципиальнй разницы в разборе выражения

3 2 +
и
123 f1

запись
3 2 +
эквивалентна
3 2 plus,

где plus - функция от 2х переменных
1
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
27.06.2009, 17:59 7
Действительно. Видимо мне подсознательно стековые механизмы обработки выражений не нравятся
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
27.06.2009, 23:13  [ТС] 8
Так а в стеке же хранится символьные операторы. Что нужно переделывать стек под строки, если функции вводить.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
27.06.2009, 23:46 9
Да как угодно, лишь бы это потом можно было прочесть. Условно говоря, можно так:

C
1
2
3
4
5
6
7
8
9
10
struct
{
  int kind; // 1 - константа, 2 - операция, 3 - функция
  union
  {
    int ival;
    char op;
    char *func;
  } val;
}
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
28.06.2009, 13:09 10
Перевести в perl.
Потом дернуть perl интерпретатор для вычисления выражения.
Хотя perl трудно интегрировать в С++.

Можно использовать lua: перевести это выражение в язык lua и выполнить.
http://www.lua.org/
Реализация lua есть для C/C++.
Но придется немного изучить документации.
Зато попутно можно будет делать много чего еще: lua - мощный язык.

Или сделать все самому.

2evg: на самом деле если подумать, то функция не отличается от операции.

Если пользоваться терминами язык Форт, то у нас есть два вида операций.
1) Положить константу на стек
2) Выполнить слово.
Слово - это и операция и функция.
Слово берет некоторое кол-во верхних элементов со стека, что-то делает и кладет некоторое кол-во верхних элементов на стек.
Например слово '+': снять 2 элемента со стека, сложить и их, результат положить на стек.
Слово 'f1': снять со стека одно число, положить на стек результат функции f1 от этого числа.
И так далее.
0
1848 / 705 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.06.2009, 14:16 11
Если кому еще интересно, то вот моя давнешняя реализация Польской нотации. Я тогда в библиотеке прочел статейку по неё, нета у меня еще тогда не было, и я загорелся желанием написать прогу(вообще-то появилось желание написать интерпретатор Си, но руки не дошли). Там кстати есть и функции(sin cos...). Написано на Билдере 6.
0
Вложения
Тип файла: rar Polish notation.rar (211.1 Кб, 18 просмотров)
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
28.06.2009, 14:45  [ТС] 12
Спасибо, гляну.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
28.06.2009, 17:19 13
Цитата Сообщение от odip Посмотреть сообщение
Перевести в perl.
Потом дернуть perl интерпретатор для вычисления выражения.
Хотя perl трудно интегрировать в С++.
А ещё можно искусственный интеллект написать, но это тоже сложно

Цитата Сообщение от odip Посмотреть сообщение
2evg: на самом деле если подумать, то функция не отличается от операции.
С точки зрения стека - безусловно. Но с точки зрения синтаксического разбора выражения - нет. А потому когда человеку дают ссылку на код, который разбирает операции плюс, минус, умножить, делить и говорить, что для функции делается всё то же самое - мягко говоря, неправильно. По той ссылке при беглом просмотре я не заметил, что в приложенном коде так же есть разбор функций, а потому подумал, что очередной умник решил растопырить пальцы. Но ошибся
0
1848 / 705 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.06.2009, 17:28 14
Перл может и трудновато, а Луа элементарно встраивается.
Я по началу все никак не мог найти себе нормального скриптового движка, а потом как нашел Lua... мне больше ничего не надо.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
28.06.2009, 17:47 15
Цитата Сообщение от Otaka Посмотреть сообщение
Перл может и трудновато, а Луа элементарно встраивается
А не проще ли тогда сгенерить исходник на Си и не заморачиваться всякими скриптовыми языками?
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
28.06.2009, 17:55 16
Я так понял, что строки которые нужно вычислить подаются снаружи и могут быть разными.
Ну допустим исходник на C ты сгенеришь - а что ты с ним дальше делать будешь ? Компилировать ? Тогда тебе придется вместе с программой таскать еще и компилятор C. Например Visual Studio 2005 ))

А lua как раз это и есть - он тебе пропарсит и выполнит твое выражение.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
28.06.2009, 19:14 17
Цитата Сообщение от odip Посмотреть сообщение
Ну допустим исходник на C ты сгенеришь - а что ты с ним дальше делать будешь ? Компилировать ? Тогда тебе придется вместе с программой таскать еще и компилятор C. Например Visual Studio 2005 ))
Да кому нужна эта программа, чтобы её куда-то таскать
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
28.06.2009, 20:24 18
Кому нужна программа - это уже вопрос к автору.

А чтобы дернуть компилятор из программы - тоже код писать нужно, обрабатывать ошибки, куда-то класть временные файлы и т.д.

Это в UNIX/Linux/BSD все просто - в 99% случаев в системе есть gcc, запустить его не составляет больших проблем. Но там и perl можно вызвать - это будет еще проще
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
28.06.2009, 22:42 19
Хорошо. Выскажу своё мнение открытым текстом. Товарищу нужно сделать задачу из разряда тех, что дают в институте, при этом он не знает как. Всякие заумные советы типа perl, lua - товарищ и слов-то таких наверное не слышал.
0
Эксперт С++
7171 / 3229 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
28.06.2009, 23:02 20
Заумные советы типа сгенерировать C-ный файл, потом его откомпилировать - это IMHO не лучше
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2009, 23:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Выполнить строку в формате base64
Здравствуйте. Беру calc.exe файл считываю через File.ReadAllBytes и конвертирую в строку формата...

Как выполнить строку SQL из функции
Скрипт для создания функции кол-ва всех записей во всех таблицах БД CREATE function countrec1 ...

Выполнить команду через командную строку
Задача такая. Есть определенная команда для командной строки. Нужно что бы Паскаль открыл командную...

Какая функция или пакет может выполнить поданную на вход строку?
есть переменная varchar2 значение которой изменяется ( per1 varchar2(100) := 'create sequence...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.