Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/30: Рейтинг темы: голосов - 30, средняя оценка - 4.50
 Аватар для TGrey[WoLf]
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683

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

27.06.2009, 13:13. Показов 6736. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2009, 13:13
Ответы с готовыми решениями:

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

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

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

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

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

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

3 2 +
и
123 f1

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

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

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
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
28.06.2009, 13:09
Перевести в perl.
Потом дернуть perl интерпретатор для вычисления выражения.
Хотя perl трудно интегрировать в С++.

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

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

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

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

Цитата Сообщение от odip Посмотреть сообщение
2evg: на самом деле если подумать, то функция не отличается от операции.
С точки зрения стека - безусловно. Но с точки зрения синтаксического разбора выражения - нет. А потому когда человеку дают ссылку на код, который разбирает операции плюс, минус, умножить, делить и говорить, что для функции делается всё то же самое - мягко говоря, неправильно. По той ссылке при беглом просмотре я не заметил, что в приложенном коде так же есть разбор функций, а потому подумал, что очередной умник решил растопырить пальцы. Но ошибся
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.06.2009, 17:28
Перл может и трудновато, а Луа элементарно встраивается.
Я по началу все никак не мог найти себе нормального скриптового движка, а потом как нашел Lua... мне больше ничего не надо.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.06.2009, 17:47
Цитата Сообщение от Otaka Посмотреть сообщение
Перл может и трудновато, а Луа элементарно встраивается
А не проще ли тогда сгенерить исходник на Си и не заморачиваться всякими скриптовыми языками?
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
28.06.2009, 17:55
Я так понял, что строки которые нужно вычислить подаются снаружи и могут быть разными.
Ну допустим исходник на C ты сгенеришь - а что ты с ним дальше делать будешь ? Компилировать ? Тогда тебе придется вместе с программой таскать еще и компилятор C. Например Visual Studio 2005 ))

А lua как раз это и есть - он тебе пропарсит и выполнит твое выражение.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.06.2009, 19:14
Цитата Сообщение от odip Посмотреть сообщение
Ну допустим исходник на C ты сгенеришь - а что ты с ним дальше делать будешь ? Компилировать ? Тогда тебе придется вместе с программой таскать еще и компилятор C. Например Visual Studio 2005 ))
Да кому нужна эта программа, чтобы её куда-то таскать
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
28.06.2009, 20:24
Кому нужна программа - это уже вопрос к автору.

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

Это в UNIX/Linux/BSD все просто - в 99% случаев в системе есть gcc, запустить его не составляет больших проблем. Но там и perl можно вызвать - это будет еще проще
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.06.2009, 22:42
Хорошо. Выскажу своё мнение открытым текстом. Товарищу нужно сделать задачу из разряда тех, что дают в институте, при этом он не знает как. Всякие заумные советы типа perl, lua - товарищ и слов-то таких наверное не слышал.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
28.06.2009, 23:02
Заумные советы типа сгенерировать C-ный файл, потом его откомпилировать - это IMHO не лучше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.06.2009, 23:02
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru