Audytor.ru

Теплоснабжение "Аудитор"
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Оператор цикла со счетчиком паскаль

Оператор цикла со счетчиком паскаль

страницы: 1 2 3

Содержание

  • Содержание
  • Операторы циклов
    • for-to и for-downto
      • Инкрементный цикл с параметром
      • Декрементный цикл с параметром
      • Оператор безусловного перехода goto

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

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

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

      Замечание: Алгоритмы, построенные только с использованием циклов, называются итеративными 1 — от слова итерация , которое обозначает повторяемую последовательность действий.

      for-to и for-downto

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

      Инкрементный цикл с параметром

      Общий вид оператора for-to :

      Счётчик i (переменная), нижняя граница first (переменная, константа или выражение) и верхняя граница last (переменная, константа или выражение) должны относиться к эквивалентным порядковым типам данных. Если тип нижней или верхней границы не эквивалентен типу счётчика, а лишь совместим с ним, то осуществляется неявное приведение: значение границы преобразуется к типу счётчика, в результате чего возможны ошибки.

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

      1. вычисляется значение верхней границы last;
      2. переменной i присваивается значение нижней границы first;
      3. производится проверка того, что i <= last;
      4. если это так, то выполняется <оператор> ;
      5. значение переменной i увеличивается на единицу;
      6. пункты 3–5, составляющие одну итерацию цикла, выполняются до тех пор, пока i не станет строго больше, чем last; как только это произошло, выполнение цикла прекращается, а управление передаётся следующему за ним оператору.

      Из этой последовательности действий можно понять, какое количество раз отработает цикл for-to в каждом из трёх случаев:

      • first < last : цикл будет работать last — first + 1 раз;
      • first = last : цикл отработает ровно один раз;
      • first > last : цикл вообще не будет работать.

      После окончания работы цикла переменная–счётчик может потерять своё значение 2 . Таким образом, нельзя с уверенностью утверждать, что после того, как цикл завершил работу, обязательно окажется, что i = last + 1 . Поэтому попытки использовать переменную-счётчик сразу после завершения цикла (без присваивания ей какого–либо нового значения) могут привести к непредсказуемому поведению программы при отладке.

      Декрементный цикл с параметром

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

      Счётчик i (переменная), верхняя граница first (переменная, константа или выражение) и нижняя граница last (переменная, константа или выражение) должны иметь эквивалентные порядковые типы . Если тип нижней или верхней границы не эквивалентен типу счетчика, а лишь совместим с ним, то осуществляется неявное приведение типов.

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

      1. переменной i присваивается значение first ;
      2. производится проверка того, что i >= last ;
      3. если это так, то выполняется <оператор> ;
      4. значение переменной i уменьшается на единицу;
      5. пункты 2-4 выполняются до тех пор, пока i не станет меньше, чем last ; как только это произошло, выполнение цикла прекращается, а управление передаётся следующему за ним оператору.
      • first < last , то цикл вообще не будет работать;
      • first = last , то цикл отработает один раз;
      • first > last , то цикл будет работать first — last + 1 раз.

      Замечание о неопределённости значения счётчика после окончания работы цикла справедливо и в этом случае.

      while и repeat-until

      Если заранее неизвестно, сколько раз необходимо выполнить тело цикла, то удобнее всего пользоваться циклом с предусловием ( while ) или циклом с постусловием ( repeat-until ).

      Общий вид этих операторов таков:

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

      Замечание: Обратите внимание, что на каждой итерации циклы for и while выполняют только по одному оператору (либо группу операторов, заключённую в операторные скобки begin-end и потому воспринимаемую как единый составной оператор). В отличие от них, цикл repeat-until позволяет выполнить сразу несколько операторов: ключевые слова repeat и until сами служат операторными скобками.

      Так же, как циклы for-to и for-downto , циклы while и repeat-until можно назвать в некотором смысле противоположными друг другу.

      Последовательности действий при выполнении этих циклов таковы:

      Для while :Для repeat-until :
      1. Проверяется, истинно ли <условие_1>.1. Выполняются <операторы>.
      2. Если это так, то выполняется <оператор>.2. Проверяется, ложно ли <условие_2>
      3. Пункты 1 и 2 выполняются до тех пор, пока <условие_1> не станет ложным.3. Пункты 1 и 2 выполняются до тех пор, пока <условие_2> не станет истинным.

      Таким образом, если <условие_1> изначально ложно, то цикл while не выполнится ни разу. Если же <условие_2> изначально истинно, то цикл repeat-until выполнится один раз.

      Break и Continue

      Существует возможность 3 прервать выполнение цикла (или одной его итерации), не дождавшись конца его (или её) работы.

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

      Continue прерывает работу текущей итерации цикла и передаёт управление следующей итерации (цикл repeat-until ) или на предшествующую ей проверку (циклы for-to , for-downto , while ).

      Замечание: При прерывании работы циклов for-to и for-downto с помощью функции Break переменная цикла (счётчик) сохраняет своё текущее значение, не «портится».

      Оператор безусловного перехода goto

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

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

      Сравните, например, два программно–эквивалентных отрывка:

      Write ( ‘Матрица ‘ ) ;
      for i := 1 to n do
      begin
      flag := False ;
      for j := 1 to m do
      if a[i , j] > a[i , i] then
      begin
      flag := True ;
      Write ( ‘не ‘ ) ;
      Break ;
      end ;
      if flag then Break ;
      end ;
      WriteLn ( ‘обладает свойством’ +
      ‘ диагонального преобладания.’ ) ;

      Write ( ‘Матрица ‘ ) ;
      for i := 1 to n do
      for j := 1 to m do
      if a[i , j] > a[i , i] then
      begin
      Write ( ‘не ‘ ) ;
      goto 1 ;
      end ;
      1 : WriteLn ( ‘обладает свойством’ +
      ‘ диагонального преобладания.’ ) ;

      Пример использования циклов

      Задача. Вычислить интеграл в заданных границах a и b для некоторой гладкой функции f от одной переменной (с заданной точностью).

      Алгоритм. Метод последовательных приближений, которым мы воспользуемся для решения этой задачи, состоит в многократном вычислении интеграла со всё возрастающей точностью, — до тех пор, пока два последовательных результата не станут различаться менее, чем на заданное число (скажем, eps = 0,001). Количество приближений нам заранее неизвестно (оно зависит от задаваемой точности), поэтому здесь годится только цикл с условием (любой из них).

      Вычислять одно текущее значение для интеграла мы будем с помощью метода прямоугольников: разобьём отрезок [a, b] на несколько мелких частей, каждую из них дополним (или урежем — в зависимости от наклона графика функции на данном участке) до прямоугольника, а затем просуммируем получившиеся площади. Количество шагов нам известно, поэтому здесь удобнее всего воспользоваться циклом с параметром.

      На нашем рисунке изображена функция f(x) = x 2 (на отрезке [1, 2]). Каждая из криволинейных трапеций будет урезана (сверху) до прямоугольника: высотой каждого из них послужит значение функции на левом конце участка. График станет «ступенчатым».

      Реализация

      03-01.png

      Вывод массива, удобный для пользователя

      Задача. Распечатать двумерный массив размерности MxN удобным для пользователя способом. (Известно, что массив содержит только целые числа из промежутка [0 .. 100].)

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

      Pascal: выход из цикла

      Break и Continue

      Для выхода из цикла предусмотрена процедура break в Паскале. Break досрочно прекращает выполнение циклов while , repeat и for .

      Процедура Continue досрочно выходит из текущей итерации цикла, но, не завершая его, а переходя к следующей итерации.

      Рассмотрим использование процедур выхода из цикла Continue и Break в Паскале (будем использовать цикл while ):

      var a:integer; begin a:=1; while a<1000 do begin a:=a*2; if a=64 then continue; if a=256 then break; write(a:4); <4 позиции на вывод каждого числа>end; end.

      В результате программы на экране будут напечатаны: 2 4 8 16 32 128.
      Число 64 пропущено, так как при условии a=64 происходит выход из текущей итерации ( continue ) и число не выводится на экран, а при a=256 выполнение цикла прерывается окончательно ( break ), так и не распечатав число 256.

      Задача 10. Решить рассмотренную задачу с процедурами break и continue для циклов repeat и for

      [Название файла: L3task10.pas ]

      2 While – цикл с предусловием

      Оператор While – начинает описание цикла с предусловием. Такой вид цикла нужен, в тех алгоритмах, где число повторений неизвестно заранее. В общем виде он выглядит так:

      While <выражение> Do <тело цикла>;

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

      Пример программы написанный с использованием цикла While :

      В данном коде использовался составной оператор Begin-End , так как операторов в теле цикла несколько.

      Цикл repeat

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

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

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

      Прямой эфир

      • Комментарии
      • Публикации
      • Technicum505SU → Отбеливание пластика 32 → Технологии
      • do-vitas → USB-CAN адаптер. 19 → STM32
      • andybeg → Кросс-платформенный терминал — SerIO 3.x 22 → Софт для электронщика
      • anakost → Корпус Argon ONE для Rasberry Pi 4, особенности применения 6 → Модернизация и ремонт
      • worker → LoRa SX1268 E22400-M22S запуск, настройка на максимальную дальность 9 → Радио
      • demoss → Макетная плата N76E003 и ее программирование 11 → Деталька
      • demoss → дополнение к статье "Дружим программу CANHacker и модуль 2CAN от Starline" 1 → STM32
      • demoss → "Странный" радиомикрофон 45 → Схемотехника
      • demoss → Машина времени для крошек. 26 → AVR
      • demoss → Управление светодиодной лентой на WS2812B с STM32F10x 255 → STM32
      • Aneg → Металлизация переходных отверстий печатной платы в домашних условиях 18 → Технологии
      • dadigor → Дешевый китайский фрезерный станочек CNC3018. Красивые отверстия в покупных корпусах. 12 → Инструмент
      • ColdWeather → Как получить актуальное время от GSM модуля, даже если оператор его не дает 11 → Алгоритмы и программные решения
      • Aneg → Считаем синус быстро и точно: ч.2 — Точность вычислений 1 → Алгоритмы и программные решения
      • Aneg → Считаем синус быстро и точно: ч.3 — Практика 1 → Алгоритмы и программные решения
      • Aneg → Считаем синус быстро и точно: ч.1 — Теория 1 → Алгоритмы и программные решения
      • dadigor → Окирпичиваем stm8l101F1 8 → Блог им. DySprozin
      • B-Screw → любопытные находки (1) 33 → Блог им. evsi
      • SOVA → Панелька (кроватка) для QFN-20 8 → Блог им. DySprozin
      • DySprozin → Спирт этиловый 11 → Блог им. AlexX1810

      Пример №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 нацело; на 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.

      For, или цикл с параметром

      For — это цикл, в котором тело выполняется заданное количество раз.

      Существует две формы записи этого цикла:

      Первая форма

      После каждой итерации значение будет увеличиваться на 1.

      — это начальное значение счетчика. Это может быть переменная или число.
      : как только значение станет больше , выполнение цикла прекратится.

      Если требуется написать несколько операторов в теле цикла, используем begin и end.

      И , и , и — переменные целого типа.

      Чаще всего в качестве счетчика используется переменная i.

      Вторая форма

      После каждой итерации значение будет уменьшатся на 1.

      — это начальное значение счетчика.
      : как только значение станет меньше , выполнение цикла прекратится.

      Два важных примечания:

      1. Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
      2. Изменять значение счетчика внутри тела нельзя! Вот что выводит компилятор:

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

      Давайте решим пару задач.

      For1. Даны целые числа K и N (N > 0). Вывести N раз число K.

      Организовываем простой цикл от 1 до требуемого числа.

      For2. Даны два целых числа A и B (A

      For9. Даны два целых числа A и B (A

      Организовываем такой же цикл, как и в предыдущей задаче, но одновременно суммируем квадраты всех чисел. Чтобы высчитать квадрат, используем функцию Sqr.

      For13°. Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не использовать.

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

      While1°. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.

      Каждый раз вычитаем B из А, пока А — В >= 0.

      While4°. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести True, если не является — вывести False.

      Действуем следующим образом: пока N делится нацело на три, делим N нацело. Затем, если N = 1 — число является степенью тройки; если N <> 1, тогда число — не степень тройки. Для того чтобы решить эту задачу, требуется знать, что такое div и mod, и как работают логические выражения.

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

      голоса
      Рейтинг статьи
      Читайте так же:
      Поверка счетчика без снятия бибирево
Ссылка на основную публикацию
Adblock
detector