Алгоритмические структуры

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

Линейная структура

Линейной структурой или следованием называют последовательное однократное выполнение двух или более операторов. Например:

readln(a ,b);
c := sqrt(a * a + b * b);
writeln(c);

Разветвленная структура

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

if логическое выражение 
   then оператор1
   else оператор2

Если значение логического выражения — истина, выполняется «оператор1», иначе (т.е. при ложности логического выражения) — «оператор2».

Пример:

if x > 0
   then y := sqrt(x)
   else y := 0;

При положительном x переменная y получит значение квадратного корня из x, в другом случае — значение 0.

Если нужно выбирать более чем из 2 вариантов, используют вложенные условные операторы, например:

if x > 0
   then y := sqrt(x)
   else if x > -10
      then y := 0
      else y := -sqrt(-x-10);

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

Второй вариант реализации ветвления — оператор множественного выбора:

case дискретное выражение of
    значение1: оператор1;
    значение2: оператор2;
...
    значениеN: операторN;
end;

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

Пример:

write('Введите операцию');
readln(c);
case c of
   '+': write(x + y);
   '-': write(x - y);
   '*': write(x * y);
   '/': write(x / y);
   else write('Недопустимая операция')
end;

Циклическая структура

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

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

Циклы с условием

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

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

while условие do
    оператор;

Пример:

while a > 10 do
   a := sqrt(a);

Такая запись обозначает: пока значение переменной a превосходит 10, из него следует извлекать квадратный корень. Предположим, что до начала цикла переменная имела значение 10000. Поскольку 10000 > 10, из него будет извлечен корень; переменная получит значение 100. С этим значением вновь проверяется условие повторения. 100 больше 10, поэтому квадратный корень извлекается еще раз; переменная получает значение 10. Опять проверяется условие, но на этот раз 10 не больше 10, значит цикл будет завершен, и компьютер перейдет к исполнению следующего оператора.

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

repeat
    операторы
until условие;

Пример:

repeat
   write('Введите положительное число:');
   readln(x)
until x > 0;

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

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

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

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

for параметр := начальное to конечное do
    оператор;

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

for параметр := начальное downto конечное do
    оператор;

Пример 1:

for i := 1 to 20 do
   writeln(i:3, i*i*i:5);

При выполнении этого фрагмента программы переменная i примет поочередно все значения от 1 до 20, при каждом из них на экран на отдельной строке (writeln) будет выводиться само это значение и его куб. В результате получится таблица кубов первых двадцати натуральных чисел. Чтобы значения выводились ровными колонками, в процедуре вывода указан формат (на значение переменной i отведено 3 позиции, для куба — 5).

Пример 2:

for c := 'z' downto 'a' do
   write(c);

Этот фрагмент программы выведет на экран английский алфавит в обратном порядке —от «z» до «a»:

zyxwvutsrqponmlkjihgfedcba

Параметр цикла

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

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

Составной оператор

В ряде случаев (например, в условном операторе, цикле с предусловием, цикле с параметром) бывает необходимо объединить несколько действий в одно целое — единый составной оператор. В языке Pascal для этого служат «операторные скобки» begin...end. Например:

if d < 0 then writeln('Действительных корней нет')
   else begin
      x1 := (-b - sqrt(d))/(2 * a);
      x2 := (-b + sqrt(d))/(2 * a);
      writeln('X1=', x1:8:2, 'X2=', x2:8:2);
   end;

При ложности условия d < 0 будет выполнена группа из трех операторов.