Описание параметра цикла for в заголовке цикла соблюдает принцип локальности: переменная описывается в том месте, где она впервые понадобилась

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

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

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

Цикл for

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

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

Цикл for существует в двух формах:

Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.

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

Цикл while

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false – то нет.

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

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.

В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана.

Primary tabs

Forums:

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

В этом уроке — мы познакомимся с первый из них — циклом For.

Цикл For — схема работы

Цикл For также называют циклом с известным числом повторений.
Он обладает следующей структурой (изобразим её на блок-схеме):

Как видим на схеме, в цикле for имеются:

    Заголовок цикла (шестиугольный блок на схеме выше) — а котором описывается как именно будет изменяться счётчик цикла (на схеме выше это переменная $i$).

Счетчик цикла — это специальная переменная (типа integer), для которой на основании правой и левой границы цикл for определяет ряд значений, которые она "проходит" при выполнении цикла.
В примере на схеме в качестве левой и правой границы указаны числа $1$ и $10$, то есть переменная $i$ должна будет "пробежать" по ряду значений:

— для каждого из этих значений тело цикла будет повторяться (в данном случае 10 раз). Правая и левая границы всегда должны обладать типом integer.

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

    — здесь в теле программы тоже три операции (но уже конкретные) и тот же диапазон значений счетчика, что и на блок-схеме. Запустите программу и посмотрите на результат.

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

    Если правая граница счётчика меньше левой — downto

    Если правая граница для счётчика цикла меньше чем левая то необходимо использовать вместо конструкции:

    Разбор практических примеров

    Пример №1 — использование значений счетчика

    Вывести на экран все числа от 1 до 125.

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

    Пример №2 — условный оператор внутри цикла

    Вывести на экран все нечетные числа от 37 до 1025.

    Здесь для решения в сравнении с решением предыдущей задачи просто изменим диапазон значений счетчика и добавим в тело цикла условный оператор с проверкой остатка от деления на $2$:

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

    Пример №3 — downto

    Задача:
    Выведите на экран все число от 133 до 57.

    Решение (тут всё просто):

    Пример №4 — downto и цикл в одной из веток условного оператора

    Пользователь вводит целое число, если оно больше $8$ выведите на экран все числа от этого числа до $5$ (в обратном порядке), иначе сообщите об ошибке.

    Пример №5 — условный оператор с составным условием внутри цикла

    Выведите на экран, все четные числа, делящиеся на 7 нацело, лежащие в диапазоне от 28 до 117.

    Решение:
    В этой задаче нам необходимо перебрать все числа от 28 до 117 (будем делать это циклом), проверяя каждое число, на соответствие сразу двум условиям:

    1. является четным — т.е. по сути делится на 2 нацело;
    2. делится нацело на 7;

    Так оба условия для выводимого числа нужно проверять одновременно (они должны выполняться одновременно— только тогда его можно выводить), то будем использовать логическое И.
    Третье же условие принадлежности диапазону будет гарантировать сам цикл for — так как мы будем перебирать только числа из этого диапазона, а потом в услвоном операторе проверять его не нужно, в качестве очередного числа используем счетчик цикла:

    Пример №6 — логические выражения, условия внутри цикла + анализ условия

    Выведите на экран, все четные числа от 35 до 117 и все числа, делящиеся на $5$ нацело, лежащие в диапазоне от 45 до 178.
    Указание: сначала можно решить задачу двумя циклами, но потом перепишите с использованием одного цикла, в теле которого составьте логическое выражение, описывающее подходящие числа (используйте логические операции).

    Решение двумя циклами:

    Решить двумя циклами проще — достаточно пройтись по двум числовым "отрезкам" (диапазонам) сначала циклом по диапазону [35..117], а потом по диапазону [45..178]. Внутри тел циклов надо проверять условия, которые написаны в задаче с помощью условного оператора.

    — заметьте, что в этом решении числа выводится не по порядку, что не очень хорошо. В следующем решении мы это исправим.

    Решение одним циклом:

    Чтобы решить задачу одним циклом (используя единственную конструкцию for), нам стоит заметить, что отрезки [35..117], а потом по диапазону [45..178] пересекаются — так как:
    $35 lt 45 lt 117 lt 178$
    — это значит, что мы можем просто перебрать все числа от 35 до 178, и:

    1. сначала проверяя какому отрезку они принадлежат,
    2. а потом какое условие требуется для вывода чисел из этого отрезка,

    — вывести только то, что нам нужно.

    Приведём код, решающий задачу одним циклом:

    — здесь внутри тела цикла стоит два независимых условных оператора, числа при выводе упорядочены, но есть дублирование, так как например 50 и четное и делится на 5 и находится на пересечении диапазонов.
    Чтобы избежать дублирование надо сделать так, чтобы для каждого очередного числа из значений $i$ положительно выполнялось максимум одно условие — тогда очередное значение $i$ либо будет выведено один раз либо не будет выведено вообще.

    Поэтому сделаем проверку второго условия, альтернативой на случай неуспеха первого — для чего введём ветку ложности в первый условный оператор и вложим в неё второй (это потребует совсем незначительных правок):

    — заметьте, что во вложенном в else условии проверяется только левая граница диапазона [45..178] — это связано с тем, что значения $i$ в заголовке цикла итак ограничены сверху числом 178.

    Самостоятельная работа

    Вопросы

    1. Зачем нужен цикл for?
    2. Что такое заголовок цикла?
    3. Что такое счетчик цикла?
    4. Что такое тело цикла?
    5. Переменной $i$ в цикле for левую границу установили в $5$, а правую в $12$ — сколько раз выполнится цикл?

    Задачи

    1. Выведите на экран, все четные числа от 35 до 64.
    2. Пользователь вводит целое число, если оно больше единицы, то выведите на экран все целые числа от этого числа до единицы (в обратном порядке), которые делятся на 5 без остатка. Иначе (если введённое пользователем число не больше единицы) сообщите об ошибке.
    3. Пользователь вводит целое число, если оно больше 100, то выведите на экран все числа от этого числа до $1$, иначе же все числа от $1$ до этого числа.

    Подсказка: в каждой ветке условного оператора тут должно быть по одному циклу.

  • Выведите на экран, все нечетные числа, делящиеся на 3 нацело, лежащие в диапазоне от 35 до 117.
  • Выведите на экран, все четные числа от 35 до 117 и нечетные числа, лежащие в диапазоне от 45 до 99.
    Указание: сначала можно решить задачу двумя циклами, но потом перепишите с использованием одного цикла, в теле которого составьте логическое выражение, описывающее подходящие числа (используйте логические операции).