Что такое зацикливание алгоритма

Что такое зацикливание алгоритма

Зацикливание — программа

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

Типичная причина принудительного завершения — зацикливание программы , когда исчерпывается заказанное время. Поскольку часть выдачи может пропасть, листинг программы иногда оказывается дезинформирующим. Например, возможна ситуация, когда программа зацикливается при выполнении, а листинг неполон, отчего возникает ложное впечатление, что программа была снята во время компиляции. [2]

Использование этого параметра позволяет прекратить задание в случае зацикливания программы . Если параметр опущен, то устанавливается стандартное значение, определенное в процедуре системного ввода. [3]

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

Параметр TIME-время-указывает предельно допустимое время выполнения задания центральным процессором и используется для предотвращения зацикливания программы . [5]

Следует поганить, что для фиктивного АП нельзя вызывать прерывание по сигналу внимание, поэтому при зацикливании программ , выполняемых на фиктивном АП, необходимо закончить выполнение ДИСП. [6]

В техническом задании должно содержаться требование о том, что никакие ошибочные входные данные или действия не должны вызывать зацикливания программы или ветвления ее по неправильному адресу. Следует исключить возможность ввода или изменения с пульта управления непосредственных адресов в главной или в массовой памяти, за исключением тех случаев, когда программа сама проверяет обоснованность этих действий. Лучше всего вводить число, пределы изменения которого могут быть проверены. Действительный аппаратный адрес рассчитывается затем по этому числу. [7]

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

Большинство современных ЭВМ включает в состав своей аппаратуры различного рода таймеры, позволяющие программировать события, связанные со временем. Контроль по времени является единственным средством, позволяющим предотвратить последствия от зацикливания программ . Учет времени необходим и при организации служб диспетчеризации задач и оплаты услуг за вычислительные работы. [9]

Утверждение RETRY используется только внутри условия ON ERROR. При этом программист должен позаботиться о том, чтобы не произошло зацикливания программы . [10]

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

Ключевой параметр TIME ( время) устанавливает предельное значение интервала времени, на котором задание может использовать центральный процессор системы. По истечении этого времени задание снимается. Это необходимо на случай зацикливания программы . [12]

Типы циклов целесообразно применять только арифметические. Итерационные циклы АЛГОЛа с условием в заголовке цикла заменяются арифметическими с условиями, перенесенными в тело цикла. Этим достигается устойчивость цикла и исключение зацикливания программы при плохой сходимости. Для широкого диапазона условий сходимости всегда целесообразно указать предельное число итерационных циклов, что обеспечит выход из цикла, даже если условие окончания итераций не выполнено. Циклы с перечислением также могут быть заменены арифметическими, поскольку и в том и другом случае в памяти организуется массив, в котором хранятся значения параметров. Для ЦВМ, имеющих цикловые команды, допускается расширение типов циклов, чтобы иметь возможность, применяя эти команды, получать более экономную программу. [13]

Читайте также:  Как поставить пароль на папку в майле

Рассмотрим программу 6.4 регистрации оцифрованного напряжения с датчика, печатающую его значение для контроля на экране дисплея. В этом примере при помощи инструкции безусловного перехода GOTO 1 мы изменили нормальное последовательное выполнение программы, заставляя ее передать управление назад. При этом возникла ситуация, называемая зацикливанием программы , когда фрагмент из четырех инструкций будет выполняться бесконечное число раз. [14]

Все параметры заголовка цикла являются переменными целого типа, и любая из них, если только она не задана буквальной константой, доступна как внутри конструкции DO, так и вне ее. Если во время работы программы ко-нечное значение становится отрицательным или нулевым, переменная цикла принимает значение 1, а выполнение цикла прекращается. Непреднамеренная замена значения шага приращения переменной цикла нулем приведет к зацикливанию программы : цикл будет исполняться вечно В этом смысле работа с конструкцией DO требует от программиста внимания и аккуратности. Самые простые приемы, гарантирующие предсказуемое выполнение цикла, — никогда не использовать переменные-параметры цикла вне цикла, задавать границы изменения и шаг переменной цикла буквальными или именованными константами, не всегда применимы. [15]

Пожалуйста, приостановите работу AdBlock на этом сайте.

Существует два оператора, которые позволяют управлять выполнением цикла. Это операторы break и continue .

Давайте рассмотрим их работу на следующем примере: Модифицируем программу из прошлого урока.

Программа: Игральный кубик.

Программа заменяет обычный игральный кубик.

Управление:

  • 1 — бросить кубик;
  • 0 — закончить игру.

В конце игры программа должна выводить количество бросков кубика, сделанных в игре.
После 50 бросков программа автоматически завершается. Выводится сообщение "Game over!" .

Код такой программы будет выглядеть следующим образом:

Давайте поясню некоторые новые операторы, которые там используются.

Оператор break

Оператор break прекращает выполнение цикла. Помните, мы уже использовали данную команду в операторе switch . Здесь всё точно так же. Мы используем данный оператор, чтобы выйти из цикла, когда произойдёт 50 бросков.

Важный момент. Оператор break работает и во всех циклических конструкциях, и в операторе выбора.

В нашем примере он используется и там, и там. Возникает вопрос: а как он решает, откуда надо выйти: из switch или из цикла. Очень просто.

Оператор break всегда завершает ближайший внешний оператор, внутри которого он находится.

Например, в нашей программе первый раз оператор break встречается в ветке case 0 . Значит он находится внутри оператора switch , который находится внутри цикла do-while . Ближайший оператор, внутри которого он расположен, – это switch . Следовательно, завершается оператор switch . Аналогично и с другими ветками оператора switch .

Последний оператор break находится внутри if , который находится внутри цикла do-while . Т.к. на конструкцию if оператор break не действует, то ближайшим оператором, в котором он находится, является цикл do-while . Поэтому в этом случае break завершает цикл.

Оператор continue

Данный оператор применяется только внутри циклов. Он позволяет прервать текущую итерацию цикла. После того, как компьютер встречает оператор continue , он завершает исполнение тела цикла и переходит к проверке условия (в циклах while и do-while ) или к изменению счётчика (выражение 3 в цикле for ).

Читайте также:  Что хорошего в магнитофоне

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

Зацикливание

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

Зачастую это происходит при использовании циклов do-while и while .

Пример: программа сложения пяти введённых чисел.

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

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

В нашем примере допущена именно такая ошибка. Условие записано верно, переменная k (счётчик считанных чисел) объявлена и инициализирована, но внутри тела цикла мы забыли её увеличить. Поэтому нашему условию окончания цикла k не суждено стать истинным.

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

Давайте приведем нашу программу в рабочее состояние:

Презентация к уроку

Загрузить презентацию (329,2 кБ)

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

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

Ход урока

I. Актуализация знаний

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

II. Теоретический материал урока

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

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

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

Читайте также:  Почему не работает динамик в наушниках

Циклом называется многократно исполняемый участок алгоритма (программы). Соответственно циклический алгоритм — это алгоритм, содержащий циклы.

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

Существует 3 типа циклических структур:

  • Цикл с предусловием;
  • Цикл с послеусловием;
  • Цикл с параметром;

Иначе данные структуры называют циклами типа «Пока», «До», «Для».

Графическая форма записи данных алгоритмических структур:

Цикл с предусловием (иначе цикл пока) имеет вид:

Форматы записи операторов алгоритма Блок-схема Форматы записи операторов на Паскале
Пока (условие)
нц
серия команд
кц
while условие do
begin
серия команд;
end;

условие – выражение логического типа.

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

Серия команд, находящихся между begin и end, выполняются до тех пор, пока условие истинно.

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

Цикл с постусловием (иначе цикл до) имеет вид:

Форматы записи операторов алгоритма Блок-схема Форматы записи операторов на Паскале
В алгоритмическом языке нет команды которая могла бы описать данную структуру, но ее можно выразить с помощью других команд (Например, ветвления). repeat серия команд
until
условие

условие – выражение логического типа.

Последовательность инструкций между repeat и until всегда будет выполнено хотя бы один раз;

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

Инструкция repeat, как и инструкция while, используется в программе, если надо провести некоторые повторяющиеся вычисления (цикл), однако число повторов заранее не известно и определяется самим ходом вычисления.

Цикл с параметром (иначе цикл для) имеет вид:

Форматы записи операторов алгоритма Блок-схема Форматы записи операторов на Паскале
Для i от а до b шаг h
делай
Нц
Серия команд
кц
h = +1
for
i:= a to b do
begin
серия команд
end;
h = -1

for i:= b downto a do
begin
Cерия команд;
end;

i – параметр цикла;
a – начальное значение цикла;
b – конечное значение цикла;
h – шаг изменения параметра.

Структура данного цикла иначе называют циклом i раз.

Эта команда выполняется таким образом: параметру i присваивается начальное значение а, сравнивается с конечным значением b и, если оно меньше или равно конечному значению b, выполняется серия команд. Параметру присваивается значение предыдущего, увеличенного на величину h – шага изменения параметра и вновь сравнивается с конечным значением b.

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

Если между begin и end находится только один оператор, то операторные скобки можно не писать. Это правило работает для цикла типа «Пока» и «Для».

Рассмотрим пример решения задач с использованием данных структур

Пример.

Вычислить произведение чисел от 1 до 5 используя различные варианты цикла

Составим алгоритм в виде блок-схемы.

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

Ссылка на основную публикацию
Adblock detector