Рассмотрим случай, когда мы хотим показать пользователю меню и попросить его сделать выбор; и, если пользователь сделает неверный выбор, спросить его снова. Ясно, что меню и выбор должны находиться внутри какого-то цикла (чтобы мы могли продолжать спрашивать пользователя, пока он не введет правильное значение), но какой цикл мы должны выбрать?
Поскольку цикл while вычисляет условие заранее, он будет неудобен. Решить проблему можно так:
#include int main() < // selection должна быть объявлена вне цикла while, чтобы мы могли использовать ее позже int selection< 0 >; while (selection != 1 selection != 2 selection != 3 selection != 4) < std::cout > selection; > // здесь что-то делаем с selection // например, оператор switch std::cout
Но это работает только потому, что наше начальное значение 0 для selection не входит в набор допустимых значений (1, 2, 3 или 4). Что, если бы 0 был корректным выбором? Нам пришлось бы выбрать другой инициализатор для представления «недопустимого» значения – и теперь мы вводим в наш код магические числа (4.13 – Литералы).
While Loops — Intro to Computer Science
Вместо этого мы могли бы добавить новую переменную для отслеживания корректности, например:
#include int main() < int selection < 0 >; bool invalid < true >; // новая переменная только для выхода из цикла while (invalid) < std::cout > selection; invalid = (selection != 1 selection != 2 selection != 3 selection != 4); > // здесь что-то делаем с selection // например, оператор switch std::cout
Это позволяет избежать использования магического числа, но вводит новую переменную, чтобы гарантировать, что цикл запускается минимум один раз, что добавляет сложности и возможности дополнительных ошибок.
Инструкции do while
Чтобы помочь решить проблемы, подобные описанным выше, C++ предлагает оператор do — while :
do инструкция; while (условие);
Оператор do while – это конструкция цикла, которая работает так же, как цикл while , за исключением того, что инструкция всегда выполняется хотя бы один раз. После выполнения инструкции цикл do — while проверяет условие. Если условие истинно, последовательность выполнения возвращается к началу цикла do — while и выполняет его снова.
Вот наш пример выше с использованием цикла do — while вместо цикла while :
#include int main() < // selection должна быть объявлена вне do-while, чтобы мы могли использовать ее позже int selection<>; do < std::cout > selection; > while (selection != 1 selection != 2 selection != 3 selection != 4); // здесь что-то делаем с selection // например, оператор switch std::cout
Таким образом, мы избежали как магических чисел, так и дополнительных переменных.
В приведенном выше примере стоит обсудить то, что переменная selection должна быть объявлена вне блока do . Если бы переменная selection была объявлена внутри блока do , она была бы уничтожена при завершении блока do , что происходит до того, как будет вычислено условие. Но эта переменная нужна нам в условном выражении while – следовательно, переменная selection должна быть объявлена вне блока do (даже если она не будет использоваться в теле функции позже).
do-while Loop
На практике циклы do — while используются нечасто. Расположение условного выражения в нижней части цикла скрывает условие цикла, что может привести к ошибкам. В результате многие разработчики рекомендуют вообще избегать циклов do — while . Мы займем более мягкую позицию и выступим за то, чтобы при равном выборе предпочтение было отдано циклам while , а не do — while .
Лучшая практика
При равном выборе отдавайте предпочтение циклам while , вместо do — while .
Источник: radioprog.ru
do-while Statement (C)
The do-while statement lets you repeat a statement or compound statement until a specified expression becomes false.
Syntax
iteration-statement : do statement while ( expression ) ;
The expression in a do-while statement is evaluated after the body of the loop is executed. Therefore, the body of the loop is always executed at least once.
The expression must have arithmetic or pointer type. Execution proceeds as follows:
- The statement body is executed.
- Next, expression is evaluated. If expression is false, the do-while statement terminates and control passes to the next statement in the program. If expression is true (nonzero), the process is repeated, beginning with step 1.
The do-while statement can also terminate when a break , goto , or return statement is executed within the statement body.
Here’s an example of the do-while statement:
do < y = f( x ); x—; >while ( x > 0 );
In this do-while statement, the two statements y = f( x ); and x—; are executed, regardless of the initial value of x . Then x > 0 is evaluated. If x is greater than 0, the statement body is executed again, and x > 0 is reevaluated. The statement body is executed repeatedly as long as x remains greater than 0. Execution of the do-while statement terminates when x becomes 0 or negative. The body of the loop is executed at least once.
Источник: learn.microsoft.com
Оператор цикла do-while . Примеры использования
Оператор do-while используется для организации циклического процесса. Отличие этого оператора от оператора while состоит в том, что тело оператора do-while будет выполнено как минимум один раз независимо от значения условия выполнения цикла.
Общая форма оператора
do < // инструкции, операторы // . > while (условие)
- условие – условие выполнения циклического процесса. Если значение условие = True , то будут выполняться операторы, размещенные между фигурными скобками (словами do и while ).
2. Схема работы оператора цикла do-while
На рисунке 1 отображена схема работы цикла do-while .
Рис. 1. Схема работы оператора цикла do-while
3. Примеры решения задач с оператором цикла do-while
3.1. Вычисление суммы чисел последовательности
Дана непустая последовательность целых чисел, которая заканчивается нулем. Вычислить сумму всех чисел последовательности.
Текст программы для приложения типа Console Application следующий
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 < class Program < static void Main(string[] args) < int number; // вводимое число int summ = 0; // сумма чисел // Цикл ввода чисел, 0 — выход do < // Ввести число с клавиатури Console.Write(«Input number (0 — exit): «); number = Int32.Parse(Console.ReadLine()); // Вычислить сумму summ += number; > while (number != 0); // Вывести сумму Console.WriteLine(«sum = «, summ); Console.ReadKey(); > > >
Результат выполнения программы
Input number (0 — exit): 1 Input number (0 — exit): 9 Input number (0 — exit): 2 Input number (0 — exit): -3 Input number (0 — exit): 0 sum = 9
3.2. Поиск значения в ряде чисел
Дано число a (1 a ≤1.5). Среди чисел
найти первое, меньшее a .
Текст программы для приложения типа Console Application .
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 < class Program < static void Main(string[] args) < double a, t; int n; // Ввод значения a Console.Write(«a color: #008080;»>Convert.ToDouble(Console.ReadLine()); // Проверка, значения на корректность if ((a < 0) || (a >1.5)) < Console.WriteLine(«Error. The value of a is incorrect.»); return; > n = 1; // цикл поиска n do < n++; t = 1 + 1.0 / n; >while (t >= a); // Вывести t, n Console.WriteLine(«t = , n = «, t, n); Console.ReadKey(); > > >
Результат выполнения программы
a = 1.22 t = 1.200000, n = 5
3.3. Определение количества цифр в числе
Дано натуральное число. Определить количество цифр 7 в нем.
Текст программы для приложения типа Console Application следующий
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 < class Program < static void Main(string[] args) < // Определение количества цифр 7 в числе int number; int t; int k; // Ввод числа Console.Write(«number color: #008080;»>Convert.ToInt32(Console.ReadLine()); if (number<0) < Console.WriteLine(«Error. Incorrect number.»); Console.ReadKey(); return; > // Вычисление t = number; // сделать копию из number k = 0; // цикл вычисления k do < if (t % 10 == 7) k++; t = t / 10; > while (t > 0); Console.WriteLine(«k = «, k); Console.ReadKey(); > > >
Результат выполнения программы
number = 45277 k = 2
3.4. Определение закономерности в последовательности
Дано натуральное число. Определить, есть ли последовательность его цифр при просмотре слева направо упорядоченной по убыванию.
Например, для числа 9621 ответ положительный, для числа 8340 ответ отрицательный.
Текст программы для приложения типа Console Application
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 < class Program < static void Main(string[] args) < // Определения, образуют ли цифры числа последовательность по убыванию int number; int t1, t2; bool f; // Ввод числа Console.Write(«number color: #008080;»>Convert.ToInt32(Console.ReadLine()); if (number<0) < Console.WriteLine(«Error. Incorrect number.»); Console.ReadKey(); return; > // Вычисление t1 = number % 10; f = true; // цикл do-while do < t2 = t1; number = number / 10; t1 = number % 10; if (t1 < t2) < f = false; break; // последовательность не убывающая > > while (number > 10); if (f == true) Console.WriteLine(«The sequence is decreasing.»); else Console.WriteLine(«The sequence is not decreasing.»); Console.ReadKey(); > > >
Результат выполнения программы
number = 88765521 The sequence is decreasing.
Источник: www.bestprog.net