Schetchiksg.ru

Счетчик СГ
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Примеры задач с циклом счетчик

#10.1 Цикл For в Паскаль. Цикл с известным числом повторений (цикл с параметром). Тело цикла.

Primary tabs

  • View (active tab)
  • Дополнительно

Forums:

  • Pascal & Delphi (Делфи и Паскаль)

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

  1. For
  2. While
  3. 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 (будем делать это циклом), проверяя каждое число, на соответствие сразу двум условиям:

    1. является четным — т.е. по сути делится на 2 нацело;
    2. делится нацело на 7;
    Читайте так же:
    Как отключить счетчик чернил canon mp160

    Так оба условия для выводимого числа нужно проверять одновременно (они должны выполняться одновременно— только тогда его можно выводить), то будем использовать логическое И.
    Третье же условие принадлежности диапазону будет гарантировать сам цикл 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$ до этого числа.
    Читайте так же:
    Установка счетчика энергомера се 101

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

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

    При написании скриптов зачастую встаёт задача сделать однотипное действие много раз.

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

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

    Цикл «while»

    Цикл while имеет следующий синтаксис:

    Код из тела цикла выполняется, пока условие condition истинно.

    Например, цикл ниже выводит i , пока i :

    Одно выполнение тела цикла по-научному называется итерация. Цикл в примере выше совершает три итерации.

    Если бы строка i++ отсутствовала в примере выше, то цикл бы повторялся (в теории) вечно. На практике, конечно, браузер не позволит такому случиться, он предоставит пользователю возможность остановить «подвисший» скрипт, а JavaScript на стороне сервера придётся «убить» процесс.

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

    Например, while (i) – более краткий вариант while (i != 0) :

    Если тело цикла состоит лишь из одной инструкции, мы можем опустить фигурные скобки <…>:

    Цикл «do…while»

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

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

    Такая форма синтаксиса оправдана, если вы хотите, чтобы тело цикла выполнилось хотя бы один раз, даже если условие окажется ложным. На практике чаще используется форма с предусловием: while(…) <…>.

    Цикл «for»

    Более сложный, но при этом самый распространённый цикл — цикл for .

    Выглядит он так:

    Давайте разберёмся, что означает каждая часть, на примере. Цикл ниже выполняет alert(i) для i от 0 до (но не включая) 3 :

    Рассмотрим конструкцию for подробней:

    часть
    началоi = 0Выполняется один раз при входе в цикл
    условиеiПроверяется перед каждой итерацией цикла. Если оно вычислится в false , цикл остановится.
    шагi++Выполняется после тела цикла на каждой итерации перед проверкой условия.
    телоalert(i)Выполняется снова и снова, пока условие вычисляется в true .

    В целом, алгоритм работы цикла выглядит следующим образом:

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

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

    Вот в точности то, что происходит в нашем случае:

    В примере переменная счётчика i была объявлена прямо в цикле. Это так называемое «встроенное» объявление переменной. Такие переменные существуют только внутри цикла.

    Вместо объявления новой переменной мы можем использовать уже существующую:

    Пропуск частей «for»

    Любая часть for может быть пропущена.

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

    Можно убрать и шаг :

    Это сделает цикл аналогичным while (i .

    А можно и вообще убрать всё, получив бесконечный цикл:

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

    Прерывание цикла: «break»

    Обычно цикл завершается при вычислении условия в false .

    Но мы можем выйти из цикла в любой момент с помощью специальной директивы break .

    Например, следующий код подсчитывает сумму вводимых чисел до тех пор, пока посетитель их вводит, а затем – выдаёт:

    Директива break в строке (*) полностью прекращает выполнение цикла и передаёт управление на строку за его телом, то есть на alert .

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

    Переход к следующей итерации: continue

    Директива continue – «облегчённая версия» break . При её выполнении цикл не прерывается, а переходит к следующей итерации (если условие все ещё равно true ).

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

    Например, цикл ниже использует continue , чтобы выводить только нечётные значения:

    Для чётных значений i , директива continue прекращает выполнение тела цикла и передаёт управление на следующую итерацию for (со следующим числом). Таким образом alert вызывается только для нечётных значений.

    Цикл, который обрабатывает только нечётные значения, мог бы выглядеть так:

    С технической точки зрения он полностью идентичен. Действительно, вместо continue можно просто завернуть действия в блок if .

    Однако мы получили дополнительный уровень вложенности фигурных скобок. Если код внутри if более длинный, то это ухудшает читаемость, в отличие от варианта с continue .

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

    Например, если мы возьмём этот код:

    …и перепишем его, используя вопросительный знак:

    …то будет синтаксическая ошибка.

    Это ещё один повод не использовать оператор вопросительного знака ? вместо if .

    Метки для break/continue

    Бывает, нужно выйти одновременно из нескольких уровней цикла сразу.

    Например, в коде ниже мы проходимся циклами по i и j , запрашивая с помощью prompt координаты (i, j) с (0,0) до (2,2) :

    Нам нужен способ остановить выполнение если пользователь отменит ввод.

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

    Метка имеет вид идентификатора с двоеточием перед циклом:

    Вызов break в цикле ниже ищет ближайший внешний цикл с такой меткой и переходит в его конец.

    В примере выше это означает, что вызовом break outer будет разорван внешний цикл до метки с именем outer , и управление перейдёт со строки, помеченной (*) , к alert(‘Готово!’) .

    Можно размещать метку на отдельной строке:

    Директива continue также может быть использована с меткой. В этом случае управление перейдёт на следующую итерацию цикла с меткой.

    Метки не дают возможности передавать управление в произвольное место кода.

    Например, нет возможности сделать следующее:

    Вызов break/continue возможен только внутри цикла, и метка должна находиться где-то выше этой директивы.

    Итого

    Мы рассмотрели 3 вида циклов:

    • while – Проверяет условие перед каждой итерацией.
    • do..while – Проверяет условие после каждой итерации.
    • for (;;) – Проверяет условие перед каждой итерацией, есть возможность задать дополнительные настройки.

    Чтобы организовать бесконечный цикл, используют конструкцию while (true) . При этом он, как и любой другой цикл, может быть прерван директивой break .

    Если на данной итерации цикла делать больше ничего не надо, но полностью прекращать цикл не следует – используют директиву continue .

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

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

    Примеры задач с циклом счетчик

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

    Цикл с параметром (со счетчиком) FOR.

    Этот цикл спользуется в том случае, если некоторую последовательность действий надо выполнить несколько раз и известно число повторений. Тело цикла будет выполняться заданное (заранее известное) число раз: 10, 20,100, n раз – это указывается в условии задачи.

    В этом цикле обязательно указываются следующие параметры:

    Имя переменной, в которой хранится число повторений цикла (переменной цикла или счетчика цикла). В качестве перемнной должна выступать порядковая (перечисляемая) переменная, использование переменных типа real не допускается.

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

    Конечное значение — выражение, определяющее конечное значение переменной-счетчика циклов (условие завершения цикла).

    Структура цикла, организованного с помощью этого оператора, имеет следующий вид. Это прямая форма цикла .

    For i := a1 to a2 do

    В данном случае роль счетчика играет переменная i, она изменяется в заданном диапазоне от начального значения a1 до конечного значения a2 (считает). По умолчанию шаг изменения цикла равен одному, т.е. каждый раз после прохождения тела цикла счетчик увеличивается на единицу.

    Примечание. Если между begin и end находится только один оператор, то составной оператор begin — end можно не писать.

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

    Алгоритм, соответствующий циклу FOR, выглядит следующим образом:

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

    For i:= a2 downto a1 do

    Условие выполнения тела данного цикла: i a1, а шаг изменения счетчика – (-1).

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

    Цикл for Delphi

    Чтобы понять, как работает цикл for Delphi, рассмотрим одну задачу. Предположим, что необходимо разработать программу, вычисляющую значение функции y=5*x*x-7 в следующих точках: x=-1, x=-0.5, x=0, x=0.5, x=1 (таблицу выведем в поле метки Label1 формы приложения). Напишем процедуру, которая решит поставленную задачу (представим один из ее вариантов):

    Как Вы можете заметить, в тексте данной процедуры группа инструкций

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

    А теперь сравним два варианта процедуры:

    1. Для создания второго варианта потребовалось меньше усилий в процессе набора;
    2. Процедура в втором варианте более гибкая: для увеличения количества строк в отображаемой таблице, к примеру, до 15, остается лишь в строке провести замену числа 5 на число 15.

    Применение цикла for Delphi эффективно тогда, когда некоторая последовательность действий выполняется несколько раз (если заранее известно количество повторений). Цикл for Delphi имеет общий вид:

    • счетчик (тип integer) означает переменную-счетчик количества повторений некоторых инструкций цикла;
    • нач_знач (тип integer) подразумевает выражение, которое является начальным значением счетчика циклов;
    • кон_знач (тип integer) обозначает выражение, являющееся конечным значением счетчика циклов.

    Определить, сколько раз (обозначим это число за m) повторяются инструкции цикла, можно, воспользовавшись следующей формулой:

    Примеры цикла for Delphi:

    А теперь приведем примеры использования инструкции for Delphi:

    Пример 1.

    Пример 2.

    Заметка. В случае, когда между служебными словами begin и end располагается только одна инструкция, то зарезервированные слова begin и end опускаются. Как устроен алгоритм инструкции for, покажет следующая иллюстрация:

    Если внимательно приглядеться к приведенному алгоритму, то можно заметить, что если конечное значение счетчика не превышает его начального значения, то инструкции между служебными словами begin и endвыполняться не будут. Нельзя не отметить, что после того, как завершилось очередное выполнение инструкции тела цикла, увеличение счетчика циклов происходит автоматически. Переменная счетчик может быть использована внутри тела цикла, но менять переменную-счетчик нельзя.

    Пример 3. После того, как выполнены следующие инструкции

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

    Пример 4. В качестве примера приведем программу, производящую вычисление суммы первых десяти элементов ряда 1+1/2+1/3+1/4+ … +1/n (свяжем значение i-того элемента данного ряда с его номером при помощи формулы 1/i).

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

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

    Заметка. Если необходимо, чтобы значения счетчика не увеличивалось, а уменьшалось, то необходимо в инструкции for слово to заменить на слово downto.

    голоса
    Рейтинг статьи
    Ссылка на основную публикацию
    Adblock
    detector