Все ранее рассматриваемые программы имели линейную структуру: все инструкции выполнялись последовательно одна за одной, каждая записанная инструкция обязательно выполняется.
Допустим мы хотим по данному числу x определить его абсолютную величину (модуль). Для этого необходимо нарушить линейную логику программы. Программа должна напечатать значение переменной x, если x>0 или же величину -x в противном случае. Линейная структура программы нарушается: в зависимости от справедливости условия x>0 должна быть выведена одна или другая величина. Соответствующий фрагмент программы на C++ имеет вид:
double x; cin>>x; if (x>0) { cout<<x; } else { cout<<-x; } return 0;
В этой программе используется условная инструкция if
(если). После слова if
в обязательных круглых скобках указывается проверяемое условие (x>0)
. После этого
в фигурных скобках идет блок (последовательность) инструкций, который будет выполнен,
если условие истинно, в нашем примере это вывод на экран величины x
.
Затем идет слово else
(иначе) и после него блок инструкций, который будет выполнен,
если проверяемое условие неверно.
Итак, условная инструкция в C++ имеет следующий синтаксис:
if (Условие) { Блок инструкций 1 } else { Блок инструкций 2 }
Блок инструкций 1 будет выполнен, если Условие истинно. Если Условие ложно, будет выполнен Блок инструкций 2.
В условной инструкции может отсутствовать слово else
и последующий блок. Такая инструкция называется неполным ветвлением.
Например, если дано число x
и мы хотим заменить его на абсолютную величину x
,
то это можно сделать следующим образом:
if (x<0) { x=-x; }
В этом примере переменной x
будет присвоено значение -x
, но только
в том случае, когда x<0
.
Внутри условных инструкций можно использовать любые инструкции языка C++, в том числе и условную инструкцию. Получаем вложенное ветвление – после одной развилки в ходе исполнения программы появляется другая развилка. Покажем это на примере программы, которая по данным ненулевым числам x и y определяет, в какой из четвертей координатной плоскости находится точка (x,y):
double x,y; cin>>x>>y; if (x>0) { if (y>0) // x>0, y>0 { cout<<"Первая четверть"<<endl; } else // x>0, y<0 { cout<<"Четвертая четверть"<<endl; } } else { if (y>0) // x<0, y>0 { cout<<"Вторая четверть"<<endl; } else // x<0, y<0 { cout<<"Третья четверть"<<endl; } }
В этом примере мы использовали комментарии – текст, который компилятор игнорирует.
Комментариями в C++ является последовательность символов //
и весь текст после этого символа
до конца строки. Обратите также внимание на отступы в начале строк, используемые для облегчения
понимания текста.
В качестве проверяемого условия должно использоваться выражение логического типа bool
.
Переменные логического типа принимают два значения: true
(истина) и false
(ложь).
Также любое целочисленное выражение можно трактовать, как логическое выражение,
при этом нулевое целое число означает ложь, а ненулевое — истину. Таким образом, если вместо
условия написать false
или 0
, то оно будет всегда ложно, если же указать true
,
1
или любое ненулевое число, то условие будет истинно.
Как правило, в качестве проверяемого условия используется результат вычисления одного из следующих операторов сравнения:
<
true
, если первый операнд меньше второго.
>
true
, если первый операнд больше второго.
<=
>=
==
true
, если два операнда равны.
!=
true
, если два операнда неравны.
Например, условие x*x<2
означает "значение x*x
меньше 2",
а условие 2*x!=y
означает "удвоенное значение переменной x
не равно значению переменной y
".
Будьте аккуратны: оператор ==
(два знака равенства) —
это проверка на равенство двух выражений, а оператор =
(один знак равенства) — это присваивание одной переменной значения выражения
и использование его в условии оператора ветвления в большинстве случаев является ошибкой.
Иногда нужно проверить одновременно не одно, а несколько условий.
Например, проверить, является ли данное число четным можно при помощи
условия n%2==0
(остаток от деления n
на 2
равен 0
),
а если необходимо проверить, что два данных целых числа n
и m
являются
четными, необходимо проверить справедливость обоих условий: n%2==0
и m%2==0
, для чего их необходимо объединить при помощи оператора &&
(логическое И): n%2==0 && m%2==0
.
В C++ существуют стандартные логические операторы: логическое И, логическое ИЛИ, логическое отрицание.
Логическое И является бинарным оператором
(то есть оператором с двумя операндами: левым и правым)
и имеет вид &&
(два знака амперсанда).
Оператор &&
возвращает true
тогда и только
тогда, когда оба его операнда имеют значение true
.
Логическое ИЛИ является бинарным оператором и возвращает true
тогда и только
тогда, когда хотя бы один операнд равен true
. Оператор "логическое ИЛИ" имеет
вид ||
(два знака вертикальной черты).
Логическое НЕ (отрицание) является унарным (то есть с одним операндом)
оператором и имеет вид !
(восклицательный знак), за которым
следует единственный операнд. Логическое НЕ возвращает true
,
если операнд равен false
и наоборот.
Пример:
x && !y
Данное выражение означает "x
И отрицание y
" и равно true
тогда и только тогда, когда x
равно true
, а y
равно false
.
>
, <
, >=
, <=
)
необходимо для решения этой задачи?
YES
, иначе выведите строку NO
.
YES
, если из первой клетки ходом
ладьи можно попасть во вторую или NO
в противном случае.
sqrt
,
для использования которой необходимо в начале программы
подключить заголовочный файл cmath
.
Формат входных данных: три действительных числа.
Формат выходных данных: два действительных числа, если
уравнение имеет два корня, одно действительное число –
при наличии одного корня. При отсутствии действительных корней программа
не выводит ничего.
rectangular
для прямоугольного треугольника, acute
для остроугольного треугольника,
obtuse
для тупоугольного треугольника или impossible
,
если входные числа не образуют треугольника.
korov
, korova
или korovy
,
например, 1 korova
, 2 korovy
, 5 korov
.
Между числом и пробелом должен стоять ровно один пробел.
0 1 2
(2 билета на 60 поездок и 1 билет на 10 поездок).