Как найти цикл в информатике

Циклический алгоритм.

Алгоритм, в
котором действия повторяются , называется циклическим.

1. Цикл с предусловием.

Действия в
данном  цикле повторяются, пока
выполняется условие. Условие проверяется в самом начале цикла.

Блок-схема:

В общем виде цикл реализуется записью:
    while <условие>

do <действие>;
Если тело цикла содержит более одного действия, то необходимо использовать
операторные скобки:
    while <условие> do
    begin
      <действие 1>;
      <действие 2>;
      …
      <оператор n>;
    end;


2. Цикл с постусловием.

Действия в данном
цикле повторяются, до тех пор, пока не выполнится  условие. Условие проверяется в конце цикла.

Блок-схема:



В общем виде цикл записывается так:


   
 repeat

      <действие>;


  
  until <условие>;


3. Цикл с
параметром.

Блок-схема:

Если при изменении переменной параметра необходимо использовать переход к
следующему значению, то используется оператор to;
если переход необходимо осуществить к предыдущему значению, то используется
оператор downto. Тогда в общем виде цикл
записывается так:
    for I:=I0 to In do
      begin
        <действие 1>;
        <действие 2>;
        …
        <действие n>;
      end;

mihalchenkova@sch1640.ru

 

Пример: задано целое число. Вывести на печать все цифры введенного числа. 
1 способ (Цикл с предусловием):

   

var a,b:longint; 
    Begin 
      read(a); 
      while a<>0 do 
        begin 
          b:=a mod 10; 
          write(b:3); 
          a:=a div 10; 
        end; 
    еnd.


2 способ (Цикл с постусловием):

         var a,b:longint; 
           Begin 
             read(a); 
             repeat 
               b:=a mod 10; 
                writeln(b); 
               a:=a div 10; 
            until a=0; 
           End.


Пример: найти сумму первых n натуральных чисел.

    Var i,N,S:integer; 
    Begin 
      readln(N); 
      S:=0;

      For i:=1 to N do 
        S:=S+i; 
    End. 

Тест «Циклы»

План урока:

Понятие циклического алгоритма

Программирование циклического алгоритма

Операторы цикла

Решение задач с использованием операторов while, repeat, for

Понятие циклического алгоритма

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

Циклические алгоритмы – это алгоритмы, в которых некоторая часть операций повторяется многократно.

Цикл – конструкция с оператором, который повторяется определённое или неопределённое заранее количество раз. Действия, выполняющиеся последовательно внутри цикла, называют телом цикла.

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

Циклы разделяют на три типа в зависимости от метода организации повторений:

  • Цикл, в котором задано условие окончания работы;
  • Когда известно условие продолжения работы цикла;
  • Когда известно число повторений цикла.

1 cikly razdelyaut na tri ripa

Программирование циклического алгоритма

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

Цикл с предусловием

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

2 cikl s predusloviem

Цикл с постусловием

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

Тело цикла с постусловием всегда выполняется как минимум один раз, независимо от истинности или ложности условия. Это его ключевое отличие от цикла с предусловием.

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

3 cikl s postusloviem4 cikl s postusloviem drugoi variant 

Цикл с заданным числом повторений

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

4 cikl s postusloviem drugoi variant

Операторы цикла

Для программирования циклических алгоритмов и корректного выполнения программ с их использованием, необходимо знать операторы цикла. Чаще всего, в языке Паскаль используют операторы цикла: for, repeat и while. Разберем их подробнее.

Оператор while

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

6 uslovie operatora

Если переводить его дословно, то можно сказать, что он работает по принципу «пока <условие> выполнять действие <оператор 1>», а заканчивается при переходе программы на слово end. Перед выполнением операторов внутри цикла условие обязательно проверяется и уже дальше, в зависимости от его истинности, программа либо выполняет тело цикла, либо переходит к последующим операторам.

Решение задач с использованием оператора while

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

Задача 1. На вход подаются целые числа. До тех пор, пока не будет введено число, которое больше 17, программа должна вывести сумму полученного числа и числа 8. Когда вводимое число будет больше 17, то после выполнения программы цикл завершается.

Решение.

7 kod na vhod podautsya celye chisla

Шаг 1. Для начала необходимо дать программе название.

Шаг 2. Учитывая, что на вход подаётся целое число, указать тип данных, в данном случае – integer.

Шаг 3. Запись командного блока. Нужно написать слово, обозначающее начало, begin.

Шаг 4. Нужно дать переменной a значение 1, чтобы цикл начался автоматически.

Шаг 5. Запись цикла. Поскольку известно условие окончания работы, для этой задачи необходимо написать «пока a меньше или равно 17» и сделать переход к последующим операторам путём написания составного цикла.

Шаг 6. Первоначальный вывод программы. Необходимо написать то, что программа будет выдавать в первую очередь. В данном случае, она будет запрашивать целое число, запрос так и пишется: «Введите целое число: » .

Шаг 7. Запись необходимых операторов. Используя оператор readln программа считывает данные и переводит курсор на новую строку. Далее она производит операции над поступившими данными.

Шаг 8. Запись суммы. Исходя из условия задачи необходимо сделать так, чтобы программа выводила сумму входящего числа и числа 8. Осуществить это можно используя оператор writeln.

Шаг 9. Запись вывода программы после цикла. После того, как программа выполнит свою работу в цикле, необходимо показать, что она из него вышла. Можно просто попрощаться, как в данном случае.

Шаг 10. Проверка правильности записи алгоритма. В конце программного блока, после слова end нельзя забывать точку, её обязательно нужно поставить.

Оператор repeat

Оператор цикла repeat until используется для создания циклического алгоритма с постусловием. Его схема выглядит так:

8 operator cikla repeat until

Дословно оператор Паскаля repeat можно перевести как «повторяй <оператор 1>, до <условие>». В зависимости от истинности условия, либо происходит переход на повторение «оператора 1», либо осуществляется выход из цикла к последующим операторам.

Оператор repeat имеет два важных отличия от оператора while:

  • в операторе repeat сначала выполняется тело, а затем проверяется условие;
  • в операторе repeat прописывается условие завершения цикла, тогда как в операторе while – условие его продолжения.

Решение задач с использованием оператора repeat

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

Решение.

9 kod pridumat algoritm i napisat programmu

Шаг 1. Название программы. В данном случае — «задача 1».

Шаг 2. Учитывая, что на вход подаются целые числа, требуется указать тип данных – integer.

Шаг 3. Командный блок. Запись начального слова begin.

Шаг 4. Вывод запроса программы. Поскольку программе необходимо целое число, нужно попросить пользователя ввести его. Осуществляется это с помощью процедуры writeln и текста «Введите целое число, которое больше 1: ».

Шаг 5. Необходимо присвоить переменной i значение 1 для того, чтобы последовательность начиналась с натурального числа.

Шаг 6. Запись цикла. Учитывая, что используется цикл с постусловием, необходимо сначала записать оператор, который будет повторяться, затем увеличить i на 1, чтобы образовывалась последовательность, и уже после этого прописать условие повторения. В данной задаче цикл перестаёт повторяться тогда, когда переменная i принимает значение больше введённого числа, которое является последним членом последовательности.

Шаг 7. Проверка программы на правильность в выводе. В результате своей работы программа должна вывести последовательность натуральных чисел от 1 до n, через пробел.

Оператор for

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

10 operator for

Дословно его можно перевести как «для переменной в значении от начального к конечному выполнять <оператор 1> ».

Решение задач с использованием оператора for

Рассмотреть пример с оператором for можно при написании короткого алгоритма для следующей задачи.

Задача 1. Напишите на одном из языков программирование алгоритм, который выводит квадраты чисел от 1 до 10.

Решение.

11 reshenie zadach s ispolzovaniem operatora for

Шаг 1. Необходимо дать программе название.

Шаг 2. Поскольку на вход числа не подаются, тип указывается в зависимости от данных, которые изначально находятся в программе. В данном случае – это целые числа. 

Шаг 3. Запись блока с командами алгоритма.

Шаг 4. Перебор последовательности чисел осуществляется в цикле for, в котором счетчик i пробегает значения от 1 до 10, а расчет и вывод квадратов осуществляется в процедуре write.

Решение задач с использованием операторов while, repeat, for

Задача 1 Разработать алгоритм программы, которая выведет таблицу умножения чисел от 1 до 10 на 9.

Решение

12 reshenie zadach algoritm programmy

13 razrabotat algoritm programmy

Для решения можно написать два вида кода. Однако, этапы разработки программы, задачи, которые ей необходимо выполнить, очень похожи на прошлые примеры, и она ничем не отличается от решения обычной задачи. Поскольку различие в этих двух кодах лишь в использованном операторе while и for, то рассматривать их по-отдельности нет смысла. Последовательность написания первого кода выглядит так:

Шаг 1. Нужно назвать программу.

Шаг 2. Так как пользователь не вводит никаких данных, то их можно ввести в сам код программы. Тип используемых данных в данном случае – это integer.

Шаг 3. Написание команд. Изначально нужно сделать так, чтобы программа вывела название того, для чего она предназначена. В данной задаче это «Таблица умножения на 9».

Шаг 4. Запись цикла for. С помощью него программа будет последовательно умножать числа от 1 до 10 на 9 и составлять таблицу умножения путём вывода каждого значения по схеме «9x, i, =, p», где i – умножаемое на 9 число, p – результат произведения 9 и i.

Шаг 6. Программа завершает свою работу. Необходимо проверить правильность выведенных данных и, если это необходимо, поправить код для более корректной работы.

Цикл в программировании — это управляющая конструкция, которая заставляет какой-то блок кода выполняться несколько раз. Циклы есть в большинстве языков программирования. Чаще всего их объявляют командами for, while или repeat.

Блок кода, который нужно повторять, называется телом цикла. Там может быть практически любой код, необходимый разработчику. Сама управляющая конструкция описывает, как долго повторять действия: можно задать четкое количество повторений или заставить цикл выполняться до достижения какого-то условия.

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

Кто и зачем пользуется циклами

Циклы встречаются в работе большинства программистов практически на всех языках программирования. Они есть в Java, JavaScript, PHP, Python, C++ — везде. Циклов в привычном виде нет разве что в очень низкоуровневых языках, близких к «железу», таких как ассемблер.

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

  • построчно посчитать данные из файла;
  • обработать каждый элемент структуры данных по очереди;
  • видоизменить целый ряд данных;
  • решить математическую задачу;
  • обновить экран.
  • решить математическую задачу;
  • обновить экран.

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

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

Какими бывают циклы

Обычно в языках программирования несколько видов циклов. У каждого из них свое назначение. Разберемся с основными.

For. Это цикл, который выполняется заданное количество раз. В большинстве C-подобных языков (то есть таких, которые внешне похожи на C и C++) он имеет похожую структуру:

for (<объявление переменной>; <условие>; <действие>) {

<подпрограмма>

}

Объявление переменной — это создание итератора, переменной, которая будет изменяться на каждом шаге цикла. Когда итератор достигнет какого-то значения, цикл закончится.

Условие описывает, должен ли цикл продолжаться. Пока оно выполняется, цикл работает. Чаще всего условие — итератор меньше или больше определенного числа. Соответственно, когда итератор достигает указанного значения, цикл останавливается.

Действие — то, что нужно выполнить в конце каждой итерации. Сюда записывают изменения итератора: например, добавить к нему единицу или отнять какое-то число.

Стандартный случай — задается итератор, равный 0. Условие — итератор меньше какого-нибудь N. Действие — прибавить к итератору единицу. Цикл будет выполняться N+1 раз, потому что отсчет идет с нуля. Есть и вариации, их рассмотрим ниже.

В некоторых языках, таких как Python или Pascal, синтаксис цикла For другой. Но суть та же: им пользуются, когда нужное количество действий известно заранее.

For in / for of / for-each. Частный случай цикла for — когда нужно пройти по структуре данных. Для этого в некоторых языках существует особая конструкция. Это цикл for, который вместо итератора работает с самой структурой данных, например массивом или объектом.

В JavaScript такой цикл называется for of (есть еще for in, но он работает немного иначе), в Java — for-each, в Python — for in. Синтаксис примерно такой:

for <итератор> in* <структура данных> {

<подпрограмма>

}

* in приведено для примера. В JS там не in, а of, а в Java и C++ — вообще двоеточие.

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

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

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

While с предусловием. While — совсем другой случай. Это цикл, который используют, если нужное количество действий заранее неизвестно. Он может выполниться несколько раз, один раз, бесконечное количество раз — или вообще не выполниться ни разу. Слово while переводится как «пока» и отражает суть: пока верно какое-то условие, цикл выполняется.

Синтаксис у него примерно такой, хотя в зависимости от языка детали могут различаться:

while (<условие>) {

<подпрограмма>

}

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

While с постусловием. Это вариация цикла while. Ее единственное отличие — условие пишется не до, а после тела цикла:

do {

<подпрограмма>

}

while (<условие>);

Условие будет проверяться, когда подпрограмма уже выполнится. А еще такой цикл всегда исполнится как минимум один раз, до проверки условия. Его используют реже, чем while с предусловием, но иногда такая конструкция выручает.

Блок-схема циклов с предусловием и постусловием

Repeat / until. В некоторых языках есть еще один вид цикла — repeat или until. Он похож на while, но, в отличие от него, описывает не условие для продолжения, а условие для выхода из цикла. Цикл закончится, когда условие окажется верным.

В Pascal это цикл с постусловием, который описывается так:

repeat {

<подпрограмма>

}

until (<условие>);

А, например, в Perl это цикл с предусловием:

until (<условие>) {

<подпрограмма>

}

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

Как можно модифицировать циклы

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

Цикл по структуре данных. Это цикл for in / for of, о котором мы уже говорили. Обычным циклом тоже можно пройти по массиву: запустить счетчик от 0 до длины структуры данных. Но тут есть детали, которые стоит прояснить подробнее.

Структура данных должна быть итерируемой. Это свойство некоторых сущностей в программировании — оно говорит, что содержимое сущности можно перечислить. У итерируемых объектов есть внутренний итератор — указатель, который служит для перечисления.

Если структура не итерируемая, то пройти по ней циклом for in / for of обычно нельзя. В большинстве языков программирования это работает именно так.

Структуру можно сделать итерируемой: написать свой итератор или присоединить стандартный. Такая возможность есть в большинстве языков программирования и помогает тонко управлять перебором структур данных.

Цикл в обратную сторону. Тут все проще: цикл for можно запустить не только от 0 до какого-то числа, но и наоборот. Тогда итератор на каждом шаге будет не увеличиваться, а уменьшаться на единицу. Соответственно, цикл пройдет столько же раз, но в обратном направлении. Иногда эта возможность бывает полезной.

Кстати, повернуть цикл for в другую сторону — не единственная его модификация. Можно, например, сделать цикл с шагом 2 и больше, чтобы итератор изменялся не на 1, а на 2 или другое число. Можно вообще не складывать с ним или вычитать из него числа, а умножать или делить. Вариаций много. Но используют их не так часто, чтобы не усложнять код: хорошая практика — делать программу понятной и легко читаемой.

Вложенный цикл. Его иногда называют двойным циклом. Это цикл, в который вложен другой цикл. Чаще всего это цикл for.

Тело внешнего цикла — внутренний цикл. А уже внутри могут быть разные подпрограммы.

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

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

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

Бесконечным чаще всего становится цикл while, но в теории таким можно сделать и цикл for — например, если не менять итератор или установить невозможное условие для выхода.

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

Как прервать цикл

Существует несколько способов остановить выполнение цикла. Чаще всего используют тот, который предусмотрен самой конструкцией, — невыполнение условия. Но есть и другие возможности. Пользоваться ими не всегда корректно.

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

Условия могут быть разными, в том числе сложными, состоящими из нескольких частей. Ниже мы расскажем про break и continue — в большинстве случаев грамотно составленные условия помогают обойтись без использования этих операторов.

Пропуск итерации. Если по какой-то причине в цикле нужно закончить итерацию раньше времени и перейти на следующую, для этого есть специальная команда. Обычно она называется continue. По сути, это оператор, который говорит программе: «Закончи это повторение, продолжи со следующего шага».

Continue нужно просто написать в том месте, где вы хотите выйти из текущей итерации, — например, если в программе выполнилось какое-то условие.

На практике continue используется не слишком часто, во многих языках его считают плохой практикой. Его можно заменить условным оператором.

Выход из цикла. Можно экстренно выйти из цикла в любой момент. Для этого во многих языках программирования существует команда break. Она означает «Прерви выполнение подпрограммы и выйди из нее».

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

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

Команду можно использовать не только в циклах, но и, например, в условных структурах if/else.

Пауза. Некоторые языки дают возможность временно приостановить цикл, как бы установить задержку для его выполнения. Например, подождать несколько секунд — для этого есть специальные функции. Как реализовать такую возможность, зависит от языка и ситуации.

Что нужно знать при использовании циклов

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

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

Пользоваться операторами break и continue без нужды — плохая практика в большинстве языков программирования. Они нарушают структуру программы, делают код менее логичным и предсказуемым.

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

Хотите узнать больше про языки программирования? Запишитесь на курсы и станьте разработчиком на одном из востребованных современных языков.

§1. Алгоритмическая конструкция «Цикл». Операторы цикла While и Repeat

1.1 Алгоритмическая конструкция «Цикл»

Зачастую в задаче нужно повторять одни и те же действия много раз. Рассмотрим следующий пример: вывести на экран квадраты чисел от `1` до  `100`.

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

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

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

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

1.2. Оператор while

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

Первый оператор цикла называется While и реализует алгоритмическую конструкцию с предусловием. В общем виде он записывается следующим образом:

while условие do оператор

Слова while и do являются служебными зарезервированными словами языка. Под условием (аналогично оператору if) понимается выражение, результат вычисления которого имеет тип boolean. Работает этот оператор следующим образом. Сначала вычисляется условие. Если в результате получилось true, то мы заходим в цикл, то есть выполняем тело цикла и возвращаемся вновь к вычислению условия. Если же получилось false, то происходит переход к следующему оператору в программы, и входа в цикл не будет. Фактически оператор while является многократным применением оператора if с пустой веткой else. Аналогично оператору if, тело цикла должно состоять из `1` оператора. Если нужно исполнить несколько, то следует использовать операторные скобки (begin end).

Возможна ситуация, когда цикл будет выполняться бесконечное количество раз (зациклится). Например, while 2*2=4 do… Что написать после do, совершенно не важно, важно, что оно будет выполняться, пока 2*2=4, а это всегда так, и никогда не изменится. Значит, чтобы избегать зацикливания, параметры условия должны быть переменными, например while x*x=4 do … Хотя это тоже не гарантирует отсутствие зацикливания. Поэтому при написании программ нужно всегда внимательно следить за тем, какие условия мы пишем в операторе цикла, чтобы не случилось ситуации зацикливания.

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

1.3. Примеры задач

Рассмотрим несколько примеров задач на оператор цикла.

Дано целое число, не меньшее `2`. Выведите его наименьший натуральный делитель, отличный от `1`.

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

var i,n:integer;

begin

  readln(n);

  i:=2; 

  while n mod i <> 0 do

    i:=i+1;

  end;

  writeln (i);

end.

В первый день спортсмен пробежал `x` километров, а затем он каждый день увеличивал пробег на `10%` от предыдущего значения. По данному числу `y` определите номер дня, на который пробег спортсмена составит не менее `y` километров. Программа получает на вход действительные числа `x` и `y`. Программа должна вывести одно натуральное число.

В этой задаче нам нужно реализовать постепенное увеличение пробега. То есть, на каждом шаге цикла мы будем сохранять значение пробега в соответствующий день в одной переменной, а номер этого дня – в другой. Завершение, когда значение первой переменной станет не меньшим чем `y`. Приведём код программы. Все переменные, отвечающие за километры, имеют  тип real (из условия).

var x,y:real; i:integer;

begin

  readln(x,y);

  i:=1;

  while x<y do begin

    x:=x/100*10+x;

    i:=i+1;

  end;

  writeln(i);

end.

Дано натуральное число `N`. Вычислите его сумму цифр.

Для решения этой задачи на каждом шаге цикла нужно изменять наше число: при помощи операции mod можно выделить последнюю цифру из числа и прибавить её к сумме, а затем её надо выбросить из числа при помощи операции div. Делить нужно, естественно, на `10`. Критерий завершения – когда число станет равным нулю, ибо это будет означать, что мы уже рассмотрели все цифры и поделили на `10` однозначное число (по свойствам операции целочисленного деления известно, что при делении меньшего числа на большее получается ноль). Приведём код программы.

var a,n,s:integer;

begin

  readln(n);

  s:=0;

  while n>0 do begin

    a:=n mod 10;

    s:=s+a;

    n:=n div 10;

  end;

  writeln(s);

end.

Ввести целое число `n`. Вывести `»YES»`, если оно простое, и `»NO»`, если оно составное.

Эта задача демонстрирует сразу две важные вещи. Во-первых, как проверять делимость целых чисел, а во-вторых, технику флажков. Флажком называется переменная, которая имеет некоторое начальное значение и меняет его, если происходит определённое событие. Как правило, флажок имеет тип boolean.

В нашей задаче мы будем перебирать числа от `2` до квадратного корня из `n` и проверять, делится ли `n` на каждое из них. Изначально предположим, что `n` — простое, и присвоим флажку значение true, но если `n` поделится на какое-нибудь число, это будет значить, что оно составное, и, соответственно, флажок «упадёт» на значение false. Проверять на делимость нужно, сравнивая остаток от деления с нулём.

var n,i:integer;

        f:boolean;

 begin

  readln(n);

  f:=true;

  for i:=2 to round(sqrt(n)) do

    if n mod i = 0 then f:=false else;

    if f=true

        then writeln(‘YES’)

        else writeln(‘NO’);

end.

1.4  Оператор repeat

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

repeat

  Оператор 1;

  Оператор 2;

….

  Оператор N

until условие

Все операторы, написанные между repeat и until, являются телом цикла. Это выгодно отличает оператор repeat от других циклов — составной оператор здесь не требуется, а операторными скобками можно считать слова repeat и until. Работает этот оператор по следующему алгоритму:

1) выполняется тело цикла;

2) вычисляется значение условия. Если получилось true, то выход из цикла и переход к следующему оператору программы, в противном случае переход к пункту 1.

Отличительная особенность оператора цикла repeat заключается в том, что тело  всегда выполняется, по крайней мере, один раз. Это нужно учитывать в задачах при выборе оператора цикла. Аналогично оператору while, цикл repeat может зациклиться, правда в случае, когда условие никогда не принимает значение true, например,  repeat…until 2*2=5.

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

Типы циклов

Цикл For

for (int i=0; i<10; i++) { тело }

i — это переменная-счётчик, которая сначала равна нулю. До тех пор, пока она меньше 10, выполняется тело цикла, затем счетчик увеличивается на единицу. For — цикл с предусловием. Это значит, что сначала проверяется условие, и если оно true, то тело выполняется. В скобках объявляется тип переменной счётчика и её начальное значение. Затем указывается условие конца цикла и способ, которым изменяется значение счётчика.

Цикл Foreach (или совместный цикл)

for (int element :array) { тело }

Тело этого цикла выполнится для каждого элемента коллекции. В переменной element будет доступен по очереди каждый элемент массива array.

Цикл While

while(i < 10) { тело }

Относится к тому же типу циклов, что и For, — цикл с предусловием. С его помощью можно создать безусловный цикл, например while(1) — бесконечный цикл. Чтобы его закончить, нужно использовать служебное слово break.

Цикл Do While

do { тело } while (i<10)

Do While относится к типу циклов с постусловием. Однако здесь код выполнится как минимум один раз, даже если условие false.

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

int array[][] = {{1, 2, 3}, {3, 4, 5}}

for (i=0;i<3;i++) {
    for (j=0;j<3;j++) {
        printf(array[i][j])
    }
}

Циклы можно помещать внутрь друг друга. Это удобно для перебора многомерных коллекций. Код в примере выше выведет в консоль значение каждого элемента из двумерного массива array.

Операторы циклов

Break

while (true) // бесконечный цикл
    {
         std::cout << "Введите 0 чтобы выйти, или любое число чтобы продолжить: ";
         int val;
         std::cin >> val;
 
         // Выходим из цикла, если пользователь ввел 0
         if (val == 0)
             break;
    }

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

Continue

Оператор Continue даёт циклу команду выйти из текущей итерации и перейти к следующей.

Этот код выведет в консоль все нечетные числа из диапазона от 0 до 10:

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;
    }
    cout << i << "n";
}

Понравилась статья? Поделить с друзьями:

Не пропустите также:

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

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии