Циклические процессы обработки данных. Управляющие структуры WHILEDO, DOUNTIL, FORDO, страница 2

Управляющая структура DOUNTIL относится к базовому набору управляющих структур структурного программирования и является элементарной программой. В языке Object Pascal, для организации последовательности действий, задаваемой этой структурой, используют оператор repeat.

Управляющая структура DOUNTIL

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

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

На Object Pascal последовательность действий, задаваемую этой структурой, реализует оператора цикла repeat.

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

Е – дерево выполнения для cтруктуры DOUNTIL.

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

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

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

program PRepeat;

{$APPTYPE CONSOLE}

uses

  SysUtils,

  URussian;

Var

  y: integer;

begin

  write(Rus('Ведите целое число: '));readln(y);

  y:= abs(y);

  repeat

    writeln(y mod 10);//вывод младшего разряда y

    y:= y div 10;//отбрасываем младший разряд

  until y = 0;

  readln;

end.

Синтаксическая диаграмма оператора цикла с постусловием (repeat)

Оператор цикла с предусловием (while)

Оператор цикла с предусловием (while) строится в соответствии со следующим правилом (см. также синтаксическую диаграмму):

while E do S

здесь E - выражение булевского типа, которое называется условием продолжения цикла; S оператор, называемый телом цикла; whileи do– зарезервированные слова.

Оператор цикла while содержит в себе условие продолжения цикла, которое управляет  повторным выполнением тела цикла (тело цикла может  быть составным оператором). Условие продолжения цикла вычисляется до того, как тело цикла будет  выполнено. Тело цикла выполняется повторно до тех пор, пока условие продолжения цикла принимает значение «истина» (True).

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

Оператор цикла (while) называется циклом с предусловием, потому что сначала вычисляется условие продолжения цикла, а потом выполняется тело цикла.

Условие продолжения цикла названо так, потому что выполнение цикла продолжается до тех пор, пока условие завершения цикла принимает значение «истина» (True).

Управляющая структура оператора while - это структура типа «WHILEDO», в которой while-тест соответствует условию продолжения цикла, а do - часть - телу цикла.

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

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

Управляющая структура WHILEDO

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

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

На Object Pascal она может быть реализована посредством применения оператора цикла while.

Структура WHILEDO. Е – схема выполнения

Структура WHILEDO. Е – дерево выполнения

Пример оператора цикла с предусловием (while)

В этом примере мы формируем из введённого целого числа x число y, в котором разряды x переставлены в обратном порядке.

program PWhile;

{$APPTYPE CONSOLE}

uses

  SysUtils,

  URussian;

var

  x: integer;//введённое число

  s: integer = 1;//знак числа

  y: integer = 0;//результат

begin

  write(Rus('Ведите целое число: '));readln(x);

  while x <> 0 do begin

    y:= y*10 + x mod 10;//сдвигаем разряды y влево на 1 //разряд и добавляем к нему младший разряд x

    x:= x div 10;отбрасываем младший разряд x

  end;

  writeln(y);

  readln;

end.

Синтаксическая диаграмма оператора цикла с предусловием (While)

Оператор цикла с параметром (for)

Оператор цикла (for) строится в соответствии со следующим правилом (см. также синтаксическую диаграмму):

for I:= E1 to E2 do  S

или

for I:= E1 downto E2 do  S

здесь E1 - выражение, которое называется начальным значением; E2 - выражение, которое называется конечным значением; I - идентификатор управляющей переменной (индекса цикла); S оператор, называемый телом цикла; for,.to,do,downto – зарезервированные слова.

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

В качестве управляющей переменной должен использоваться идентификатор переменной (без какого-либо квалификатора), который обозначает переменную, объявленную локальной в блоке, в котором содержится оператор for. Управляющая переменная должна иметь порядковый тип. Начальное и конечное значения должны иметь тип, совместимый по присваиванию с этим порядковым типом.

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

Оператор, который содержится в теле оператора for, выполняется один раз для каждого значения в  диапазоне между начальным и конечным значениями. Управляющая переменная всегда инициализируется начальным значением. Когда оператор for использует ключевое слово to, управляющей переменной присваивается следующее значение из множества при каждом повторении цикла. Если начальное значение превышает конечное значение, то содержащийся в теле оператора for оператор не выполняется.

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

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