itmo.ru aco.ifmo.ru c-visionlab.ru
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


1.8. Пошаговый цикл for

1.8.1 Пример работы оператора for - вычисление суммы чисел (пример 9)

Рассмотрим пример вычисления суммы чисел от 1 до 10.

/////////////////////////////////////////////////////////////////////////////
// Программирование на языке высокого уровня. Основы языка С++
// Пример 9. Пример работы оператора for - вычисление суммы чисел
// 
// http://aco.ifmo.ru/el_books/programming
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
 
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    // описание переменных
    int sum = 0; 

    // оператор пошагового цикла
    for(int i=1; i<=10; ++i)
    {
        sum+=i; 
    }
    cout<<"sum="<<sum<<endl;
}
/////////////////////////////////////////////////////////////////////////////

Пошаговый цикл for позволяет выполнять блок операторов, заключенный в фигурные скобки задуманное количество раз.

В данном примере, когда оператор for начинает выполняться, объявляется и инициализируется счетчик цикла i ( i=0). Затем проверяется условие продолжения цикла i < 10. Поскольку начальное значение i равно 0, условие удовлетворяется, и выполняется блок операторов внутри цикла (тело цикла). Затем выражение ++ i выполняет приращение счетчику i ( i=1), и цикл снова начинается с проверки условия продолжения. Этот процесс продолжается, пока тело цикла не будет исполнено 10 раз и управляющая переменная i не увеличится до 10, это приведет к тому, что проверка условия продолжения даст отрицательный результат, и повторение будет прервано. Выполнение программы продолжится с первого оператора, расположенного после оператора for.

1.8.2 Пошаговый цикл for

Общая форма оператора for, и соответствующая ему блок-схема показаны в таблице.

Пошаговый цикл

for(инициализацияусловиеприращение)
{
   блок операторов;
}
            

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

Если условие продолжения цикла с самого начала ложно, то операторы тела for не исполняются и управление сразу передается оператору, следующему за for.

В большинстве случаев оператор for можно представить эквивалентным оператором while:

инициализация;

while ( условие ) 
{ 
    блок операторов ; 
    приращение ; 
} 

Если выражение инициализации в заголовке оператора for объявляет счетчик цикла (т.е. перед именем переменной указан ее тип), то переменная может использоваться только в теле оператора for – вне оператора for эта переменная будет неизвестна. Такое ограничение на использование имени переменной называют областью действия переменной. Область действия переменной определяет, где в программе она может использоваться.

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

Еще несколько примеров заголовков цикла:

  • изменение управляющей переменной от 1 до 100 с шагом 1:
    for(int i = 1; i <= 100; i++)
  • изменение управляющей переменной от 100 до 1 с шагом -1 (с уменьшением на 1):
    for(int i = 100; i > 0; i--)
  • изменение управляющей переменной от 7 до 77 с шагом 7:
    for(int i = 7; i <= 77; i += 7)
  • изменение управляющей переменной от 20 до 2 с шагом -2:
    for(int i = 20; i >= 2; i -= 2)
  • изменение управляющей переменной в следующей последовательности: 2, 5, 8, 11, 14:
    for(int j = 2; j <= 20; j += 3)
  • изменение управляющей переменной в следующей последовательности: 99, 88, 77, 66, 55, 44, 33, 22, 11, 0:
    for(int j = 99; j >= 0; j -= 11)

Выражения инициализации и приращения могут быть списками выражений, разделенных запятыми. Например, в одном операторе for может быть несколько управляющих переменных, которые нужно инициализировать и модифицировать:

for(int x = 0, y=0; x < 10; x++, y++)

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

На самом деле, все три выражения в операторе for являются необязательными. Если опущено выражение для условия продолжения цикла, C++ предполагает, что условие всегда истинно и, таким образом, получается бесконечный цикл. Можно опустить выражение инициализации, если управляющая переменная инициализируется в программе ранее. Можно опустить и выражение приращения, если приращение переменной выполняется в теле цикла или оно вообще не требуется.

Например, цикл for(int i = 0; i < 100; i++) можно записать следующим образом:

int i=0;
for( ;  ; ) 
{
   // ...
   if(i>=100)
       break;
   i++;
}

1.8.3 Операторы break и continue

Когда оператор break исполняется в операторе while, for, do... while или switch, происходит немедленный выход из цикла (или switch) и исполнение программы продолжается со следующего оператора. Типичным применением оператора break является досрочное прерывание цикла или пропуск оставшейся части оператора switch.

Исполнение оператора continue в операторе while, for или do... while вызывает пропуск оставшейся части тела оператора и переход к следующей итерации цикла. В операторах while и do... while сразу после исполнения оператора continue оценивается условие продолжения цикла. В операторе for сначала исполняется выражение приращения, и затем оценивается условие продолжения.

1.8.4 Пример вычисление факториала (пример 10)

/////////////////////////////////////////////////////////////////////////////
// Программирование на языке высокого уровня. Основы языка С++
// Пример 10. Вычисление факториала. Примеры работы циклов for, do...while
// 
// http://aco.ifmo.ru/el_books/programming
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
 
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    int menu_number;// номер пункта меню
    // цикл, позволяющий производить вычисления пока не будет выбран пункт "Exit"
    do
    {
        // число, для которого вычисляется факториал
        int number; 
        // цикл будет работать до тех пор, пока не будет введено положительное число
        do
        {
            cout<<"Enter integer positive numbers: "; 
            cin>>number; 
        }while(number <= 0);
        
        // факториал, первоначальное значение равно 1, т.к. 0!=1
        int factorial=1; 
        // пошаговый цикл, перебирает все числа от number до 1, с шагом -1
        for(int i=number; i>0; --i)
        {
            factorial*=i;
        }
        // вывод результата
        cout<<number<<"! = "<<factorial<<endl; 

        // вывод меню
        cout<<endl<<"Enter number of menu item: "<<endl;
        cout<<"0. Exit"<<endl;  
        cout<<"1. New calculation"<<endl;
        // ввод номера пункта меню
        cin>>menu_number;
    }while(menu_number!=0);
}
/////////////////////////////////////////////////////////////////////////////