- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
119 Глава 3
Существует библиотечная функция ISO/ANSI С++ для преобразования букв в верхний ре- гистр, поэтому обычно вам не придется программировать эту операцию самостоятельно. Она называется toupper (), и ее заголовок содержится в стандартном библиотечном фай- ле <ctype>. Позднее вы узнаете больше о библиотечных средствах, когда мы поговорим о написании функций.
Расширенный оператор if
Оператор if, который вы использовали до сих пор, выполнял оператор или блок, если указанное условие возвращало true. Затем выполнение программы продолжа- лось со следующего оператора по порядку. Но есть и другая версия if, которая позво- ляет выполнить один оператор, когда условие if возвращает true, и другой — когда оно возвращает false. После этого выполнение программы продолжается со следу- ющего оператора по порядку. Как вы уже видели в главе 2, блок операторов всегда может заменить один оператор, и это также касается расширенной версии if
Описание полученных результатов
После чтения входного значения в number оно проверяется на четность путем взя- тия остатка от деления на 2 (используя для этого операцию %, с которой вы познако- мились в предыдущей главе) и проверки его в условии оператора if. В данном случае
условие оператора if возвращает целое, а не булевское значение. Оператор if ин- терпретирует ненулевое значение, возвращенное условием, как true, а нулевое — как false. Другими словами, условное выражение:
(number % 2L)
Типичный
вывод этой программы:
Решения
и циклы
эквивалентно такому:
Если остаток равен 1, условие равно true, и тогда выполняется оператор, следу- ющий непосредственно за if. Если же остаток равен 0, то условие оценивается как false, и тогда выполняется оператор, следующий за ключевым словом else.
Условие оператора if может быть выражением, возвращающим значение любого из фунда- ментальных типов данных, с которыми вы познакомились в главе 2. Когда условное выраже- ние возвращает числовое значение вместо bool, то компилятор вставляет автоматическое приведение результата такого выражения к типу bool. Приведение к bool ненулевого зна- чения дает true, а нулевого— false.
Поскольку остатком от деления целого на 2 может быть только единица или ноль, я снабдил код комментарием, отражающим этот факт. После любого исхода оператор return завершает программу.
Ключевое слово else пишется без точки с запятой— так же, как часть оператора if. Опять-таки, отступы служат для визуального выделения отношений между операторами. Благодаря им, вы можете ясно видеть, какой оператор выполняется в случае true или нену- левого результата, а какое— в случае false или нуля. Вы всегда должны сдвигать операторы в своей программе, чтобы подчеркнуть ее логическую структуру
Комбинация if-else предоставляет выбор между двумя возможностями. Общая логика if-else показана на рис. 3.2.
121 Глава 3
Стрелочки на диаграмме указывают последовательность выполнения операторов, в зависимости от того, возвращает условие if значение true или false.
Вложенные операторы if-else
Как вы уже видели, можно вкладывать операторы if в другие операторы if. Точно так же можно вкладывать операторы if-else внутрь операторов if, а опера- торы if — внутрь if-else. Здесь существует некоторая возможность путаницы, поэ- тому рассмотрим несколько примеров. Ниже представлен пример вложения if-else внутрь if.
Проверка donuts выполняется только в случае, когда проверка coffee возвраща- ет true, поэтому сообщения корректно отражают ситуацию в каждом случае. Однако здесь легко запутаться. Если вы напишете то же самое с неправильными отступами, то, глядя на код, можете прийти к неверным заключениям.
Здесь сравнительно легко обнаружить ошибку, но в случае более сложных структур if вам следует помнить о правиле, определяющем, какому if принадлежит else.
else всегда относится к ближайшему предшествующему if, у которого нет другого else.
В любом случае, когда код выглядит сложным, вы можете применить это правило, чтобы разобраться. А когда пишете собственную программу, всегда применяйте фигур- ные скобки, чтобы сделать ситуацию яснее. Без них можно обойтись в таком простом случае, но, тем не менее, вы моглибы записать последний пример следующим образом:
И в этом случае не остается места для неправильного толкования. Теперь, когда вы знаете правила, понять случай с вложением if внутрь if-else будет нетрудно
.
Решения
и циклы
Здесь скобки важны. Если их убрать, то else будет относиться ко второму if, ко- торый проверяет donuts. В ситуации подобного рода легко забыть о скобках, и тем самым породить ошибку, которую будет трудно обнаружить. Программы с такими ошибками компилируются успешно, и даже иногда выдают правильные результаты.
Если в данном примере удалить фигурные скобки, то вы получите корректный ре- зультат только тогда, когда и coffee, и donuts равны * у', то есть тогда, когда про- веркане выполняется.
А теперь рассмотрим случай вложения операторов if-else в другие операторы if-else. Такая конструкция может показаться весьма запутанной, даже при одном уровне вложенности.
Логика этого примера выглядит не столь очевидной, даже несмотря на правиль- ные отступы. Необходимости в фигурных скобках нет, потому что правило, упомяну- тое выше, выполняется, но код будет яснее, если скобки все-таки вставить.
Однако существует гораздо лучший способ программирования логики такого рода. Если вы собираете достаточно много if в одну конструкцию, то почти наверняка рано или поздно допустите ошибку. В следующем разделе я покажу, как упростить си- туацию.
Логические операции и выражения
Как видите, использование if может выглядеть несколько неуклюже, когда нужно проверить два или более взаимосвязанных условия. В предыдущем примере мы по- пробовали применить if для выяснения ситуации с кофе и пончиками, но на прак- тике может понадобиться проверять намного более сложные условия. Вы можете ис- кать в файле персонала кого-нибудь старше 21, но младше 35 лет, женского пола, с дипломом колледжа, не замужем и разговаривающую на хинди или урду. Определение