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

115 Глава 3

практически всего механизма принятия решений. Существует шесть фундаменталь- ных операций для сравнения двух доступных значений:

Операция сравнения "равно" состоит из двух подряд знаков равенства. Это не то же са- мое, что операция присваивания, которая состоит лишь из одного знака равенства. Распространенная ошибка связана с использованием операции присваивания вместо опера- ции сравнения, поэтому будьте внимательны.

Каждая из этих операций сравнивает значения двух своих операндов и возвраща- ет одно из двух возможных значений типа bool: true — если сравнение истинно, и false — если нет. Вы можете увидеть, как это работает, рассмотрев несколько про- стых примеров сравнений. Предположим, что объявлены целочисленные перемен- ные i и j со значениями 10 и -5 соответственно. Все представленные ниже выраже- ния возвращают значение true:

Далее предположим, что вы определили следующие переменные:

Вот несколько примеров сравнений, использующих эти символьные переменные:

Все четыре выражения сравнивают значения кодов ASCII. Первое выражение воз- вращает true, потому что first инициализировано символом ' А', что эквивалент- но десятичному числу 65. Второе выражение проверяет, меньше ли значение first, которое равно ' А', чем значение last, которое равно ' Z 1. Если заглянуть в табли- цу кодов символов ASCII в приложении Б, то мы увидим, что заглавные буквы пред- ставлены последовательными числовыми величинами — от 65 до 90, при чем 65 пред- ставляет ' А', а 90 — ' Z ', поэтому второе сравнение также вернет true. Третье же выражение вернет false, потому что ' Е1 больше, чем значение first. Последнее выражение вернет true, поскольку 'А' определенно не равно * Z'.

Теперь рассмотрим несколько более сложные сравнения чисел. Имея переменные, определенные следующим образом:

взгляните на такие выражения:

Как видите, в качестве операндов сравнения можно использовать выражения, возвращающие числовые значения. Если вы заглянете в таблицу приоритетов, при- веденную в главе 2, то увидите, что скобки не являются совершенно необходимыми, однако они помогают сделать выражения яснее. Первое сравнение истинно, поэтому возвращает bool-значение true. Переменная у содержит очень малое отрицательное число, — 0,000000000025, а потому оно больше, чем -1. Второе сравнение возвращает false. Выражение 10 — i равно 20, то есть тому же, что и j. Третье выражение воз- вращает true, потому что 3 + у чуть меньше, чем 3.

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

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

Оператор if

Базовый оператор i f позволяет программировать выполнение единственно- го оператора или блока операторов, заключенных в фигурные скобки, если данное условное выражение оценено как истинное, или же пропустить оператор или блок операторов, если условие оценено как ложное. Это показано на рис. 3.1.

Рис. 3.1. Базовый оператор if Вот простой пример оператора if:

Проверяемое условие помещается в скобки, следующие за ключевым словом if, после чего следует оператор, который должен быть выполнен, если условие возвра- щает true. Обратите внимание на то, где находится точка с запятой. Она идет после следующего за if со скобками оператора; то есть, не должно быть точки с запятой сра- зу после проверочного условия в скобках, так как эти две строки, по сути, составляют единый оператор. Вы также можете видеть, как оператор, следующий за if, сдвинут, чтобы отметить, что он должен быть выполнен только в том случае, когда условие if вернет true. Такой отступ не является необходимым, чтобы программа компилиро- валась и исполнялась, но он помогает вам увидеть отношение между условием if и оператором, который от него зависит. Оператор вывода в этом фрагменте кода вы- полняется только в том случае, если переменная letter содержит значение 'А'.

Вы можете расширить этот пример, добавив оператор, изменяющий значение letter, если оно равно 'А':

Блок операторов, управляемый оператором if, ограничен фигурными скобками. Здесь операторы блока выполняются, только если условие (letter == 'А') оцени- вается как true. Без этих скобок лишь первое из них было бы субъектом if, а при- сваивание 1 а * переменной letter выполнялось бы всегда, независимо от условия if. Обратите внимание, что после каждого оператора в блоке ставится точка с запятой, но не после закрывающей фигурной скобки. В блоке может быть столько операторов, сколько вам нужно. Здесь в результате того, что letter содержит ' А', его значение изменяется на 1 а' после вывода такого же сообщения, как и раньше. Если же условие вернет false, ни один из операторов блока не выполняется.

Вложенные операторы if

О

Рассмотрим пример вложенных операторов i f в рабочем примере.

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

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

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

Программа начинается с обычных строк комментариев; затем идет оператор #include для включения заголовочного файла поддержки ввода-вывода и объявле- ние using для cin, cout и endl из пространства имен std. Первое действие в теле main () — приглашение пользователю на ввод буквы. Введенная буква сохраняется в переменной типа char по имени letter.

Оператор if, который следует за вводом, проверяет введенный символ на пред- мет того, больше или равен он 1 А1. Поскольку коды ASCII для прописных букв (от 97 до 122) больше, чем коды заглавных букв (от 65 до 90), ввод прописной бук- вы заставит программу выполнить блок первого оператора if, потому что условие

возвращает true для всех букв. В этом случае выполняется вло- женный оператор if, который проверяет, меньше или равен введенный символ 1Z'. Если он равен ' Z' или меньше, это значит, что введена заглавная буква, отображается соответствующее сообщение, и на этом программа завершается оператором return. Оба оператора заключены в фигурные скобки, поэтому оба они выполняются, если условие вложенного if возвращает true.

Следующие операторы i f проверяют, является ли введенный символ буквой ниж- него регистра с помощью, по сути, того же механизма, что и в первой паре if, ото- бражают сообщения и завершают программу.

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

Как видите, отношения между вложенными if и оператором вывода гораздо про- ще отследить, имея отступы в строках кода.

Ниже показан пример выполнения этого примера.

Можно легко организовать преобразование символа верхнего регистра в ниж- ний, добавив только один дополнительный оператор к if, проверяющий верхний регистр:

Здесь добавлено один дополнительный оператор. Он преобразует заглавную букву в прописную, увеличивая значение letter на разность ' а' - 'А'. Это работает, по- тому что ASCII-коды от ' А' до 1 Z 1 и от 1 а1 до ' z ' представляют две непрерывных группы последовательных числовых кодов, поэтому выражение 1 а1 - 'А1 представ- ляет значение, которое должно быть добавлено к букве верхнего регистра, чтобы по- лучить эквивалентную букву нижнего регистра.

С тем же успехом вы могли бы применить здесь эквивалентные коды ASCII, но за счет использования букв гарантируется, что программа будет работать и на компью- терах, где применяется кодировка символов, отличная от ASCII — до тех пор, пока множества прописных и заглавных букв представлены непрерывными последователь- ностями числовых значений.