Урок 12. циклы в pascal: repeat, while, for

§ 3.4. основные алгоритмические конструкции

Алгоритмы с повторениями для исполнителя Чертёжник.Работа в среде исполнителя Чертёжник

Презентация «Управление исполнителем Чертежник»

Ключевые слова: • исполнитель Чертёжник • абсолютное смещение • относительное смещение • вспомогательный алгоритм • основной алгоритм • цикл п раз 

Цикл ПОВТОРИТЬ п РАЗ

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

Например, программу рисования ряда из пяти ромбов (рис. 71) с помощью конструкции повторения можно записать так: использовать Чертежник алг ряд ромбов нач      сместиться в точку (1,2)      нц 5 раз           опустить перо           сместиться на вектор (1, 2)           сместиться на вектор (1, -2)           сместиться на вектор (-1, -2)           сместиться на вектор (-1, 2)           поднять перо           сместиться на вектор (3, 0)      кц кон 

Рисование ромба можно оформить в виде вспомогательного алгоритма: алг ромб нач      сместиться на вектор (1, 2)      сместиться на вектор (1, -2)      сместиться на вектор (-1, -2)      сместиться на вектор (-1, 2) кон

Тогда основной алгоритм будет выглядеть так: использовать Чертежник алг ряд ромбов_1 нач      сместиться в точку (1,2)      нц 5 раз           опустить перо           ромб           поднять перо           сместиться на вектор (3, 0)      кц кон

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

нц <число повторений> раз

<тело цикла>

кц

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

Предложите вариант решения задачи о почтовом индексе Красноярска с использованием конструкции повторения.

Можно ли обойтись без вспомогательного алгоритма в следующих ситуациях (рис. 72)? 

Вопросы и задания

1. Охарактеризуйте исполнителя Чертёжник.

2. Составьте для Чертёжника алгоритм рисования прямоугольника со сторонами, параллельными осям координат, если известны координаты его двух вершин: (2, 1) и (7, 5).

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

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

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

6. Оформите вспомогательные алгоритмы для рисования букв «М», «И», «Р». Составьте алгоритмы рисования слов «МИР», «РИМ», «МИМ». 

7. Разработайте вспомогательный алгоритм рисования домика. На его основе составьте основной алгоритм рисования улицы из пяти домиков. 

8. Составьте алгоритмы управления Чертёжником, после исполнения которых будут получены следующие рисунки: 

9. Составьте алгоритмы управления Чертёжником, после исполнения которых будут получены следующие рисунки: 

10. Придумайте свои задачи для Чертёжника. 

Повторение

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

Цикл с заданным условием продолжения работы

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

Если мы будем рассматривать на примере, простейшего программы Робота. И установим, условие, что пока справа свободно он должен двигаться вверх и закрашивать клетку. Пока это условие «СПРАВА СВОБОДНО» будет выполняться, робот будет двигаться вверх, и закрашивать клетки. Но как только это условие будет нарушено, робот будет действовать дальше по прописанной последовательности действи, после выхода из цикла.

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

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

Особенность конструкции заключается в том, что должен быть пройден цикл, а потом проверяется условие. Если условие не удовлетворяется, значит, цикл повторяется. Тело цикла выполняется в этом алгоритме хотя бы 1 раз. Данный цикл можно представить в виде заучивания наизусть стихотворения. Телом цикла в данном случае будет само стихотворение. Условие – пересказ без ошибок. Если да, то стихотворение выучено, и алгоритм идет дальше, т.е. выполняются следующие действия. Если нет, значит, повторяется тело цикла.

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

Цикл с заданным числом повторений

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

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

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

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

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

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

  1. Определить цель программного обеспечения

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

  3. Создать структуру в виде блок-схемы

  4. Написать программный код

  5. Протестировать работу программы.

  6. Если обнаружились ошибки, исправить их.

  7. Если все хорошо провести отладку программного обеспечения.

  8. Оформить документацию.

  9. Ввод в эксплуатацию.

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

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

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

Правила применения

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

Упрощение кода

Циклы в некотором случае могут быть тоже лишними. Однако не всегда целесообразно их использовать, поскольку этот подход существенно влияет на скорость вычислений. Для примера следует разобрать случай, когда необходимо вывести всего лишь несколько строк на экран. Проще использовать специальный оператор write или writeln, который занимает незначительный объем оперативной памяти. Для организации кода приложений с учетом признаков «хорошего тона» необходимо воспользоваться следующей инструкцией:

  • Цель приложения.
  • Количество генерируемой информации (маленький или большой объем).
  • Простота кода.
  • Количество строк.

Первый элемент инструкции — основное предназначение программы. Если она применяется для вывода массивов информации, то при использовании циклов объем кода существенно сократится, но будет нагрузка на «железо», поскольку для цикла формируется область в оперативной памяти, занимающая некоторое место. Это связано с тем, что нужна запись итератора, его интервал изменения, а также постоянное сравнение его значения с условием, которое задано в теле цикла. Кроме того, необходима отдельная динамическая ячейка для записи временных значений.

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

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

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

Достоинства и недостатки

Перед применением циклов необходимо разобраться в их достоинствах и недостатках. К первым можно отнести следующее:

  • Простота применения.
  • Уменьшение количества кода.
  • Универсальность.
  • Читабельность.
  • Обработка и вывод больших массивов информации.

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

Читабельность кода приложения зависит от его структуры. Кроме того, при их применении количество кода существенно уменьшается. Последним достоинством является специфика применения элемента. Если требуется обработать или вывести большое количество информации, то применение циклов — крайняя необходимость. Этот подход позволит не только сохранить драгоценное время, но и избежать множества ошибок.

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

  • Ресурсоемкость.
  • Зацикливание (зависание).

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

Разновидности циклов в программировании

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

Наиболее распространенными типами циклов являются:

  1. Цикл while: этот тип цикла выполняет указанный блок кода, пока условие истинно.
  2. Цикл do-while: в отличие от цикла while, цикл do-while выполнит указанный блок кода хотя бы один раз, даже если условие неверно.
  3. Цикл for: этот тип цикла позволяет определить начальное значение, условие выполнения и инкремент в одной строке кода. Он часто используется, когда известно количество повторений.
  4. Цикл foreach: специальный тип цикла, используемый для перебора элементов в массиве или коллекции. Он автоматически выполняет указанный блок кода для каждого элемента.

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

Тип цикла Пример использования
Цикл while while (условие) { // код, выполняемый пока условие истинно }
Цикл do-while do { // код, выполняемый хотя бы один раз // проверка условия для продолжения цикла } while (условие);
Цикл for for (начальное_значение; условие; инкремент) { // код, выполняемый каждую итерацию }
Цикл foreach foreach (тип элемента переменная in коллекция) { // код, выполняемый для каждого элемента }

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

Важно учитывать эффективность и поддерживаемость кода при выборе определенного типа цикла в программировании

Оператор множественного выбора (switch)

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

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

Конструкция множественного выбора реализуется следующим образом: указывается ключевое слово switch, после которого, в круглых скобках указывается выражение-селектор, которое мы будем анализировать. Затем, ставятся фигурные скобки switch-блока, в теле которого могут быть только конструкции, относящиеся непосредственно к оператору. В нашем случае это будет примерно так:
<source lang=»kpp»>
function ProcessError(const int errno) {

   switch (errno) {
       /* switch блок */ 
   }

}
</source>

Далее, мы должны определить относящиеся к делу случаи, а именно, перечислить конкретные значения, с которыми мы будем сравнивать код ошибки и на основании этого сравнения будем выполнять некоторые операции. Это осуществляется с помощью подоператора case, который записывается так:
<source lang=»kpp»>
case /* выражение сравнения */: /* обработчик */
</source>

Выражение сравнения — это любое выражение, которое будет сравниваться с селектором. В качестве такого выражения может быть выбрано не одно, а сразу несколько условий. Тогда они должны отделяться друг от друга запятой:
<source lang=»kpp»>
case /*условие1*/, /*условие2*/, … /*условие N*/: /* обработчик */
</source>

В качестве условия может так же быть указан . Тогда будет проверяться, попадает ли значение выражения селектора в заданный интервал. Например, если нам необходимо анализировать численное выражение, то один из операторов case может выглядеть так:
<source lang=»kpp»>
case 1, 2, 5 .. 10, 12: /* обработчик */
</source>

Для срабатывания обработчика достаточно, чтобы сработало хотябы одно из условий, перечисленных в списке; тогда управление будет передано коду обработчика. Обработчиком может быть либо отдельное выражение, либо блок. Во втором случае, его необходимо заключить в фигурные скобки. В отличие от C++, после обработчика управление передается за пределы оператора switch, а не на следующее сравнение. То есть, логика работы более близка к паскалевской конструкции case.

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

Если требуется рассмотреть отдельный случай, когда ни одно из условий не было удовлетворено (то есть, ни один из операторов case не сработал), применяется действие по умолчанию. Для этого, необходимо записать ключевое слово default, а затем через двоеточие указать обработчик. Естественно, никакого выражения сравнения тут нет.

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

  • на кажый оператор switch может быть указан только один обработчик по умолчанию
  • обработчик по умолчанию должен быть записан в самом конце конструкции

Обобщив вышесказанное, напишем наконец, реализацию задуманной нами функции:
<source lang=»kpp» line=»1″>
function ProcessError(const int errno) {

   switch (errno) {
       case AGAIN: {
           Log("требуется повтор операции"); 
           /* запрашиваем у пользователя подтверждение на повтор */ 
       }
       case ACCESS_DENIED: 
           Log("ошибка доступа"); 
       case REQUEST_TIMEOUT, TIMEOUT: 
           Log("таймаут"); 
       default:
           Log("неизвестный код ошибки: #{errno}");
   }

}
</source>

3-6
Поскольку выражение обработчик сложное, то есть состоит более чем из одной конструкции, мы заключили его в фирурные скобки.
9
Для случаев REQUEST_TIMEOUT и TIMEOUT был использован один обработчик. Подразумевается, что коды, соответствующие данным ошибкам разные, но программист решил их объединить в одно целое.

Упражнения

1. Сформулируйте и реализуйте обратные условия для примера 3.2. Для всех случаев, для которых в исходной задаче вводилось true, нужно было бы вывести false и, наоборот, для всех случаев, в которых в исходной задаче получалось false, получить true.

2. Определите, что делают следующие программы, и дополните команду вывода

1. #include <iostream>

usingnamespacestd;

int main()

{

  setlocale(,»»);

int x;

cout<<«x = «;

cin>> x;

bool a = x %10==;

cout<< boolalpha;

cout<<«Число … – «<< a;

return;

  }

2. #include <iostream>

usingnamespacestd;

int main()

{

  setlocale(,»»);

int x;

cout<<«x = «;

cin>> x;

bool a = x >10&& x <100;

cout<< boolalpha;

cout<<«Число … – «<< a;

return;

}

3. Напишите программу, которая выведет на экран значение true или false, в зависимости от того, является ли введенное число x положительным или нет.

4. Задано положительное число x — возраст человека в годах. Определите, человек совершеннолетний (x ≥ 18) или нет. Напишите программу, которая выведет на экран true или false.

5. Напишите программу, которая выведет на экран значение true или false в зависимости от того, является введенное число x четырехзначным или нет.

6⃰. Заданы два положительных числа xиy. Определите, верно ли, что первое число меньше второго и хотя бы одно из них нечетное. Напишите программу, которая выведет на экран true или false.

7. Заданы координаты точки (x, y). Проверить, верно ли, что точка принадлежит первому квадранту координатной плоскости. Напишите программу, которая выведет на экран true или false.

8. Заданы координаты точки (x, y). Проверить, верно ли, что точка лежит внутри круга радиусом 5 с центром в начале координат. Напишите программу, которая выведет на экран true или false.

Что нужно знать при использовании циклов

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

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

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

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

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

Другие термины на «Ц»

ЦОДЦелевая аудитория
Все термины

Какими бывают циклы

Обычно в языках программирования несколько видов циклов. У каждого из них свое назначение. Разберемся с основными.

For. Это цикл, который выполняется заданное количество раз. В большинстве C-подобных языков (то есть таких, которые внешне похожи на C и C++) он имеет похожую структуру:

Объявление переменной — это создание итератора, переменной, которая будет изменяться на каждом шаге цикла. Когда итератор достигнет какого-то значения, цикл закончится.

Условие описывает, должен ли цикл продолжаться. Пока оно выполняется, цикл работает. Чаще всего условие — итератор меньше или больше определенного числа. Соответственно, когда итератор достигает указанного значения, цикл останавливается.

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

Стандартный случай — задается итератор, равный 0. Условие — итератор меньше какого-нибудь N. Действие — прибавить к итератору единицу. Цикл будет выполняться N+1 раз, потому что отсчет идет с нуля. Есть и вариации, их рассмотрим ниже.

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

Курс для новичков «IT-специалист с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить

Подробнее

For in / for of / for-each. Частный случай цикла for — когда нужно пройти по структуре данных. Для этого в некоторых языках существует особая конструкция. Это цикл for, который вместо итератора работает с самой структурой данных, например массивом или объектом.

В JavaScript такой цикл называется for of (есть еще for in, но он работает немного иначе), в Java — for-each, в Python — for in. Синтаксис примерно такой:

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

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

Не стоит путать этот цикл с функцией forEach(). Она проходит по массиву и что-то делает с каждым его элементом. Но это не цикл, а одна из функций высшего порядка, о которых мы говорили ранее.

While с предусловием. While — совсем другой случай. Это цикл, который используют, если нужное количество действий заранее неизвестно. Он может выполниться несколько раз, один раз, бесконечное количество раз — или вообще не выполниться ни разу. Слово while переводится как «пока» и отражает суть: пока верно какое-то условие, цикл выполняется.

Синтаксис у него примерно такой, хотя в зависимости от языка детали могут различаться:

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

While с постусловием. Это вариация цикла while. Ее единственное отличие — условие пишется не до, а после тела цикла:

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

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

Repeat / until. В некоторых языках есть еще один вид цикла — repeat или until. Он похож на while, но, в отличие от него, описывает не условие для продолжения, а условие для выхода из цикла. Цикл закончится, когда условие окажется верным.

В Pascal это цикл с постусловием, который описывается так:

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

Понравилась статья? Поделиться с друзьями:
ГДЗ 8 класс
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: