Читаем Программирование полностью

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. Сочетания напоминают перестановки за исключением того, что в них порядок следования не имеет значения. Например, если вы делаете банановое мороженое и хотите использовать три разных вкуса из пяти, имеющихся в наличии, вам все равно, когда вы используете ваниль — в начале или в конце, вы просто хотите использовать ваниль. Формула для вычисления количества сочетаний имеет следующий вид:

Разработайте программу, запрашивающую у пользователя два числа, предлагающую ему вычислить количество перестановок или сочетаний и вывести результат на экран. Напишите, что именно должна делать программа. Затем переходите на этап проектирования. Напишите псевдокод программы и разбейте ее на части. Эта программа должна проверять ошибки. Убедитесь, что все неправильные входные данные приводят к появлению осмысленных сообщений об ошибках.

Послесловие

Осмысление входных данных — одна из основных составных частей программирования. Каждая программа в той или иной степени сталкивается с этой проблемой. Осмысление чего бы то ни было, сделанного человеком, относится к одной из труднейших задач. Например, многие аспекты распознавания голоса остаются нерешенными задачами. Простые варианты этой задачи, такие как наш калькулятор, можно решить с помощью грамматики, описывающей входные данные.

<p id="AutBody_Root115"><strong>Глава 7. Завершение программы</strong></p>

“Цыплят по осени считают”.

Поговорка

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже