Лекция № 2
Тема: «Логические операции и операторы ветвления»
План
Компьютеры представляют
собой нечто большее, чем средства для беспрерывного «перемалывания» чисел. Они
обладают способностью сравнивать значения, и именно эта особенность служит
компьютеру основанием для принятия необходимых решений. Указанная возможность
воплощена в 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;