В паскале существует 3 оператора цикла это while…do; repeat…until ; for…to/downto…do; рассмотрим их по подробнее.
while
while оператор повтора, с указанием условий повторения до тела цикла. Поэтому операторы в теле цикла не выполнятся ни разу, если условие не истинно.
Шаблон данного оператора выглядит следующим образом:
while <Условия продолжения повторений> do
<Тело цикла>;
<Тело цикла> будет выполнятся, пока <Условия продолжения повторений> не станет ложью.
Рассмотрим Следующую задачу: Строку, указанной длины заполнить последовательно цифрами от 0..9.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
program TestWhile; var Len:Integer; s,tempS: string; begin Write('Введите длину строки:'); Readln(len); while Length(S)<len do begin Str(Length(S) mod 10,tempS); S:=S+tempS; end; Writeln(s); end. |
Перед началом цикла мы задаём значения len — длина строки, i мы определяем как 0.
Дальше мы убеждаемся, что i не превышает длину строки len, и выполняем тело цикла заключённого между begin и end;, пока i не превышает длину строки len.
Дальше выводим результат.
repeat
Так же существует оператор цикла repeat…until; это оператор цикла, с проверкой условия в конце цикла. Она задаётся следующим шаблоном:
repeat
<Оператор 1>;
<Оператор 2>;
…
<Оператор n>;
until <Условие окончания цикла>;
<Условие окончания цикла> — если это условие станет истинным, то выполнение цикла прекратится.
Заметим, что оператор цикла repeat…until, в отличии от while do выполнится хотя бы один раз. Даже если <Условие окончания цикла> является истинным ещё до начала выполнения цикла.
попытаемся решить предыдущую задачу с помощью этого оператора цикла, напомню условия: «Строку, указанной длины заполнить последовательно цифрами от 0..9.»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
program TestRepeat; var Len,i:Integer; s,tempS: string; begin Write('Введите длину строки:'); Readln(len); S:=''; repeat Str(Length(S) mod 10,tempS); S:=S+tempS; until (Length(S)>=Len); Writeln(s); end. |
Перед началом выполениня цикла мы так же задаём значения len — длина строки, i мы определяем как 0.
Выполняем операторы внутри цикла, проверяем значения выхода из цикла, если длина строки ещё не больше или не равна заданной длины, то повторяем цикл ещё раз.
После выполнения цикла выводим строку на экран.
Эта задача будет работать в большенстве условий, однако если мы зададим длину 0 то цикл выполнится один раз, и вместо строки нулевой длины мы получим строку ‘0’ длиной 1, что явно не соответствует условию задачи.
for
Существует ещё один оператор цикла — for.
Этот операто цикла со встроенным счётчиком. Обычно его использование более понятное, чем операторы while и repeat, по крайней мере для меня.
существует два шаблона оператора for:
for <парметры цикла>:=<начальное значение параметра цикла> to <конечное значение параметра цикла> do
<Тело цикла>;
for <парметры цикла>:=<начальное значение параметра цикла> downto <конечное значение параметра цикла> do
<Тело цикла>;
Конструкция for to do- будет увеличивать <парметры цикла> на 1, пока не станет равно конечному значению параметра цикла, после выполнит цикл ещё раз и завершится.
Конструкция же for downto do- будет уменьшать <парметры цикла> на 1, пока не станет равным конечное значение параметра цикла, потом выполнит цикл ещё раз и завершится.
Для закрепления попытаемся решить предыдущую задачу с помощью данного оператора повтора. » Строку, указанной длины заполнить последовательно цифрами от 0..9.»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
program TestFor; uses SysUtils; var Len:Integer; s,tempS: string; i: Integer; begin Write('Введите длину строки:'); Readln(len); S:=''; for i:=0 to Len-1 do begin Str(i mod 10,tempS); S:=S+tempS; end; Writeln(s); end. |
Обратите внимание, что в условии цикла for мне пришлось из Len вычесть 1,т.к. цикл выполняется ещё раз после достижения результата. Так же нам пришлось объявить ещё одну переменную i.
Break
Иногда хочется выйти из цикла в середине его выполнения, для этого существует оператор Break. При его вызове программа выходит из текущего цикла.
Рассмотрим первое решение задачи с помощью параметра while. В том примере, мы не учитываем, что длина строки в Pasсal не может привышать 254 символа. Обработаем данную ошибку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
program TestBreak; var Len:Integer; s,tempS: string; begin Write('Введите длину строки:'); Readln(len); while Length(S)<len do begin Str(Length(S) mod 10,tempS); S:=S+tempS; if Length(S)>=254 then Break; end; Writeln(s); readln; end. |
Мы вставили строку:
12 |
if Length(S)>=254 then Break; |
Теперь если длина строки будет равна или превышать 254, то мы выйдем из цикла и выведем полученное значение.
Однако не стоит злоупотреблять оператором Break он может существенно снизить читаемость кода. И обычно без него возможно обойтись, так например предыдущий код мог выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
program NotBreak; var Len:Integer; s,tempS: string; begin Write('Введите длину строки:'); Readln(len); while (Length(S)<len) and (Length(S)<=254) do begin Str(Length(S) mod 10,tempS); S:=S+tempS; end; Writeln(s); end. |
Комментарии: