Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

119 Глава 3

Существует библиотечная функция ISO/ANSI С++ для преобразования букв в верхний ре- гистр, поэтому обычно вам не придется программировать эту операцию самостоятельно. Она называется toupper (), и ее заголовок содержится в стандартном библиотечном фай- ле <ctype>. Позднее вы узнаете больше о библиотечных средствах, когда мы поговорим о написании функций.

Расширенный оператор if

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

Описание полученных результатов

После чтения входного значения в number оно проверяется на четность путем взя- тия остатка от деления на 2 (используя для этого операцию %, с которой вы познако- мились в предыдущей главе) и проверки его в условии оператора if. В данном случае

условие оператора if возвращает целое, а не булевское значение. Оператор if ин- терпретирует ненулевое значение, возвращенное условием, как true, а нулевое — как false. Другими словами, условное выражение:

(number % 2L)

Типичный вывод этой программы:

Решения и циклы 120

эквивалентно такому:

Если остаток равен 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 будет нетрудно

.

Решения и циклы 122

Здесь скобки важны. Если их убрать, то else будет относиться ко второму if, ко- торый проверяет donuts. В ситуации подобного рода легко забыть о скобках, и тем самым породить ошибку, которую будет трудно обнаружить. Программы с такими ошибками компилируются успешно, и даже иногда выдают правильные результаты.

Если в данном примере удалить фигурные скобки, то вы получите корректный ре- зультат только тогда, когда и coffee, и donuts равны * у', то есть тогда, когда про- веркане выполняется.

А теперь рассмотрим случай вложения операторов if-else в другие операторы if-else. Такая конструкция может показаться весьма запутанной, даже при одном уровне вложенности.

Логика этого примера выглядит не столь очевидной, даже несмотря на правиль- ные отступы. Необходимости в фигурных скобках нет, потому что правило, упомяну- тое выше, выполняется, но код будет яснее, если скобки все-таки вставить.

Однако существует гораздо лучший способ программирования логики такого рода. Если вы собираете достаточно много if в одну конструкцию, то почти наверняка рано или поздно допустите ошибку. В следующем разделе я покажу, как упростить си- туацию.

Логические операции и выражения

Как видите, использование if может выглядеть несколько неуклюже, когда нужно проверить два или более взаимосвязанных условия. В предыдущем примере мы по- пробовали применить if для выяснения ситуации с кофе и пончиками, но на прак- тике может понадобиться проверять намного более сложные условия. Вы можете ис- кать в файле персонала кого-нибудь старше 21, но младше 35 лет, женского пола, с дипломом колледжа, не замужем и разговаривающую на хинди или урду. Определение