Синтаксис do while. Как использовать циклы while и do-while

В этой статье будут рассмотрены еще два цикла: while и do while . Они очень похожи между собой. Их синтаксис:

Рис.1 – синтаксис while
Рис.2 – синтаксис do while

Отличие состоит только в том, что при начале выполнения цикла while , сразу происходит проверка условия. Если оно возвращает ложь (false ), то тело цикла не выполнится ни разу. А при использовании do while , сразу выполнится оператор(-ы) в теле цикла, а потом будет проверено условие в круглых скобках () после ключевого слова while . И аналогично, при возврате false , цикл завершает работу, иначе – выполняется следующий шаг (итерация). То есть тело цикла do while выполнится хотя бы один раз, при любом раскладе.

Поговорим о них в отдельности. Начнем с while . Как говорилось выше, чтобы выполнилось тело цикла, необходимо чтобы при проверке условия в круглых скобках () , была возвращена истина (true ).

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

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

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

Пример - цикл while C++

#include using namespace std; int main() { setlocale(LC_ALL, "rus"); double payment = 0; int exit = 1; // управляющая переменная while (exit == 1) { cout << "Введите сумму для пополнения счета: "; cin >> payment; cout << "Оплатить и выйти - нажмите 0. Изменить сумму - нажмите 1: "; cin >> exit; // изменение управляющей переменной } cout << "\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"; cout << "Ваш счет пополнен на " << payment << "$ Спасибо! До свидания!"; cout << "\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"; return 0; }

#include

using namespace std ;

int main ()

double payment = 0 ;

int exit = 1 ; // управляющая переменная

while (exit == 1 )

cout << ;

cin >> payment ;

cout << ;

cin >> exit ; // изменение управляющей переменной

cout << ;

cout << "Ваш счет пополнен на " << payment << "$ Спасибо! До свидания!" ;

cout << "\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n" ;

return 0 ;

Управляющая переменная exit объявляется и инициализируется единицей до цикла while – строка 9. Поэтому при входе в цикл, проверка условия while (exit == 1) вернет true (подробнее об этом можно почитать ) и программа перейдет к выполнению тела цикла. Подобное условие часто записывают таким способом: while (exit) . С таким условием программа работает, как и с предыдущим. Объясняется это тем, что любое значение переменной exit отличное от нуля будет восприниматься компилятором, как true . Тело цикла будет выполняться, пока пользователь не изменит значение этой переменной на 0. Тогда while (exit) будет равнозначно while (0) . То есть проверочное условие ложно. Такая запись встречается чаще, так как она более короткая, хотя и не настолько ясна, как та, что в примере. К этому просто надо привыкнуть.

В строках 16 – 17 пользователю задается вопрос и предлагается сделать выбор: cout << “Оплатить и выйти – нажмите 0. Изменить сумму – нажмите 1: “; То есть если он совершил ошибку при вводе суммы пополнения, у него есть возможность исправить её, нажав 1.

Как только пользователь введет верную сумму и нажмет 0 (что соответствует “Оплатить и выйти”), произойдет выход из цикла и программа продолжит работу. В итоге на экране покажется сообщение о сумме пополнения счета – строки 20 – 22.

Результат:

Эту же задачу можно решить применяя цикл do while . В этом случае, изначально значение переменной exit может быть каким угодно. Цикл в любом случае выполнит тело и предложит сделать выбор. Смотрим:

#include using namespace std; int main() { setlocale(LC_ALL, "rus"); double payment = 0; int exit = 0; do { cout << "Введите сумму для пополнения счета: "; cin >> payment; cout << "Оплатить и выйти - нажмите 0. Изменить сумму - нажмите 1: "; cin >> exit; } while (exit == 1); cout << "\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"; cout << "Ваш счет пополнен на " << payment << "$ Спасибо! До свидания!"; cout << "\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"; return 0; }

#include

using namespace std ;

int main ()

setlocale (LC_ALL , "rus" ) ;

double payment = 0 ;

int exit = 0 ;

cout << "Введите сумму для пополнения счета: " ;

cin >> payment ;

cout << "Оплатить и выйти - нажмите 0. Изменить сумму - нажмите 1: " ;

cin >> exit ;

Тем, что в do while сначала выполняется тело цикла, а затем проверяется условие продолжения цикла. Из-за такой особенности do while называют циклом с постусловием. Таким образом, если условие do while заведомо ложное, то хотя бы один раз блок операторов в теле цикла do while выполнится. В итоге do while отличается от цикла while структурой. Если в while сначала выполняется проверка условия продолжения цикла, и если условие истинно, то только тогда выполняется тело цикла. Цикл do while работает сточностью до наоборот, сначала выполняется тело цикла, а потом проверяется условие, вот почему тело цикла do while , хотя бы раз, выполнится.

// форма записи оператора цикла do while: do // начало цикла do while { /*блок операторов*/; } while (/*условие выполнения цикла*/); // конец цикла do while

В начале цикла do while пишется зарезервированное слово do , после идут фигурные скобочки, которые можно опускать, в случае использования одного оператора в теле цикла do while . После закрывающей фигурной скобочки, обозначающей конец тела цикла do while , стоит условие цикла do while , после которого обязательно нужно ставить точку с запятой. Рассмотрим программу с циклом do while , которая выполняет некоторые транзакции с денежным счётом в банке.

// do_while.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv) { srand(time(0)); int balance = 8; // баланс do // начало цикла do while { cout << "balance = " << balance << endl; // показать баланс int removal = rand() % 3; // переменная, для хранения вычитаемого значения cout << "removal = " << removal << endl; // показать вычитаемое значение balance -= removal; // управление условием } while (balance > 0); // конец цикла do while system("pause"); return 0; }

В строке 11 объявлена переменная balance , она отвечает за остаток денежных средств на счету. С 12-й по 19-ю строки записан цикл do while. Вцикле do while выполняются все транзакции со счётом balance , а именно — перевод денежных средств на какой-то другой счёт, строка 17 . Строка 14 показывает остаток денежных средств на счету balance . В строке 15 объявлена переменная, в которой хранится вычитаемое значение, причём это значение генерируется случайно в интервале . Переменная removal один раз объявляется в теле цикла do while , и каждый раз при повторении цикла эта переменная не переопределяется. А вот её значение меняется, в зависимости от того, какое число сгенерировалось. В строке 19 записано условие цикла do while , как только условие станет ложным, программа передаст управление следующему оператору, после цикла do while , строка 20 . Результат работы программы показан на рисунке 1.

Рисунок 1 Цикл do while в C++

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

Вспомним программу «Угадай число», из раздела: . В этой задаче правильней было бы использовать цикл do while , код уменьшится на две строки.

// ygadai2.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv) { srand(time(0)); int unknown_number = 1 + rand() % 10; // загадываемое число int enter_number; // переменная для хранения введённого числа do { cout << "Enter unknown number : "; cin >> enter_number; // отгадываем } while (enter_number != unknown_number); cout << "You win!!!\n"; system("pause"); return 0; }

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

Для закрепления материала, разработаем ещё одну программу, которая вычисляет сумму чисел в заданном интервале.

// dowhile.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv) { cout << "Enter the first limit: "; // начальное значение из интервала int first_limit; cin >> first_limit; cout << "Enter the second limit: "; // конечное значение из интервала int second_limit; cin >> second_limit; int sum = 0, count = first_limit; do { sum += count; // наращивание суммы count++; // инкремент начального значения из задаваемого интервала } while (count <= second_limit); // конец цикла do while cout << "sum = " << sum << endl; // печать суммы system("pause"); return 0; }

После запуска программы необходимо ввести пределы интервала, первый и второй. После этого начинает работать цикл do while ,строка 13 .переменная sum предназначена для хранения накапливаемой суммы, строка 15 . В строке 16 инкрементируется начальное значение предела, после каждого повторения цикла. Результат работы программы (см. Рисунок 2).

Рисунок 2 Цикл do while в C++

Интервал указан от -6 до 10 включительно, [-6;10]. Программа суммирует все целые числа из заданного интервала. Сумма формируется так: -6 -5 -4 -3 -2 -1 + 0 +1 +2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 34. Таким образом, циклически выполняется действие суммирования всех целых чисел из, указанного пользователем, интервала.

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

Для реализации циклического процесса, в языках программирования применяются циклы. Язык программирования C/C++ имеет в наличии удобные для работы операторы цикла.

2. Виды операторов цикла в языке C++

В языке C++ существует 3 вида операторов цикла:

  • цикл for ;
  • цикл while с предусловием;
  • цикл do…while с постусловием.

Каждый из операторов цикла имеет свои особенности применения. Любой из вышеприведенных операторов цикла может быть заменен другим.

3. Цикл for. Общая форма оператора цикла for

В языке C++ цикл for может иметь очень широкую реализацию и применение. Цикл for еще называется циклом с параметром.

Общая форма оператора цикла for :

for (инициализация ; выражение ; прирост ) { // ... }
  • инициализация – операция присваивания, в которой устанавливается начальное значение переменной цикла. Эта переменная есть счетчиком, который управляет работой цикла. Количество переменных, управляющих циклом for, может быть две и больше;
  • выражение – условное выражение, в котором проверяется значение переменной цикла. На этом этапе определяется дальнейшее выполнение цикла;
  • прирост – определяет, как будет изменяться значение переменной цикла после каждой итерации.

Цикл for выполняется до тех пор, пока значение выражение равно true. Как только значение выражение станет false, выполнение цикла прекращается и выполняется оператор, который следует за циклом for.

4. Примеры использования оператора цикла for

Пример 1. Найти сумму всех целых чисел от 100 до 300.

// сумма чисел от 100 до 300 int sum; int i; sum = 0; for (i = 100; i<=300; i++) sum = sum + i; // sum = 40200

Пример 2. Дано натуральное число n . Вычислить сумму:

Фрагмент кода, который решает данную задачу.

// s = 1 + 1/2 + 1/3 + ... + 1/n int n; float s = 0; int i; // ввод значения n n = 4; for (i = 1; i<=n; i++) s = s + 1.0/i; // s = 2.08333

В данном примере, чтобы получить вещественное значение, вместо числа 1 (целый тип) вводится число 1.0 (вещественный тип). Операция деления

дает вещественный результат.

Пример 3. Вычислить сумму

Фрагмент кода, который решает данную задачу.

float s; int i; s = 0; for (i=50; i>=1; i--) s = i + Math::Sqrt(s); s = Math::Sqrt(s); // s = 1.7579

В данном примере значение счетчика i в цикле for изменяется по убыванию. Это значение уменьшается на 1 в каждой итерации цикла. При решении подобных задач значение счетчика цикла должно изменяться от последнего к первому значению. В данном случае от 50 до 1.

В вычислениях использована функция Sqrt() из библиотеки Math.

5. Какие существуют варианты реализации цикла for ?

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

В цикле for может отсутствовать любой из элементов заголовка цикла:

  • инициализация;
  • выражение;
  • прирост.

Пример оператора цикла for , в котором есть 2 управляющие переменные. Найти значения произведения:

D = (1 + cos(9)) · (2 + cos(8)) · … · (9 + cos(1))

Фрагмент кода, который решает данную задачу.

// D = (1 + cos(9))*(2 + cos(8))* ... *(9 + cos(1)) int i, j; float d; d = 1; for (i = 1, j = 9; i<=9; i++, j--) d = d * (i + Math::Cos(j));

В вышеприведенном фрагменте кода в цикле for используются две переменные, которые изменяют свое значение (i , j ).

6. Цикл while . Общая форма

Цикл while называется циклом с предусловием. Общая форма цикла while следующая:

while (выражение ) { // последовательность операторов // ... }

где выражение – любое допустимое выражение в языке C++. Последовательность операторов выполняется до тех пор, пока условное выражение возвращает значение true . Как только выражение становится равным false , выполнение цикла while прекращается и управление передается следующему за циклом while оператору.

7. Примеры использования оператора цикла while

Пример 1. Дано вещественное число a . Найти такое наименьшее n , при котором

Соображения. В начале значение суммы есть меньше чем значение a . При прохождении каждой итерации значение суммы постепенно увеличивается. В какой-то момент (при каком-то значении n ) эта сумма станет выше значения a . Этот момент (значение n ) нужно зафиксировать. Для вычисления n , удобно подходит цикл while .

Фрагмент кода, который решает данную задачу.

float a; int n; float sum; // ввод значения a a = 2.2; n = 1; sum = 1.0/n; while (sum < a) { n++; sum = sum + 1.0/n; } // n = 5; sum = 2.283334

Пример 2. Дано натуральное число. Определить количество цифр 3 в нем.

Фрагмент кода, который решает данную задачу.

// количество цифр 3 в числе int n; // заданное натуральное число int k; // количество цифр 3 в числе int t, d; // дополнительные переменные // ввод значения n n = 12343; t = n; // делаем копию из n k = 0; while (t>0) { d = t % 10; // выделить последнюю цифру if (d == 3) k++; t = t / 10; // уменьшить разрядность числа } // k = 2

В данном примере, значение исходного числа будет делиться на 10 при каждой итерации. Таким образом, будет уменьшаться разрядность числа. На каждой итерации, с помощью операции % языка C++ берется остаток от деления на 10, то есть определяется последняя цифра числа. Если эта цифра равна 3, то счетчик k увеличивается на 1.

8. Общая форма оператора цикла do…while

Цикл do … while целесообразно использовать в случаях, когда итерацию нужно сделать хотя бы 1 раз. В отличие от циклов for и while , в цикле do…while условие проверяется при выходе из цикла (а не при входе в цикл). Цикл do…while еще называется циклом с постусловием.

Общая форма оператора цикла do…while :

do { // последовательность операторов // ... } while (выражение );

где выражение – условное выражение, в котором проверяется значение переменной цикла. На этом этапе определяется дальнейшее выполнение цикла.

Фигурные скобки в этом цикле необязательны.

Цикл работает следующим образом. Сначала происходит выполнение тела цикла. Потом проверяется значение выражение (условное выражение). Если значение выражение есть истинным (true ), выполняется снова тело цикла. Как только значение выражение станет false , выполнение цикла прекращается

9. Примеры использования оператора цикла do…while

Пример. Используя цикл do…while , найти значение суммы:

S = 1 + 3 + … + 99

Фрагмент кода, который решает данную задачу.

// s = 1 + 3 + ... + 99 int t; int s; s = 0; t = 1; do { s = s + t; t = t + 2; } while (t<=99); // s = 2500
10. Вложенные циклы. Примеры использования

Вложенные циклы могут быть использованы, например, при работе с двумерными (многомерными) массивами (обнуление массива, вычисление сумм, произведений и прочее).

Пример 1. Вычислить произведение

D = 1 · (1 + 2) · (1 + 2 + 3) · … · (1 + 2 + … + 9)

Фрагмент кода, который решает данную задачу.

// D = 1 * (1+2) * (1+2+3) * ... * (1+2+...+9) float d; // результат - произведение int i, j; // счетчики циклов int s; // дополнительная переменная d = 1; for (i = 1; i<=9; i++) { s = 0; for (j = 1; j<=i; j++) s = s + j; d = d * s; } // d = 2.571912E+09

В данном примере в цикле for со счетчиком i выполняется цикл for со счетчиком j .

Пример 2. Дан двумерный массив целых чисел размером 6×9. Записать во все элементы массива значение 5.

int M; // двумерный массив целых чисел int i, j; for (i=0; i<6; i++) for (j=0; j<9; j++) M[i][j] = 5;
11. Что такое бесконечный цикл?

Бесконечный цикл – это цикл, который никогда не заканчивается.

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

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

Пример 1. Бесконечный цикл с оператором for :

for (; ;) { // последовательность операторов C++ . Оператор выбора switch

Циклы do while и foreach

Цикл do. . . while

Цикл do...while в C# - это версия while с постпроверкой условия. Это значит, что условие цикла проверяется после выполнения тела цикла. Следовательно, циклы do...while удобны в тех ситуациях, когда блок операторов должен быть выполнен как минимум однажды. Ниже приведена общая форма оператора цикла do-while:

do { операторы; } while (условие);

При наличии лишь одного оператора фигурные скобки в данной форме записи необязательны. Тем не менее они зачастую используются для того, чтобы сделать конструкцию do-while более удобочитаемой и не путать ее с конструкцией цикла while. Цикл do-while выполняется до тех пор, пока условное выражение истинно. В качестве примера использования цикла do-while можно привести следующую программу, расчитывающую факториал числа:

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string args) { try { // Вычисляем факториал числа int i, result = 1, num = 1; Console.WriteLine("Введите число:"); i = int.Parse(Console.ReadLine()); Console.Write("\n\nФакториал {0} = ", i); do { result *= num; num++; } while (num

Цикл foreach

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

foreach (тип имя_переменной_цикла in коллекция) оператор;

Здесь тип имя_переменной_цикла обозначает тип и имя переменной управления циклом, которая получает значение следующего элемента коллекции на каждом шаге выполнения цикла foreach. А коллекция обозначает циклически опрашиваемую коллекцию, которая здесь и далее представляет собой массив. Следовательно, тип переменной цикла должен соответствовать типу элемента массива. Кроме того, тип может обозначаться ключевым словом var. В этом случае компилятор определяет тип переменной цикла, исходя из типа элемента массива. Это может оказаться полезным для работы с определенного рода запросами. Но, как правило, тип указывается явным образом.

Оператор цикла foreach действует следующим образом. Когда цикл начинается, первый элемент массива выбирается и присваивается переменной цикла. На каждом последующем шаге итерации выбирается следующий элемент массива, который сохраняется в переменной цикла. Цикл завершается, когда все элементы массива окажутся выбранными.

Цикл foreach позволяет проходить по каждому элементу коллекции (объект, представляющий список других объектов). Формально для того, чтобы нечто можно было рассматривать как коллекцию, это нечто должно поддерживать интерфейс IEnumerable . Примерами коллекций могут служить массивы C#, классы коллекций из пространства имен System.Collection, а также пользовательские классы коллекций.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: