Какие циклы в языке Паскаль? For, While, Repeat. Вложенные циклы Pascal

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

На фото изображено окно программы IDE PascalABC.Net.

Циклы while и repeat

И тут нам на помощь спешат еще два оператора с циклами (в дальнейшем просто циклы) while и repeat. Причем если нужно поставить условие в начале цикла, то здесь мы используем while, а если в конце – repeat. Ну, а теперь давайте разберемся с вышесказанным.

Оператор цикла While

Цикл while имеет довольно простую для понимания структуру: while условие do оператор

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

Но что же делать, если в операторе нам нужно прописать несколько строчек кода (выполнить сразу несколько операторов)? Для этого используются операторные скобки begin-end. Важно учитывать, что при использовании данного метода в конце каждого оператора ставится “точка с запятой (;)” (после последнего, перед END, не обязательно).

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

while условие do
begin
оператор 1;
оператор 2;
оператор 3;
. . . . . .
оператор N
end;

Пример 1. Допустим, что нам нужно найти сумму кубов чисел от 1 до 10.

var
b, sum: integer;

begin
b := 1;
sum := 0; // начальная сумма
while b <= 10 do
begin
sum := sum + b*b*b;
inc(b)
end;
writeln(‘sum = ‘, sum); // выводим результат
readln
end.

В начале цикла (строка 7) видно, что он будет повторяться пока b <= 10. Тело цикла (операторы) состоит из строк, в которых при каждом повторе мы к сумме sum прибавляем b3 (строка 9) а b, в свою очередь, будет увеличиваться на 1 (10 строка). В момент, когда b достигнет значения 10, цикл выполнит свое последнее вычисление и будет произведен выход из цикла, так как наше условие b <= 10 будет иметь ложное значение (его значение будет 11).

Пример 2. Перед вами небезызвестный пример, где функция ех расположена в ряд Тейлора. Вычисления проведем с точностью до одной миллионной, а результат возьмем за S. Можем заметить, что первоначальное значение a0=1, а следующие члены вычисляются путем умножения an на х и деления на n.

Смысл этого кода прост: пока все члены > 0,000001, то тело цикла начнет свою работу, где мы вычисляем указанную нами сумму. Но если член ряда будет <= 0,000001, то тело цикла прекращает работу, выполняется выход и выводится результат.

var a, x, S: real; n: integer;
begin x := 0.5;
n := 0; // начальный номер
a := 1; // начальное значение члена ряда
S := 0; // начальная сумма
while a > 0.0000001 do
begin
S := S + a;
inc(n);
a := a * x / n
end;
writeln(‘S = ‘, S:0:6);
readln
end.

Старайтесь избегать так называемых “бесконечных циклов”, например:

begin
while 1 < 100 do writeln(‘Hello!’) end.

Так как наше условие априори истинное (единица никак не может быть больше ста), то программа будет безостановочно выводить фразу “Hello”. Как вы поняли, чтобы избегать подобных ситуаций, нужно контролировать, чтобы условие не было постоянно истинным. Выведите наименьший делитель числа x, отличный от 1

var x, d: integer;
begin write(‘Введите x —> ‘);
readln(x);
d := 2; { <- минимальный делитель отличный от 1 }
while (x mod d <> 0) do inc(d);
writeln(‘d = ‘, d);
readln
end.

Напечатать минимальное число, большее 200, которое нацело делится на 17

var
n: integer;

begin
n := 201; { <- минимальное число большее 200 }
while (n mod 17 <> 0) do inc(n);
writeln(‘Ответ: ‘, n);
readln
end.

Оператор цикла Repeat

Оператор цикла repeat имеет отличающуюся структуру от while:

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

Как вы могли заметить, данный оператор отличается тем, что условие будет проверяться на конце цикла. То есть, если оно верное – будет произведен выход из цикла, а если ложное – цикл повторится. Из-за такой особенности данный оператор также называется оператор выхода. Есть еще одно отличие: в цикле repeat не требуются скобки begin-end, а тело цикла прописывается напрямую:

repeat
оператор 1;
оператор 2;
оператор 3;
………..
оператор N
until условие;

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

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

var
x: integer;

begin
repeat
readln(x)
until x >= 0; { <— выходим, если x>=0 }
writeln(‘Квадратный корень: ‘, sqrt(x):0:4);
readln
end.

Вводить с клавиатуры числа до тех пор, пока их сумма не превысит заданное наперед число. Выход из цикла будет произведен тогда, когда сумма sum станет > числа M:

var
x, M, sum: real;

begin
write(‘Введите контрольное число —> ‘);
readln(M);
sum := 0; { <- начальное значение суммы }
repeat
readln(x); { <- вводим x }
sum := sum + x { <- к сумме прибавляем x } until sum > M; { <== выходим, если сумма превысит M }
writeln(‘Результат: ‘, sum);
readln
end.

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