Оператор цикла foreachимеет одну из следующих форм:
foreachпеременная inконтейнер do
оператор
или
foreachпеременная: тип inконтейнер do
оператор
или
foreachvar переменная inконтейнер do
оператор
В качестве контейнера может фигурировать динамический массив, строка, множество, а также любой контейнер, удовлетворяющий интерфейсу IEnumerable или IEnumerable(например, List, Dictionary и т.д.). Переменная цикла должна иметь тип, совпадающий с типом элементов контейнера (если контейнер удовлетворяет интерфейсу IEnumerable, то это тип object). В последней форме foreach тип переменной цикла автовыводится по типу элементов контейнера.
Переменная цикла пробегает все значения элементов контейнера и для каждого значения переменной цикла выполняется тело цикла. Изменение переменной цикла внутри тела цикла не меняет элементы контейнера, т.е. они доступны только на чтение.
Например:
var
ss: set ofstring := ['Иванов','Петров','Сидоров'];
a: array ofinteger := (3,4,5);
b: array[1..5] ofinteger := (1,3,5,7,9);
l := new List;
begin
foreachs: string inss do
write(s,' ');
writeln;
foreachx: integer ina do
write(x,' ');
writeln;
foreachvar x inb do
write(x,' ');
writeln;
foreachvar r inl do
write(r,' ');
end.
Операторы цикла while и repeat
Оператор цикла whileимеет следующую форму:
whileусловие do
оператор
Условие представляет собой выражение логического типа, а оператор после doназывается телом цикла . Перед каждой итерацией цикла условие вычисляется, и если оно истинно, то выполняется тело цикла, в противном случае происходит выход из цикла.
Если условие всегда оказывается истинным, то может произойти зацикливание :
while2>1 do
write(1);
Оператор цикла repeatимеет следующую форму:
repeat
операторы
untilусловие
В отличие от цикла while, условие вычисляется после очередной итерации цикла, и если оно истинно, то происходит выход из цикла. Таким образом, операторы, образующие тело цикла оператора repeat, выполняются по крайней мере один раз.
Обычно оператор repeat используют в ситуациях, где условие нельзя проверить, не выполнив тело цикла. Например:
repeat
read(x);
untilx=0;
Если условие всегда оказывается ложным, то может произойти зацикливание :
repeat
write(1);
until2=1;
Оператор 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позволяет сократить предыдущую запись:
withDateOfBirthday 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;
;
то фрагмент программы
witha,b do
begin
x := 1;
y := 2;
z := 3;
;
эквивалентен фрагменту
witha do
withb do
begin
x := 1;
y := 2;
z := 3;
;
а также фрагменту
b.x:=1;
a.y:=2;
z:=3;
Оператор with устарел и сейчас практически не используется.
Читать дальше