циклы C++

программированиелекция

в окне печати выбери «сохранить как pdf».

что было

оглавление
оглавление

Сравнение while, do while и for, трассировка суммы от 1 до n и разбор ошибок границы и остановки.

У цикла должны быть начальное состояние, условие, тело и изменение. Граница определяет набор итераций, а изменение должно приближать условие к ложному.

while, do while и for

while сначала проверяет условие и может не выполниться ни разу. do while проверяет после тела и выполняется хотя бы раз. for собирает инициализацию, условие и шаг в заголовке.

Сравнение циклов

цикл

проверка

минимум итераций

когда удобен

while

до тела

0

число повторений заранее неизвестно

do while

после тела

1

тело обязано сработать хотя бы раз

for

до тела

0

есть счётчик и понятный шаг

четыре части цикла

Изменение должно вести к остановке.

описание схемы словами

Цикл состоит из начального состояния, проверки, тела и изменения параметра, после которого проверка повторяется.

трассировка суммы 1..n

Для n=4 цикл должен добавить 1, 2, 3 и 4. Таблица фиксирует состояние после каждой итерации и показывает, вошла ли верхняя граница.

Трассировка при n=4

итерация

i

sum до

sum после

1

1

0

1

2

2

1

3

3

3

3

6

4

4

6

10

Самодостаточная сумма 1..n

#include <iostream>

int main() {
    int n{};
    if (!(std::cin >> n) || n < 1) {
        std::cerr << "n must be positive\n";
        return 1;
    }
    long long sum = 0;
    for (long long i = 1; i <= n; ++i) {
        sum += i;
    }
    std::cout << sum << "\n";
    return 0;
}

проверка n=4

условие: Найти сумму 1..4.

ход решения

  1. sum=0

  2. после i=1: 1

  3. после i=2: 3

  4. после i=3: 6

  5. после i=4: 10

ответ: 10

проверка: По формуле n(n+1)/2=4⋅5/2=10n(n+1)/2=4\cdot5/2=10.

ошибки границы и остановки

Ошибка off-by-one (ошибка на единицу) возникает, когда цикл захватывает на одно значение больше или меньше. Для суммы 1..n условие i<n потеряет n; нужно i<=n.

бесконечный цикл

В while (i <= n) { sum += i; } переменная i не меняется. Если условие истинно при входе, оно никогда не станет ложным.

Граничные тесты

n

зачем

ожидаемое

0

ниже допустимой границы

ошибка ввода

1

минимальное допустимое

1

2

две итерации

3

4

обычный случай

10

что запомнить

  • while и for могут дать ноль итераций; do while — минимум одну.

  • У цикла есть начало, условие, тело и изменение.

  • Операторы < и <= задают разные наборы итераций.

  • Если условие не приближается к ложному, цикл может стать бесконечным.

самопроверка

  • Почему do while не всегда подходит для проверки ввода?

  • Какие i получатся при i<n и n=4?

  • Почему цикл без ++i не завершится?

  • Как трассировка обнаруживает off-by-one?

источники

  • материал занятия: Циклы C++ — /materials/lectures/cpp-loops.pdf

  • редакционная сверка: cppreference: while loop — https://en.cppreference.com/w/cpp/language/while.html

  • редакционная сверка: cppreference: do-while loop — https://en.cppreference.com/w/cpp/language/do.html

  • редакционная сверка: cppreference: for loop — https://en.cppreference.com/w/cpp/language/for.html

что сделать

Измените пример так, чтобы он считал сумму чётных чисел от 2 до n; проверьте n=1, 2 и 6.

благодарность

Евгения Прохорова (1-45), Никита Козлов (1-48) и Иван Лашманов (1-48)

материалы

предложить дополнение или исправлениекак оцифровать конспект