Бесконечная программа в паскале

Содержание
Читайте также:
С какого года развивается областная программа 500 парков белогорья ответ

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

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

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

Итак зацикливание в программировании — это ситуация, когда цикл написан таким образом, что условия выхода из него не выполняется. Рассмотрим зацикливание в операторах цикла for,while и repeat. Справедливости ради все варианты будут рассмотрены в Turbo Pascal и PascalABC. Также будет добавлен оператор write для вывода результатов.

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

Вообще идея зацикливания проста: необходимо всего-то в каждом шаге цикла уменьшать оператор шага на 1 (i:=i-1;). Однако именно такая реализация возможна не везде. Рассмотрим простой пример.

[pascal] написать программу, вычисляющую сумму ряда

Казалось бы все просто,да не тут то было.В то время как в Turbo Pascal все проходит на ура,в PascalABC такое не возможно и для зацикливания необходимо использовать оператор goto.

label m;
var i:integer;
begin
m:
for i:=1 to 5 do begin
write(i);
if i=2 then goto m;
end;
end.

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

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

Оба компилятора адекватно реагируют на пропуск шага.

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

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

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

#11 Цикл While «с предусловием» — пример. Паскаль

vedro-compota's picture

Ранее мы уже рассмотрели цикл for (т.н. «цикл с известным числом повторений»), для которого число витков определялось правой и левой границей счетчика.

#4. Циклы For, While, repeat на PascalABC.net

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

Когда используется

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

Цикл while — структура

while do begin < группа операторов >end;
while (a

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

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

while (a5) do // выполняй пока «а» меньше «b» и «а» не равно 5 begin a := a + 1; // например, увеличивай каждый раз на 1 writeln(‘a —>’ + a); end;

Условие выхода из while

Цикл типа while в Паскале выполняется до тех пока истинно логическое выражение в заголовке данного цикла.
То есть:

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

Бесконечный циклы и как с ними бороться

Как возникают бесконечные циклы

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

В цикле же while проверка логического условия приводит к тому, что есть возможность (в некотором смысле «опасность») получить зависание программы за счет бесконечного числа раз повторения цикла.
Эта ситуация может возникнуть при следующих условиях (они должны выполняться одновременно):

  1. Цикл while выполнился хотя бы один первый раз.
  2. Во всех последующих итерациях (повторах) тела цикла логическое выражение по-прежнему возвращает только true и никогда false.

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

var a: integer; begin a := 8; while (a < 100) do // пока a < 100 write(a, ‘ ‘); // выводим очередное значение a end.

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

Но фактически, мы видим, что ещё до начала цикла была выполнена операция присваивания:

a := 8;

— а это значит, что на самом деле в цикле первый раз мы проводим сравнение (паскаль проводит):

результат которого истинен, а цикл первый раз выполнится (первое условие для «угрозы бесконечности» у нас уже есть). Что же происходит далее?
В теле цикла значение переменной $a$ никак не меняется, а значит не меняется от витка к витку и значение логического выражения:

— и потому цикл оказывается бесконечным.

Как избежать этой ситуации? Рассмотрим далее.

Как бороться с бесконечными циклами

Чтобы цикл с проверкой логического условие не был бесконечным необходимо:

  • изменять в теле цикла компоненты логического выражения (значения входящих в него переменных)

— это не даёт гарантии защиты «от бесконечности», так как ваше логическое выражение или ваш алгоритм изменения переменных могут быть построены так, что несмотря на изменение значений переменных логическое выражение все равно каждый раз будет возвращать true, но без этого вы точно получите бесконечный цикл (если он начнётся, а выражение изменяться не будет).

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

Главное: анализируйте ваш код на предмет того, что в каком-то витке условие должно вернуть false — без этого любой while, который начал выполняться станет бесконечным.

Примеры кода (решения задач)

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

Пример №1 — цикл с неизвестным число повторений

Пользователь вводит целые числа. Пока он не введёт число большее $17$, в ответ на каждое введённое число выводите сумму этого числа и числа $8$, если же введённое число больше $17$, то цикл необходимо завершить.

Решим эту задачу:

program Project1; var a: integer; begin a := 1; // любое значение, чтобы цикл мог начаться while (a

Пример №2 — замена for на while

Цикл while — самая универсальная конструкция из всех циклов Паскаля. любой другой цикл можно заменить на него (хотя это не всегда рекомендуется делать). Рассмотрим код (запустите его):

var i: integer; begin for i:= 1 to 10 do write(i, ‘ ‘); // выводим значения через пробел writeln(); // переносим строку i:=1; // начальное значение счетчика while i

— в этой задаче мы выводим числа от $1$ до $10$ два раза, делая одно и тоже разными циклами.
По сути в while в примере выше мы тоже используем переменную счетчик, но уже сами управляем её изменением в теле цикла, в то время как в for этого не требуется.

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

Видео-пояснения

Для данного урока есть такие видео-пояснения:

Задачи для самостоятельного решения

  1. Решите с помощью цикла while:
    Пользователь вводит целое число N, большее 8.
    Выведите на экран последовательность четных числел от 8 до N,
    Например:
  1. для N=21:

8 10 12 14 16 18 20
8 10 12 14 16 18 20 22

  • этот видео-пояснение
  • а также это уточнение про отладку.

Ниже мы приведём ещё пару задач на эту же тему.

  • С использованием if()
  • С использованием if() и break;
  • в одном витке цикла должен быть только 1 readln()
  • не использовать «обмен» (т.е. не присваивать одной переменной значение другой)

Подсказка: Если не получается решить:

  • посмотрите эту видео-подсказку
  • посмотрите вариант с одним readln()
  • Решение с использованием счетчика
  • Решение без счетчика

4 8 12 16. 100

46541
—Polzovatel: 12 Otvet: 6 —Polzovatel: 12 Otvet: 7 —Polzovatel: 90 Otvet: 8 —Polzovatel: 55 Otvet: 7 —Polzovatel: 100 Otvet: 6 —Polzovatel: 123644 Otvet: 5 —Polzovatel: 77 Otvet: 6 —Polzovatel: 1 Otvet: 7
—Polzovatel: 12 Otvet: 4 —Polzovatel: 16 Otvet: 5 —Polzovatel: 5 Otvet: 6 —Polzovatel: 10 Otvet: 7 —Polzovatel: 8 Otvet: 8 —Polzovatel: 9 Otvet: 7 —Polzovatel: 9 Otvet: 6 —Polzovatel: 20 Otvet: 7

Дополнительная проверка знаний (решать не обязательно):

Key Words for FKN + antitotal forum (CS VSU):

  • паскаль while пример кода
  • while примеры В паскаль
  • цикл с предусловием примеры
  • цикл с постусловием примеры Паскаль
  • Паскаль как работают циклы
  • Паскаль как работает цикл while объяснение
  • замена for на while пример Паскаль
  • паскаль бесконечный цикл
  • Паскаль зацикливание программы
  • Паскаль бесконечный цикл пример и как избавиться от зацикливания

Источник: fkn.ktu10.com

Бесконечные циклы

Бесконечный цикл может быть представлен следующей схемой:

i :=0;

5: i := i + 1; эти три оператора образуют бесконечный цикл

i := i -1;

GoTo 5;

Как правило, появление в программе бесконечных циклов вызвано логическими ошибками, допущенными программистом при разработке алгоритма и кодировании (написании операторов программы) и использовании оператора безусловного перехода GoTo. Поэтому в современных алгоритмических языках этот оператор практически не используется, а заменяется циклами. Бесконечные циклы не выявляются транслятором при синтаксическом контроле и проявляются только после запуска программы на выполнение следующим образом:

  1. длительное время (десятки секунд) программа не выводит на устройство вывода никакой информации – программа зависает,
  2. на устройство вывода постоянно выводится одна и та же информация.

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

Как правило, некоторую цепочку операторов необходимо повторять не бесконечно, а до тех пор, пока выполняется некоторое условие: ПОКА (условие) ВЫПОЛНЯТЬцепочка; Такой цикл называется циклом с предусловием (циклом ПОКА) и изображается следующей схемой: Условие – это логическое выражение, зависящее от переменных, входящих в цепочку. Цикл повторяется до тех пор, покаусловиеистинно. Значит, данное условие является условием продолжения цикла. Выполнение цикла заканчивается, если операторы цепочки изменяют значения переменных, входящих в условие, и оно становится ложным. Цикл не выполняется ни разу, если условие было ложным с самого начала. Цикл ПОКА превращается в бесконечный, если условие подобрано так, что оно всегда истинно. В Паскале цикл с предусловием реализуется оператором цикла While: While(условие)Doоператор; или While(условие)DoBeginоператор;оператор;оператор; … End; Операторы, находящиеся между Begin и End, называются телом цикла. Внимание! После слова Do точка с запятой не ставится! Если поставить точку с запятой после слова Do, то этот цикл, как правило, превращается в бесконечный, потому что в этом случае условие изменяться не будет. Операторные скобки Begin…End используются в том случае, если после слова Do должна следовать цепочка операторов. Действия оператора While:

  1. проверяется выполнение условия,
  2. если оно истинно, то выполняется оператор (цепочка), стоящий после Do,
  3. после его выполнения снова проверяется условие, и если оно снова истинно, то цикл повторяется,
  4. если условие становится ложным, то цикл заканчивает работу.

Примеры:

  1. вычислить сумму ста первых натуральных чисел:

s= 1 + 2 + 3 + … + 98 + 99 + 100 Пусть s – искомая сумма, i – очередное число (изменяется от 1 до 100). Тогда алгоритм решения задачи можно описать следующим образом:

  1. обнуляем сумму s – в ней ничего нет,
  2. берем первое число: i = 1,
  3. добавляем в сумму очередное число, пока оно не достигнет 100.

Представим этот алгоритм так: s= 0;i = 1;ПОКА (i ≤ 100)ВЫПОЛНЯТЬНАЧАЛОs = s + i;i = i + 1;КОНЕЦ;Программа: Program Gauss;Uses CRT;

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru