Статья Автор: Лебедев Дмитрий

Конспект 6. Цикл for


C++_Цикл for. Часть 1

Некоторые операции в языке C++ имеют сокращённую запись. Например, увеличить x на единицу можно несколькими способами:

x=x+1;
x+=1;
++x;
x++;

Последние два варианта самые компактные, поэтому рекомендуем использовать именно их. Операции ++x и x++ имеют небольшое различие, но пока мы его рассматривать не будем.

Задача про числа от 1 до 100

Выведите на экран все числа от 1 до 100.

Решение с циклом while

while (i <= 100){
    cout << i << " ";
    i++;
}

Данную задачу можно решить иначе с помощью цикла for.

Решение с помощью цикла for

for (i = 1; i <= 100; ++i)
    cout << i << " ";

Данное решение лучше, так как все инструкции управления циклом находятся в одном месте, что упрощает чтение программы.

Цикл for содержит три инструкции управления, разделённые точкой с запятой:

  1. Инициализация переменной.
  2. Условие продолжения цикла.
  3. Инструкция, выполняемая после завершения всех операций внутри цикла (обычно изменение счётчика).

Задача про таблицу умножения

Выведите на экран таблицу умножения для чисел от 1 до 10.

Решение

Решим данную задачу с помощью вложенного цикла for.

for (i = 1; i <= 10; ++i){
    for (int j = 1; j <= 10; ++j){
        cout << i * j << " ";
    }
    cout << endl;
}

Иногда может быть важно не выводить пробел после последнего числа в строке. Модифицируем код, чтобы учесть это требование:

for (i = 1; i <= 10; ++i){
    for (int j = 1; j <= 9; ++j){
        cout << i * j << " ";
    }
    cout << i * 10 << endl;
}

Модифицируем программу так, чтобы не выводить перевод строки после вывода таблицы:

for (i = 1; i <= 10; ++i){
    for (int j = 1; j <= 10; ++j){
        cout << i * j << " ";
    }
    if (i != 10){
        cout << endl;
    }
}

C++_Цикл for. Часть 2

Задача

Дана последовательность из nn натуральных чисел. Найдите сумму чётных чисел в последовательности. Значения всех чисел не превышают 231−1.

Решение

Несмотря на то, что для хранения элементов последовательности хватит типа int, для хранения ответа необходимо использовать больший тип данных — long long.

#include <iostream>
using namespace std;
 
int main() {
    long long sum = 0;
    int now, n;
    cin >> n;
    for (int i = 0; i < n; ++i){
        cin >> now;
        if  (now % 2 == 0){
            sum += now;
        }
    }
    cout << sum << endl;
    return 0;
}
 

Задача

Даны два натуральных числа — A и B. Необходимо вывести все нечётные числа на отрезке [A;B]. Гарантируется, что A — нечётное и A<B.

Решение

#include <iostream>
using namespace std;
 
int main() {
    int a, b;
    cin >> a >> b;
    for (int i = a; i <= b; i += 2){
        cout << i << " ";
    }
    return 0;
}
 

Преинкремент и постинкремент

Разберём различия инструкций преинкремента (++i) и постинкремента (i++).

Приведём два примера:

    int a, b;
    b = 10;
    a = b++;
    cout << a << " " << b << endl;

На экран будет выведено два числа — 10 и 11.

    int a, b;
    b = 10;
    a = ++b;
    cout << a << " " << b << endl;

На экран будет выведено два числа — 11 и 111

Таким образом, преинкремент сначала прибавляет единицу к переменной b, а затем возвращает её значение. Постинкремент, наоборот, сначала возвращает значение переменной b, а затем прибавляет к ней единицу.

Такое поведение называется побочным эффектом операций и часто позволяет сократить длину кода. Однако, мы не рекомендуем пользоваться данным приёмом, так как это может привести к ошибкам в программе и усложнить чтение кода. Советуем не использовать преинкремент и постинкремент в присваиваниях.


C++_Цикл for. Часть 3

Задача

Выведите все n-значные натуральные числа.

Решение

#include <iostream>
using namespace std;
 
int main()
{
    int d;
    cin >> d;
    int mind = 1, maxd;
    for (int i = 1; i < d ; ++i){
        mind *= 10;
    }
    maxd = mind * 10 - 1;
    for (int i = mind; i <= maxd; ++i){
        cout << i << " ";
    }
    return 0;
}

C++_Цикл for. Часть 4

Задача

Даны три натуральных числа — a, b, c. Выведите все числа на отрезке [a;b], делящиеся на c.

Решение

#include <iostream>
using namespace std;
 
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    int m = a % c;
    if (m != 0){
        a += c - m;
    }
    for (int i = a; i <= b; i += c){
        cout << i << " ";
    }
    cout << endl;
    return 0;
}
 

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


Задачи для тренировки

1) Ряд

 
2) Ряд — 2  
3) Факториал  
4) Количество нулей  
5) Цифры числа  
6) Четные числа  
7) Остатки  

Задачи с разбором

Разбор задачи "Диофантовое уравнение"
z1*) Диофантово уравнение  
Разбор задачи "Делители"

z2*) Делители

 
Разбор задачи "Сумма факториалов"
z3*) Сумма факториалов  

Печать