Теоретический материал (Д.Кириенко, С++)
Условная инструкция
Все ранее рассматриваемые программы имели линейную структуру: все инструкции выполнялись последовательно одна за одной, каждая записанная инструкция обязательно выполняется.
Допустим, мы хотим по данному числу 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
.
Упражнения
- (A) Даны два целых числа. Напечатайте наибольшее из них.
- (B) Даны два целых числа. Программа должна вывести число 1, если первое число больше второго, число 2, если второе больше первого, или число 0, если они равны.
- (C) Даны три числа. Напечатайте наибольшее из них (программа должна вывести ровно одно целое число). Какое наименьшее число операторов сравнения (
>
,<
,>=
,<=
) необходимо для решения этой задачи? - (D) Даны три действительных положительных числа a, b, c. Определите, существует ли треугольник с такими сторонами. Если треугольник существует, выведите строку
YES
, иначе выведите строкуNO
. - (E) Даны три целых числа. Определите, сколько среди них совпадающих. Программа должна вывести одно из чисел: 3 (если все совпадают), 2 (если два совпадает) или 0 (если все числа различны).
- (F) Поле шахматной доски определяется парой чисел (a, b), каждое от 1 до 8, первое число задает номер столбца, второе – номер строки. Заданы две клетки. Определите, может ли шахматная ладья попасть с первой клетки на вторую за один ход. Входные данные: 4 целых числа от 1 до 8 каждое, первые два задают начальную клетку, вторые два задают конечную клетку. Начальные и конечные клетки не совпадают. Программа должна вывести
YES
, если из первой клетки ходом ладьи можно попасть во вторую илиNO
в противном случае. - (G) Решите ту же задачу для короля.
- (H) Решите ту же задачу для слона.
- (I) По заданному числу n от 1 до 365 определите, на какое число какого месяца приходится день невисокосного года с номером n. Программа получает на вход целое число n и должна вывести два числа: число месяца (от 1 до 31) и номер месяца (от 1 до 12), на которое приходится данный день.
- (J) Даны действительные числа a, b, c. Найдите все решения квадратного уравнения ax2+bx+c=0. Для вычисления квадратного корня используется функция
sqrt
, для использования которой необходимо в начале программы подключить заголовочный файлcmath
. Формат входных данных: три действительных числа. Формат выходных данных: два действительных числа, если уравнение имеет два корня, одно действительное число – при наличии одного корня. При отсутствии действительных корней программа не выводит ничего. - (K) Определите тип треугольника (остроугольный, тупоугольный, прямоугольный) с данными сторонами. Входные данные: три натуральных числа – стороны треугольника. Выходные данные: одно из слов
rectangular
для прямоугольного треугольника,acute
для остроугольного треугольника,obtuse
для тупоугольного треугольника илиimpossible
, если входные числа не образуют треугольника. - (L) По данному числу n<100 закончите фразу "На лугу пасется..." одним из возможных продолжений: "n коров", "n корова", "n коровы", правильно склоняя слово "корова". Программа должна вывести введенное число n и одно из слов (на латинице):
korov
,korova
илиkorovy
, например,1 korova
,2 korovy
,5 korov
. Между числом и пробелом должен стоять ровно один пробел. - (M) Билет на одну поездку в метро стоит 15 рублей, билет на 10 поездок стоит 125 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок. Определите, сколько билетов каждого вида он должен приобрести, чтобы суммарное количество оплаченных поездок было не меньше n, а общая стоимость приобретенных билетов – минимальна. Входные данные: количество поездок n. Выходные данные – три целых числа, равные необходимому количеству билетов на 1, на 10, на 60 поездок. Например, при вводе 129 программа должна вывести
0 1 2
(2 билета на 60 поездок и 1 билет на 10 поездок). - (N) Решите предыдущую задачу при наличии следующих билетов: 1 поездка - 15 рублей, 5 поездок - 70 рублей, 10 поездок - 125 рублей, 20 поездок - 230 рублей, 60 поездок - 440 рублей. Если для какого-то данного n существует несколько способов приобретения билетов одинаковой стоимости, необходимо вывести ту комбинацию билетов, которая дает большее число поездок.