Другие языки программирования и технологии

вопрос к C# программистам.

как вырвать из строки числа символы и затем выполнить операцию. к примеру вводиться строка (6+6)*6. подскажите может есть спец. методы какие. в нете я нашел примеры, но они пока для меня сложноваты (третий день изучаю) . заранее всем огромное СПАСИБО!!
Парсить строку, со скобками сложнее, конечно, можно регулярные выражения попробовать.
АВ
Александр Васильев
9 909
Лучший ответ
Я уже писал вроде про этот вопрос, давно.. . Делается это достаточно легко с помощью рекурсии и не надо заморачиваться с регулярными выражениями и прочим. Кстати, регулярки тут врядли помогут, т. к. структура может быть непредсказуемая.
если делаешь калькулятор, то не правильно делаешь. Через хэш-таблицу такое делать надо.
В одной книжке по Visual С++ 1998-2000 годов был пример, удобно делается через рекурсию. Просто если встречается открывающая скобка - начинается рекурсивная обработка, если закрывается скобка - заканчивается рекурсия, переход на верхний уровень.

Я бы поискал готовые примеры на C#, думаю они есть. Ну и естественно отсёк бы варианты где это решается без рекурсии.
АЛ
Андрей Луцов
10 716
регулярные выражения FTW
на твою строку оно будет вида .\d.\d..\d ну можно там лучше написать но у меня нету таблички перед глазами
где . это любой символ, а \d любая цифра
Насир Маренов
Насир Маренов
8 401
СПЕЦИАЛИСТЫ!
Это ж в школе ещё на информатике проходят.

3 этапа
I. Токенизация - разбиение строки на токены, в данном случае: "(", "6", "+", "6", ")", "*", "6"
II. Преобразование в Postfix нотацию - читай - Обратная Польская запись (Reverse Polish Notation)
Последовательность (6+6)*6 преобразуется в 6 6 + 6 * следующим образом:

Читаем токены слева направо
{
1. Если токен - операнд - добавляем в выходную последовательность
2. Если токен - унарный постфикс оператор - добавляем в выходную последовательность
3. Если токен - унарный префикс оператор - загоняем его в стек
4. Если токен - имя функции - загоняем в стек
5. Если токен - разделитель аргументов функции
5.1 Выталкиваем верхний элемент из стека и добавляем в вывод
5.2 Делаем это до тех пор, пока верхним элементом стека не станет открывающаяся скобка
6. Если токен - бинарный оператор
6.1 Если оператор - лево-ассоциативный оператор А, тогда пока верхним элементом стека является оператор Б с более высоким или равным приоритетом, чем у А, тогда выталкиваем Б из стека и добавляем его к выводу
6.2 Если А - право-ассоциативный, тогда, пока на вершине стека остаётся оператор Б более высокого приоритета, чем А, тогда выталкиваем Б из стека и добавляем к выводу
6.3 Загоняем А в стек
7. Если токен - открывающаяся скобка - толкаем её в стек
8. Если токен - закрывающаяся скобка:
8.1 Выталкиваем операторы из стека и добавляем их к выводной строке, пока на вершине стека не окажется открывающаяся скобка
8.2 Выталкиваем открывающуюся скобку из стека
8.3 Если токен на вершине стека - токен с именем функции - выталкиваем его и добавляем к выводу
}
Когда все токены будут прочитаны
9. Пока на вершине стека есть операторы - выталкиваем их и добавляем к выходной строке

III. Вычисление выражения PostFix:
Читаем выражение 6 6 + 6 * слева направо
1. Если токен - операнд - добавляем в стек
2. Если токен - оператор - в стеке будет как минимум 2 операнда (для бинарных операторов, для унарных - один)
2.1 Выталкиваем операнд №1, сохраняем в переменной А, выталкиваем операнд №2, сохраняем его в переменной Б,
2.2 вычисляем: А (оператор) Б
2.3 результат заталкиваем обратно в стек
3. Повторяем, пока не будут прочитаны все элементы выражения
4. Выталкиваем вершину стека - это и есть наш результат.