Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Алгоритмы
Курсы ККДП
Дистрибутивы
Ссылки

HotLog


 

Арифметическое выражение

(Время: 1 сек. Память: 16 Мб Сложность: 66%)

Вычисление арифметического выражения – классическая задача, решать которую можно по-разному. Можно использовать алгоритм перевода выражения в постфиксную форму, а затем производить вычисление данного выражения. Но в данном случае придется использовать стек и обрабатывать его вручную. Более просто использовать рекурсивный алгоритм, где стек рекурсии заменит вышеописанный стек. Опишем суть функции Count(s), которая будет возвращать значение арифметического выражения s.

Первоначально следует удалить из s лишние пробелы и затем удалить лишние соответствующие друг другу скобки, расположенные в начале и конце строки. Далее следует справа налево в строке найти в некоторой k-й позиции операцию «+», не находящуюся внутри скобок и разбить выражение на два выражения, которые можно вычислить рекурсивно: count(s) = count(s[1..k-1]) + count(s[k+1..length(s)]). После чего (если «+» не найден) следует повторить данный процесс для операций «-», «*», «/» именно в данном порядке.

Если же в рассматриваемом таким образом выражении операции не найдены, то это либо число либо вызов тригонометрической функции. Сначала следует проверить на функцию: для этого строка должна начинаться либо на ‘cos(‘, либо на ‘sin(’ и заканчиваться на ‘)’. Если начало – это функция, а окончание – не закрывающая скобка, то следует вывести сообщение об ошибке, иначе вычислить выражение в скобках, вызвав count(s[4..length(s)]), и вернуть значение функции от возвращаемого рекурсией значения.

Когда выражение не содержит знаков и функций, то его стоит рассматривать как число, которое следует перевести в числовой вещественный эквивалент, проверив на корректность перевода.


[Обсуждение] [Все попытки] [Задача]


Красноярский краевой Дворец пионеров, (c)2006 - 2017, ICQ: 151483