Мы с вами уже рассмотрели одну из конструкций повторения в языке C – цикл for. В этой статье будут рассмотрены еще два цикла: while і do while. Они очень похожи между собой. їх синтаксис:
Отличие состоит только в том, що при початку виконання циклу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;
сума + = число;
кількість ++;
} 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 << "Сумма введенных чисел:" << сума << endl;
cout << "соеднее введеных чисел:" << summa / kol_vo << endl;
Геч ();
return 0;
}
Задачок б =)))
Ссылка 1
Ссылка 2
… залийся … мало не покажеться.
хлопців, у мене програма зациклюється на місці
(Будь ласка, введіть тільки ”у\” или \”n\”)
Не підкажете, у чому моя помилка?
Вибачте, код скопіювали не зовсім вірно.
І знову, кхм.
#include
using namespace std;
int main()
{
setlocale (LC_ALL,”rus”);
INT число = 0;
голець відповідь = «у»;
while (відповісти == «у»)
{
cout <> number;
cout << number << " в квадраті одно " << number * number << endl;
cout <> answer;
if (!(відповідь = «у») || (відповідь = «п»))
{
while ((answer != «А») || (answer != «П»))
{
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;
}
редактор сожрал строку … але п + = … , за аналогією, має бути зрозуміло.
перше завдання компілятором цілком вірне не сприймається
Думаю варто уточнити, що цикл for погано спрацює, якщо крок зміни керуючої змінної – не ціла кількість, або якщо керуюча змінна – дробове число.