Лекция № 2

Тема: «Логические операции и операторы ветвления»

 

План

1.  Выражения сравнения

2. Оператор IF … ELSE

3. Оператор ?:

4. Оператор SWITCH

 

1. Выражения сравнения

Компьютеры представляют собой нечто большее, чем средства для беспрерывного «перемалывания» чисел. Они обладают способностью сравнивать значения, и именно эта особенность служит компьютеру основанием для принятия необходимых решений. Указанная возмож­ность воплощена в C++ в операторах сравнения. Для сравнения чисел в C++ существует шесть операторов сравнения. Каждое выражение сравнения сводится к значению true, если результат срав­нения оказывается истинным, и к значению false, если результат сравнения оказывается ложным. Все операторы сравнения представлены в таблице.

 

Оператор

Значение

< 

меньше

<=

меньше или равно

= = 

равно

> 

больше

>=

больше или равно

!=

не равно

 

Операторы сравненья обладают более низким при­оритетом, чем арифметические операторы. Это означа­ет, что выражение

х  + 3 > у - 2         //выражение 1

соответствует выражению

(x + 3) > (у - 2) //выражение 2

а не следующему выражению:

х + (3 > у) - 2    //выражение 3

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

Часто приходится проверять более одного условия. В целях удовлетворения подобной необхо­димости язык C++ предоставляет три логические опе­рации для объединения или изменения существующих выражений. Этими операциями являются логическое ИЛИ, записываемое как ||; логическое И, записываемое как &&; и логическое НЕ, записываемое как !

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

В разговорном языке слово или может указывать на то, что одно или оба условия удовлетворяют предъявляемо­му требованию. Операция логичес­кого ИЛИ, записываемая как ||, объединяет два выражения в одно. Если любое или оба исходных выражения имеют значение true, резуль­тирующее выражение также имеет значение true. В противном случае выражение имеет значение false. Ниже приведе­но несколько примеров:

5 = = 5 || 5 = = 9     //истинно, поскольку первое выражение истинно

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

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

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

5 > 8 || 5 < 2         //ложно, поскольку оба выражения ложны

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

В соответствии с правилами C++ оператор || являет­ся точкой последовательности, т.е. любые изменения зна­чения, указанные в левой части, происходят до вычис­ления правой части. Например, давайте рассмотрим следующее выражение:

i++ < 6 || i == j

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

Операция логического И: &&

Операция логического И, записываемая как &&, также объединяет два выражения в одно. Результирующее вы­ражение имеет значение 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++ не утруж­дает себя вычислением правой части. Операция && позволяет в условиях диапазоны значений.

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

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

Как правило, отношение можно выразить понятнее, не прибегая к этому оператору:

!(х  >  5) то же самое, что и  х <= 5

Немного о логических операциях

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

x > 5 && х < 10

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

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

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

!(х > 5)

Операция логического И имеет более высокий при­оритет, чем операция логического ИЛИ. Следовательно, выражение

x > 30 && x < 45 || y > 300

означает следующее:

(x > 30 && x < 45) || y > 300

Таким образом, одно условие состоит в проверке принадлежности переменной x диапазону от 31 до 44, а второе в том, чтобы y было больше 300.

Для указания программе требуемого порядка действий можно использовать скобки. Например, предположим, что нужно использовать операцию && для объединения условия «x больше 50 или y больше 300» с условием «z больше 1000». Для этого часть ИЛИ необходимо заключить в скобки:

(x > 50 || y >300) && z > 1000

В противном случае компилятор объединит условие y с условием z, а не с условием x. Для группирования условий проще всего использовать скоб­ки, независимо от того, нужны они или нет. Это облег­чает чтение текста программы. (начало)

 

2. Оператор IF … ELSE

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

if (условие)

оператор;

 

Истинное условие приво­дит к выполнению программой оператора, который может быть отдельным оператором или блоком операторов. Ложное условие приводит к тому, что оператор пропускается программой.

Оператор if else

Оператор if позволяет программе решить, должен ли выполняться конкретный оператор или блок. Оператор if else позволяет программе решить, какой из двух опе­раторов или блоков должен выполняться. Этот оператор незаменим для создания взаимоисключающих последо­вательностей действий. Общая форма этого оператора выглядит следующим об­разом:

if (условие)

оператор1;

else

оператор2;

 

Если условие является истинным, программа выполняет оператор1 и пропус­кает оператор2. В противном случае, когда значение условия является ложным, программа пропускает onepamop1 и выполняет оператор2.

 

Например. Составить программу для нахождения максимального из двух чисел.

 

#include <iostream.h>

 

int main()

{

//отображение русских символов

system("chcp 1251>nul");

float a,b,c;

cout<<"Введите значения двух чисел: ";

cin>>a>>b;

//нахождение максимального значения

if (a>b)

     c=a;

else

     c=b;

cout<<"Максимальное из двух чисел равно: "<<c<<endl;

//пауза для просмотра результата

system("pause");

//завершаем работу программы

return 0;

}

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

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

Компьютерные программы, как и реальная жизнь, мо­гут ставить вас перед необходимостью выбора более чем из двух возможных вариантов. Для удовлетворения этой потребности можно расширить возможности оператора if else C++. За ключевым сло­вом else можкт следовать еще один оператор IF.

 

Например. Составить программу для нахождения максимального из трех чисел.

 

#include <iostream.h>

 

int main()

{

system("chcp 1251>nul");

float a,b,c,d;

cout<<"Введите значения трех чисел: ";

cin>>a>>b>>c;

 

if (a>b && a>c)

     d=a;

else if (b>a && b>c)

     d=b;

else

     d=c;

 

cout<<"Максимальное из трех чисел равно: "<<d<<endl;

system("pause");

return 0;

}

 

Например. Составить программу для решения квадратного уравнения.

#include <iostream.h>

#include <math.h>

 

int main()

{

system("chcp 1251>nul");

float a,b,c,d,x1,x2;

cout<<"Введите значения коэффициентов уравнения: ";

cin>>a>>b>>c;

 

//считаем дискриминант

d=pow(b,2)-4*a*c;

//если дискриминант положительный

if (d>0)

{

//находим два корня уравнения

x1=(-b+sqrt(d))/(2*a);

x2=(-b-sqrt(d))/(2*a);

cout<<"Уравнение имеет два корня: x1="<<x1<<" x2="<<x2;

}

else if (d==0) //если дискриминант равен нулю

{

//находим один корень уравнения

x1=-b/(2*a);

cout<<"Уравнение имеет один корень: x="<<x1;

}

//иначе дискриминант отрицательный

//уравнение корней не имеет

else

cout<<"Уравнение корней не имеет";

 

system("pause");

return 0;

}(начало)

 

3. Оператор ?:

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

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

 

Если выражение1 истинно, то значением всего ус­ловного выражения является значение выражения2.

В противном случае значением всего выражения явля­ется значение выражения3.

Ниже приведено несколько примеров, в которых демонстрируется работа этого опе­ратора:

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

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

 

По сравнению с последовательностью if else услов­ный оператор более лаконичен, но и то же время имеет менее понятный синтаксис.

Однако он позволяет использовать условное выражение в общем большом выражении.

 

Например. Составить программу для расчета выражения: y=a2 + max(a,b) – b3

Сначала решим пример, обычным способом. Найдем max(a,b) с помощью оператора if.

 

//подключаем заголовочные файлы

#include <iostream.h>

#include <math.h>

 

int main()

{

system("chcp 1251>nul");

float a,b,max,c;

cout<<"Введите значения переменных a и b: ";

cin>>a>>b;

 

if (a>b)

     max=a;

else

     max=b;

 

c=pow(a,2)+max+pow(b,3);

 

cout<<"Функция равна: "<<c<<endl;

 

system("pause");

return 0;

}

 

 

Теперь найдем max(a,b) с помощью оператора?: Это позволяет сократить текст программы.

 

//подключаем заголовочные файлы

#include <iostream.h>

#include <math.h>

 

int main()

{

system("chcp 1251>nul");

float a,b,max,c;

cout<<"Введите значения переменных a и b: ";

cin>>a>>b;

 

c=pow(a,2)+(a>b ? a : b)+pow(b,3);

 

cout<<"Функция равна: "<<c<<endl;

 

system("pause");

return 0;

}

 

Допускается вложение нескольких операторов ?: друг в друга.

Например: найдем максимальное из трех чисел.

 

#include <iostream.h>

 

int main()

{

system("chcp 1251>nul");

//описываем переменные

float a,b,c,d;

 

//вводим исходные данные

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

cin>>a>>b>>c;

 

//находим максимальное из 3 чисел с помощью оператора ?:

d=(a>b && a>c ? a : (b>a && b>c ? b : c));

//выводим результат

cout<<"Максимальное число равно: "<<d<<"\n";

 

//делаем паузу для просмотра результата

system("pause");

return 0;

} (начало)

 

4. Оператор SWITCH

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

 

switch   (целочисленное выражение)

{

case метка1 : оператор(ы);

case метка2 : оператор(ы);

. . .

case меткаN : оператор(ы);

default : оператор(ы);

}

 

Оператор switch в языке C++ действует в качестве переключателя, который указывает компьютеру, какую строку программы нужно выполнять следующей. Встре­тив ключевое слово switch, программа переходит к стро­ке, помеченной значением, соответствующим значению целочисленного выражения. Значением целочис­ленного выражения, как следует из его названия, долж­но быть выражение, при вычислении дающее целочис­ленное значение. Кроме того, каждая метка должна быть выражением целочисленной константы. Если целочислен­ное выражение не соответствует ни одной из меток, программа переходит к строке, помеченной меткой default. Эта метка необязательна. Если ее опустить и при этом совпадение с метками отсутствует, программа пе­реходит к оператору, следующему за switch.

Оператор switch существенно отличается от аналогич­ных операторов таких языков, как Pascal. После того, как программа переходит к конкрет­ной строке в операторе switch, она по порядку выпол­няет все операторы, которые следуют за этой строкой, если только явно не указано иное. Выполнение опера­ции не останавливается автоматически на следующем варианте. Для остановки выполнения в конце конкрет­ной группы операторов необходимо использовать опе­ратор break. В результате выполнение продолжится с оператора, следующего за switch.

Оператор switch не предназначен для обра­ботки диапазонов. Каждая метка варианта оператора switch должна быть отдельным значением. Кроме того, это значение должно быть целым, поэтому оператор switch не будет выполнять проверку значений с плавающей точкой. И значение метки вари­анта должно быть константой. Если реализация вариан­тов требует использования диапазонов, осуществления проверки значений с плавающей точкой или сравнения двух переменных, следует использовать оператор if else.

Чаще всего оператор switch используется для обработки выбора пользователя из меню программы.

 

Пример. Пусть имеется две переменные a и b. Необходимо выдать на экран меню вида:

1 – сумма

2 – разность

3 – произведение

4 – частное

В зависимости от выбора пользователя нужно посчитать выбранное значение.

 

#include <iostream.h>

 

int main()

{

system("chcp 1251>nul");

//задаем начальные значения переменных

float a=10, b=5, c;

int k=1;

//выдаем меню

cout<<"1 - сумма\n" ;

cout<<"2 - разность\n" ;

cout<<"3 - произведение\n" ;

cout<<"4 - частное\n" ;

 

//запрашиваем выбор из меню

cout<<"Сделайте выбор - ";

cin>>k;

 

//обрабатываем выбор из меню

switch (k)

{

//если выбран первый режим

case 1 :

c=a+b;

cout<<"Сумма="<<c<<endl;

break;

 

//если выбран второй режим

case 2 :

c=a-b;

cout<<"Разность="<<c<<endl;

break;

 

//если выбран третий режим

case 3:

c=a*b;

cout<<"Произведение="<<c<<endl;

break;

 

//если выбран четвертый режим

case 4 :

c=a/b;

cout<<"Частное="<<c<<endl;

break;

 

//если выбран неверный режим (не 1, не 2, не 3, не 4)

default:

cout<<"Вы выбрали неверный режим";

}    //конец оператора switch

system("pause");

return 0;

}(начало)