Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс_ред.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.76 Mб
Скачать

Применение логических операций

В предыдущей программе для определения принадлежности значения переменной inputNumber интервалу [0, 100] мы использовали следующую конструкцию с логическим оператором И:

if(inputNumber > 0 && inputNumber <= 100)

System.Console.Write("Это число больше 0, но меньше или равно 100");

Аналогичного результата можно было бы добиться при помощи вложенного оператора if:

if(inputNumber > 0)

{

if(inputNumber <= 100)

{

System.Console.Write("Это число больше 0");

System.Console.Write(", но меньше или равно 100");

}

}

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

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

if(((inputNumber > 10) && (inputNumber <= 100)) ||

! ((х > 20) && (х <= 200)))

Здесь тело оператора if будет выполнено в том случае, если число inputNumber принадлежит интервалу ]10, 100] или число х не принадлежит интервалу ]20, 200].

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

Конструкция выбора

Мы уже рассмотрели пример программы, которая выполняла те или иные действия в зависимости от значения числа, введенного с клавиатуры.

Задача выбора одного действия из нескольких по результатам вычисления какого-либо выражения возникает очень часто, и в языке С# предусмотрен специальный оператор выбора switch, предназначенный для ее решения. Этот оператор используется для исполнения того или иного фрагмента программы в зависимости от значения переменной или выражения.

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

Аналогично данная конструкция выглядит на псевдокоде:

Выбор <Выражение>

Случай <K1>

<Оператор 1>

Случай <K2>

<Оператор 2>

. . .

Случай <KN>

<Оператор N>

Иначе

<Оператор N+1>

Все-Выбор

На C# оператор switch в общем виде записывается так (квадратными скобками отмечены необязательные конструкции оператора):

switch(<Переключающее выражение>)

{

case <Выражение-константа 1>:

<Оператор 1>

[<Оператор перехода>]

[case <Выражение-константа 2>:

<Оператор 2>

[<Оператор перехода>]]

. . .

[default:]

[<Оператор N+1>]

}

Оператор switch выполняется следующим образом.

Вначале вычисляется значение выражения <Переключающее выражение>, следующего за ключевым словом switch. Это выражение должно быть целочисленным (со знаком или без знака), символьным char либо строковым string. Оно также может быть перечислением enum, созданным на базе значений указанных типов (тип string и перечисление enum в данном курсе рассматриваются позже).

Результат вычислений сравнивается с выражениями-константами блоков case (называемых также метками case). В случае совпадения значения управление передается оператору соответствующего блока case. Если совпадений не обнаружено, управление передается оператору <Оператор N+1> блока default.

Операторы, расположенные в блоках case и default , можно заключать в фигурные скобки, хотя это и не обязательно.

По сравнению с вложенным оператором if оператор выбора позволяет создавать более эффективные программы, так как компилятор соответствующим образом оптимизирует создаваемый код. В частности, для ускорения работы оператора создается специальная таблица переходов, каждый из которых соответствует своему блоку case. Вычислив условие, программа сразу получает из таблицы информацию, необходимую для исполнения соответствующего блока case или блока default. Что же касается вложенного оператора if, то он последовательно сравнивает полученный результат со всеми константными выражениями, а на это требуется больше времени.