|
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 98
|
|
Калькулятор с парсингом ввода04.10.2014, 13:05. Показов 18282. Ответов 78
Метки нет (Все метки)
Всем привет, не так давно начал постигать c++. Возник вопрос как сделать программу-калькулятор, в которую можно вводить свои числа и арифметические операции.
Пример: Выскакивает консолька и пользователь вводит "17 + 19 * 6 - 8", то есть пользователь не ограничен в действиях.
0
|
|
| 04.10.2014, 13:05 | |
|
Ответы с готовыми решениями:
78
Простой калькулятор и калькулятор с парсингом
|
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||
| 04.10.2014, 20:05 | ||||
|
Добавлено через 47 секунд Добавлено через 2 минуты
0
|
||||
| 04.10.2014, 20:07 | ||
. Просто вы предложили ТС написать "рекурсивный парсер", а я отметил, что по крайней мере для задачи не вычисления а перевода на префиксный язык это требует некоторых усилий.
0
|
||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 04.10.2014, 20:12 | |
|
У него задача вычисления. Решать можно или рекурсивным разбором, или трансляцией в постфиксную/префиксную форму. Одно из трёх, комбинации не даны, так как при рекурсивном разборе выражения можно получить только дерево выражений. Если можете написать надёжный не рекурсивный парсер изначально рекурсивной нотации, то имеете отличный повод для хвастовства. Нет - читайте Герберта Шилдта и пробуйте приспособить для своих нужд предложенный им парсер.
0
|
|
|
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
|
|
| 04.10.2014, 20:13 | |
|
А ПОЛИЗ чем не устраивает? Всего то и делов перегнать числа в числа (int'ы), символы операций в какие-нибудь подходящие структуры (и char сойдет) - и то это при условии, что числа больше, чем однозначные, иначе и делать ничего не надо - берешь алгоритм и считаешь. Выражение в ПОЛИЗ -> Считаешь ПОЛИЗ -> Профит!
Но если только начал, то лучше сперва с структурами данных различными ознакомиться, как мне кажется. А еще лучше - их самому реализовать. vector'а, stack'и, map'ы всякие...
0
|
|
| 04.10.2014, 20:22 | |
|
Вообще по-большому счету рекурсивные/нерекурсивные алгоритмы решения этой задачи в принципе одинаковы - только при рекурсии используется системный стек, куда сохраняются необходимые промежуточные значения плюс еще куча контекста, а при нерекурсивных алгоритмах мы создаем/заполняем/разбираем этот стек самостоятельно вручную внутри одной функции разбора/вычисления. А повод для хвастовства (или некоторого удовлетворения) у меня будет тогда, когда я пойму выложенное знакомым решение этой задачи на Haskell с использованием комбинаторов, принципов синтаксического разбора, порождающих грамматик и прочих интересных и пока непонятных мне слов.
0
|
|
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 04.10.2014, 20:25 | ||
|
0
|
||
| 04.10.2014, 20:31 | |
|
Как будете без стека разбирать 1+(2+(3+(4+5)))? Последовательной редукцией всей строки по одному действию наивысшего приоритета пока действия не закончатся? Тоже вариант, но немного более затратный - надо строку (или другой контейнер хранения структуры вычислений) каждый раз переписывать.
0
|
|
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 04.10.2014, 21:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1+(2+(3+(4+5)))
Шаг первый.
Добавлено через 3 минуты Добавлено через 2 минуты Исправить с учётом функций и разной арности не могу, так как данный алгоритм смог только сочинить без понимания того, почему он вообще работает.
0
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
|
|||
| 04.10.2014, 22:19 | |||
|
perec200, то, что Вы реализовали... на уровне школы. Вы, а не кто-либо другой, поставили задачу разобрать математическое выражение. Что ж, в наипростейшем ее варианте Вы справились. Теперь постарайтесь сделать то же, но без участия пользователя (т.е. чтобы машина сама разибарал что и с чем ей делать).
0
|
|||
| 05.10.2014, 02:10 | |
|
1
|
|
|
Комп_Оратор)
|
||
| 05.10.2014, 02:33 | ||
|
Предложения разбирается на слова, выбирается выражение старшего приоритета (выражение - минимальный набор который возвращает результат заменяемый словом), вычисляется, результат-слово возвращается вместо своего выражения в предложение. И всё повторяется, пока от предложения не останется слово - результат. Можно написать ба-альшущую функцию, которая всё это делает. Но легче написать несколько и использовать взаимную рекурсию. Технически, рекурсия проще построения дерева выражений.
2
|
||
| 05.10.2014, 02:46 | ||
|
IGPIGP, тогда непонятно, зачем рекурсия и что большущего. Это как раз тот вариант, который я назвал
0
|
||
| 05.10.2014, 02:51 | |
|
По ссылке с RSDN: Строчный калькулятор
0
|
|
|
Комп_Оратор)
|
|||
| 05.10.2014, 03:00 | |||
|
Так что, не вчитался в сказанное.
1
|
|||
| 05.10.2014, 03:13 | ||||
я просто хотел вместо противопоставления "разных" алгоритмов подчеркнуть некую принципиальную общность отдельных групп рекурсивных и нерекурсивных методов решения данной задачи - в использовании стека, а различия - или мы отдаем это дело компилятору и он туда еще весь контекст будет каждый раз запихивать по колл-конвеншнс и время тратить на пуши-попы, или реализуем сами, и ничего лишнего в него не пихаем, соответственно работает быстрее.Добавлено через 1 минуту Добавлено через 5 минут
1
|
||||
|
Комп_Оратор)
|
||
| 05.10.2014, 03:46 | ||
1
|
||
| 05.10.2014, 03:53 | |
|
Боюсь навлечь на себя гнев тру-кодеров, но я имею в виду 1С 7.7
Там есть объект "СписокЗначений", который может хранить значения любого типа, имеет индекс и (если надо) ключ каждого элемента, авторесайзится при добавлении/удалении в/из любого места себя и вообще очень удобен и хорош. и мы запихиваем в него нашу строку сразу с числами, операциями и их рассчитанным приоритетом при пробежке по строке, а потом просто бегаем по списку, вычисляем значения максимального приоритета операций, заменяем операцию на это значение, а предыдущий и следующий элементы (исходные аргументы инфиксной записи) удаляем, и не заботимся о целостности и связности списка.Жаль, я надеялся что в STL есть подобное... Теперь еще меньше поводов учить С++ Хотя, насчет типов - никто не мешает действительно создать структуру с полями: типом енумом-значение или операция, приоритетом операции и значением значения. Но авторесайз конечно удобная штука.
0
|
|
|
Комп_Оратор)
|
||
| 05.10.2014, 04:20 | ||
![]() На плюсах, можно же не только разобрать, а и при первом разборе создать контейнер операций инициализированный операндами. Для этого все числа можно отобразить на массив и работать с целочисленными значениями-индексами (если использовать не только литеральные числа, а и имена-параметры удобно) и потом при вычислениях запускать последовательное выполнение "скомпелированной цепочки" при любых фактических значениях переменных, минуя стадию разбора. Это быстрее, если заполнять таблицу, например, или график построить или уравнение решить. И на C# это можно.
1
|
||
| 05.10.2014, 04:31 | |
|
Да ладно, парсер будет делать то, что мы ему напишем (а написать его мы можем по-разному, даже в этой теме несколько вариантов уже предлагалось), а от языка он зависит в последнюю очередь - может только вопрос наличия/отсутствия удобных контейнеров. Как раз о С и asm для некоторых архитектур я некоторое представление имею, а с С++ ни разу не сталкивался - нет, конечно написал на С++ тетрис, но в чисто сишном стиле
, без объектов/классов/ООП. Поэтому и не знаю, что там придумали с шаблонами и какие вкусные объекты есть в STL. И если там есть какой-нибудь список/вектор/что-то еще, из которого можно одной строкой вызвать метод "удалить элемент", то это просто удобно. Ваш текст про то, что можно на плюсах навскидку не понял, буду перечитывать и думать ![]() Я вот хочу это баловство сейчас на Haskell реализовать, на его базовых структурах, без библиотечных соответствий и прочих алгебраических типов, просто на списках однотипных структур.
0
|
|
|
Комп_Оратор)
|
|||
| 05.10.2014, 04:55 | |||
|
1,25e-2+1,23 + x - a * ( sin ( x + bcd1 ) ) Есть значения для a, bcd1 и диапазон и шаг для x. Можно каждую точку вычислять разбирая заново, а можно один раз разобрать и построить цепочку операций. У каждой операнды и результат. Они отражаются на массив, то есть каждой следующей не нужен результат предыдущей, а достаточно индекса, где он появится. Потом для вычислений разбирать уже ничего не нужно. ![]() Хотя С++ учить можно с разными мотивами и сказанное, скорее шутка. Мне этот язык нравится. Хоть я его и не знаю почти.
1
|
|||
| 05.10.2014, 04:55 | |
|
Корень и дробная часть. Калькулятор с парсингом Помогите с парсингом С++!!! Как преобразовать обычный калькулятор в калькулятор использующий класс стек? Калькулятор в строке ввода
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|