Литмир - Электронная Библиотека
A
A

3. Добавьте оператор вычисления факториала: для его представления используйте знак восклицания,

!
. Например, выражение
7!
означает
7*6*5*4*3*2*1
. Присвойте оператору
!
более высокий приоритет по сравнению с операторами
*
и
/
, т.е.
7*8!
должно означать
7*(8!)
, а не
(7*8)!
. Начните с модификации грамматики, чтобы учесть оператор с более высоким приоритетом. Для того чтобы учесть стандартное математическое определение факториала, установите выражение
0!
равным
1
.

4. Определите класс

Name_value
, хранящий строку и значение. Включите в него конструктор (так же как в классе
Token
). Повторите упр. 19 из главы 4, чтобы вместо двух векторов использовался вектор
vector<Name_value>
.

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)
перестановок, где количество перестановок определяется по формуле:

Программирование. Принципы и практика использования C++ Исправленное издание - _060.png

где символ

!
означает факториал. Например,
4!
— это
4*3*2*1
. Сочетания напоминают перестановки за исключением того, что в них порядок следования не имеет значения. Например, если вы делаете банановое мороженое и хотите использовать три разных вкуса из пяти, имеющихся в наличии, вам все равно, когда вы используете ваниль — в начале или в конце, вы просто хотите использовать ваниль. Формула для вычисления количества сочетаний имеет следующий вид:

Программирование. Принципы и практика использования C++ Исправленное издание - _061.png

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

Послесловие

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

Глава 7. Завершение программы

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

Поговорка

Создание программы предполагает последовательное уточнение того, что вы хотите сделать и как вы желаете это выразить. В главе 6 мы разработали первоначальную версию программы, имитирующей работу калькулятора. Теперь мы ее улучшим. Завершение программы, т.е. ее настройка с учетом потребностей пользователей, подразумевает улучшение пользовательского интерфейса, выполнение серьезной работы по устранению ошибок, добавление новых полезных функциональных возможностей и перестройку программы для повышения ее ясности и проведения модификаций.

7.1. Введение

 

Программирование. Принципы и практика использования C++ Исправленное издание - _001.png
 Когда программа в первый раз начинает работать нормально, вы, вероятно, находитесь лишь на полпути к финишу. Для больших программ и программ, неправильная работа которых может привести к тяжелым последствиям, даже “полпути” — слишком оптимистическая оценка. Когда программа в принципе работает, начинается самое интересное! Именно в этот момент мы можем приступить к экспериментам с нашими идеями на основе работоспособного кода.

92
{"b":"847443","o":1}