Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# / C#Лаб1 / ЛабРабота2.doc
Скачиваний:
35
Добавлен:
31.05.2015
Размер:
1.66 Mб
Скачать

Операторы c#

Управляющие конструкции унаследованы от С и позволяют создавать алгоритмы. Стандартными управляющими конструкциями являются

  • if

  • switch

  • goto

  • for

  • while

  • do

  • foreach

Блок if..else позволяет исполнять код при выполнении определенного условия. Синтаксис конструкции таков

if (<условие>)

<код, выполняется, если условие истинно>;

else

<код выполняется, если условие ложно>;

Или же

if (<условие>)

{

<выполняется многострочный код, если условие истинно>;

}

else

{

<выполняется многострочный код, если условие ложно>;

}

if (a > b)

{

Console.WriteLine("a > b");

}

else

{

Console.WriteLine("a <= b");

}

Если a=3, b=5, то будет выведено значение a <= b.

Ветку else можно опускать.

Допускаются вложенные конструкции if…else

if (var==1)

{ // выполнение каких-то действий }

else

{

if (var==2)

{ // выполнение каких-то действий }

else

{ if (var==3 || var==4)

{ // выполнение каких-то действий }

else

{ // выполнение каких-то действий }

}

}

Логическое выражение в скобках должно иметь тип bool (в отличие от C/C++, где выражение было целым). Если оно истинно, выполнится первый блок команд, если ложно - второй.

Возможна и такая конструкция:

If(выражение1) if(выражение2) if(выражение3) ...

Пример

// Идет проверка, чтобы избежать деления на 0

if (x != 0)

{ d /= x; }

else

return;

// Проверяем, вернула ли процедура значение и, если нет, возвращаем // null

if (command.Parameters["RETURN_VALUE"].Value != Convert.DBNull)

return command.Parameters["RETURN_VALUE"].Value;

else

return null;

Оператор switch расширяет оператор ветвления, рассматривается как оператор многоальтернативного выбора. Синтаксис:

switch (<селектор>)

{

case <значение1>:

//выполняется, если <селектор> ==<значение1>

break;

case <значение2>:

// выполняется, если <селектор> ==<значение2>

break;

default:

// выполняется, если <селектор> != <ниОдномуИзЗначений>

break;

}

Например:

int a = 1;

switch (a)

{

case 0:

Console.WriteLine("A = 0");

break;

case 1:

Console.WriteLine("A = 1");

break;

default:

Console.WriteLine("A <> 0 и A <> 1");

break; }

Удобно switch использовать для обработки выражений перечислимых типов.

В отличие от С++ нельзя переходить от одного case к другому. Для переходов между блоками можно использовать команды goto case и goto default.

Каждый case должен заканчиваться своим break;

Для каждого case можно писать много операторов, причем заключать их в { } не надо.

Метка default может и отсутствовать.

Ограничений на количество case нет.

Можно записывать и так:

switch (<селектор>)

{

case <значение1>:

case <значение2>:

case <значение3>:

//Операторы

break;

default:

//Операторы

break;

}

Пример: анализируем введенное с клавиатуры имя.

const string mySt1="света"; // внимание: присутствetn const

const string mySt2="соня"; //без него компилятор выдаст ошибку,

const string mySt3="инна"; //т.к. после case обязана быть константа,

// а не переменная

Console.Write("Введите Ваше имя ");

string name=Console.ReadLine();

switch (name.ToLower())

{

case mySt1:

Console.WriteLine("Привет, Света");

Console.WriteLine("Можно звать Светиком?");

break;

case mySt2:

Console.WriteLine("Я тоже Соня");

break;

case mySt3:

Console.WriteLine("Какое редкое имя");

break;

default:

Console.WriteLine("Рады познакомиться, {0}", name);

break;

}

Пример: угадываем веденное с клавиатуры целое число.

const int c1=1;

Console.Write("Введите целое число...");

int myInt=Convert.ToInt32(Console.ReadLine());

string resultString=(myInt>100) ? "больше 100" :

"меньше или равно 100";

Console.WriteLine("Число {0}",resultString);

switch (myInt)

{

case с1:

Console.WriteLine("Это 1");

break;

case 2*10: // здесь можно писать константное выражение

Console.WriteLine("Это 20");

break;

case 4:

Console.WriteLine("Это 4");

break;

default:

Console.WriteLine("Точнее не могу угадать");

break;

}

Безусловный переход goto применяется в двух ситуациях: когда нужно перейти на обработку определенного случая в блоке switch или выполнить переход в определенное место программы.

Во втором случае нужно записать метку после goto

goto <метка>;

Метка указывается просто - в программе пишется имя метки с двоеточием на конце:

Exit: return 0;

Чтобы перейти на эту метку, пишется:

goto Exit;

Если нужно перейти к определенной ветви в блоке switch, то после goto записывается case <значение>;

Например:

int level = GetLevel();

switch (level)

{

case 0:

Console.WriteLine("Level is less than 1");

break;

case 1:

goto case 2;

case 2:

Console.WriteLine("level is greater than or equal to 1");

goto default;

default:

Console.WriteLine("bye");

break;

}

Цикл for представляет цикл с инициализирующей командой, условием окончания и командой перехода – операцией над переменной цикла.

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

{

//тело цикла

}

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

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

После выхода из цикла значение переменной цикла не теряется, если только эта переменная не объявлена внутри цикла.

Простейший цикл:

// Складываем все элементы массива

for (int i = 0; i < 10; i++)

sum += array[i];

Здесь по выходу из цикла значение i теряется.

Цикл for используется, если вам нужно проитерироваться с целым параметром, указывающим номер итерации или если просто нужно выполнить действие некоторое количество (в нашем примере 10) раз.

Пример:

ArrayList items = new ArrayList();

// Инициализируем список некоторым образом

CreateArray(items);

// Выводим все его элементы по очереди

for (int i = 0; i < items.Count; i++)

{

Console.WriteLine("i[{0}] = {1}", i, items[i]);

}

Синтаксически допустима следующая конструкция:

for (int j=1; j<5; j++)

{;;;};

Она может рассматриваться как задержка по времени, работа на холостом ходе.

Часто полезно иметь несколько счетчиков:

int s=0;

int j,i;

Console.WriteLine("Циклы");

for(i=0, j=0; i<=10; i++, j++) s+=i;

Console.WriteLine("s= {0} i={1} j={2}",s,i,j);

Или можно записать так:

int s=0;

int j=0,i=0;

for(; i<=10; i++, j++)

s+=i;

Console.WriteLine("s= {0} i={1} j={2}",s,i,j);

Цикл while является циклом с предусловием: сначала проверяется определенное условие перехода, а затем выполняется итерация цикла. Синтаксис цикла while следующий:

while <условие>

{

// тело цикла

}

Пример:

// Задаем число

int num = 678;

// Число разрядов - 0

int len = 0;

// считаем, сколько разрядов в числе

while (num > 0)

{

len++;

num /= 10;

}

Console.WriteLine(len);

Цикл do реализует цикл с постусловием. Суть этого цикла аналогична while, но условие выхода проверяется не до итерации, а после.

string s = "A, B, C, D";

do

{

s = s.Substring(s.IndexOf(",") + 1);

}

while (s.Length > 0);

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

Цикл foreach удобен при работе с массивами, коллекциями и другими подобными контейнерами данных:

foreach (<тип идентификатор> in <контейнер>) <оператор>;

Он позволяет перебрать все элементы некоторой коллекции, даже написанной вами, для этого класс коллекции должен лишь реализовать интерфейс IEnumerable.

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

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

// Получаем некоторый DataSet

DataSet data = GetData();

foreach (Row row in data.Tables[0].Rows)

{

Console.WriteLine("ID = {0}", row["ID"]);

}

Оператор перебирает все элементы коллекции и выполняет для каждого тело перечислителя.

Прекращает выполнение тела цикла один из операторов:

break – приводит к немедленному завершению цикла;

continue – переходит к следующей итерации цикла;

goto – позволяет выйти из цикла в помеченную точку кода;

return – выходит из цикла и из функции, где находится цикл.

Возможно преднамеренно или в результате ошибки создать бесконечные циклы:

while (true)

{

// тело цикла

}

int i=1;

while (i<=10)

{ if ((i%2) ==0)

continue;

Console.WriteLine(“{0}”, i++); }

Соседние файлы в папке C#Лаб1