#10.1 Цикл For в Паскаль. Цикл с известным числом повторений (цикл с параметром). Тело цикла.
В Паскале можно использовать три конструкции для организации циклов, они известны по именами:
- For
- While
- Repeat
В этом уроке -- мы познакомимся с первый из них -- циклом 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 (будем делать это циклом), проверяя каждое число, на соответствие сразу двум условиям:
- является четным -- т.е. по сути делится на 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, и:
- сначала проверяя какому отрезку они принадлежат,
- а потом какое условие требуется для вывода чисел из этого отрезка,
-- вывести только то, что нам нужно.
Приведём код, решающий задачу одним циклом:
-- здесь внутри тела цикла стоит два независимых условных оператора, числа при выводе упорядочены, но есть дублирование, так как например 50 и четное и делится на 5 и находится на пересечении диапазонов. Чтобы избежать дублирование надо сделать так, чтобы для каждого очередного числа из значений $i$ положительно выполнялось максимум одно условие -- тогда очередное значение $i$ либо будет выведено один раз либо не будет выведено вообще.
Поэтому сделаем проверку второго условия, альтернативой на случай неуспеха первого -- для чего введём ветку ложности в первый условный оператор и вложим в неё второй (это потребует совсем незначительных правок):
-- заметьте, что во вложенном в else условии проверяется только левая граница диапазона [45..178] -- это связано с тем, что значения $i$ в заголовке цикла итак ограничены сверху числом 178.
Пример №7 -- Цикл внутри веток условного оператора
Если переменная a больше 5, то выведите на экран все числа от 1 до 10, иначе все числа от 12 до 7 в обратном порядке
Видео-пояснения
Для этого урока есть следующие видео:
Самостоятельная работа
Вопросы- Зачем нужен цикл for?
- Что такое заголовок цикла?
- Что такое счетчик цикла?
- Что такое тело цикла?
- Переменной $i$ в цикле for левую границу установили в $5$, а правую в $12$ -- сколько раз выполнится цикл?
- Выведите на экран, все числа от 35 до 64.
- Пользователь вводит два целых числа, выведите на экран все числа между ними, причем:
- Если первое больше второго то в порядке возрастания, пример консоли:
- Иначе в порядке убывания, пример консоли:
Проверить решение для пар значений:
-- должны увидеть все числа от 10 до 20, и для:
-- все числа от 20 до 10 в обратном порядке
Подсказка: в каждой ветке условного оператора тут должно быть по одному циклу.