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

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

    Конструкция цикла позволяет многократно выполнять определенный набор команд. В языке C# существует несколько циклических конструкций, и со всеми ними мы познакомимся. Но начнем с цикла while. У него достаточно простой синтаксис. Описание начинается с ключевого слова while. В круглых скобках после ключевого слова while указывается некоторое условие (выражение со значением логического типа). Затем в фигурных скобках указывается блок из команд, формирующих тело цикла. Общий синтаксис цикла while, таким образом, следующий:

  while (условие) {
  // Команды
  }

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


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

    Стоит заметить, что команды в теле цикла выполняются блоком, то есть условие в очередной раз проверяется только после того, как выполнены все команды в теле цикла. Условие, указанное в круглых скобках после ключевого слова while, должно быть таким, чтобы при выполнении команд в теле цикла оно в принципе могло измениться. Проще говоря, чтобы в конструкции цикла начали выполняться команды, условие в самом начале должно быть равно true. А чтобы конструкция цикла в какой-то момент завершила выполнение, условие должно стать равным false. Иначе получим бесконечный цикл.


Инструкция break, с которой мы встретились при знакомстве с оператором выбора switch, позволяет завершать выполнение цикла. Если в теле цикла выполняется инструкция break, то конструкция цикла прекращает свое выполнение вне зависимости от того, какое условие. Инструкция continue может использоваться в теле оператора цикла для досрочного завершения текущего цикла (итерации).

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


    Далее мы рассмотрим небольшой пример, в котором используется оператор конструкция while. Программа очень простая - в ней вычисляется сумма первых n нечетных чисел 1 + 3 + 5 + ... + (2n - 1) (значение параметра n в программе определяется с помощью переменной).


Для проверки результатов вычислений можно воспользоваться соотношением 1 + 3 + 5 + ... + (2n - 1) = n2. Поэтому, например, если вычисляется сумма первых 10 нечетных чисел, то такая сумма равна 100, то есть 1 + 3 + 5 + ... + 19 = 100. Но в программе эти формулы не используются - вычисление суммы выполняется непосредственным суммированием слагаемых.

    Интересующий нас программный код представлен ниже.

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

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

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


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

    В программе мы объявляем три целочисленные переменные. Переменная n со значением 10 определяет количество слагаемых в сумме. Переменная k с начальным значением 1 нам нужна для подсчета количества слагаемых, добавленных к значению суммы. Эту переменную будем называть индексной. Переменная s с начальным значением 0 нам понадобится для записи в эту переменную значения суммы. Перед началом вычислений командой

  Console.Write ("Сумма 1 + 3 + 5 +...+ {0} = ", 2*n-1);
в консольном окне выводится текстовое сообщение, формально обозначающее вычисляемую сумму. Текстовое значение заканчивается знаком равенства, и переход к новой строке не выполняется (поскольку использован метод Write()).


Команда
  Console.Write ("Сумма 1 + 3 + 5 +...+ {0} = ", 2*n-1);
выполняется так. Отображается текстовое значение "Сумма 1 + 3 + 5 +...+ (0} = ", но только вместо инструкции {0} подставляется значение выражения 2*n-1, которое указано аргументом метода Write() после текстовой строки.

    Здесь мы учли, что если вычисляется сумма n нечетных чисел, то последнее слагаемое в такой сумме равно 2n - 1.


    Для вычисления суммы использована конструкция цикла while. В циклической конструкции указано условие k<=n - то есть цикл будет выполняться до тех пор, пока значение переменной k не превышает значения переменной n. Поскольку начальное значение переменной k равно 1, а значение переменной n равно 10, то при первой проверке условия k<=n его значение равно true (условие истинно). Поэтому начинается выполнение команд в теле цикла. Там их всего две. Сначала командой s+=2*k-1 к текущему значению суммы прибавляется очередное слагаемое, после чего командой k++ значение индексной переменной увеличивается на единицу.


Мы приняли в расчет, что если k - это порядковый номер нечетного числа, то значение этого числа может быть вычислено по формуле 2k - 1. Поэтому на каждой итерации к переменной s, в которую записывается значение суммы нечетных чисел, прибавляется значение 2*k-1. Чтобы получить значение очередного нечетного числа, можно воспользоваться той же формулой, но только значение переменной k нужно увеличить на единицу.

    После выполнения команд в теле цикла снова проверяется условие k<=n. Для использованных начальных значений переменных при второй проверке условие опять окажется истинным. Будут выполнены команды в теле оператора, потом снова начнется проверка условия. И так далее. Последний раз условие k<=n окажется истинным, когда значение переменной k будет равно значению переменной n. На этой итерации к значению переменной s прибавляется значение 2*n-1, а значение переменной k станет больше на единицу значения переменной n. В результате мри проверке условия k<=n оно окажется ложным, и конструкция цикла завершит свою работу.

    По завершении цикла в переменную s записана искомая сумма нечетных чисел. Поэтому командой Console.WriteLine(s) вычисленное значение отображается в консольном окне.


Если в рассмотренном выше программном коде переменной n вместо значения 10 присвоить значение 0, то для суммы нечетных чисел программа выдаст значение 0. Объяснение простое: при первой же проверке условия k<=n в конструкции цикла, поскольку начальное значение переменной k равно 1, а значение переменной n равно 0, условие будет ложным. Поэтому команды в теле цикла выполняться не будут. Следовательно, переменная s останется со своим начальным значением 0. Оно и будет отображено в консольном окне как результат вычислений.

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




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