Тарифы Услуги Сим-карты

Циклы for, while и do while в языке C. Циклы

В этой статье будут рассмотрены еще два цикла: 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 ;

В некоторых случаях необходимо выполнять код до тех пор, пока не будет достигнут нужный результат. Для этого PHP предоставляет циклы while , for и foreach .

Синтаксис цикла while в PHP

Синтаксис цикла while :

Пример использования цикла while в PHP :

В примере цикла while в php , приведенном выше, сначала инициализируется переменная счётчика $ i значением 0 .

Условие цикла while – это $ i < 10 . Это означает, что мы проверяем, меньше ли переменная, чем 10.

Всё, что заключено в фигурные скобки – это инструкции (тело ) цикла. Они повторяются до тех пор, пока условие возвращает значение true . В примере, приведенном выше, $ i выводится на экран, а затем переменная счётчика увеличивается на 1. Это важно чтобы условие цикла, в конце концов, перестало соблюдаться. Если условие цикла соблюдается всегда, например, потому что вы забыли увеличить переменную счётчика $ i , тогда скрипт войдёт в бесконечный цикл. К счастью, через некоторое время PHP прекратит выполнение вашего скрипта.

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

$min) { echo "count1: $count1; count2: $count2
"; $ counter1 += 2; // Сокращённое выражение для $counter1 = $counter1 + 2; $counter2 -= 3; // Сокращённое выражение для $count2 = $count2-3; } ?>

В примере определяются две переменные: $ counter 1 и $ counter 2 . Одна переменная увеличивается на 2, а другая уменьшается на 3. Цикл while выполняется, пока соблюдаются оба условия $ count 1 < $ max и $ count 2 > $ min .

Влияние ключевых слов break и continue на цикл

С помощью команды break можно прервать процесс выполнения цикла while в PHP . Допустим, мы ищем определённого пользователя. Тогда можно пройти по всем пользователям в цикле while . Если найдём нужного пользователя, то остановим цикл с помощью ключевого слова break .

Простой пример использования ключевого слова break :

while ($count < $max) { if ($count == 10) { echo "Останавливаемся на числе 10"; break; } echo "$count,"; $counter += $increment; // увеличивает $count на значение $increment } ?>

Этот код перебирает числа по возрастанию от 0 до $max = 30 , прибавляя к переменной $ count значение $ increment , другими словами число 2. Но если переменная $ count будет равна 10, произойдет выход из цикла while в php .

Ключевое слово continue не завершает цикл while в php полностью , а лишь пропускает оставшуюся часть тела цикла. Приведенный ниже пример демонстрирует это:

while ($count < $max) { $counter += $increment; // увеличивает $payer на $increment if ($count >= 10 && $count <= 15) { echo "Число между 10 и 15
"; continue; }
echo "$count
"; } ?>

Этот цикл начинается с 0 и увеличивает счётчик до значения $ max . Переменная $ counter всегда увеличивается на значение переменной $ increment . То есть принимает значения 0, 2, 4 и т.д.

Если переменная $ count имеет значение между 10 и 15, на экран будет выведен текст и оператор continue пропустит остальные выражения в теле цикла. В результате мы видим, что числа 10, 12 и 14 не выводятся.

Цикл do-while в PHP

Небольшой модификацией while является цикл do — while . В данном случае условие цикла проверяется только после выполнения его тела. Это значит, что тело цикла выполнится хотя бы один раз.

Синтаксис цикла do-while :

Предположим, что мы хотим сгенерировать случайное число, которое должно быть либо между 0 и 10, либо между 20 и 30. Согласно определению функции rand ($ min , $ max ) , можно случайным образом сгенерировать число между $ min и $ max :

10 && $random < 20) { $random = rand (0, 30); }
echo "Наше случайное число: $random"; ?>

Используя php цикл do while , можно получить значение выражения без инициализации переменной $ random . Тело цикла выполняется перед тем, как проверяется условие. Тогда пример, приведенный выше, будет выглядеть следующим образом:

10 && $random < 20);
echo " Наше случайное число: $random"; ?>

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

Циклы 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, а также пользовательские классы коллекций.

Циклы используются для многократного повторения кусков кода. Возможность повторения определенных фрагментов кода — это одна из основных и в тоже время важных задач, которые приходится решать программисту. Большинство программ или сайтов используют циклы, например — для вывода новостной информации или объявлений. То есть в таких задачах необходимо выполнять постоянно операции чтения и записи, и для того чтобы не дублировать один и тот же код на помощь приходят циклы. Циклы достаточно просто объявляются в коде, однако они выполняют сложные задачи, всего лишь простым повторением.

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

Самый часто используемый цикл — это цикл for , его структура показана ниже:

For (/*инициализация переменной; условие; изменение значения переменной*/) { // тело цикла (тут находится код который будет повторяться) }

Инициализация переменной позволяет либо объявить переменную и присвоить ей значение либо присвоить значение уже существующей переменной. Во-вторых, значение этой переменной сообщает программе — истинно или ложно условие цикла. И пока условие цикла — истинно, цикл должен продолжать повторяться. Управляющую переменную обязательно необходимо как-то изменять, иначе цикл будет бесконечный, например можно обновлять её так: i++ , i = i + 2 или даже так i = random(5) . Обратите внимание, что каждую секцию в заголовке цикла, отделяет точка с запятой, что очень важно. Также отметим, что каждый из разделов может быть пустым, хотя точки с запятой все еще должны быть там. Если условие не пустое, то оно оценивается как истинное и цикл будет выполняться до тех пор, пока что-то не сделает условие цикла — ложным. Давайте рассмотрим простой пример использования цикла for .

#include int main() { int i; /* Цикл будет работать до тех пор, пока i < 10, при этом после каждой итерации переменная i будет инкрементироваться(увеличиваться на 1)*/ for (i = 0; i < 10; i++) { /* Имейте ввиду что условие проверяется перед каждым повторением, то есть работа цикла остановится когда переменная i будет равна 10*/ printf("%d\n", i); } getchar(); }

Собственно, результат работы программы:

0 1 2 3 4 5 6 7 8 9

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

Цикл while — очень простой цикл, вот его структура:

While (/*условие*/) { // тело цикл - тут находится код, который необходимо повторять }

Тело цикла начинает выполняться, если условие цикла — истинно. Условие представляет собой логическое выражение, например х == 1 или х! = 7 (х не равно 7). То есть условие может быть абсолютно любым — любое сочетание логических выражений. Вот пример составного условия — x == 3 || x > 10 , это условие будет истинным, если икс будет равен трем или икс будет больше 10. Обратите внимание, что while имеет раздела инициализации или раздела изменения управляемой переменной, поэтому перед использованием этого цикла, сначала необходимо объявить переменную, которая будет проверяться в условии цикла и в теле цикла изменять значение этой переменной. Собственно, давайте рассмотрим простой пример с использованием цикла while:

#include int main() { int var = 0; /* обязательно сначала объявляем переменную */ while (var < 10) { /* пока значение переменной var меньше 10 */ printf("%d\n", var); var++; /* обновляем значение в переменной var(если этого не делать, то условие цикла всегда будет истинным, тогда цикл будет - бесконечным) */ } getchar(); }

Вот мы и рассмотрели еще один пример использования циклов, и как видите и в этом примере нет ничего сложного. Просто представьте себе, что цикл всегда начинает повторять код, который находится в теле цикла. Как только выполняется последний оператор в теле цикла, выполняется проверка условия цикла. Если условие все ещё — истинное, то цикл продолжает и дальше работать, а если условие — ложное, то выполняется выход из цикла.

Есть еще один тип циклов — do while . Этот цикл полезен, когда необходимо выполнить код по крайней мере — 1 раз. Рассмотрим его структуру:

Do { // тело цикла } while (/*условие*/);

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

#include int main() { int i = 0; do { /* Напечатает сообщение и завершит работу*/ printf("Привет! Я цикл do while\n"); } while (i != 0); getchar(); }

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

Тем, что в 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. Таким образом, циклически выполняется действие суммирования всех целых чисел из, указанного пользователем, интервала.