На этом шаге мы рассмотрим еще несколько примеров использования этой конструкции цикла.
Другой способ организации цикла, когда блоки в for-инструкции содержат по несколько команд, представлен в программе ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr42_1 { class Program { static void Main() { // Количество слагаемых в сумме, индексная // переменная и значение суммы: int n = 10, k, s; // Отображение сообщения: Console.Write ("Сумма 1 + 3 + 5 +...+ {0} = ", 2 * n - 1); // Циклическая конструкция: for(k=1, s=0; k <= n ; s += 2*k-1, k++); // Отображение вычисленного значения: Console.WriteLine(s); // Задержка: Console.ReadLine(); } } }
В данном случае переменные n, k и s объявляются в главном методе программы, но начальные значения переменным k и s присваиваются в конструкции цикла (в нервом блоке). Команда s+-=2*k-l из тела цикла перенесена в третий блок, и теперь там две команды (кроме упомянутой команды s+=2*k-l там еще есть инструкция k++). В результате тело цикла оказалось пустым, поэтому сразу после for-инструкции стоит точка с запятой.
Противоположная к предыдущей ситуация реализована в программном коде ниже - там два блока (первый и третий) в for-инструкции цикла пустые.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr42_2 { class Program { static void Main() { // Количество слагаемых в сумме, индексная // переменная и значение суммы: int n = 10, k = 1, s = 0; // Отображение сообщения: Console.Write ("Сумма 1 + 3 + 5 +...+ {0} = ", 2 * n - 1); // Циклическая конструкция: for (; k <= n; ) { s += 2 * k - 1; // Добавляем слагаемое в сумму k++; // Новее значение индексной переменной } // Отображение вычисленного значения: Console.WriteLine(s); // Задержка: Console.ReadLine(); } } }
Здесь переменные k и s получают начальные значения при объявлении, поэтому в первом блоке нет необходимости выполнять присваивание значений переменным. Что касается третьего блока, то команды из него вынесены в тело цикла: там теперь есть инструкции s+=2*k-l и k++. Поэтому третий блок тоже пустой.
Наконец, совсем "экзотический" случай представлен в программном коде ниже. В этой программе в цикле for все три блока (включая второй блок с условием) являются пустыми.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr42_3 { class Program { static void Main() { // Количество слагаемых в сумме, индексная // переменная и значение суммы: int n = 10, k = 1, s = 0; // Отображение сообщения: Console.Write ("Сумма 1 + 3 + 5 +...+ {0} = ", 2 * n - 1); for(;;) { // Все блоки пустые s += 2 * k - 1; // Добавляем слагаемое в сумму k++; // Новее значение индексной переменной // Условная конструкция: if ( k > n ) break; // Завершение цикла } // Отображение вычисленного значения: Console.WriteLine(s); // Задержка: Console.ReadLine(); } } }
Напомним, что если второй блок с условием пустой, то это эквивалентно истинному условию во втором блоке. Поскольку такое "пустое" условие изменить уже нельзя, то формально мы получаем бесконечный цикл. Но его можно остановить. Для этого использована инструкция break. Она задействована вместе с условной конструкцией. В теле цикла, после выполнения команд s+=2*k-l и k++, выполняется условная конструкция. Здесь проверяется условие k>n. Если условие истинно, то инструкцией break завершается выполнение цикла.
Во всех рассмотренных примерах результат выполнения один и тот же (рисунок 2 предыдущего шага).
На следующем шаге мы рассмотрим инструкцию безусловного перехода goto.