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

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

    Другой способ организации цикла, когда блоки в 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-инструкции, либо поставить пустые фигурные скобки. Если ничего этого не сделать, то к конструкции цикла будет относиться следующая (после цикла) команда в программе - в данном случае это была бы команда Console.WriteLine(s).

    Противоположная к предыдущей ситуация реализована в программном коде ниже - там два блока (первый и третий) в 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 завершается выполнение цикла.


Условие k<=n, которое мы размещали во втором блоке в цикле for, было условием продолжения работы конструкции цикла. Условие k>n, которое мы использовали в условной конструкции, является условием завершения выполнения цикла. То есть условие k>n является "противоположным" к условию k<=n.

    Во всех рассмотренных примерах результат выполнения один и тот же (рисунок 2 предыдущего шага).

    На следующем шаге мы рассмотрим инструкцию безусловного перехода goto.




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