Тернарная операция

Этой операции также нет в других языках, и без неё можно обойтись. С её помощью в более компактном виде в некоторых случаях можно записать полную форму оператора if. Например, вместо if (k9) R=100; else R=x*y; можно записать R=k9 ? 100 : x*y;.

Это единственная трёхместная операция, так как для неё требуется три операнда. Общий вид операции: выражение1 ? выражение2 : выражение3.

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

Эта операция не обязательно должна быть связана с присваиванием. Например, известно, что в cout можно записать выражение, а в нём эту операцию без дополнительного присваивания значения выражения. Например:

coutx ? x*y : x+y); в зависимости от значений x и y выведут их произведение или сумму. Это равносильно

if (x0 yx) cout

else cout

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

Эта операция, как и любая другая, в выражении не обязательно должна быть единственной. Аналогично, как и другие операции тернарную можно использовать с другой операцией. Допустимо, например, следующее присваивание: r=a+b*(xy ? x : y); которое вычисляет r= a+b*max(x, y);

Эта операция может быть вложенной. Например, вычисление r= min(x,y), если ab и r=x*a+y*b в противном случае можно выполнить так:

r=ab ? (x

4.3. Оператор выбора switch

Аналогичный оператор есть и в других языках (case в Pascal). Он используется, если уровень вложенности if достаточно большой.

Пример 4. Вывести целое однозначное число z прописью.

Это можно сделать с помощью if:

int z; cinz; if (z==0) cout

else if (z==1) cout

else if (z==2) cout

/* и т.д. записываем if для 3, 4, 5, 6, 7, 8 */

else if (z==9) cout

else cout

Второй вариант с оператором switch вместо вложенного if нагляднее и легче для понимания и отладки.

int z; cinz;

switch (z)

{ case 0: cout

case 1: cout

case 2: cout

case 3: cout

case 4: cout

case 5: cout

case 6: cout

case 7: cout

case 8: cout

case 9: cout

default: cout

} // Конец оператора switch.

// Здесь оператор, следующий после switch.

Работает оператор так. Пусть,например, z=3. Тогда первые две ветви пропускаются, выполняется cout

Оператор switch имеет следующий общий вид:

switch (выражение)

{ case константное_выражение1:

последовательность_операторов1; break;

case константное_выражение2:

последовательность_операторов2; break;

case константное_выражениеN:

последовательность_операторовN; break;

default: последовательность_операторов;

}

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

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

В отличие от языка Pascal нельзя указать диапазон констант. Вместо этого разрешается для нескольких констант указать одну и ту же последовательность операторов.

Пример 5. Анализ оценки z будет выглядеть так:

switch (z)

{ case 1:

case 2:

case 3: cout

case 4: case 5: cout

case 6: case 7: case 8: cout

case 9:

case 10: cout

default: cout

}

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

Допускается вложенность операторов switch, когда в любой последовательности операторов используется другой switch. Константы или значения константных выражений внутреннего и внешнего операторов switch могут совпадать. На одном уровне switch они должны быть различными. Например, допустима следующая часть программы:

char flag1, flag2; ……

switch (flag1)

{ case ‘A’: switch (flag2)

{ case ‘A’: cout

case ‘B’: cout

} break;

case ‘X’: …

}

Упражнения и тесты

1.Дано x. Вычислить y = x*x, если x 0, иначе y = 100.

Предлагаются следующие три варианта решения:

a) if (x0) y=x*x; else y=100; cout

б) y = x0?x*x:100; cout

в) cout

2. Даны х, y. Вывести “+++” или “– – –” в зависимости от того, xy или нет.

Решение: а) if (xy) cout

б) xy? cout

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

Решение:

if (y=0 y–1 ) cout

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

а) xy x-1; б) xy || x-1; в) xy x-1; г) xy || x-1; д) xy (x-1); е) xy !(x-1).

5. Определить результат, то есть значения переменных a, b и r, после выполнения оператора if. Даны, например, следующие начальные значения этих переменных: a) int a=2, b=3, r=4; b) int a=5, b=5, r=4; c) int a=-5, b=5, r=4; d) int a=0, b=3, r=4;. Варианты оператора if:

1) if (a=1) r=a+b; else if (b0) r=a-b;

else if (b

2) if (a=1) r=a+b; else if (b0) r=a-b;

else if (b

3) if (a=b) if (b) r=a+b; else r=a-b;

4) if (a=1) { if (b0) r=a+b; } else r=a-b;

5) if (a=1) if (b0) r=a+b; else r=a-b;

6) if (a+b) if (a-b) {a*=b; b*=a++; }

else { a*=(—b); b*=(a—); }

else { a—; b=a; ++b; }

7) if (a+b) if (a-b) {a*=b; b*=a++; }

else { a*=(—b); b*=(a—); }

else a—; b=a; ++b;

8) if (a=b) { if (b) r=a+b; } else r=a-b;

9) if (a==b) if (b) r=a+b; else r=a-10;

10) if (a==b) { if (b) r=a+b; } else r=a-10;

11) if (a+b) if (a-b) {a*=b; b*=a++; } else { a*=(—b); b*=(a—); }

else { a—; b=a; ++b; }

12) if (a+b) if (a-b) {a*=b; b*=a++; } else { a*=(—b); b*=(a—); }

else a—; b=a; ++b;

6. Пусть float x=… , y=…, a=… , b=…, где a0, b0 (на месте многоточия конкретные числовые константы). Определить результат (true или false) для каждого логического выражения

1) yfabs(x) fabs(x)3) yfabs(x) fabs(x)5) (yfabs(x) || fabs(x)fabs(x) || ( fabs(x)7) ! (yfabs(x) || fabs(x)

В следующих вариантах (8), 9) и т.д.) которые можно записать самостоятельно, по-разному расставлены скобки, меняются логические операции, операции сравнения и место логического отрицания.

7. Записать номера логических выражений, для которых получим true, если int x=…, y=…;(на месте многоточия конкретные числа).

Уровень А. Используются логические выражения, составленные по образцу предыдущего типа теста.

Уровень B. Используются логические выражения, в которых логические величины сравниваются по следующим правилам:

true = = true; false = = false ; true false.

Примеры таких логических выражений:

1) (yx) = = (x0); 2) (yx) ! = (x0); 3) (yx) (x0);

4) (yx) 0); 5) (yx) = (x0); 6) (yx) 0);

7) (y x) !(x 0)и т. п.

8. Пусть float x=…, y=…, r; (x и y проинициализированы конкретными значениями).Записать в указанном порядке значения x, y, r, которые получатся после выполнения операции присваивания и тернарной операции

1) r= x1 || y1 || y

3) r= x1 || y1 y

9.Сравнить оператор switch с оператором case языка Pascal.

10.Что будет выведено, если введём

1) 1 2) 5 3) 8 4) 0 5) 22 ?

int m; cinm;

switch (m)

{case 1:case 2: case 3: cout

case 4: case 5: cout

case 6: case 7: case 8: cout

case 9: case 10: cout

default: cout

}

Оператор break может отсутствовать в одной или нескольких других ветвях.

11. В каких строках ( //1 — //6) есть ошибки компиляции?

#define ONE 1

int m; const n=4, float k=1; cinm;

switch (m+k) //1

{ case ONE: //2

case т: cout

case ONE+2: cout

case n: cout

case k+n: cout

}

12. В каких строках ( //1 — //7) есть ошибки компиляции?

char C, B=’B’; C=getch();

switch (C) //1

{ case ‘A’: cout

case “B”: switch (B) //3

{ case ‘A’: cout

case B : cout

case ‘C’ : cout

}

case С: cout

Задачи

1. Ввести число. Вывести 0 или 1 в зависимости от того, положительное число или неположительное. Выполнить это двумя способами:

#include

#include

int main() { float x; int resu

coutx;

cout

cout

if (x0) result=1; else result=0;

cout

2. Найти наибольшее из трех введенных чисел:

main() { int x, y, z, res1, res2, res3;

coutx;

couty;

coutz;

cout

// Полная форма оператора if:

if (xy) res1=x; else res1=y;

if (zres1) res1=z;

cout

// Сокращённая форма оператора if:

res2= x; if (y res2) res2= y;

if (z res2) res2= z;

cout

// Тернарная операция :

res3=xy?x:y; res3=zres3?z:res3;

cout

getch(); return 0; }

Указания.Одну и ту же задачу по возможности решить несколькими способами, используя, например, сокращенную и полную формы if, if и switch, if и тернарную операцию.

Уровень А

1. Вычислить r = max(min(x, y), z).

2. Вычислить r = max(x, 0) + min(y, z).

3. Вычислить r = min(x, y, 0) + max(y, z).

4. Найти произведение двух наименьших из трех чисел.

5. Найти действительные корни квадратного уравнения, если заданы его коэффициенты. Предусмотреть следующие варианты: два различных корня; один корень; нет действительных корней.

6. Ввести часы, минуты и секунды. Определить корректность момента времени.

7. Даны длины трех отрезков A, B, C. Определить возможность построения треугольника и его вид (разносторонний, равнобедренный, равносторонний).

8. Расположить два числа a, b в порядке убывания их значений.

9. Вычислить значение функции в соответствии с заданным графиком для произвольного одного фиксированного значения аргумента.

10. Даны a, b, c, K, P. Вычислить значение функции

ประเภท

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector