|
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 98
|
|
Калькулятор с парсингом ввода04.10.2014, 13:05. Показов 18036. Ответов 78
Метки нет (Все метки)
Всем привет, не так давно начал постигать c++. Возник вопрос как сделать программу-калькулятор, в которую можно вводить свои числа и арифметические операции.
Пример: Выскакивает консолька и пользователь вводит "17 + 19 * 6 - 8", то есть пользователь не ограничен в действиях.
0
|
|
| 04.10.2014, 13:05 | |
|
Ответы с готовыми решениями:
78
Простой калькулятор и калькулятор с парсингом
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||
| 04.10.2014, 20:05 | ||||
|
Добавлено через 47 секунд Добавлено через 2 минуты
0
|
||||
| 04.10.2014, 20:07 | ||
. Просто вы предложили ТС написать "рекурсивный парсер", а я отметил, что по крайней мере для задачи не вычисления а перевода на префиксный язык это требует некоторых усилий.
0
|
||
|
4226 / 1796 / 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 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 04.10.2014, 20:25 | ||
|
0
|
||
| 04.10.2014, 20:31 | |
|
Как будете без стека разбирать 1+(2+(3+(4+5)))? Последовательной редукцией всей строки по одному действию наивысшего приоритета пока действия не закончатся? Тоже вариант, но немного более затратный - надо строку (или другой контейнер хранения структуры вычислений) каждый раз переписывать.
0
|
|
|
4226 / 1796 / 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 | |
|
Корень и дробная часть. Калькулятор с парсингом Помогите с парсингом С++!!! Как преобразовать обычный калькулятор в калькулятор использующий класс стек? Калькулятор в строке ввода
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
|
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время?
Никакой пенсии. Никакого нового. . .
|
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю
Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы
Кратко. . .
|
|
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем
**Полевые заметки о двухнедельной совместной работе**. . .
|
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|