Форум программистов, компьютерный форум CyberForum.ru

Строковый калькулятор - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти суму n членов арифметической прогресии с заданым начальным членом и шагом http://www.cyberforum.ru/cpp-beginners/thread190323.html
Найти суму n членов арифметической прогресии с заданым начальным членом и шагом(используя рекурсивные функции) кто сможет помогите написать буду очень благодарен
C++ Использование функций кто может напишите пожалуйста код http://www.cyberforum.ru/cpp-beginners/thread190322.html
Строковый ввод-вывод C++
Спасайте... Лабораторная работа № 9 "Строковый ввод-вывод" Цель: Работа с текстовыми файлами, ввод-вывод текстовой информации и ее хранение на внешних носителях. 1 Краткие теоретические сведения Для построчного ввода - вывода используются следующие функции; 1 char *fgets(char *s, int n, FILE *F), где char *s - адрес, по которому размещаются считанные байты;
C++ Перегрузка функций
Помогите пожалуйста... Лабораторная работа № 7 7.1. "Перегрузка функций в Си++" Цель: Знакомство с организацией перегруженных функций в Си++. 1. Краткие теоретические сведения Цель перегрузки состоит в том, чтобы функция с одним именем по разному выполнялась и возвращала разные значения при обращении к ней с различными типами и различным числом фактических параметров. Для обеспечения...
C++ Строки http://www.cyberforum.ru/cpp-beginners/thread190319.html
Помогите с кодом.... Лабораторная работа № 6 "Строки" Цель: Изучение символьных и строковых переменных и способов их обработки в языке Си. 1. Краткие теоретические сведения Для представления символьной (текстовой) информации можно использовать символы, символьные переменные и символьные константы. Символьная константа представляется последовательностью символов, заключенной в...
C++ Функции и массивы Помогите пожалуйста... Лабораторная работа №5 "Функции и массивы" Цель : Организовать обработку массивов с использованием функций, научиться передавать массивы как параметры функций. 1. Краткие теоретические сведения 1.1. Функции Функцию в Си можно рассматривать: • как один из производных типов данных (наряду с массивами и указателями); подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.11.2010, 05:37     Строковый калькулятор
Вообще вся система этого калькулятора строится на простом рекурсивном определении:

Код
выражение -> слагаемое [ + слагаемое] [ - слагаемое]
слагаемое -> множитель [ * множитель] [ / множитель]
множитель -> число, (выражение)
Выражения в квадратных скобках - необязательные, (выражение) - выражение в скобках (в нашем случае его нет, поэтому получается, что множитель -> число, и тогда определение перестаёт быть рекурсивным и заключается в разбиении выражения на слагаемые и вычисления их значений, а затем вычисления значения всего выражения на основе результата вычисления слагаемых).

Разберём это на вашем примере: 8 - 9 / 3

Сначала разберёмся, как это представить в рамках нашего определения. Всё выражение - это слагаемое (8) минус слагаемое (9 / 3). При этом слагаемое (8) - это множитель (8), а множитель - это число (8). А слагаемое (9 / 3) - это множитель (9) разделить на множитель (3). Множитель (9) - это число (9), аналогично с 3. Вот мы разбили всё выражение на цепь простых лексем. Примерно так же, как я описал (несколько избыточно (избыточность в том, что сразу понятно, что 8 - это число, но я его всё же провёл через цепь слагаемое - множитель - число), но в дальнейшем так будет понятнее) поступает программа.
Разберём код.

Начинается всё с функции expr(). Первое же, что делает expr - это сохраняет в своей переменной result то, что вернёт factor(). Что вернёт factor? Он сохранит в своей переменной result то, что вернёт number (т.е. 8), затем считает операцию. Поскольку там нет известных ему операций, то он поместит её обратно в поток и вернёт result, т.е. 8. Таким образом в переменной result функции expr у нас теперь 8. Далее expr считывает операцию. Ага, операция известна expr - это минус. Поэтому expr отнимает от своей переменной result то, что вернёт новый вызов factor. Вызванный вновь factor в своей переменной result сначала сохраняет результат функции number - девятку. Далее считывает операцию и видит, что она ему знакома - это операция деления. Тогда он значение переменной result делит на то, что вернёт очередной вызов number - т.е. на тройку, и помещает результат операции в result. Таким образом в result окажется значение 3. Затем он снова пытается считать операцию из потока (ведь у нас стоит бесконечный цикл), и, поскольку в потоке уже ничего не осталось, он просто вернёт result - т.е. 3. Как мы помним, expr хотела от своей переменной result (в которой сейчас 8) отнять то, что вернёт factor. А factor вернул 3. Таким образом в переменную result функции expr помещается результат операции 8 - 3, т.е. 5. Далее, поскольку у нас и здесь бесконечный цикл, expr опять попытается считать операцию из потока, но, по той же причине, что и factor, ему это не удастся, и он просто вернёт переменную result, т.е. 5. Таким образом результат вычисления становится известен только после того, как expr окончательно завершит работу, т.е. в её переменной result и накапливается результат вычисления.

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

Прошу прощения за утомительный опус, но зато должно стать понятно, как всё работает.
 
Текущее время: 09:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru