Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lesson_1_2.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
280 Кб
Скачать
☆
  1. Операторы ветвления. Конструкция логического выбора if, тернарный оператор ?

Оператор if

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

Синтаксис оператора if:

if (проверочное-условие)

оператор

Вся конструкция if рассматривается как одиночный оператор. Чаще всего проверочное-условие — выражение сравнения, вроде тех, которые управляют циклами.

If (a==10) cout << “Ответ верный”;

Задача: ввести два числа, определить какое из них больше или они равны.

#include <iostream>

using namespace std;

void main()

{

setlocale (LC_CTYPE, "russian");

int a,b;

cout << "Введите число: ";

cin >> a;

cout << "Введите второе число: ";

cin >> b;

if (a>b)

cout << a << " > " << b;

if (a<b)

cout << a << " < " << b;

if (a==b)

cout << a << " = " << b;

cin.get();

cin.get();

}

Оператор if else

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

Оператор if else имеет следующую общую форму:

if (проверочное-условие)

оператор 1

else

оператор 2

Если проверочное-условие равно true или не ноль, то программа выполняет оператор 1 и пропускает оператор2. В противном случае, когда проверочное-условие равно false или ноль, программа выполняет оператор2 и пропускает оператор 1. Потому следующий фрагмент кода печатает первое сообщение, если answer равно 1492, и второе — в противном случае:

if (answer == 1492)

cout << "That's right!\n";

else

cout << "You'd better review Chapter 1 again.\n";

Вся конструкция if else трактуется синтаксически как одиночный оператор.

Форматирование операторов if else

Имейте в виду, что две альтернативы в операторе if else должны быть одиночными операторами. Если в каждой логической ветви требуется более одного оператора, воспользуйтесь фигурными скобками {}, чтобы организовать их в единый блок.

Конструкция if else if else Другой вариант: if if if …. Else – не корректный!

оператор else относится только к последнему if

В компьютерных программах, как и в жизни, иногда приходится выбирать из более чем двух вариантов. Оператор C++ if else можно расширить, чтобы он отвечало таким потребностям. Как уже говорилось, за else должен следовать единственный оператор, который может быть и блоком операторов. Поскольку конструкция if else сама является единым оператором, она может следовать за else:

if (ch == 'А')

a_grade++; // альтернатива # 1

else

if (ch == 'В') // альтернатива # 2

b_grade++; // подальтернатива # 2a

else

soso++; // подальтернатива # 2b

Если значение ch не равно 'А1, программа переходит к else. Там второй оператор if else разделяет эту альтернативу еще на два варианта.

Это выглядит как совершенно новая управляющая структура — if else if else. Но на самом деле это один оператор if else, вложенный в другой. Вся эта конструкция по-прежнему трактуется как единственный оператор.

#include <iostream>

using namespace std;

void main()

{

setlocale (LC_CTYPE, "russian");

int a,b;

cout << "Введите число: ";

cin >> a;

cout << "Введите второе число: ";

cin >> b;

if (a>b)

cout << a << " > " << b;

else if (a<b)

{cout << a << " < " << b;}

else

{cout << a << " = " << b;}

cin.get();

cin.get();

}

Операция ?:

Язык C++ включает операцию, которая часто может использоваться вместо оператора if else. Она называется условной операцией, записывается как ? : и является единственной операцией C++, которая требует трех операндов. Ее общая форма выглядит следующим образом:

Выражение 1 ? выражение2 : выражениеЗ

Если выражение 1 истинно, то значением всего условного выражения будет значение выражение2. В противном случае значением всего выражения будет выражениеЗ. Ниже приведены два примера, демонстрирующие ее работу:

5 > 3 ? 10 : 12 // 5 > 3 истинно, поэтому значением всего выражения будет 10

3== 9? 25: 18 // 3 == 9 ложно, поэтому значением всего выражения будет 18

Первый пример можно перефразировать так: если 5 больше, чем 3, то выражение оценивается как 10; иначе оно оценивается как 12. В реальных ситуациях программирования выражения, конечно же, могут включать в себя переменные.

Задача: предложение ввести 2 числа, определение и вывод большего.

2digit_larger.cpp

#include <iostream>

using namespace std;

void main()

{

setlocale (LC_CTYPE, "russian");

int a,b;

cout << "Введите 2 числа: " << endl;

cin >> a >> b;

int c=a>b ? a:b; // с = а, если а > b, иначе с = b

cout << "Большее: " << c << endl;

cin.get();

cin.get();

}

Аналог выражения int c=a>b ? a:b;

int с;

if (а > b)

с = а;

else с = b;

Условные операции и предотвращение ошибок

Многие программисты превращают более интуитивно понятное выражение переменная == значение в значение == переменная, чтобы предотвратить ошибки, связанные c опечатками, когда вместо операции проверки равенства (==) вводится операция присваивания (=). Например, следующее условие корректно и будет работать правильно:

if (3 == myNumber)

Однако если допустить ошибку и ввести оператор, как показано ниже, то компилятор выдаст сообщение об ошибке, поскольку расценит это как попытку присвоить значение литералу (3 всегда равно 3, и ему нельзя присвоить ничего другого):

if (3 = myNumber)

Предположим, что сделана та же опечатка, но используется обычный формат:

if (myNumber =3)

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

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

Часто приходится проверять более одного условия. Например, чтобы символ относился к прописным буквам, его значение должно быть больше или равно ' а' и меньше или равно ' z '. Чтобы обеспечить такие возможности, C++ предлагает три логических операции, с помощью которых можно комбинировать или модифицировать существующие выражения: логическое "ИЛИ" (которое записывается как | |), логическое "И" (записывается как &&) и логическое "НЕ" (записывается как !).

Логическая операция "ИЛИ": | |

В английском языке слово "or" (или) означает, что одно из двух условий либо оба сразу удовлетворяют некоторому требованию.

Эта операция комбинирует два выражения в одно. Если одно или оба исходных выражения возвращают true или не ноль, то результирующее выражение имеет значение true (истина). В противном случае выражение имеет значение false. Ниже показаны некоторые примеры:

5 == 5 | | 5 == 9 // истинно, потому что первое выражение истинно

5 > 3 || 5 > 10 // истинно, потому что первое выражение истинно

5 > 8 || 5 < 10 // истинно, потому что второе выражение истинно

5 < 8 | | 5 > 2 // истинно, потому что оба выражения истинны

5>8||5<2 // ложно, потому что оба выражения ложны

Результирующее выражение ложно, только если оба выражения ложны, в остальных случаях – истинно!

Поскольку | | имеет более низкий приоритет, чем операции сравнения, нет необходимости использовать в этих выражениях скобки.

В C++ предполагается, что операция | | является точкой следования. Это значит, что любое изменение, проведенное в левой части, вычисляется прежде, чем вычисляется правая часть.

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

І++ < 6 | | І == j

Предположим, что изначально переменная і имела значение 10. К моменту сравнения с j переменная і получает значение 11. Таким образом, C++ не заботится о правой части выражения, если выражение слева истинно, потому что одного истинного выражения достаточно, чтобы все составное выражение было оценено как истинное.

В листинге используется операцию | | внутри if для того, чтобы проверить заглавную и прописную версии символа:

char ch;

cin » ch;

if (ch == 'y' | | ch == 'Y') // у или Y

cout « "You were warned! \a\a\n" ;

else if (ch == 'n' | | ch == 'N') // n или N

cout « "A wise choice . . . bye\n" ;

Логическая операция "И": &&

Логическая операция "И", которая записывается как &&, также комбинирует два выражения в одно. Результирующее выражение имеет значение true только в том случае, когда оба исходных выражения также равны true.

Ниже приведены некоторые примеры:

5==5 && 4==4 // истинно, потому что оба выражения истинны

5==3 && 4==4 // ложно, потому что первое выражение ложно

5>3 && 5>10 // ложно, потому что второе выражение ложно

5>8 && 5<10 // ложно, потому что первое выражение ложно

5<8 && 5>2 // истинно, потому что оба выражения истинны

5>8 && 5<2 // ложно, потому что оба выражения ложны

Поскольку && имеет меньший приоритет, чем операции сравнения, нет необходимости использовать скобки. Подобно | |, операция && действует как точка следования, а потому возможны любые побочные эффекты перед тем, как будет вычислено правое выражение. Если левое выражение ложно, то и все составное выражение также ложно, поэтому в таком случае C++ можно не беспокоиться о вычислении правой части.

Установка диапазонов с помощью &&

cout « "Enter your age in years: "; // запрос возраста в годах

cin » age;

if (age > 17 && age < 35)

cout << «Бег»;

else if (age >= 35 && age < 50)

cout << «Быстрая ходьба»;

else if (age >= 50 && age < 65)

cout << «Медленная ходьба »;

else

cout << «Отдых»;

Задача:

Написать программу проверки введенного вашего возраста для диапазонов 17-35 лет, 35-50 лет, 50-65 лет и старше с рекомендациями физических упражнений.

Проверка диапазонов

Обратите внимание, что каждая часть проверки диапазонов должна использовать операцию "И" для объединения двух полных сравнительных выражений:

if (age > 17 && age < 35) // Нормально

Не заимствуйте из математики и не применяйте следующую нотацию:

if (17 < age < 35) // Не делайте так!

Логическая операция "НЕ": !

Операция ! выполняет отрицание, или обращает, истинность выражения, следующего за ней. То есть если expression равно true, то ! expression равно false, и наоборот. Точнее говоря, если expression имеет значение true, или ненулевое, то ! expression будет равно false.

Обычно выражение отношения можно представить яснее без применения операции !:

if (! (х > 5)) //в этом случае if (х <= 5) яснее

Однако операция ! может быть полезна с функциями, которые возвращают значения true/false либо значения, которые могут интерпретироваться подобным образом.

Например, strcmp (si, s2) возвращает не ноль (true), если две строки в стиле С, s1 и s2, отличаются друг от друга, и ноль, если они одинаковы. Это значит, что !strcmp(sl, s2) равно true, если две строки эквивалентны.

Факты, связанные с логическими операциями

Как упоминалось ранее в этой главе, логические операции "ИЛИ" и "И" в C++ обладают более низким приоритетом, чем операции сравнения. Это значит, что такое выражение, как

х > 5 && х < 10

интерпретируется следующим образом:

(х > 5) && (х < 10)

С другой стороны, операция "НЕ" (!) имеет более высокий приоритет, чем любая арифметическая операция и операция сравнения. Таким образом, для отрицания выражения его необходимо заключить в скобки:

! (х > 5) // равно false, если х больше 5

!х > 5 // равно true, если !х больше 5

Кстати, результатом второго из приведенных выражений всегда будет false, т.к. !х принимает значения true или false, что преобразуется, соответственно, в 1 и 0. Логическая операция "И" имеет более высокий приоритет, чем логическая операция "ИЛИ". Поэтому следующее выражение:

age > 30 && age < 45 I I weight > 300

означает вот что: (age > 30 && age < 45) I I weight > 300

Здесь первое условие говорит о том, что возраст должен быть от 31 до 44 лет включительно, а второе — что вес должен быть больше 300 (фунтов). Все выражение будет истинным, если истинно одно из выражений или оба сразу.

Разумеется, можно использовать скобки, чтобы явно указать программе, как следует интерпретировать выражение. Например, предположим, что вы хотите использовать && для комбинирования условий о том, что возраст (age) должен быть больше 50 или вес (weight) — больше 300, с условием, что размер пожертвования (donation) должен быть больше 1000. Для этого часть "ИЛИ" потребуется поместить в скобки:

(age > 50 | | weight > 300) && donation > 1000

Иначе компилятор скомбинирует условие weight с условием donation, вместо того чтобы скомбинировать его с условием age.

Хотя правила приоритетов операций C++ часто позволяют писать составные выражения без использования скобок, все же проще всегда применять скобки для группирования проверок, независимо от того, нужны они или нет. Это улучшает читабельность кода, исключает неправильное понимание порядка приоритетов и снижает вероятность ошибки из-за того, что вы не помните точно правил приоритетов.

Альтернативные представления

Не все клавиатуры предоставляют возможность ввода символов, используемых для обозначения логических операций, поэтому в стандарте C++ предусмотрены их альтернативные представления. Идентификаторы and, or и not являются зарезервированными словами C++, а это значит, что их нельзя

использовать в качестве имен переменных и тому подобного.

&& - and

1 1 - or

! - not

Библиотека символьных функций cctype

Язык C++ унаследовал от С удобный пакет функций для работы с символами, прототипы которых находятся в заголовочном файле cctype.

Например, функция isalpha (ch) возвращает ненулевое значение, если ch — буква, и ноль — в противоположном случае. Аналогично, ispunct (ch) возвращает значение true, только если ch — знак препинания, такой как запятая или точка.

Использовать эти функции намного удобнее, чем операции "И" и "ИЛИ". Например, вот как пришлось бы с помощью "И" и "ИЛИ" проверять, что ch является буквенным символом:

if ( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') )

Сравните это с применением функции isalpha ():

if (isalpha(ch))

В следующей программе демонстрируется применение некоторых функций из семейства cctype. В частности, в нем используется функция isalpha (), проверяющая буквенные символы, isdigits () , проверяющая символы десятичных цифр, таких как 3, isspace (), проверяющая пробельные символы, такие как пробелы, символы новой строки и табуляции, и ispunct (), проверяющая знаки препинания. Программа также предлагает повторный обзор структуры if else if и цикла while с cin.get(char).

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

String_cctype.cpp

#include <iostream>

#include <cctype>

using namespace std;

void main()

{

setlocale (LC_CTYPE, "russian");

cout << "Введите текст для анализа и символ @ для окончания ввода: " << endl;

char sm;

int chars=0, pr=0, digit=0, punct=0, other=0;

cin.get(sm); // получение первого символа

while (sm != '@') // проверка на признак окончания ввода

{

if(isalpha(sm)) // буквенный символ?

chars++;

else if(isspace(sm)) // пробельный символ?

pr++;

else if(isdigit(sm)) // десятичная цифра?

digit++;

else if(ispunct(sm)) // знак препинания?

punct++;

else

other++;

cin.get(sm); // получение следующего символа

}

cout << "В тексте: " << chars << " букв, " << pr << " пробелов, "

<< digit << " цифр, " << punct << " знаков препинания, " << other << " других символов\n";

cin.get();

cin.get();

}

Символьные функции cctype

Функция Возвращаемое значение

isalnum () Возвращает true, если аргумент — буква или десятичная цифра

isalpha () Возвращает true, если аргумент — буква

isblank () Возвращает true, если аргумент — пробел или знак горизонтальной табуляции

iscntrl () Возвращает true, если аргумент — управляющий символ

isdigit () Возвращает true, если аргумент — десятичная цифра (0-9)

isgraph () Возвращает true, если аргумент — любой печатаемый символ, отличный от пробела

islower () Возвращает true, если аргумент — символ в нижнем регистре

isprint () Возвращает true, если аргумент — любой печатаемый символ, включая пробел

ispunct () Возвращает t rue, если аргумент — знак препинания

isspace () Возвращает true, если аргумент — стандартный пробельный символ (т.е. пробел, прогон страницы, новая строка, возврат каретки, горизонтальная табуляция, вертикальная табуляция)

isupper () Возвращает true, если аргумент — символ в верхнем регистре

isxdigit () Возвращает true, если аргумент — шестнадцатеричная цифра (т.е. 0-9, a-f или A-F)

tolower () Если аргумент — символ верхнего регистра, возвращает его вариант в нижнем регистре, иначе возвращает аргумент без изменений

toupper () Если аргумент — символ нижнего регистра, возвращает его вариант в верхнем регистре, иначе возвращает аргумент без изменений

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]