Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций.pdf
Скачиваний:
41
Добавлен:
27.05.2015
Размер:
1.53 Mб
Скачать

буется определить, делится ли значение переменной 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;, то целесообразно применять условный оператор ? :, так как при этом упрощается запись кода и его результат можно применять в качестве операнда более сложных выражений.

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

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

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

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

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

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

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

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

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

21

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

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

{

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

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

[default:

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

}

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

Пример:

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 = ???;

22

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; // Процент скидки

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 (<инициализация>; <условие>; <итерация>) <оператор>;

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

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

23

если <условие> имеет значение false. Как правило, <условие> должно зависеть от “параметра цикла”.

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

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

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

int

n;

n =

???;

int

f = 1;

for

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

f

*= i;

<инициализация> и <итерация> могут выполнять более одного оператора. В этом случае операторы разделяются запятой. Предыдущий пример может быть записан следующим образом:

int n,i,f; n = ???;

for (i=2, f=1; i<=n; f *= i, i++);

Приведенный выше фрагмент показывает, что тело цикла может быть пустым.

Также пустыми могут быть <инициализация>, <условие>, <итерация>. Напри-

мер, предыдущий пример может быть записан так:

int n; n = ???;

int f = 1; int i = 2; for (; i<=n; )

f *= i++;

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

2.10 Оператор цикла while

Оператор цикла while фактически представляет собой оператор цикла for, у которого не заданы <инициализация> и <итерация>. Формальная структура данного оператора имеет вид:

while (<условие>) <оператор>;

24