Мы с вами уже рассмотрели одну из конструкций повторения в языке C++ – цикл for. В этой статье будут рассмотрены еще два цикла: while и do while. Они очень похожи между собой. Их синтаксис:
![цикл while в C++ цикл while в C++](https://purecodecpp.com/wp-content/uploads/2014/07/cikl-while-v-c.jpg)
![цикл do while в C++ цикл do while в C++](https://purecodecpp.com/wp-content/uploads/2014/07/cikl-do-while-v-c.jpg)
Отличие состоит только в том, что при начале выполнения цикла while, сразу происходит проверка условия. Если оно возвращает ложь (false), то тело цикла не выполнится ни разу. А при использовании do while, сразу выполнится оператор(-ы) в теле цикла, а потом будет проверено условие в круглых скобках ( ) после ключевого слова while. И аналогично, при возврате false, цикл завершает работу, иначе – выполняется следующий шаг (итерация). То есть тело цикла do while выполнится хотя бы один раз, при любом раскладе.
Поговорим о них в отдельности. Начнем с while. Как говорилось выше, чтобы выполнилось тело цикла, необходимо чтобы при проверке условия в круглых скобках ( ), была возвращена истина (true).
Проверка условия и выполнение тела будет происходить, пока условие не вернет false. Из этого выходит, что для прерывания цикла, в его теле должно происходить что-либо, что повлияет на проверку условия.
Это может быть или введенное пользователем с клавиатуры значение переменной, которая присутствует в проверочном условии цикла. Или это может быть увеличение либо уменьшение управляющей переменной, которая так же задействована в проверочном условии.
Рассмотрим пример с изменением значения управляющей переменной в теле цикла. Постановка задачи: пользователь хочет пополнить карточный счет через терминал. Он вводит сумму с клавиатуры. Предусмотреть в программе возможность изменения ошибочно введенной суммы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <iostream> 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; } |
Управляющая переменная 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 может быть каким угодно. Цикл в любом случае выполнит тело и предложит сделать выбор. Смотрим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <iostream> 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; } |
Запустив программу, увидите, что несмотря на то, что переменная exit изначально равна 0, тело цикла do while выполнится. Это потому, что проверка условия производится ниже тела – в строке 18. Обратите внимание на точку с запятой ; после закрывающей круглой скобки. Для цикла do while она обязательна.
Сравнивая циклы for, while и do while видно, что они похожи. Только в цикле for всё необходимое для его нормальной работы собрано в одной строке (объявление и инициализация управляющей переменной, проверочное условие, изменение управляющей переменной).
Тогда как в циклах while и do while управляющая переменная объявлена до цикла, а ее изменение происходит ниже в теле. Какую конструкцию повторения использовать – решать вам. Чаще циклы while и do while применяются тогда, когда неизвестно изначально, сколько будет повторений (как в нашем примере). Стоит ещё помнить, что в отличии от циклов while и do while , управляющая переменная цикла for не видна за пределами его тела (то есть при выходе из цикла, она уничтожается).
Предлагаю так же обучающее видео на тему циклов в C++. В нём рассмотрен и цикл for:
Вопросы оставляйте в комментариях. По возможности делитесь статьей с друзьями в социальных сетях. Задачи по теме уже есть!
кажеться я отучился.мозги в кашу!
Я вот так решил первую задачу. А можно ли как-то упростить этот код?
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “rus”);
int amount = 0;
int sum = 0;
int number;
do
{
cin >> number;
sum += number;
amount++;
} while (number != 0);
cout << endl;
amount–;
cout << amount << endl;
cout << sum << endl;
cout << sum / amount<< endl;
return 0;
}
#include
#include
using namespace std;// сокращения типа (cout<>)
int main()
{
setlocale(LC_ALL, “rus”);// включение русского языка
int summa = 0;
int kol_vo = 0;
int chislo = 0;
int a ;
while(a > 0)
{
cout <> a;
chislo=chislo+a;
summa = chislo+a;
++kol_vo;
}
kol_vo=kol_vo-1;
cout << "колличество вводов:" << kol_vo << endl;
cout << "Сумма введенных чисел:" << summa << endl;
cout << "соеднее введеных чисел:" << summa/kol_vo << endl;
getch ();
return 0;
}
Задачек бы=)))
Ссылка 1
Ссылка 2
… залейся … мало не покажется.
Ребят, у меня программа зацикливается на месте
(Пожалуйста, введите только \”у\” или \”n\”)
Не подскажите, в чем моя ошибка?
Извините, код скопировался не совсем верно.
И снова, кхм.
#include
using namespace std;
int main()
{
setlocale (LC_ALL,”rus”);
int number = 0;
char answer = ‘y’;
while (answer == ‘y’)
{
cout <> number;
cout << number << " в квадрате равно " << number * number << endl;
cout <> answer;
if (!(answer = ‘y’) || (answer = ‘n’))
{
while ((answer != ‘y’) || (answer != ‘n’))
{
cout <> answer;
}
}
}
return 0;
}
как написать программу
даны N чисел из них нужно найти сколько отрицательных чисел, сколько положительных чисел и сколько нулей
int arr[ N ] = { ... };
int p = 0, m = 0, n = 0;
for( int i = 0; i < N; i++ ) {
m += arr[ i ] 0 ? 1 : 0;
n += arr[ i ] == 0 ? 1 : 0;
}
редактор сожрал строку … но по n += … , по аналогии, должно быть понятно.
первая задача компилятором вполне верное не воспринимается
Думаю стоит уточнить, что цикл for плохо сработает, если шаг изменения управляющей переменной – не целое число, или если управляющая переменная – дробное число.