Как составить алгоритм с постусловием

План урока:

Циклы, их виды

Повторение в программировании

Сравнение цикличных структур 

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

Циклы, их виды

Многие операции, действия выполняются однотипно много раз. Этот процесс повторения называют циклом, а повторяемая последовательность – телом цикла. Процедуру с повторяющимися этапами называют циклической.

Каждое повторение действий в алгоритмах – итерация.

1 konstrukciya povtoreniya
 

Выделяют 3 основных вида повторяющихся структур:

  • с условием выполнения цикла (предусловием);
  • с критерием завершения (постусловием);
  • с указанным числом повторений цикла.

Описывать подобные процессы удобно схематично или при помощи команд.

2 konstrukciya povtoreniya

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

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

Описание цикла с условием двумя способами:

3 konstrukciya povtoreniya

Порядок выполнения:

  • Проверка критерия/логического сравнения.
  • Пока результат «Да», «проигрывать по кругу» однотипные операции.
  • Если ответ на условие отрицательный, закончить процедуру.

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

Циклический алгоритм, примеры:

  • Написать алгоритм постройки забора из кирпичей высотой 2 м.

алг забор

нач

нц пока есть кирпичи и раствор цемента

если высота забора < 2,0 м

то намазать слой цемента

положить слой кирпичей

иначе сделать сверху декоративный слой

все

кц

кон

  • Нарисовать шуточный (но действующий) алгоритм покраски забора «от начала и до обеда.

4 konstrukciya povtoreniya
 

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

Заменим деление вычитанием, будем выполнять отнимание, пока остаток не будет меньше вычитаемого – условие выполнения. Число вычитаний и будет частному от деления, это счетчик цикла, а разность, выполненная в последний раз – остаток от деления.

Обозначим x – делимое, y – делитель, q – частное от деления, r – остаток.

5 konstrukciya povtoreniya

Особенности цикла-Пока:

  • Если условие ни разу не выполняется, то команды из тела не будут выполнены ни разу. Это нормально, это один из вариантов – нет необходимости в выполнении команд.
  • Если же условие всегда истинно, тело операции будут выполняться бесконечное число раз. Такое положение называется зацикливанием. Фактически программа «зависает» и не сможет завершиться сама. Рекомендуется предусмотреть этот вариант.

Циклический алгоритм с постусловием

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

Порядок выполнения цикла с заданным условием:

  • Выполнение команд из тела.
  • Проверка условия (сравнения определенной величины с заданной).
  • Пока ответ на условие «Нет», повторять описанные в теле операции/шаги.
  • Если ответ на условие положительный, закончить процедуру.

Описание структуры с постусловием языком блок-схем и на алгоритмическом языке:

6 konstrukciya povtoreniya

Особенности циклов с заданным условием окончания работы:

  • Будет хотя бы одно выполнение процедуры;
  • Условие описывает завершение повторяемых действий.

Пример: написать программу покраски забора.

7 konstrukciya povtoreniya

Блок схема циклического алгоритма.

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

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

7 konstrukciya povtoreniya

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

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

Пример: написать алгоритм разгрузки и переноса 15 мониторов из авто в компьютерный класс.

9 konstrukciya povtoreniya

Повторение в программировании

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

10 konstrukciya povtoreniya

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

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

11 konstrukciya povtoreniya
 

Цикл начала работы в программировании

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

“While” обозначает на английском “пока”. Но не как прощание, а как то, что «делается пока, что-то происходит/выполняется». Этот оператор используется во всех языках программирования, использующих структурный подход (Pascal, Python). Обобщено его записывают так:

12 konstrukciya povtoreniya

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

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

13 konstrukciya povtoreniya
 

Цикл окончания работы в программировании

Для записи такой повторяемой конструкции в языках программирования используется оператор repeat. После него следуют команды (тело), после – оператор until, обозначающий условие окончание процесса.

14 konstrukciya povtoreniya

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

15 konstrukciya povtoreniya
Источник

Цикл со счетчиком в программировании

Для описания цикла с заданным повторением применяют оператор for.

Общий вид блока на языке программирования:

16 konstrukciya povtoreniya

Программа проходит команды из тела и значение счетчика (параметра) становится больше на 1. Чтобы выйти из цикла с фиксированным числом повторений, нужно достичь максимума параметра, который указан в условии задачи.

Сравнение цикличных структур

Блок-схемы повторяющихся алгоритмов позволяют оценить подобие всех 3 видов:

  • обязательное наличие условия (для оператора с параметром – это число повторений);
  • серия однотипных команд/шагов.

17 konstrukciya povtoreniya

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

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

18 konstrukciya povtoreniya

Занятие 4. Графическая реализация циклического алгоритма

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

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

Итерация – это единичное выполнение тела цикла.

Переменная цикла – это величина, изменяющаяся на каждой итерации цикла.

Каждый цикл должен содержать следующие необходимые элементы:

  1. первоначальное задание переменной цикла,
  2. проверку условия,
  3. выполнение тела цикла,
  4. изменение переменной цикла.

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

Циклический алгоритм с предусловием в общем виде

Рис.
2.9.
Циклический алгоритм с предусловием в общем виде

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

Циклический алгоритм с постусловием в общем виде

Рис.
2.10.
Циклический алгоритм с постусловием в общем виде

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

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

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

Пример 7. Вася звонит Пете, но у Пети может быть занята линия. Составить блок-схему действий Васи в этом случае.

Решение. Когда телефонная линия занята, то необходимо снова и снова набирать номер, пока Петя не закончит предыдущий разговор, и телефонная линия не окажется вновь свободной. Блок-схема представлена на рис. 2.11.

Блок-схема для примера 7

Рис.
2.11.
Блок-схема для примера 7

Здесь тело цикла состоит из одного действия “Набрать номер Пети”, т.к. именно это действие следует повторять, пока линия будет занята. Под итерацией цикла понимается очередная попытка дозвониться до Пети. Как таковой переменной цикла здесь нет, т.к. ситуация взята из жизни. Выход из цикла происходит в тот момент, когда условие “У Пети занято” стало неверным, т.е. телефонная линия свободна – действительно, нет необходимости больше набирать номер Пети. В данном примере применен цикл с постусловием, т.к. сначала необходимо набрать номер Пети, ведь иначе мы не можем ответить на вопрос – занята ли линия у Пети.

Пример 8. Ученику требуется купить учебник. Составить блок-схему, описывающую действия ученика в случае, если учебника нет в ряде магазинов.

Решение. Действия ученика в данном примере очевидны: когда он приходит в первый и любой последующий магазины, то возможны два варианта – учебник имеется в наличии или учебника нет в продаже. Если учебника нет в продаже, то ученику следует пойти в другой книжный магазин и спросить данный учебник, и т.д. пока учебник не будет куплен, т.к. перед учеником стоит конечная цель – купить учебник. Мы будем использовать цикл с предусловием, т.к. сначала требуется найти магазин, имеющий в наличии данный учебник. Цикл будет выполняться, пока условие “В данном магазине нет учебника” будет верным, а выход из цикла осуществится, когда условие станет ложным, т.е. когда ученик придет в магазин, в котором есть данный учебник. Действительно, в этом случае ученик купит нужный ему учебник и не будет больше искать книжные магазины. Результат блок-схемы представлен на рис. 2.12.

Блок-схема для примера 8

Рис.
2.12.
Блок-схема для примера 8

Здесь тело цикла состоит из одного действия “Найти другой книжный магазин”. Переменной цикла в явном виде нет, но можно подразумевать номер магазина, в который пришел ученик в очередной раз. Как любой другой цикл с предусловием, данный цикл может ни разу не выполниться (не иметь итераций), если в первом же магазине окажется нужный учебник.

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

Пример 9. Даны числа a, b. Известно, что число а меняется от -10 до 10 с шагом 5, b=7 и не изменяется. Вычислить сумму S и разность R чисел a и b для всех значений a и b.

Решение. В отличие от примеров 3 и 6 здесь число а меняется от -10 до 10 с шагом 5. Это означает, что число а является переменной цикла. Сначала а равно -10 – это первоначальное задание переменной цикла. Далее а будет изменяться с шагом 5, и т.д. пока не будет достигнуто значение 10 – это соответствует изменению переменной цикла. Итерации надо повторять, пока выполняется условие “ale 10“. Итак, а будет принимать следующие значения: -10, -5, 0, 5, 10. Число b не будет являться переменной цикла, т.к. b=7 и не изменяется по условию задачи. Результат блок-схемы (с предусловием) представлен на рис. 2.13.

Блок-схема для примера 9 (с предусловием)

Рис.
2.13.
Блок-схема для примера 9 (с предусловием)

Тело цикла состоит из нескольких действий: вычисление суммы, вычисление разности и вывод полученных данных на экран. Таким образом, у нас получится несколько значений сумм и разностей, т.к. а изменяется. Количество сумм и количество разностей совпадет с количеством различных значений а, т.е. пять.

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

Приведем блок-схему, использующую цикл с постусловием, на рис. 2.14.

Блок-схема для примера 9 (с постусловием)

Рис.
2.14.
Блок-схема для примера 9 (с постусловием)

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

Блок-схема с ветвлением для примера 9: а) с предусловием,    б) с постусловием

Рис.
2.15.
Блок-схема с ветвлением для примера 9: а) с предусловием, б) с постусловием

Вопросы:

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

·     Применение
инструкций управления циклом на языке Python.

Рассмотрим
алгоритм мытья посуды. Для того, чтобы помыть грязные тарелки, нужно: взять
губку, открыть кран с водой, помыть одну тарелку, вытереть её, после чего проверить,
не осталось ли грязных тарелок. Если это условие не выполняется, нужно снова
помыть тарелку; если же грязных тарелок не осталось, нужно закрыть кран,
положить губку на место и вытереть руки.

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

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

В
большинстве языков программирования есть отдельный оператор цикла с
постусловием, но в языке Python его нет. Здесь цикл с постусловием реализуется с
помощью бесконечного цикла с предусловием. Мы уже знаем, что его заголовок – while
True. Дальше
записываются инструкции, составляющие тело цикла с постусловием. После них
следует инструкция ветвления, содержащая условие цикла с постусловием. Если это
условие выполняется – следует инструкция остановки цикла – break.

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

Напишем
модуль для решения задачи. Вначале с помощью инструкции print
выведем на экран сообщение о том, что это программа, вычисляющая наибольший
общий делитель двух целых положительных чисел, а также запрос на ввод двух
чисел. Запишем инструкцию для считывания чисел в переменные a
и b. По условию задачи числа
целые, поэтому при считывании мы будем преобразовывать их значения в целочисленный
тип int. Теперь запишем цикл с
постусловием. Для этого запишем сначала бесконечный цикл while,
в котором будет ветвление с условием завершения работы цикла: a
= 0
or b
= 0
,
то есть цикл завершится тогда, когда одно из чисел станет равным нулю.  Если
это условие выполняется – сработает инструкция окончания работы цикла break.
Тело цикла с постусловием будет содержать ветвление для определения большего из
чисел с условием a
>
b. Если это условие
выполняется, то переменной a
присвоим значение a
%
b, если это условие не
выполняется, значит наибольшее число b,
поэтому переменной b
мы присвоим значение b
%
a. Так как одно из чисел
после выполнения описанного цикла будет равно нулю, то значение ненулевого
числа можно вычислить как их сумму. Поэтому выведем на экран сообщение о том,
что НОД введённых чисел равен сумме значений a
и b.

Сохраним
написанный модуль и запустим его на выполнение. Введём числа 45 и 75.
Наибольший общий делитель этих чисел действительно равен 15. Снова запустим
программу и введём числа 7 и 3. Наибольший общий делитель этих чисел
действительно равен единице. Программа работает правильно. Задача решена.

Циклы
в языке Python после основного тела могут содержать блок инструкций else.
Он выполняется в том случае, когда работа цикла была завершена без помощи
инструкции, остановки исполнения цикла – break.

Помимо
инструкции break есть и другая
инструкция управления циклом – continue.
Эта инструкция прерывает текущее исполнение тела цикла и переходит к
следующему, начиная с проверки условия.

Проверим
работу описанных инструкций управления циклом, решив задачу. Написать
программу, генерирующую случайное целое число на промежутке от a
до b и
предоставляющую пользователю неограниченное число попыток для того, чтобы его
угадать. Если пользователю надоело угадывать, то он должен ввести слово
«Сдаюсь». A всегда
меньше либо равно b.

Начнём
написание модуля для решения задачи. С помощью инструкции print
выведем на экран запрос на ввод числа a.
Теперь напишем инструкцию для считывания a.
Так как, по условию задачи, это целое число, то при вводе его значение мы будем
преобразовывать в целочисленный тип int.
Скопируем написанные инструкции и изменим их для считывания значения b.
Так как функции генерации случайных чисел описаны в модуле random,
подключим его. Теперь присвоим переменной n
случайное число на промежутке от a
до b, сгенерированное с
помощью функции randint.
Далее с помощью инструкции print
выведем на экран сообщение о том, что загадано случайное число на промежутке от
a до b
и предложение его угадать. Теперь присвоим переменной s
значение пустой строки, позже именно в эту строку мы будем считывать вводимые
числа.

Теперь
напишем цикл для угадывания значения n.
Он будет работать до тех пор, пока значение строки s
не станет равным значению переменной n,
преобразованной в строковый тип str.
Тело цикла будет начинаться со считывания значения строки s.
Так как данные с клавиатуры вводятся в текстовой форме, нам не нужно их
преобразовывать. Теперь запишем инструкцию ветвления с условием, что значение s
равно текстовой строке ‘Сдаюсь’. Если это условие выполняется, завершим
исполнение цикла с помощью инструкции break.
Далее запишем блок elif
с условием, что значение s
равно значению n, преобразованному
в строковый тип str. Если это условие
выполняется, вернёмся в начало цикла с помощью инструкции continue.
После этого ветвления запишем инструкцию print,
которая выводит на экран сообщение о том, что пользователь не угадал число, и
предложение попробовать ещё раз. Дальше напишем блок else
для цикла и в нём инструкцию print,
выводящую сообщение о том, что пользователь угадал. Сохраним написанный модуль.

print
(‘Введите a.’)

a = int (input ())

print
(‘Введите b.’)

b =
int (input
())

import random

n =
random.randint (a, b)

print (‘Загадано
случайное целое число на промежутке [a; b]. Попробуйте его угадать.’)

s = ”

while s != str (n):

   
s = input ()

   
if s == ‘Сдаюсь’:

       
break

   
elif s == str
(n):

       
continue

    print (‘Вы не угадали.
Попробуйте ещё раз.’)

else:

    print (‘Поздравляем!
Вы угадали.’)

Рассмотрим,
как должен работать цикл, который мы написали в программе. После считывания s,
если это строка ‘Сдаюсь’, исполнение цикла будет завершено инструкцией break,
и начнут выполняться команды, следующие после цикла. Если это число, равное n,
то благодаря инструкции continue
снова будет проверено условие цикла. Оно будет ложно, так как противоречит
условию ветвления, поэтому начнёт выполняться блок else
цикла. Если в строке s
хранится любое другое значение, то будет выведено сообщение о том, что
пользователь не угадал.

Протестируем
программу, которую мы написали. Введём промежуток от 1 до 3. Теперь зададим
значение 1. Программа вывела сообщение о том, что мы не угадали, и предложение
попробовать ещё раз. Попробуем ввести 2. Программа снова предлагает попробовать
ещё раз. И, наконец, введём 3. На этот раз программа вывела сообщение о том,
что мы угадали. Снова запустим программу и введём промежуток от 1 до 100. Угадывание
числа на таком промежутке займёт много времени, поэтому сразу введём слово
«Сдаюсь». Как видим, программа завершила свою работу. Программа работает правильно.
Задача решена.

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

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

print (‘Введите
a.’)

a =
int (input
())

print (‘Введите
b.’)

b =
int (input
())

import random

n =
random.randint (a, b)

print (‘Загадано
случайное целое число на промежутке [a; b]. Попробуйте его угадать.’)

s = ”

while s != str (n):

   
s = input ()

   
if s == ‘Сдаюсь’:

       
break

   
elif s == str (n):

       
print (‘Поздравляем!
Вы угадали.’)

    else:

        print (‘Вы не угадали.
Попробуйте ещё раз.’)

Таким
образом, принцип работы кода стал очевиднее, при этом программа всё ещё
работает правильно. Убедимся в этом. Сохраним написанный модуль и запустим его
на выполнение. Введём промежуток от 1 до 100. Предпримем пару безуспешных
попыток угадать число, после чего запишем слово «Сдаюсь». Программа завершила
свою работу. Снова запустим модуль и введём промежуток от 1 до 1. Введём 1.
Программа вывела сообщение о том, что мы угадали. Таким образом мы убедились в
правильности работы программы.

Мы
узнали:

·     Как
работают инструкции остановки работы цикла – break,
а также прерывания текущего исполнения цикла – continue.

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

·     Цикл
с постусловием
работает до тех пор, пока не выполнится
его условие, которое проверяется после исполнения тела цикла.

·     Цикл
с постусловием в программе в любом случае выполняется хотя бы один раз.

·     Так
как в языке Python нет инструкции для записи цикла с постусловием, он
реализуется через бесконечный цикл прерываемый с помощью инструкции break.

На занятии рассматривается цикл с постусловием в Паскаль Repeat и происходит знакомство со строковым типом данных

Основной задачей портала labs-org.ru является предоставление возможности получения навыков решения практических задач с использованием языка программирования Pascal. На основе решенных примеров и заданий по Паскалю, изложенных по мере увеличения их сложности, даже новичкам будет достаточно просто усвоить предоставленный материал.

Цикл с постусловием в Паскаль (repeat)

Пример: Ввести целое положительное число (n) и определить четное ли оно.

Проблема 1: Как избежать ввода отрицательного числа или нуля?
Решение 1: Если вводится неверное число, то нужно вернуться назад к вводу данных (цикл).

Проблема 2: Неизвестно, сколько шагов надо сделать.
Решение 2: Надо остановиться, когда n > 0, т.е. надо делать «до тех пор пока n не станет больше0».

  • Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием)!.
    • Цикл Repeat в Паскале используется для организации повторений (итераций) с заранее неизвестным их числом.
    • Цикл повторяется до тех пор, пока не станет истинным некоторое условие.
    repeat
      оператор1;
      оператор2;
      . . .;
      операторN
    until условие {до тех пор, пока условие не станет истинным}

    Блок-схема решения примера:

    Блок-схема решения примера

    Блок-схема решения примера

    Решение на Паскале:
    Цикл repeat пример на паскале

    • Операторы образуют тело цикла и будут выполняться до тех пор, пока значение "условие" не станет равно true, т.е. не станет истинным.
    • Условием может быть переменная или логическое выражение.
    • Проверка условия осуществляется уже после первого прохождения операторов тела структуры, т.е. после первой итерации, т.о. цикл с постусловием в Паскаль обязательно выполнится хотя бы один раз, независимо от истинности условия.

    Еще одно использование цикла Repeat рассмотрим на примере с решением.

    Пример: Печатать «ноль» указанное количество раз

    Показать решение:

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var i,n:integer;
    begin
    write ('количество раз');
    readln(n);
    i:=1;
    repeat
      write(0);
      i:=i+1
    until i>n
    end.
    1
    2
    3
    4
    5
    6
    7
    8
    
    begin
    var n:=readInteger('количество знаков');
    var i:=1;
    repeat
      write(0);
      i:=i+1
    until i>n
    end.

    В решенной задаче оператор 8-й строки — это счетчик (i:=i+1), который просчитывает количество раз и одновременно является условием для выхода из цикла.


    PascalABC.NET:

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

    Пример:

    // Выводить 5 раз слово "Привет!"
    loop 5 do 
      begin
        println('Привет!');
      end;
    // ...

    Задача 1. Написать программу решения задачи о печати чисел 3 5 7 9 11 13. Решите задачу дважды в одном файле: используя цикл Repeat и цикл loop (если вы его рассмотрели).

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

    Узнать о работе оператора с постусловием в Паскале можно также из видеоурока:

    Строковый тип данных в Паскаль

    Для решения следующей задачи нам пригодится работа со строковым типом данных.
    Рассмотрим как объявляются строки в Паскале:

    Объявление строковой переменной:

    Присваивание значения строковой переменной:

    str:='вот такая вот строка';

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

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    
    var str1,str2: string;
    begin
         str1:='Привет, ';
         writeln('Ваше имя?');
         readln(str2);
         writeln(str1,str2)
    end.
    1
    2
    3
    4
    5
    6
    7
    
    begin
         var str1:='Привет,';
         var str2: string;
         writeln('Ваше имя?');
         readln(str2);
         print(str1,str2)
    end.

    Теперь снова возвращаемся к нашему циклу repeat.

    Задача 2. Компьютер предлагает человеку ввести слово, после чего распечатывает это слово, снабдив его восклицательным знаком. Затем снова предлагает ввести слово и так до тех пор, пока человек не введет слово «Хватит». Распечатав его с восклицательным знаком, компьютер отвечает: «Хватит так хватит» и заканчивает работу.
    Решите задачу дважды в одном файле: для решения использовать цикл с постусловием в Паскаль и цикл loop (если вы его рассмотрели).

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

    Дополнительно: Перед выводом каждого слова необходимо выводить его порядковый номер.

    Задача 3. Составьте блок-схему решенного задания.

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

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

    Что делать, чтобы стать программистом

    Что делать, чтобы стать программистом

    Многие сегодня хотят стать программистами. Хотят. Но ничего не делают для этого. Не делают даже простых вещей. Не хотят даже прочитать книжку из 10 страниц. В итоге так и остаются никем. Потому что мечты не сбываются никогда. Сбываются только планы…
    Подробнее…

    Блок схема алгоритма цикла с постусловием показана на рис. 21.2.

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

    Рис. 21.2. Блок-схема алгоритма цикла с постусловием.

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

    Например, вывести несколько одинаковых строк на экран можно так:

    i := 1;
    Повторять
      Начало
        Вывести(‘Привет, МИР ’, i);
        i := i + 1;
      Конец;
    Если i < 10;

    Как вы думаете, сколько строк выведет эта программа? А вот и не угадали. Всего одну.

    Почему? Потому что это цикл с постусловием. Здесь СНАЧАЛА выполняется итерация цикла,
    а затем проверяется условие. И если условие выполняется, то цикл
    завершается. А в нашем случае условие выполняется, так как i изначально меньше 10. Поэтому цикл с постусловием сразу завершается.

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

    А теперь посмотрим, как этот цикл реализовать в Паскале.

    var i : byte;
    
    begin
      i := 1;
      repeat
        WriteLn('Привет, МИР ', i);
        Inc(i);
      until i > 10;
      ReadLn;
    end.

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

     ВАЖНО! 
    Обратите внимание, что мы не используем слова begin и end,
    чтобы как-то обозначить тело цикла. Дело в том, что слова repeat и until сами являются
    операторными скобками,
    поэтому слова begin и end здесь использовать необязательно. Хотя и не запрещено.

    См. также:

    • Прерывание и продолжение циклов
    • Использование циклов в программе КАЛЬКУЛЯТОР

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

    Добавить комментарий