Выбрать главу

Если цикл используется в подпрограмме, то переменная-параметр цикла должна быть описана как локальная. Наилучшим решением в PascalABC.NET является описание переменной в заголовке цикла.

Изменение переменной-параметра цикла внутри цикла является логической ошибкой. Например, следующий фрагмент со вложенным оператором for является ошибочным:

for i := 1 to 10 do

i -= 1;

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

Оператор цикла foreach имеет одну из следующих форм:

foreach переменная in контейнер do

оператор

или

foreach переменная: тип in контейнер do

оператор

или

foreach var переменная in контейнер do

оператор

В качестве контейнера может фигурировать динамический массив, строка, множество, а также любой контейнер, удовлетворяющий интерфейсу IEnumerable или IEnumerable<T>(например, List<T>, Dictionary<Key,Value> и т.д.). Переменная цикла должна иметь тип, совпадающий с типом элементов контейнера (если контейнер удовлетворяет интерфейсу IEnumerable, то это тип object). В последней форме foreach тип переменной цикла автовыводится по типу элементов контейнера.

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

Например:

var

ss: set of string := ['Иванов','Петров','Сидоров'];

a: array of integer := (3,4,5);

b: array [1..5] of integer := (1,3,5,7,9);

l := new List<real>;

begin

foreach s: string in ss do

write(s,' ');

writeln;

foreach x: integer in a do

write(x,' ');

writeln;

foreach var x in b do

write(x,' ');

writeln;

foreach var r in l do

write(r,' ');

end.

Операторы цикла while и repeat

Оператор цикла while имеет следующую форму:

while условие do

оператор

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

Если условие всегда оказывается истинным, то может произойти зацикливание:

while 2>1 do

write(1);

Оператор цикла repeat имеет следующую форму:

repeat

операторы

until условие

В отличие от цикла while, условие вычисляется после очередной итерации цикла, и если оно истинно, то происходит выход из цикла. Таким образом, операторы, образующие тело цикла оператора repeat, выполняются по крайней мере один раз.

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

repeat

read(x);

until x=0;

Если условие всегда оказывается ложным, то может произойти зацикливание:

repeat

write(1);

until 2=1;

Оператор with

Оператор with позволяет сократить обращение к полям записи, а также к полям, методам и свойствам объекта. Он имеет вид:

with имя записи или объекта do оператор

или

with список имен do оператор

Всюду внутри оператора можно опускать имя записи при обращении к полю указанной записи или имя объекта при обращении к полю, методу или свойству указанного объекта. Например, пусть описана переменная

var

DateOfBirthday = record

Day: Integer;

Month: Integer;

Year: Integer;

end;

Тогда присваивание значений ее полям без использования оператора with имеет вид:

DateOfBirthday.Day := 23;

DateOfBirthday.Month := 2;

DateOfBirthday.Year := 1965;

Использование оператора with позволяет сократить предыдущую запись:

with DateOfBirthday do

begin

Day := 23;

Month := 2;

Year := 1965;

end;

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

var

x,y,z: integer;

a: record

x,y: integer;

end;

b: record

x: integer;

;

то фрагмент программы

with a,b do

begin

x := 1;

y := 2;

z := 3;

;

эквивалентен фрагменту

with a do

with b do

begin

x := 1;

y := 2;

z := 3;

;

а также фрагменту

b.x:=1;

a.y:=2;

z:=3;

Оператор with устарел и сейчас практически не используется.

Оператор безусловного перехода goto

Оператор безусловного перехода goto имеет следующую форму:

goto метка

Он переносит выполнение программы к оператору, помеченному меткой метка.

Метка представляет собой идентификатор или целое без знака. Чтобы пометить оператор меткой, необходимо перед оператором указать метку с последующим двоеточием:

label1: оператор

Метки должны быть описаны в разделе меток с использованием служебного слова label:

label 1,2,3;

Например, в результате выполнения программы

label 1,2;

begin

var i := 5;

2: if i<0 then goto 1;

write(i);

Dec(i);

goto 2;

1:

end.

будет выведено 543210.

Метка должна помечать оператор в том же блоке, в котором описана. Метка не может помечать несколько операторов.