Управляющие структуры C#

Автор работы: Пользователь скрыл имя, 27 Декабря 2012 в 13:42, курсовая работа

Описание работы

Язык программирования С# был создан в конце 1990-х годов и стал частью общей. NET- стратегии Microsoft. Впервые он увидел свет в качестве α - версии в середине 2000 года. Главным архитектором С# был Андерс Хейлсберг — один из ведущих специалистов в области языков программирования, получивший признание во всем мире. Хейлсберг был главным архитектором языков Turbo Pascal, Borland Delphi, JAVA и J++, и его богатый опыт помог в создании очень мощного и удобного нового языка. В создании языка так же приняли участие Скотт Уилтамут и Питер Гоулд.

Файлы: 1 файл

Текст курсовой.docx

— 72.46 Кб (Скачать файл)

{

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

блок инструкций для выполнения 1

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

блок инструкций для выполнения k

[dafault:операторы n]

}

Из этого кода можно увидеть, что, подобно оператору условия if, выражение условия помещено в круглые скобки после оператора switch. Внутри оператора switch есть секция выбора - case и секция действия по умолчанию - default. Секция выбора (case) нужна для определения действия, которое будет выполняться при совпадении соответствующего константного выражения с выражением switch. В этой секции обязательно нужно указать одно или несколько действий. Секция default может в операторе switch не указываться. Она выполняется в том случае, если не совпала ни одна константная инструкция из секции выбора, но из - за этой нестрогости конструкции семантика оператора switch чуть - чуть запутана. Запутанность этого вида условия заключается в том, что вначале вычисляется значение switch-выражения. Затем оно поочерёдно, в порядке следования case, сравнивается на совпадение с константными выражениями в каждой секции. Как только достигнуто совпадение, выполняется соответствующая последовательность действий. Поскольку последний оператор этой последовательности является оператором перехода (чаще всего это оператор break), то обычно он завершает выполнение оператора switch. При его отсутствии управление "проваливается" в следующую case-ветвь. Если значение switch-выражения не совпадает ни с одним константным выражением, то выполняется последовательность действий оператора ветви default, если, конечно, она есть. А использование оператора goto в виде оператора перехода делает этот тип условия ещё сложнее для понимания кода, при написании программы. Каждая ветвь case требует обязательного указания значения для сравнения константного выражение (литеральная или символическая константа), а также параметра, по которому будет производится сравнение.

Так же стоит упомянуть, что  при использовании условия switch в операторе case, в отличие от условного оператора if нельзя использовать составное выражение, т. к. это условие создано для проверки одного значения из возможных и использование составных выражений с операциями “И”, “ИЛИ” приведёт к ошибке. Автор предлагает рассмотреть пример.

 

 

int z;z = (int)numericUpDown1.Value;

switch (z)

                {

                    case 11:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 12:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 13:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 14:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 15:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 16:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 17:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 18:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                    case 19:

                        label1.Text = Convert.ToString(z) + " " + "рублей"; break;

                }

Из этого кода видно, что  переменная z сравнивается с каждой константой case - ветви. Как только будет получено истинное значение, то выполнится последующий за case блок  инструкций. После их выполнения, с помощью оператора break, проверка условий закончится.

 

 

 

 

      1. Вложенные операторы выбора

 

Бывает, что для обработки сложных условий использование просто составного выражения не достаточно. В таких случаях используют вложение условных операторов в блоки инструкций других условных операторов. Оператор if может быть включен в конструкции if, else или else if другого оператора if. Чтобы сделать программу более читабельной, рекомендуется группировать операторы и конструкции во вложенных операторах if, используя фигурные скобки. Если первое условие не выполнится, то вложенные условия не будет даже проверять и в результате программа просто не доберётся до блока инструкций внутри вложенных условий.

if (выражение 1)

{

if (выражение 2)

{блок инструкций 2}

}

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

if (выражение_1)

{блок инструкций 1

if (выражение_2)

{блок инструкций 2}

}

Выше, автор  уже показывал вложение условного оператора if, рассмотрим этот пример ещё раз.

 

 

 

 

int z;z = (int)numericUpDown1.Value;

if ((z < 11) || (z > 19))

                {

                   int ost;

                   ost = z % 10;

                    if (ost == 1)

                    {

                        label1.Text = Convert.ToString(z) + " " + " рубль";

                    }

                    else if ((ost >= 2) && (ost <= 4))

                    {

                        label1.Text = Convert.ToString(z) + " " + " рубля";

                    }

                    else if ((ost == 0) || ((ost >= 5) && (ost <= 9)))

                    {

                        label1.Text = Convert.ToString(z) + " " + " рублей";

                    }

                }

На этом примере можно увидеть, что, если самое первое выражение не будет истинным, то проверка вложенных условий исключена, в результате не будет выполнен ни один блок инструкций. А в том случае, если первое условие будет истинным (значение переменной z будет находиться в интервале от 11 до 19), то перед тем, как проверить вложенные условия, программа объявит переменную ost, вычислит её и, по её значению будут проверяться вложенные условия. В результате, кокой либо блок инструкций будет выполнен только тогда, когда программа получит истинное значение первого условного выражения.

В C# можно влаживать друг в друга не только условные операторы if, а так же язык позволяет влаживать switch в switch и более того, возможно вложение этих двух разных операторов друг в друга. Ниже приведён пример с вложением оператора if в оператор switch.

int chis=(int)numericUpDown2.Value;

Random rnd = new Random();

int rand = rnd.Next(1, 2);

switch (chis)

            {

                case 1:

                    int mn=rand*chis;

                    if (mn <= 10) { listBox7.Items.Add(mn); }

                    else { listBox8.Items.Add(mn); }

                    break;

                case 2:

                    int mn1=rand*chis;

                    if (mn1 <= 10) { listBox7.Items.Add(mn1); }

                    else { listBox8.Items.Add(mn1); }

                    break;

            }

На этом примере  показано, что оператор switch сравнивает значение переменной chis со значениями case. Если значение переменной равно 1, то вычисляется значение произведения случайного числа (rand) и переменной chis. После этого первое и второе вложенные условия распределяют полученные результаты переменной mn по компонентам listBox7 и listBox8. Если переменная mn меньше или равна 10, производится запись в компонент listBox7, в противном случае - в listBox8.

 

 

 

 

 

      1. Оператор goto

 

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

Все операторы языка C# могут иметь метку – уникальный идентификатор, предшествующий оператору и отделённый от него символом двоеточия. Передача управления помеченному оператору – это классическое использование оператора goto. Так же его применяют в операторе swich. Об этом автор рассказывал выше.

Он используется следующим  образом:

1. Создается метка в  коде программы (имя_метки).

2. Организуется переход  на эту метку goto (имя_метки).

Имя метки  обязательно  должно заканчиваться двоеточием. Оно  указывает на точку в программе, с которой будет выполняться программа после использования инструкции goto. Оператор goto передает управление на оператор, помеченный меткой имя_метки. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной, т.е. одно имя_метки не может быть использовано для разных операторов программы. Имя_метки - это идентификатор.

goto имя_метки;

...

имя-метки: оператор;

Использование этого оператора  не рекомендуется, т. к. он затрудняет работу программ и возможность её написания.

      1. Операторы break и continue

 

Бывают ситуации, когда  необходимо прекратить выполнение цикла досрочно (до того как перестанет выполняться условие цикла) или при каком то условии не выполнять описанные в теле цикла инструкции, не прерывая при этом цикла. Для таких случаев очень удобно использовать инструкции break и continue.

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

int[] r = new int[10];

for (int q1 = 0; q1<= 9; q1++)

                {

                    if (q1 == 5) { break; } listBox3.Items.Add(r[q1]);

                }

В примере автора блок инструкций цикла выполняется только пять раз, хотя должен выполняться 10 раз. Если переменная q1 равна 5, то передаётся управление оператору break и он обрывает цикл.

Оператор  continue используется только в теле циклов и выполнение программы с его использованием, продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного цикла. Этим он отличается от оператора break.

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

int[] r = new int[10];

for (int q2 = 0; q2 <= 9; q2++)

                {

                    if ((r[q2] >= 10) && (r[q2]<=20))

                    { continue; }

                    listBox4.Items.Add(r[q2]);

                }      

При использовании  оператора continue в вышеприведённом примере можно заметить, что этот цикл выводит столько элементов массива, сколько не было прервано условием с помощью этого оператора, т.е. цикл for в сочетании с оператором continue работает в блоке инструкций с меньшим количеством элементов, чем задано в условном выражении цикла. То же самое происходит с циклом foreach.

Этим отличается работа оператора cintinue в блоке инструкций циклов for и foreach от работы этого же оператора в инструкциях циклов while и do … while. В циклах while и do … while блок инструкций выполняется столько раз, сколько сказано в условном выражении цикла, не смотря на то, что в блоке инструкций выполняет работу оператор continue, хотя это зависит от расположения увеличения шага переменной внутри блока инструкций выше упомянутых циклов. Ниже автор приводит пример использование оператора continue в цикле while.

Random rnd = new Random();int ogr1 = 0; int ogr2 = 0;int[] mass=new int[10];

while (ogr1 <= 9)

                {

                    mass[ogr1] = rnd.Next(0, 31);

                    if ((mass[ogr1] >= 10) && (mass[ogr1] <= 20)) { continue; }

                    listBox5.Items.Add(mass[ogr1]);

                    ogr1++;

                }

В данном примере  происходит запись и чтение массива  mass по переменной ogr1. Если значение массива будет равно числам от 10 до 20, то цикл будет начинаться сначала, в результате переменная ogr1 внутри цикла не будет увеличиваться. И это позволит выполнить блок инструкций столько раз, сколько сказано в условном выражении цикла, в данном случае 10.

Информация о работе Управляющие структуры C#