Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

3.5. Тернарная операция (?)

Этой операции также нет в других языках, и без неё можно обойтись. С её помощью в более компактном виде в некоторых случаях можно записать полную форму оператора if. Например,

R=k>9 ? 100 : x*y; равносильно if (k>9) R=100; else R=x*y;

Это единственная трёхместная (триадная) операция, так как для неё требуется три операнда. Общий вид операции следующий:

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

Операция выполняется следующим образом: вычисляется выражение1; если оно истинно (любое ненулевое значение), то вычисляется выражение2, и всё выражение получает это значение; если выражение 1 ложно (нулевое значение), то вычисляется выражение3, и всё выражение получает это значение.

Эта операция не обязательно должна быть связана с присваиванием. Например, в cout можно записать выражение, а в нём при необходимости разрешается использовать эту операцию без дополнительного присваивания значения выражения. Например: cout<<(x>0 && y>x ? x*y : x+y); в зависимости от значений x и y выведут их произведение или сумму. Это равносильно if (x>0 && y>x) cout<<(x*y); else cout<<(x+y).

Не для любого оператора if можно записать тернарную операцию. Вопервых, её можно использовать для замены только полной формы условного оператора. Вовторых, в одной и другой ветвях операции (после символов “?” и “:” ) можно использовать по одному выражению, то есть это соответствует такому оператору if, в котором в каждой ветви по одному оператору.

Эта операция, как и любая другая, в выражении не обязательно должна быть единственной. Аналогично, как операцию “+” можно использовать с другой операцией, допустимо, например, следующее присваивание: R=A+(x>y ? x : y)* B;

Замечание. Наличие отмеченных выше особенностей присваивания, тернарной операции и операции “запятая”(§ 6) является одной из причин того, что язык С, в том числе и С++, традиционно считается сложнее языка Pascal. На начальном этапе изучения такого рода особенности не обязательно надо использовать. Можно программировать проще, в стиле языка Pascal.

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

Задачи и упражнения

1. Вывести “Yes” или “No” в зависимости от того, точка с координатами x, y принадлежит области, ограниченной линиями y= –x, x=0 и y= –1, или нет (записать оператор if и операторы вывода).

if (y<= – x && x>= 0 && y>–1) cout<<"Yes";

else cout<<"No";

  1. Нарисовать область плоскости, в которой и только в которой следующее логическое выражение истинно:

а) x>y && x<2 && y>-1; б) x>y || x<2 && y>-1;

в) x>y && x<2 || y>-1; г) x>y || x<2 || y>-1;

д) x>y && (x<2 || y>-1).

  1. Даны два вещественных числа x, y. Вывести “Yes” или “No” в зависимости от того, точка плоскости с координатами (x, y) принадлежит кольцу, ограниченному окружностями, радиусы которых r и R (r<R) c общим центром в точке с координатами (a, b), или не принадлежит этому же кольцу.

4. Даны два вещественных числа x, y. Если точка плоскости с координатами (x, y) принадлежит треугольнику с вершинами в точках (–2, 0), (0, 2), (2, 0), то обе координаты увеличить в 10 раз, в противном случае уменьшить их на 10.