Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Конспект лекций (C#).pdf
Скачиваний:
864
Добавлен:
27.05.2015
Размер:
2.03 Mб
Скачать

if (b+c == 0)

{

b = 1; c = 0;

}

res = a/(b+c);

2.6 Логические операторы «И» и «ИЛИ»

Полные и укороченные логические операторы «И» и «ИЛИ» дают один и тот же результат, однако укороченные операторы могут работать быстрее и позволяют реализовывать более простые конструкции.

Полные логические операторы выполняют логическое выражение полностью. Например, в выражении a < b & c > d сначала будет вычислен результат a < b, потом c > d и только потом рассчитан результат всего выражения с помощью оператора &. Однако, если выражение a < b даёт результат false, то фактически уже известен конечный результат всего выражения. Укороченные операторы учитывают это обстоятельство и в этом случае не рассчитывают выражение c > d.

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

if (n%m == 0){...}

Но в случае равенства m нулю при выполнении проверки возникнет ошибка. Её можно предотвратить используя два оператора if

if (m != 0)

if (n%m == 0){...}

или используя один оператора if с укороченным логическим «И»

if (m != 0 && n%m == 0){...}

Использование полного логического «И» недопустимо, т.к. в этом случае при m=0 выражение n%m == 0 все равно будет вычисляться и в нем произойдёт ошибка.

2.7 Условный оператор ? :

Если для расчёта значения некоторой переменной требуется применение условного оператора if в виде if (a) r = b; else r = c;, то целесообразно

21

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

Структура условного оператора имеет вид:

<логическое значение> ? <выражение если истина> : <выражение если ложь>;

В качестве <логическое значение> могут выступать логические переменные, логические константы или выражения, дающее логическое значение.

<выражение если истина> и <выражение если ложь> должны давать одинаковый тип результата.

Результат работы оператора должен быть присвоен некоторой переменной или являться частью более сложного выражения.

Пример 1: найти минимум из двух целочисленных переменных a, b и сохранить его в переменную min.

min = a < b ? a : b; // Это аналог if (a < b) min = a; else min = b;

Пример 2: найти максимум из двух целочисленных переменных a, b и сохранить его удвоенное значение в переменную max.

max = 2*(a > b ? a : b);

// Это аналог if (a > b) max = 2*a; else max = 2*b;

2.8 Оператор выбора switch и оператор прерывания break

Если требуется выполнить разветвление выполнения программы более чем на два направления, то возможно применение либо нескольких вложенных операторов if, либо оператора выбора switch.

Формальное описание оператора switch имеет вид:

switch (<значение switch>)

{

case <значение 1>: <операторы 1> break;

[case <значение 2>: <операторы 2> break; ...]

[default:

<операторы default> break;]

}

<значение switch> должно быть переменной или выражением целого, строкового, символьного, перечисляемого, логического типа. <значение N> должны быть значениями такого же типа. <значение N> должны быть уникальными.

22

Пример:

int n; string s; n = ???;

switch (n)

{

case 1:

s = "n=1"; break;

case 2:

s = "n=2"; break;

default:

s = "n<1 или n>2"; break;

}

При выполнении оператора ищется <значение N>, равное <значение switch>. Если такое значение найдено, то выполняется соответствующий блок case. Если значение не найдено, то:

при наличии блока default выполняется этот блок;

при отсутствии блока default никаких действий не производится.

Каждый блок case и блок default должны заканчиваться оператором break, которые прерывает дальнейшее выполнение оператора switch. Исключением является ситуация, когда блок case не имеет операторов. Такое решение применяется, когда требуется, чтобы для нескольких значений выполнялись одни и те же действия, например:

int n; string s; n = ???;

switch (n)

{

case 1: case 2:

s = "n=1 или n=2"; break;

default:

s = "n<1 или n>2"; break;

}

Вместо оператора break может располагаться оператор goto case <N>, позволяющий перейти к блоку со значением <N>.

Пример: рассчитать процент скидки, если при покупке одного товара скидки нет, при покупке двух товаров – скидка 2%, трёх – 5%, четырёх и более – 10%.

int n; // Количество товаров int c; // Процент скидки

23

n = ???;

switch (n)

{

case 1: c = 0; break;

case 2: c = 2; break;

case 3: c = 5; break;

default: c = 10; break;

}

2.9 Оператор цикла for

Предназначен для реализации итерационных алгоритмов. Формальная структура оператора имеет вид:

for ([<инициализация>]; [<условие>]; [<итерация>]) [<оператор>];

<инициализация> представляет собой операторы, подготавливающие цикл к работе. Они выполняются один раз до начала работы цикла. Как правило в этих операторах задаются начальные значения «параметров цикла».

<условие> определяет условие выхода из цикла и его результатом должно быть логическое значение. <условие> проверяется перед каждой итерацией цикла, поэтому тело цикла может не выполниться ни разу. Выход из цикла производится, если <условие> имеет значение false. Как правило, <условие> должно зависеть от «параметра цикла».

<итерация> определяет действия, выполняемые после каждой итерации цикла. Как правило, в них производится изменение «параметров цикла», причём изменение может осуществляться произвольным образом как в сторону увеличения, так и в сторону уменьшения.

<оператор> представляет собой одиночный оператор, выполняемый на каждой итерации цикла. Если в цикле необходимо выполнять несколько операторов, то используются операторные скобки.

Пример: рассчитать факториал числа n.

int

n;

n =

???;

int

f = 1;

for

(int i=2; i<=n; i++)

f

*= i;

24