|
1 / 1 / 0
Регистрация: 18.02.2016
Сообщений: 71
|
||||||
Как разобрать арифметическое выражение?09.10.2018, 17:52. Показов 1182. Ответов 9
Метки нет (Все метки)
Мне сначала надо найти знак равенства, потом пройтись по левой и правой части.
0
|
||||||
| 09.10.2018, 17:52 | |
|
Ответы с готовыми решениями:
9
Разобрать в ПОЛИЗ логическое выражение
|
|
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
|
|
| 09.10.2018, 18:01 | |
|
ivret, А причем тут этот лист ?
0
|
|
|
1 / 1 / 0
Регистрация: 18.02.2016
Сообщений: 71
|
|
| 09.10.2018, 18:11 [ТС] | |
|
0
|
|
|
Модератор
|
|||||||
| 09.10.2018, 18:28 | |||||||
Второе, собственно разбор у Вас состоит из деления на две части выражение по знаку равенства. Здесь надо проверять на корректность: знак должен быть только один. И потом обе стороны разбирать. Здесь уже надо более определённо. А что за разбор? Для чего? По каким правилам? И т.д и т.п.
1
|
|||||||
|
1 / 1 / 0
Регистрация: 18.02.2016
Сообщений: 71
|
|||||||
| 09.10.2018, 18:46 [ТС] | |||||||
|
На вход программы подается текстовый файл (с именем INPUT.TXT), содержащий единственную строку сим- волов. Данная строка задает присваивание переменной значения арифметического выражения в виде ПЕРЕМЕННАЯ = ВЫРАЖЕНИЕ. Выражение может включать: – знаки сложения и умножения («+» и «*»); – круглые скобки («(» и «)»); 8 – константы (например, 5; 3.8; 1e+18, 8.41E-10); – имена переменных. Имя переменной — это последовательность букв и цифр, начинающаяся с буквы. Входное выражение считать правильным. Программа должна с помощью регулярного выражения построить дерево, соответствующее заданному во входном файле выражению, и выдать (в текстовый файл OUTPUT.TXT) для дан- ного выражения: 1) таблицу имен; 2) неоптимизированный код; 3) оптимизированный код. В методичке сказано. Рекурсивный алгоритм построения дерева: 1. На входе алгоритма имеем некоторый узел дерева node и строку с частью математического выражения expr. 2. Ищем в строке знаки операций, не заключенные в скобки, в порядке приоритета. Наименьший приоритет у присваи- вания («=»), средний у сложения («+»), наивысший — у умножения («*»). 3. Если знак операции найден в позиции pos строки expr, то записываем его в поле oper узла дерева node. Далее два раза вызываем рекурсивно данный алгоритм — сна- чала для левого поддерева node.left и для подстроки строки expr, расположенной слева от позиции pos, и за- тем для правого поддерева node.right и для подстроки строки expr, расположенной справа от позиции pos. 4. Если знак не найден, то: 4.1. Если при этом первым символом строки expr явля- ется открывающая скобка «(», а последним — закрываю- щая «)», то удалить их и вернуться на шаг 2. 4.2. В противном случае имеем лист дерева. Записываем в поле oper узла дерева node все выражение expr — оно содержит либо идентификатор, либо константу. Указате- ли node.left и node.right обнулить. Для начала работы алгоритма запускаем его, передавая на вход указатель root и строку, содержащую исходное выраже- ние. В качестве примера возьмем выражение COST = (PRICE+TAX)*0.98. Рекурсивный алгоритм построения дерева: 1. На входе алгоритма имеем некоторый узел дерева node и строку с частью математического выражения expr. 2. Ищем в строке знаки операций, не заключенные в скобки, в порядке приоритета. Наименьший приоритет у присваи- вания («=»), средний у сложения («+»), наивысший — у умножения («*»). 3. Если знак операции найден в позиции pos строки expr, то записываем его в поле oper узла дерева node. Далее два раза вызываем рекурсивно данный алгоритм — сна- чала для левого поддерева node.left и для подстроки строки expr, расположенной слева от позиции pos, и за- тем для правого поддерева node.right и для подстроки строки expr, расположенной справа от позиции pos. 4. Если знак не найден, то: 4.1. Если при этом первым символом строки expr явля- ется открывающая скобка «(», а последним — закрываю- щая «)», то удалить их и вернуться на шаг 2. 4.2. В противном случае имеем лист дерева. Записываем в поле oper узла дерева node все выражение expr — оно содержит либо идентификатор, либо константу. Указате- ли node.left и node.right обнулить. Для начала работы алгоритма запускаем его, передавая на вход указатель root и строку, содержащую исходное выраже- ние. В качестве примера возьмем выражение COST = (PRICE+TAX)*0.98. Есть пример на Паскале. Только сама рекурсивная функция построения дерева из строки.
0
|
|||||||
|
Модератор
|
||
| 09.10.2018, 19:28 | ||
|
Надо сначала проверить полученное выражение на корректность. Сформировать из левой части имя переменной. А арифметический анализ проводить только правой части. Есть множество тем, в том числе и на этом форуме, по разбору и вычислению выражений заданных в строке. Посмотрите их, что-то сами сделаете. Что не получится - напишите.
0
|
||
|
1 / 1 / 0
Регистрация: 18.02.2016
Сообщений: 71
|
||
| 09.10.2018, 19:56 [ТС] | ||
|
Вот тут такой-же пример https://www.cyberforum.ru/post1443152.html Он ищет знак и потом применяет ту же функцию к левой и правой части как и я, только у меня не получается выйти из рекурсивной функции. Спасибо, буду дальше разбираться.
0
|
||
|
1 / 1 / 0
Регистрация: 18.02.2016
Сообщений: 71
|
||
| 10.10.2018, 00:55 [ТС] | ||
|
Я сейчас пытаюсь сделать без использования foreach, возможно проблема в этом. Код в той теме и в примере на Паскале, который я привёл один и тот же только в Паскале используют while. Cейчас я попытаюсь попытаюсь сделать с оператором for.
0
|
||
|
Модератор
|
|||
| 10.10.2018, 11:16 | |||
|
Добавлено через 3 минуты Так как тема уже "старая", те кто её читал, возможно читать больше не будут. Сделайте какой можете код на C#. И проблемные участки этого кода, выкладывайте в в новой теме с описанием проблем. Так быстрее дождётесь помощи.
1
|
|||
| 10.10.2018, 11:16 | |
|
Помогаю со студенческими работами здесь
10
Как вычислить арифметическое выражение? Как записать арифметическое выражение? Как записать арифметическое выражение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
|