Как организуется цикл в программе

Операторы в C++ всегда выполняются последовательно, один за другим. И если представить, что у Вас есть некоторый блок кода, который нужно использовать (т.е. повторить) более 1 раза, то вместо того, чтобы копировать этот блок кода несколько раз, Вы можете заключить его внутрь цикла и задать условия выполнения этого цикла.

Циклы в C++ бывают следующих видов:

Давайте рассмотрим каждый вид цикла более детально.

Цикл for в C++

Чтобы лучше погрузиться в тему циклов, давайте для начала рассмотрим пример, в котором у Вас есть некоторый массив (назовём его array_of_int) целых чисел из 10-ти элементов, и Вы хотите проинициализировать каждый элемент этого массива значением индекса, умноженного на 100, а затем вывести на отдельных строках все значения элементов массива на экране консоли.

Вот как будет выглядеть код на C++, решающий эту задачу без использования циклов:

#include using namespace std; int main() < int array_of_int[] = < 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 >; array_of_int[0] = 0 * 100; array_of_int[1] = 1 * 100; array_of_int[2] = 2 * 100; array_of_int[3] = 3 * 100; array_of_int[4] = 4 * 100; array_of_int[5] = 5 * 100; array_of_int[6] = 6 * 100; array_of_int[7] = 7 * 100; array_of_int[8] = 8 * 100; array_of_int[9] = 9 * 100; cout

Запустите эту программу и увидите на экране консоли следующий вывод:

Паскаль с нуля [ч6]. Циклы. While, repeat-until, for.



100
200
300
400
500
600
700
800
900

Эта программа, если в неё вглядеться, содержит существенный недостаток — нам приходится дублировать код для инициализации каждого очередного элемента массива, а также дублировать код, который выводит значение определенного элемента массива на консоль. Чтобы избежать дублирования, давайте посмотрим на вариант этой же программы, но с использованием цикла for, который предоставляется средствами языка C++:

#include using namespace std; int main() < int array_of_int[] = < 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 >; for (int i = 0; i < 10; i++) < array_of_int[i] = i * 100; cout >

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

  • инициализация каждого элемента нужным нам значением
  • вывод значения текущего перебираемого элемента на консоль

Цикл for устроен следующим образом:

В примере, который мы рассматривали выше, инициализирующим оператором цикла является int i = 0. Т.е. мы инициализируем так называемую переменную цикла с именем i. Условием выполнения цикла является оператор i < 10, т.е. пока значение переменной цикла i меньше 10, операторы, помещённые в тело цикла, будут выполняться. Оператором инкремента в нашем случае является i++, где мы наращиваем значение переменной цикла каждый раз на единицу. Операторы инкремента выполняются после каждого очередного прохода цикла, т.е. после выполнения всех операторов, представляющих собой тело цикла.

Python с нуля. Урок 4 | Циклы (for, while)

Наиболее часто в реальных программах встречается цикл for с одним инициализирующим оператором (например, как у нас int i = 0), однако Вы не ограничены в том, чтобы задать несколько инициализирующих операторов. Давайте посмотрим, как это может выглядеть:

for (int i = 0, j = 0; i

Если Вы запустите программу с этим вариантом цикла, то увидите на экране следующее:


100
200
300
400

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

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

  • в самом начале и только один раз исполняются инициализирующие операторы, как правило, устанавливая начальные значения переменных цикла (или переменной, если она одна)
  • затем сразу же проверяется условие выполнения цикла. Если оно в начале первой итерации цикла возвращает результат false или 0, то цикл не будет выполнен ни разу, и произойдет моментальный выход из цикла. Если же условие выполнения цикла возвращает результат true или 1, то выполняются операторы, расположенные в теле цикла.
  • После выполнения всех операторов в теле цикла выполняются операторы инкремента (или оператор, если он всего один). После выполнения операторов инкремента условие выполнения цикла проверяется вновь, и если оно возвращает true или 1, то цикл продолжается, а если возвращает false или 0, то происходит выход из цикла (т.е. завершение цикла).
Читайте также:
Пандион программа как работать

Цикл while в C++

Давайте немного перепишем наш пример с циклом for, который рассматривали выше, и посмотрим на то, как можно выполнить ту же самую исходную задачу с инициализацией элементов нашего массива и их выводом на экран при помощи цикла while:

#include using namespace std; int main() < int array_of_int[] = < 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 >; int i = 0; while (i < 10) < array_of_int[i] = i * 100; cout >

Если Вы запустите этот вариант программы, то увидите тот же результат, что мы получили в самом начале изучения работы цикла for:


100
200
300
400
500
600
700
800
900

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

С циклом while нужно быть внимательным, чтобы не забывать изменять переменную, от которой зависит условие выполнения цикла. Если забыть это сделать, Вы получите бесконечный цикл (англ. infinite loop) — цикл, который никогда не закончится и будет «съедать» процессорное время и ресурсы вашего компьютера (например, выделять всё больше и больше памяти). Если это произойдет, то программа попросту «зависнет», и Вам придётся её завершать принудительно через диспетчер задач, если Вы работаете под ОС Windows. Убрав всего один оператор i++ из примера выше, мы получим такой бесконечный цикл:

#include using namespace std; int main() < int array_of_int[] = < 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 >; int i = 0; while (i < 10) < // это условие будет всегда истинно! array_of_int[i] = i * 100; cout >

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

Напоследок, говоря про цикл while, можно отметить его некоторую схожесть с циклом for в том плане, что если условие выполнения цикла при входе в него вернёт false или 0, то тело цикла не будет выполнено ни разу, и программа C++ перейдет сразу к операторам, следующим за циклом. Если же условие выполнения цикла при входе в него вернёт true или 1, то мы будем выполнять цикл до тех пор, пока это условие возвращает true или 1.

Цикл do . while в C++

Цикл do . while в языке C++ очень похож на цикл while, за исключением той его особенности, что тело цикла будет выполнено всегда, как минимум один раз. Давайте рассмотрим небольшой пример:

#include using namespace std; int main() < int array_of_int[] = < 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 >; int i = 0; do < array_of_int[i] = i * 100; cout while (i

Эта программа с вариантом цикла do . while решает всё ту же задачу инициализации элементов массива и вывода их значений на экран консоли. Вывод на консоль ничем не отличается от предыдущих вариантов с циклами for и while:


100
200
300
400
500
600
700
800
900

Цикл do . while так же, как и обычный цикл while, содержит условие выполнения цикла внутри while. Сразу после ключевого слова do идёт блок операторов, представляющих собой тело цикла. Ещё один момент: обратите внимание, что в самом конце цикла do . while стоит точка запятой: она необходима для завершения цикла, и без неё компилятор C++ выдаст Вам ошибку.

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

Вложенные циклы

Возможности языка C++ позволяют Вам как программисту организовывать вложенные циклы. Без труда можно догадаться, что речь идёт о ситуации, когда Вы «вкладываете» один цикл в другой. Комбинировать и вкладывать друг в друга можно любые типы циклов: можете организовать, к примеру, три вложенных цикла for или внутрь цикла for поместить цикл while. Ваши возможности здесь безграничны, и всё зависит от Вашей фантазии и задачи, выполняемой программой.

Читайте также:
За что отвечает программа svchost exe

Давайте посмотрим на небольшой пример вложенных циклов for:

#include using namespace std; int main() < int matrix_of_int[3][3] = < < 10, 20, 30>, , >; for (int i = 0; i < 3; i++) < for (int j = 0; j < 3; j++) < matrix_of_int[i][j] = (i + 1) * (j + 1); cout cout >

В этом примере мы задаём двумерный массив целых чисел с именем matrix_of_int и инициализируем его статически целочисленными константами от 10 до 90. Двумерный массив ещё принято называть матрицей (англ.

matrix), что и отражено в названии массива. Матрицу можно представить в виде таблицы с определённым количеством строк и столбцов. В нашем примере у нашей «таблицы» 3 строки и 3 столбца.

Дальше мы организовали два цикла for: внешний цикл for по строкам и второй, внутренний, — по столбцам нашей матрицы.

Во внутреннем цикле мы переписываем каждый элемент нашей матрицы, присваивая ему значение произведения индекса строки на индекс столбца, к которым прибавлено по единице: (i + 1) * (j + 1)

Далее мы выводим на экран консоли индекс строки и индекс столбца нашей матрицы, а также значение матрицы в данной строке и столбце, разделённые символом табуляции ( t ). Когда внутренний цикл по столбцам завершается, мы делаем переход на следующую строку при помощи оператора cout

Если Вы запустите эту программу, то увидите на экране следующее:

[0, 0] = 1 [0, 1] = 2 [0, 2] = 3
[1, 0] = 2 [1, 1] = 4 [1, 2] = 6
[2, 0] = 3 [2, 1] = 6 [2, 2] = 9

Всё вывелось так, как должно было: каждый элемент матрицы является произведением индексов его строки и столбца, к которым прибавлены единицы.

Заключение

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

Источник: allineed.ru

Организация циклов в языках программирования.

Если бы циклы не существовали, вряд ли занятие программ-ем было бы оправданным: циклы позволяют записать длинные послед-ти операций обработки данных с пом небольшого числа повторяющихся команд. Если в пр-ме возникает необх-ть неоднократного выполнять оператор, то испол-ся опер-р повтора (цикла). 3 вида цикла:While, Repeat, For. Они испол-ся для организации циклов разного типа.

Выр-я управл-щие повторениями д/иметь булевский тип. Если число повторений опер-ра заранее не известно, а задано лишь условие его повторения исп-ся While, Repeat. Опер-р For испол-ся, если число повторений заранее известно.

Опер-р While(пока) часто наз. цикл с предусл-ем за то, что проверка условия выполнения тела цикла производится в самом начале оператора. Формат записи: While do begin end;

Условие – булевское выражение, тело цикла – простой или составной оператор. Перед каждым выполнением тела цикла вычисл-ся знач-е выраж-я условия. Если результат = true, то тело цикла вып-ся и снова пров-ся условие. В прот-ом случае при ложном условии цикл заканч-ет свою работу. Блок схема

Пока условие истинно, выполн. опер-р цикла. Напр,  10 чисел

Опер-р повтора Repeat аналогичен опер. While, но отлич-ся от него тем, что условие проверяется после очередного выпол-я тела цикла (очередной итерации), и т.о, гарантир-ся хотя бы однократное выполн-ие цикла и критерием прекращения цикла явл. рав-во выр-я константе True.

За это его часто называют циклом с постусловием, т.к. он прекращает выполняться, как только знач-ие выраж-ия условия, записанного после слова Until = True. Этот оператор состоит из заголовка Repeat, тела и условия окончания Until. Формат записи: Repeat Until ; Операторы, заключенные между словами Repeat и Until, явл телом цикла. Сначала вып-ся тело цикла, затем проверяется условие выхода из цикла.

Именно поэтому такой цикл выполниться в  случае хотя бы 1 раз. Если рез-ат булевского выр-ия = False, то тело цикла активизируется еще раз, если рез-ат True, происходит выход из цикла. При программ-ии операторов тело цикла следует обеспечить влияние по крайней мере одного из операторов тела цикла на значение условия, иначе цикл будет выполняться бесконечно.

Напр, проверка корректности ввода данных. Writeln (‘введите положит число’); Repeat Readln(a); If a0

Опер-р повтора For наз. опер-м цикла с параметром, т.к. число повторений задается переменной, наз-й параметром цикла. Сущ-ет 2 формата цикла For: for:= to do begin ; end; Параметр пробегает все значения от нач. до конечного с шагом +1. Если слово to заменить но downto, то шаг параметра = -1.

Этот оператор обеспечивает выполнение цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного. На испол-ие управляющей переменной параметра в цикле for наклад-ся ограничение:*в качестве параметра д/испол-ся простая переменная. *управл-ая переменная д/иметь дискретный тип. *нач. и кон. зн-я диапозона д/иметь тип совмест-мый с типом управл-й переменной. *в теле цикла запрещается явное изменение зн-я управл-ей переменной. *после завершения опер-ра зн-е управл-ей переменной становится неопределенной.

Читайте также:
Правила записи программы информатика

Напр, For i:=n to m do s:=s+I; Writeln(‘сумма’,s); end. Здесь целая переем-ая i принимает послед-ть знач-ий в диапазоне от n до m. При кажд знач-ии i выполн-ся тело цикла. После последнего вып-ия цикла при i=n происходит выход из цикла на продолжение алгоритма. Цикл вып-ся хотя бы 1 раз, если nm и не выполн-ся ни разу, если при nm.

Вложенные опер-ры цикла, если тело цикла явл. циклич. структура, то такие циклы наз. вложенными. Цикл содержащий в себе др. цикл наз. внешним, а цикл содер-ся в цикле – внутренним. Все опер-ры внутр-го цикла д/ распол-ся в теле внешнего цикла. for i:=1 to 10 do for j:=1 to 5 do begin Repeat(a[i,j]); Write(a[i,j]); end; Значение параметра внешнего цикла измен-ся на 1, пар-р внутр-го цикла побегает все значия.

Источник: studfile.net

От транзистора до фреймворка. Часть 10. Циклы в языках программирования

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

Структура процессора и система команд

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

Вычисление значения линейной функции

Проблема в том, что в нашем процессоре нет команды умножения. Однако, мы знаем, что умножение это многократно повторяющееся сложение (подробнее в материале об арифметико-логическом устройстве ). Команда сложения (в прошлом уроке мы писали на Си как раз программу сложения ) в процессоре есть, поэтому это станет простым и хорошим примером того, как на самом низком уровне организованы циклические конструкции.

Пример цикла в языке Си.

При помощи языка С запишем решение этой задачи. Для начала установим значение исходных данных, это параметры линейной функции и значение переменной х . Конструкции, организующие многократное выполнение участка программы называются циклом , а многократно выполняющийся участок программы называют телом цикла . Тут начинается циклическая конструкция while .

Циклическая конструкция while

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

Блок-схема алгоритма

К результату добавляется значение переменной a . Потом из переменной цикла вычитается единица. При вычитании бит переноса, он же флаг переноса, приобретает одно из двух значений. Если он равен 1 , то продолжаем выполнение. При этом флаг переноса будет сброшен в 0 . Следующая проверка заставит программу перейти к началу тела цикла. Чем это все обусловлено?

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

Бит переноса.

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

Появление бита переноса при вычитании

Как можно заметить, бит переноса при этом будет единичный, кроме одного случая. Этот случай вычитания единицы из 0 . Таким образом, чтобы цикл выполнился три раза, переменная цикла должна будет иметь три значения. Это 2 , 1 , 0 . После этого будет произведен выход из цикла. А еще это означает, что из переменной цикла нужно будет заранее вычесть 1 .

Отладка программы цикла.

Выполним отладку программы после ее компиляции из исходного кода на языке C. На первом шаге в аккумулятор загружается значение x , он же переменная цикла. X лежит в 4 ячейке.

Заранее вычитаем из него единицу. Сохраняем его обратно.

Сейчас уже выполняется тело цикла. Заносим в аккумулятор промежуточное значение результата из ячейки 6 . Добавляем к нему переменную. Сохраняем промежуточный результат.

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

Флаг переноса на первом выполнении тела цикла будет 1 . Поэтому произойдет сброс флага и следующая проверка.

Источник: dzen.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru