Theory and Tasks for Students - Spring 2019
Операторы цикла while и for, генератор случайных чисел Random

Допустим перед вами стоит простая задача - вывести все числа от 0 до 99. Можно было бы написать 100 строк с операцией вывода, но это не является оптимальным способом. Для многократного выполнения блока кода существуют циклы, например, условный цикл while: while (logical_expression) { /* блок кода */ } Пока выражение возращает true, выполняется блок кода внутри. Фигурные скобки ограничивают область существования переменных, объявленных внутри.

Таким образом, для решения задачи с выводом чисел будет достаточно написать 5 строк: int i = 0; while (i < 100) { Console.WriteLine(i); i++; } Операции ++ и --, называются инкрементом (increment, increase, увеличение) и декрементом (decrement, decrease, уменьшение). Запись i++ эквивалентна i++1, i += 1 и i = i + 1. Обратите внимание на оператор += - существуют аналогичные ему операторы -=, *=, /=.

Такая запись цикла while не выполнит ни одной итерации, если при первой проверки условия оно вернёт false. Это не всегда бывает удобно, поэтому существует следующая запись: do { /* блок кода */ } while (logical_expression);

Например, следующий код считает сумму сходящегося ряда 1, 1/2, 1/4, 1/8 .. 1/N2: double sum = 0, sumPrev; int i = 1; do { sumPrev = sum; sum += 1.0 / i / i; i++; } while (Math.Abs(sum - sumPrev) >= 1E-9); Console.WriteLine(sum); Это и есть основной сценарий, при котором применяется условный цикл - неизвестное количество итераций.

В том случае, если число итераций цикла известно, используется цикл for: for (тип переменная_цикла = начальное_значение; условие_выполнения; изменение_переменной_цикла) { /* блок кода */ } Например, вывод чисел от 0 до 99: for (int i = 0; i < 100; i++) { Console.WriteLine(i); } Обратите внимание, что переменная i существует только в пределах тела цикла. Так же, переменная i не может быть объявлена как переменная цикла, если такое имя переменной уже использовалось ранее. То же самое верно относительно любой переменной внутри вложенного блока кода (внутри пары фигурных скобок).

В прицнипе, циклы for и while взаимозаменяемы, т.к. каждый из трёх аргументов цикла for можно опустить, например, следующие блоки содержат эквивалентные циклы: int i; for (i = 0; i < 100;) { i++; } int i = 0; for (; i < 100; ) { i = i + 1; } int i = 0; while (i < 100) { i += 1; } Однако настоятельно рекомендуется ипользовать операторы цикла по их первичному назначению.

Часто возникает необходимость прервать выполнение всего цикла или отдельной итерации. Для этого существуют операторы break и continue. Следующий блок так же эквивалентен предыдущим: int i = 0; for (;;) { if (i >= 100) { break; } }

Оператор continue прерывает выполнение только текущей итерации цикла, начиная новую итерацию с начала. Таким образом, эквивалентными являются следующие блоки кода, выводящие чётные числа от 0 до N: for (int i = 0; i < n; i += 2) { Console.WriteLine(i); } for (int i = 0; i < n; i++) { if (i % 2 == 0) { Console.WriteLine(i); } } for (int i = 0; i < n; i++) { if (i % 2 != 0) { continue; } Console.WriteLine(i); } Это лишь демонстрация работы операторов. Очевидно, если существует возможность написать более простой код, следует так и сделать.

Оба оператора влияют лишь на непосредственно тот цикл, в котором они находятся. Например, следующий код выводит координаты все ячеек матрицы NxN ниже главной диагонали: for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j >= i) { break; } Console.WriteLine(i.ToString() + " " + j.ToString()); } }

Позже для разных задач потребуется генерировать случайные числа. Это делается с помощью класса Random. Следующий код создаёт объект генератора случайных чисел и записывает в три переменных случайные числа на промежутке [0; 100]: Random rand = new Random(); int a = rand.Next(101); int b = rand.Next(0, 101); int c = (int)Math.Floor(rand.NextDouble() * 101); Метод Next() можно вызвать тремя способами:

  • Next() возвращает случайное число от 0 до Int32.MaxValue, равное 231-1
  • Next(b) возвращает случайное число от 0 до b, не включая b
  • Next(a, b) возвращает случайное число от a до b, не включая b

Метод NextDouble() возвращает случайное вещественно число от 0.0 до 1.0, не включая 1.0. В других языках и на других платформах часто бывает доступна только эта функция.