Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Дополнительные операторы управления




ОПЕРАТОРЫ УПРАВЛЕНИЯ. Следование. Ветвление.

В языке С# реализован полный набор управляющих конструкций структурного программирования: следование, ветвление, цикл. Кроме того, имеются дополнительные операторы управления. Алгоритмические языки отличаются от неалгоритмических наличием так называемых управляющих конструкций. Итак, текущий урок посвящен рассмотрению управляющих конструкций следование и ветвление. И, если следование – это достаточно просто для понимания, то ветвление представляет собой некоторую сложность. Особенно, когда ветвление сложное. Мы сначала рассмотрим типовые простейшие варианты. Далее перейдем к более сложным. Примеры программ вы сможете скопировать в область редактора вновь созданного проекта и отладить. Использование программ позволит наглядно проследить ход выполнения.

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

Следование

Операторы по умолчанию выполняются последовательно в порядке записи. Операторы, заключенные в фигурные скобки {} образуют блок операторов. Блок операторов рассматривается транслятором как один составной оператор.

{оператор … оператор} блок операторов

 

В качестве оператора могут быть:

· объявление

· выражение, заканчивающееся символом точи с запятой

· управление

· блок операторов

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

 

 
 


Ветвление

If (логическое выражение P)

Оператор1

Else

Оператор2

 

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

Допускается сокращенное ветвление.

if (P) оператор;

Оператор 1 и оператор 2 блок-схемы алгоритма ветвления, соответствующие ветвям «да» и «нет»,могут представляют собой:

1) Одиночный оператор C# (а= в + с;)

2) Составной оператор, представляющий собой группу операторов, заключенных в фигурные скобки {f=d+c; r+=3;}

Таким образом, если при условном переходе на одну из ветвей необходимо выполнить не одно действие, а несколько, то используется составной оператор, который интерпретируются транслятором как один оператор. Рассмотрим простейший пример сокращенного ветвления:

if (a= =c) Console.WriteLine(b);

В данном случае, если переменная а действительно эквивалентна переменной с, то значение переменной b выводится на экран.

Пример с использованием составного оператора:

if (a!= s)

{Console.WriteLine(b); a+=4;}

Если переменная a не эквивалентна переменной s, то выводим на экран значение переменной b и увеличиваем значение переменной а на 4.

В большинстве случаев начинающие программисты ошибаются при формировании логического выражения (условия P). Логическое выражение – предположение (условие), имеет только два исхода:

1) условие выполнено (истина);

2) условие не выполнено (ложь).

Логическое выражение может принимать два значения: true или false. Этим значениям соответствует переменная, описываемая оператором bool. Опишем подробнее, что такое логическое выражение. Это может быть простое условие или сложное условие.

Пример:

Вычислить значение переменной, заданной соотношением

x2, если х<0

y=

х+10, если х≥0

Фрагмент программы с использованием ветвления:

double x, y;

x = double.Parse(Console.ReadLine());

if (x < 0)

y = x * x;

else

y = x + 10;

В следущем примере использовано при реализации данной задачи двойное сокращенное условие. Результат в обоих случаях одинаковый. Но втором случае будеи произведено две проверки условия.

double x, y;

x = double.Parse(Console.ReadLine());

y = 0.0;

if (x < 0)

y = x * x;

if (x>=0)

y = x + 10;

Сложные условия формируются из простых при помощи знаков логических операций отрицания (!), И (&&) и ИЛИ (| |). Мы уже рассматривали логические операции. Для логических переменных результат вычисления («истина» или «ложь») вычисляется в соответствии с правилами алгебры логики. Кратко сформулируем основные правила вычислений логических выражений:

1. Логическое отрицание логических переменных приводит к инверсии значения битового разряда. Например,

bool a=true, b=false; int w=2;

if (!b) w++;

b («ложь») при инверсии принимает значение «истина». Следовательно, условное выражение в скобках имеет значение «истина», т.е. выполняется оператор w++;// 3

2. Результат логического умножения равен 1 («истина») в случае, если оба операнда истинны.

bool a=true, b=false; int w=2;

if (b && a) w++;

Значение логического выражения ложно, оператор ветви «да» не выполняется. Так как ветвь «нет» отсутствует, то управление передается на оператор, следующий за оператором ветвления.

3. Результат логического сложения равен 1 («истина») в случае, если хотя бы один из операндов истинный.

bool a=true, b=false; int w=2;

if (b || a) w++;

Значение условного выражения истинно, выполняется оператор w++;

В части вычисления условного выражения оператора ветвления в С# при данных любого типа следует помнить: любое вычисленное значение условного выражения, отличное от 0, является истинным:

if (-5) // истина

if (1) // истина

if (5-5) // ложь

Итак, в каждом ветвлении заложена некая альтернатива, выбор которой зависит от истинности условного выражения. Самый постой и доступный пример (вспомним еще раз) - из известной детской сказки. «Стоит витязь пред камнем, на котором высечено: налево пойдешь – коня потеряешь, направо пойдешь – меч потеряешь». Это типичный пример классического ветвления, имеющего две ветви. Теперь попробуем описать вербально данный алгоритм: «если пойдешь налево, то потеряешь коня, если пойдешь направо, то потеряешь меч». Заметим, что в данной управляющей конструкции не предусмотрены другие варианты действий (идти вперед или назад).

Если добавить к нашему алгоритму еще одну альтернативу («если прямо пойдешь – голову потеряешь»), то получим вариант множественного ветвления.

 

Дополнительные операторы управления

- Принудительное завершение цикла break;

- Принудительное завершение текущего шага цикла и переход на следующий шаг цикла continue;

- Безусловный переход в заданную точку программы

goto_метка;

метка: оператор;

- Возврат из метода return;

Пример

Сгенерируем сочетание из двух десятичных цифр, первая – от 1 до 4, вторая – от 0 до 9. Первая цифра рассматривается как старшая цифра числа, вторая – как младшая. Вывести на экран числа кратные 5.

 

 
 


1 0 11 12 … 19 младшая цифра b

2 0 21 22 … 29

3 0 31 32 … 39

4 0 41 42 … 49

старшая цифра a

public static void Main()

{

int a, b, c;// старшая цифра, младшая цифра, число

for (a=1; a<=4; a++)

for (b=0; b<=9; b++)

{

c=a*10+b;

if (c%5!=0) continue; // если с не кратно 5, начинаем следующую итерацию

Console.Write (c.ToString()+” “);

//break;

//goto_EXIT;

//return;

}

EXIT: Console.WriteLine (“\nВсе!”);

}

Результат вывода в исходном варианте программы

10 15 20…25 30 35 40 45

ВСЕ!

Убираем комментарий около break;

Выполнение оператора break приведет к прекращению перебора младшей цифры при обнаружении первого же числа, кратного 5.

 

Результат вывода

10 20 30 40

ВСЕ!

Комментируем оператор break и снимаем комментарий с оператора goto_EXIT. При обнаружении первого же числа, кратного 5, произойдет выход на метку EXIT:

Результат вывода

ВСЕ!

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

 

Убираем комментарий c оператора return и восстанавливаем комментарий около оператора goto EXIT. При обнаружении первого же числа, кратного 5, будет выполнен оператор return. Поскольку в данном случае оператор возврата применен к методу Main(), это приведет к завершению программы.

Результат вывода

Примечание: в примере использован цикл, который мы изучим позже. Сейчас важно понять, что оператор continue приводит к прекращению выполнения блока операторов цикла и переходу на следующий шаг цикла «досрочно».

Множественное ветвление

Конструкция предназначена для выбора одной из нескольких ветвей. В С есть соответствующая управляющая конструкция. Используется, когда ветвей больше двух.

switch (выражение – переключатель)

целочисленное значение, строка, char

{

case_Маркер: операторы; break;

константа

case_Маркер: операторы; break;

<default: операторы; break;> //необязательная часть

}

Схема выполнения:

1.Вычисляется значение переключателя.

2.Значение переключателя последовательно сравнивается с маркером ветвей.

3.Выполняется та ветвь, маркер которой совпал со значением переключателя.

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

В качестве метки (маркера) каждой ветки могут быть использованы константы любого допустимого в языке С типа. Важно помнить: операторы ветки (после case_Маркер:) выполняются до оператора break, который в соответствии со своим именем (от английского «ломать») прерывает выполнение операторов переключателя. Если break убрать, то будут выполнены ВСЕ операторы веток, которые начинаются с ветки, совпадающей со значением переключателя до конца.

Рассмотрим ряд примеров применения переключателя.

Заметим, что множественное ветвление можно реализовать без переключателя при помощи множественных сокращенных ветвлений. Рассмотрим пример множественного ветвления. Программа решает такую задачу – получая символ, она определяет, является ли он элементом из набора {I, V, X}. Если ответ отрицательный, то выводится соответствующее сообщение, иначе на экран выводится сообщение о правильно введенном символе:

char symbol='s';

switch (symbol)

{ case 'I': Console.WriteLine(" I well ");

case 'V': Console.WriteLine(" V well ");

case 'X': Console.WriteLine(" I well ");

default:

Console.WriteLine(" No well {0:c}", symbol); break;

}

Значение символьной переменной symbol равно s. Это значение переключателя в нашей программе. Сравниваем ветки и их маркеры (метки) с значением переключателя. Нет ни одной ветки, где метка была бы равна s. Следовательно, срабатываем значение переключателя по умолчанию и на экране появится сообщение «No well s »:

При значении переключателя ‘V’ выводится на экран:

V well

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

Естественно, чаще в практике требуется выбор одной из множества альтернатив. В переключателе используется оператор break; прерывания выполнения составного оператора или тела цикла (от английского break «сломать»).

 

char symbol='s';

switch (symbol)

{ case 'I': Console.WriteLine(" I well "); break;

case 'V': Console.WriteLine(" V well "); break;

case 'X': Console.WriteLine(" I well "); break;

default:

Console.WriteLine(" No well {0:c}", symbol); break;

}

В данном примере при значении переключателя V (при char symbol=V ';) будет выведено

V well

Значением переключателя может быть целое число, например:

int chislo=2;

switch (chislo)

{ case 1: Console.WriteLine(" I well "); break;

case 2: Console.WriteLine(" V well "); break;

case 3: Console.WriteLine(" I well "); break;

}

Будет выведено

V well

Обратите внимание, целочисленные константы в метках ветвей не имеют кавычек и апострофов. Напоминаем написание констант разных типов! Целое 12, вещественное 12.2, символьное ‘r’ и строковое константное значение “Это строка».

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...