# Глава 4.1. Циклы while и do-while В C++ вам на выбор доступно три вида циклов: `while`, `do-while` и `for`. Причем у цикла `for` есть два варианта. Все эти циклы — это управляющие инструкции. Их тело состоит из единственной инструкции. Это может быть простая инструкция, блок (составная инструкция) или управляющая инструкция (например, условие или вложенный цикл). Правила расстановки фигурных скобок в теле цикла [такие же,](/courses/cpp/chapters/cpp_chapter_0031/#block-braces) как для условий `if-else`. Для досрочного выхода из цикла применяется оператор `break`. А для прерывания текущей итерации и перехода на следующую — оператор `continue`. ## Цикл while Тело цикла `while` выполняется, пока справедливо условие: ```cpp while(условное выражение) { // Тело цикла } ``` Цикл `while` используют, если в теле цикла требуется изменять его условие. Либо если количество итераций не известно заранее: ```cpp while (!user_pressed_stop && !end_of_playlist) { play_next_song(); } ``` Еще один распространённый сценарий применения `while` — вечный цикл: ```cpp while(true) { cmd = read_console_command(); if (!is_valid(cmd)) { continue; } if (is_exit(cmd)) { break; } handle_command(cmd); } ``` Напишите функцию `gcd()`, которая находит наибольший общий делитель (GCD, greatest common divisor) чисел `a` и `b` типа `std::size_t`. Функция не должна быть рекурсивной. {.task_text} Например, `gcd(25, 15)` равен 5, а `gcd(8, 3)` равен 1. {.task_text} Реализуйте алгоритм Евклида. Он заключается в следующем: {.task_text} - GCD равен `a`, если `a` и `b` совпадают. - GCD равен GCD от `a - b` и `b`, если `a` больше `b`. - GCD равен GCD от `a` и `b - a`, если `a` меньше `b`. ```cpp {.task_source #cpp_chapter_0041_task_0010} ``` В цикле `while` проверяйте условие `a != b`. Внутри цикла изменяйте значения `a` и `b`. После выхода из цикла `a` будет равен наибольшему общему делителю. {.task_hint} ```cpp {.task_answer} std::size_t gcd(std::size_t a, std::size_t b) { while (a != b) { if (a > b) { a -= b; } else { b -= a; } } return a; } ``` К слову, в стандартной библиотеке C++ есть функция [std::gcd()](https://en.cppreference.com/w/cpp/numeric/gcd). Для обхода элементов контейнера идиоматичнее использовать цикл `for`. Но никто не может запретить вам организовать обход через `while`: ```cpp {.example_for_playground .example_for_playground_001} std::string s = "341453TNY"; std::size_t i = 0; // При сравнении символов char сопоставляются ASCII-коды. // Цифры 0, 1, ... 9 расположены в ASCII-таблице последовательно. while (i < s.size() && s[i] >= '0' && s[i] <= '9') { s[i] = 'X'; ++i; } std::println("{}", s); ``` ``` XXXXXXTNY ``` ## Цикл do-while Цикл `do-while` отличается от `while` порядком действий: сначала исполняется тело цикла, а затем проверяется условие. Это означает, что вне зависимости от условия тело выполнится хотя бы один раз. ```cpp do { // Тело цикла } while(условное выражение); ``` К циклу `do-while` часто прибегают при чтении данных из внешнего источника. Первое чтение произойдёт в любом случае, а последующие — если останутся данные: ```cpp int data_size = 0; do { data_size = read_chunked_data(); } while (data_size > 0); ``` ---------- ## Резюме - Организовать цикл можно с помощью конструкций: `while`, `do-while`, `for`. - Оператор `break` нужен для досрочного выхода из цикла. - Оператор `continue` прерывает итерацию цикла и запускает следующую.
Отправка...
Наша группа в telegram. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!