Вы находитесь на странице: 1из 8

Лекция 8. Управляющие инструкции в C#. Оператор If и циклы (2 часа).

Оператор if определяет, какой оператор будет выполняться при выполнения условия,


заданного выражением Boolean . В приведенном ниже примере
переменной Boolean типа result присваивается значение true , а затем она проверяется
оператором if . В результате получается The variable is set to true. .
C#Копировать

bool condition = true;

if (condition)
{
Console.WriteLine("The variable is set to true.");
}
else
{
Console.WriteLine("The variable is set to false.");
}

Примеры в этом разделе можно выполнить, разместив их в методе Main консольного


приложения.
Оператор if в С# может иметь две формы, как показано в приведенном ниже примере.
C#Копировать

// if-else statement
if (condition)
{
then-statement;
}
else
{
else-statement;
}
// Next statement in the program.

// if statement without an else


if (condition)
{
then-statement;
}
// Next statement in the program.

В операторе if-else , если condition имеет значение true, выполняется then-


statement . Если condition имеет значение false, выполняется else-statement . Так
как condition не может одновременно иметь значения true и false, then-statement и else-
statement оператора if-else не могут выполняться оба. После выполнения then-
statement или else-statement управление передается следующему оператору после
оператора if .
В операторе if , не включающем оператор else , если condition имеет значение true,
выполняется then-statement .Если condition имеет значение false, то управление
передается следующему оператору после оператора if .
then-statement и else-statement могут состоять из одного или нескольких операторов,
заключенных в фигурные скобки ( {} ). Для одного оператора скобки необязательны, но
рекомендуются.
Оператор или операторы в then-statement и else-statement могут быть любого типа,
включая другой оператор if , вложенный в исходный оператор if . Во вложенных
операторах if каждое предложение else относится к последнему оператору if , у
которого нет соответствующего объекта else . В приведенном ниже
примере Result1 получается, если оба выражения m > 10 и n > 20 имеют значение
true. Если m > 10 имеет значение true, но n > 20 — значение false, то
получается Result2 .
C#Копировать

// Try with m = 12 and then with m = 8.


int m = 12;
int n = 18;

if (m > 10)
if (n > 20)
{
Console.WriteLine("Result1");
}
else
{
Console.WriteLine("Result2");
}

Если вместо этого нужно, чтобы Result2 получался, когда значение (m > 10) равно false,
можно указать такую связь с помощью фигурных скобок для задания начала и конца
вложенного оператора if , как показано в приведенном ниже примере.
C#Копировать

// Try with m = 12 and then with m = 8.


if (m > 10)
{
if (n > 20)
Console.WriteLine("Result1");
}
else
{
Console.WriteLine("Result2");
}

Result2 получается, если условие (m > 10) имеет значение false.


Пример
В приведенном ниже примере вы вводите символ с помощью клавиатуры, а программа
использует вложенный оператор if для определения того, является ли введенный символ
буквой. Если введенный символ является буквой, программа определяет его регистр. Для
каждого случая предусмотрено отдельное сообщение.
C#Копировать

Console.Write("Enter a character: ");


char c = (char)Console.Read();
if (Char.IsLetter(c))
{
if (Char.IsLower(c))
{
Console.WriteLine("The character is lowercase.");
}
else
{
Console.WriteLine("The character is uppercase.");
}
}
else
{
Console.WriteLine("The character isn't an alphabetic character.");
}

//Sample Output:

//Enter a character: 2
//The character isn't an alphabetic character.

//Enter a character: A
//The character is uppercase.

//Enter a character: h
//The character is lowercase.

Пример
Также можно поместить оператор if в блок else, как показано в части кода, приведенной
ниже. В примере операторы if помещаются в два блока else и один блок
then. Комментарии определяют какие условия выполняются в каждом из блоков.
C#Копировать

// Change the values of these variables to test the results.


bool Condition1 = true;
bool Condition2 = true;
bool Condition3 = true;
bool Condition4 = true;

if (Condition1)
{
// Condition1 is true.
}
else if (Condition2)
{
// Condition1 is false and Condition2 is true.
}
else if (Condition3)
{
if (Condition4)
{
// Condition1 and Condition2 are false. Condition3 and Condition4 are true.
}
else
{
// Condition1, Condition2, and Condition4 are false. Condition3 is true.
}
}
else
{
// Condition1, Condition2, and Condition3 are false.
}

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

Console.Write("Enter a character: ");


char ch = (char)Console.Read();

if (Char.IsUpper(ch))
{
Console.WriteLine("The character is an uppercase letter.");
}
else if (Char.IsLower(ch))
{
Console.WriteLine("The character is a lowercase letter.");
}
else if (Char.IsDigit(ch))
{
Console.WriteLine("The character is a number.");
}
else
{
Console.WriteLine("The character is not alphanumeric.");
}

//Sample Input and Output:


//Enter a character: E
//The character is an uppercase letter.

//Enter a character: e
//The character is a lowercase letter.
//Enter a character: 4
//The character is a number.

//Enter a character: =
//The character is not alphanumeric.

Точно так же как оператор в блоке else или блоке then может быть любым допустимым
оператором, в качестве условия можно использовать любое допустимое логическое
выражение. Можно использовать такие логические операторы, как &&, &, ||, | и ! , для
формирования составных условий. В коде ниже приведены примеры.
C#Копировать

// NOT
bool result = true;
if (!result)
{
Console.WriteLine("The condition is true (result is false).");
}
else
{
Console.WriteLine("The condition is false (result is true).");
}

// Short-circuit AND
int m = 9;
int n = 7;
int p = 5;
if (m >= n && m >= p)
{
Console.WriteLine("Nothing is larger than m.");
}

// AND and NOT


if (m >= n && !(p > m))
{
Console.WriteLine("Nothing is larger than m.");
}

// Short-circuit OR
if (m > n || m > p)
{
Console.WriteLine("m isn't the smallest.");
}

// NOT and OR
m = 4;
if (!(m >= n || m >= p))
{
Console.WriteLine("Now m is the smallest.");
}
// Output:
// The condition is false (result is true).
// Nothing is larger than m.
// Nothing is larger than m.
// m isn't the smallest.
// Now m is the smallest.

Циклы
Циклы являются управляющими конструкциями, позволяя в зависимости от
определенных условий выполнять некоторое действие множество раз. В C# имеются
следующие виды циклов:
 for
 foreach
 while
 do...while
Цикл for
Цикл for имеет следующее формальное определение:
1 for ([инициализация счетчика]; [условие]; [изменение счетчика])
2 {
3 // действия
4 }
Рассмотрим стандартный цикл for:
1 for (int i = 0; i < 9; i++)
2 {
3 Console.WriteLine($"Квадрат числа {i} равен {i*i}");
4 }
Первая часть объявления цикла - int i = 0 - создает и инициализирует счетчик i. Счетчик
необязательно должен представлять тип int. Это может быть и другой числовой тип,
например, float. И перед выполнением цикла его значение будет равно 0. В данном случае
это то же самое, что и объявление переменной.
Вторая часть - условие, при котором будет выполняться цикл. Пока условное выражение
возвращает true, будет выполняться цикл. В данном случае цикл будет выполняться, пока
счетчик i не достигнет 9.
И третья часть - приращение счетчика на единицу. Опять же нам необязательно
увеличивать на единицу. Можно уменьшать: i--.
В итоге блок цикла сработает 9 раз, пока значение i не станет равным 9. И каждый раз это
значение будет увеличиваться на 1.
Нам необязательно указывать все условия при объявлении цикла. Например, мы можем
написать так:
1 int i = 0;
2 for (; ;)
3 {
4 Console.WriteLine($"Квадрат числа {++i} равен {i * i}");
5 }
Формально определение цикла осталось тем же, только теперь блоки в определении у нас
пустые: for (; i <;). У нас нет инициализированной переменной-счетчика, нет условия,
поэтому цикл будет работать вечно - бесконечный цикл.
Мы также можем опустить ряд блоков:
1 int i = 0;
2 for (; i<9;)
3 {
4 Console.WriteLine($"Квадрат числа {++i} равен {i * i}");
5 }
Этот пример по сути эквивалентен первому примеру: у нас также есть счетчик, только
создан он вне цикла. У нас есть условие выполнения цикла. И есть приращение счетчика
уже в самом блоке for.
Цикл do
В цикле do сначала выполняется код цикла, а потом происходит проверка условия в
инструкции while. И пока это условие истинно, цикл повторяется. Например:
1 int i = 6;
2 do
3 {
4 Console.WriteLine(i);
5 i--;
6 }
7 while (i > 0);
Здесь код цикла сработает 6 раз, пока i не станет равным нулю. Но важно отметить, что
цикл do гарантирует хотя бы единократное выполнение действий, даже если условие в
инструкции while не будет истинно. То есть мы можем написать:
1 int i = -1;
2 do
3 {
4 Console.WriteLine(i);
5 i--;
6 }
7 while (i > 0);
Хотя у нас переменная i меньше 0, цикл все равно один раз выполнится.
Цикл while
В отличие от цикла do цикл while сразу проверяет истинность некоторого условия, и если
условие истинно, то код цикла выполняется:
1 int i = 6;
2 while (i > 0)
3 {
4 Console.WriteLine(i);
5 i--;
6 }
Операторы continue и break
Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его
завершения. В этом случае мы можем воспользоваться оператором break.
Например:
1 for (int i = 0; i < 9; i++)
2 {
3 if (i == 5)
4 break;
5 Console.WriteLine(i);
6 }
Хотя в условии цикла сказано, что цикл будет выполняться, пока счетчик i не достигнет
значения 9, в реальности цикл сработает 5 раз. Так как при достижении счетчиком i
значения 5, сработает оператор break, и цикл завершится.
0
1
2
3
4
Теперь поставим себе другую задачу. А что если мы хотим, чтобы при проверке цикл не
завершался, а просто пропускал текущую итерацию. Для этого мы можем воспользоваться
оператором continue:
1 for (int i = 0; i < 9; i++)
2 {
3 if (i == 5)
4 continue;
5 Console.WriteLine(i);
6 }
В этом случае цикл, когда дойдет до числа 5, которое не удовлетворяет условию проверки,
просто пропустит это число и перейдет к следующей итерации:
0
1
2
3
4
6
7
8