1. Выполните упражнения из раздела ПОПРОБУЙТЕ, если вы не сделали этого раньше.
2. Добавьте в программу возможность обработки скобок {}
и ()
, чтобы выражение {(4+5)*6}/(3+4)
стало корректным.
3. Добавьте оператор вычисления факториала: для его представления используйте знак восклицания, !
. Например, выражение 7!
означает 7*6*5*4*3*2*1
. Присвойте оператору !
более высокий приоритет по сравнению с операторами *
и /
, т.е. 7*8!
должно означать 7*(8!)
, а не (7*8)!
. Начните с модификации грамматики, чтобы учесть оператор с более высоким приоритетом. Для того чтобы учесть стандартное математическое определение факториала, установите выражение 0!
равным 1
.
4. Определите класс Name_value
, хранящий строку и значение. Включите в него конструктор (так же как в классе Token
). Повторите упр. 19 из главы 4, чтобы вместо двух векторов использовался вектор vector
.
5. Добавьте пункт в английскую грамматику из раздела 6.4.1, чтобы можно было описать предложения вида “The birds fly but the fish swim”.
6. Напишите программу, проверяющую корректность предложений в соответствии с правилами грамматики английского языка из раздела 6.4.1. Будем считать, что каждое предложение заканчивается точкой, ., окруженной пробелами. Например, фраза birds fly but the fish swim
. является предложением, а фразы but birds fly but the fish swim
(пропущена точка) и birds fly but the fish swim
. (перед точкой нет пробела) — нет. Для каждого введенного предложения программа должна просто отвечать “Да” или “Нет”. Подсказка: не возитесь с лексемами, просто считайте строку с помощью оператора >>
.
7. Напишите грамматику для описания логических выражений. Логическое выражение напоминает арифметическое за исключением того, что в нем используются не арифметические, а логические операторы: !
(отрицание), ~
(дополнение), &
(и), |
(или) и ^
(исключающее или). Операторы !
и ~
являются префиксными унарными операторами. Оператор ^
имеет более высокий приоритет, чем оператор |
(так же, как оператор *
имеет более высокий приоритет, чем оператор +
), так что выражение x|y^z
означает x|(y^z
), а не (x|y)^z
. Оператор &
имеет более высокий приоритет, чем оператор ^
, так что выражение x^y&z
означает x^y&z)
.
8. Повторите упр. 12 из главы 5 (игра “Коровы и быки”), используя четыре буквы, а не четыре цифры.
9. Напишите программу, считывающую цифры и составляющую из них целые числа. Например, число 123
считывается как последовательность символов 1
, 2
и 3
. Программа должна вывести на экран сообщение: “123 — это 1 сотня, 2 десятки и 3 единицы
”. Число должно быть выведено как значение типа int
. Обработайте числа, состоящие из одной цифры, двух, трех и четырех цифр. Подсказка: для того чтобы получить число 5
из символа '5'
, вычтите из него символ '0'
, иначе говоря, '5'–'0'==5
.
10. Перестановка — это упорядоченное подмножество множества. Например, допустим, что вы хотите подобрать код к сейфу. Существует шестьдесят возможных чисел, а вам необходимо выбрать три числа для комбинации. Для этой комбинации чисел существует P(60,3)
перестановок, где количество перестановок определяется по формуле:
где символ !
означает факториал. Например, 4!
— это 4*3*2*1
. Сочетания напоминают перестановки за исключением того, что в них порядок следования не имеет значения. Например, если вы делаете банановое мороженое и хотите использовать три разных вкуса из пяти, имеющихся в наличии, вам все равно, когда вы используете ваниль — в начале или в конце, вы просто хотите использовать ваниль. Формула для вычисления количества сочетаний имеет следующий вид:
Разработайте программу, запрашивающую у пользователя два числа, предлагающую ему вычислить количество перестановок или сочетаний и вывести результат на экран. Напишите, что именно должна делать программа. Затем переходите на этап проектирования. Напишите псевдокод программы и разбейте ее на части. Эта программа должна проверять ошибки. Убедитесь, что все неправильные входные данные приводят к появлению осмысленных сообщений об ошибках.
Послесловие
Осмысление входных данных — одна из основных составных частей программирования. Каждая программа в той или иной степени сталкивается с этой проблемой. Осмысление чего бы то ни было, сделанного человеком, относится к одной из труднейших задач. Например, многие аспекты распознавания голоса остаются нерешенными задачами. Простые варианты этой задачи, такие как наш калькулятор, можно решить с помощью грамматики, описывающей входные данные.
Глава 7. Завершение программы
“Цыплят по осени считают”.
Поговорка