Шаг 41.
Язык программирования C#. Начала
Управляющие инструкции. Цикл for

    На этом шаге мы рассмотрим синтексис и примеры использования этой конструкции.

    Синтаксис цикла for немного сложнее по сравнению с тем, как описываются циклы while и do-while. Описание конструкции цикла начинается с ключевого слова for. В круглых скобках после ключевого слова размещается три блока инструкций. Блоки инструкций разделяются точкой с запятой, а инструкции внутри блока - занятыми. Затем указывается блок команд в фигурных скобках. Они формируют тело цикла.


Если тело оператора цикла содержит всего одну команду, то фигурные скобки можно не использовать.

    Шаблон описания цикла for представлен ниже:

  for (первый блок; второй блок; третий блок) {
    // Команды
  }

    Выполняется цикл for следующим образом. Сначала выполняются команды в первом блоке (в круглых скобках после ключевого слова for). Эти команды выполняются один н только один раз в самом начале работы конструкции цикла. Поэтому в первый блок обычно помещают команды, имеющие отношение к инициализации переменных, а сам блок нередко называют блоком инициализации. Во втором блоке размещается условие, поэтому второй блок обычно называют блоком условия. Это условие проверяется сразу после выполнения команд в первом блоке. Если условие ложно, то на этом выполнение оператора цикла заканчивается. Если условие истинно, то выполняются команды в теле цикла. После этого выполняются команды в третьем блоке. Затем проверяется условие во втором блоке. Если условие ложно, работа цикла прекращается. Если условие истинно, то выполняются команды в теле цикла, затем в третьем блоке и снова проверяется условие. И так далее. Схема выполнения конструкции цикла for проиллюстрирована на рисунке 1.


Рис.1. Выполнение циклической конструкции for


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

    Имеет смысл обратить внимание на несколько обстоятельств.

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

    Во-вторых, блоки могут содержать по несколько команд (в таких случаях команды разделяются занятыми), а могут быть пустыми. Пустым может быть и второй блок. В этом случае он эквивалентен блоку с истинным условием - то есть фактически мы имеем дело с бесконечным циклом. Выход из такого бесконечного цикла может быть связан с использованием условной конструкции и инструкции break (пример рассматривается чуть позже). Наконец, первый блок может содержать не просто команды присваивания значений переменным, а команды, объявляющие переменную или переменные. С одной стороны, удобно. С другой стороны, такие переменные доступны только в пределах оператора цикла. Далее мы рассмотрим небольшие примеры, иллюстрирующие работу цикла for.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr41_1
{
    class Program
    {
        static void Main()
        {
            // Количество слагаемых в сумме, индексная 
            // переменная и значение суммы: 
            int n = 10, k, s = 0;
            // Отображение сообщения:
            Console.Write ("Сумма 1 + 3 + 5 +...+ {0} = ", 2 * n - 1); 
            // Циклическая конструкция: 
            for( k = 1; k <= n; k++ )
            {
                s += 2 * k - 1; // Добавляем слагаемое в сумму
            }
            // Отображение вычисленного значения:
            Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы таков.


Рис.2. Результат работы приложения

    Несложно заметить, что результат такой же, как и в рассмотренных ранее случаях. Что нового в программном коде? Как и ранее, объявляются три целочисленные переменные (n со значением 10, k и s со значением 0). Но на этот раз переменной k значение при объявлении не присваивается. Переменная k получает единичное значение в начале выполнения цикла for, когда выполняется команда k=1 в первом блоке. Эта команда выполняется только одни раз в самом начале работы конструкции цикла. После ее выполнения проверяется условие k<=n во втором блоке. При тех значениях, которые присвоены переменным k и n, условие истинно. Поэтому выполняется команда s+=2*k-l в теле конструкции цикла и команда k++ - в третьем блоке. Затем снова проверяется условие. То есть, несмотря на изменившийся синтаксис программного кода, последовательность выполнения команд, по сути, осталась прежней. Отсюда и результат.

    Еще одна небольшая вариация программы с конструкцией цикла for представлена в примере ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr41_2
{
    class Program
    {
        static void Main()
        {
            // Количество слагаемых в сумме 
            // и значение суммы:
            int n = 10, s = 0;
            // Отображение сообщения:
            Console.Write ("Сумма 1 + 3 + 5 +...+ {0} = ", 2 * n - 1); 
            // Циклическая конструкция:
            for (int k = 1; k <= n; k++)
            { 
                s += 2 * k - 1;  // Добавляем слагаемое в сумму
            }
            // Отображение вычисленного значения:
            Console.WriteLine(s);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы такой же, как и в предыдущем случае. Особенность программного кода в том, что переменная k объявляется и инициализируется в первом блоке в конструкции цикла for. Как следствие, такая переменная доступна только в цикле for, но не за его пределами. Проще говоря, если бы мы захотели проверить значение переменной k после завершения выполнения конструкции цикла, то на этапе компиляции возникла бы ошибка.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг