Язык:
Русский
English
for...to, for...downto (зарезервированные слова)
Оператор for вызывает оператор, находящийся после слова do, по одному разу для каждого значения в диапазоне от начального до конечного значений.
Синтаксис
for переменная := начальное to конечное do оператор
или
for переменная := начальное downto конечное do оператор
Замечания
Переменная цикла и начальное и конечное значения должны иметь порядковый тип. Используйте составной оператор (begin..end), чтобы выполнить в цикле несколько операторов.
to
Со словом to, значение переменной цикла увеличивается на 1 при каждой итерации цикла.
downto
Со словом downto, значение переменной цикла уменьшается на 1 при каждой итерации цикла.
Пример
(* for...to, for...downto *)
for i := 1 to ParamCount do
WriteLn(ParamStr(i);
(* Умножение матриц *)
type Matrix10x10 = array [1 .. 10, 1 .. 10] of Real;
procedure Multiply (Mat1, Mat2 : Matrix10x10; var Res : Matrix10x10);
var
i, j, k : Integer;
X : Real;
begin
for i := 1 to 10 do
for k := 1 to 10 do
begin
X := 0.0;
for j := 1 to 10 do
X := X + Mat1[i, j] * Mat2[j, k];
Res[i, k] := X;
end;
end;
Ада
for i in 1 .. Argument_Count loop
Put_Line (Argument (i));
end loop;
-- Умножение матриц
type Matrix10x10 is array (1 .. 10, 1 .. 10) of Float;
procedure Multiply (Mat1, Mat2 : Matrix10x10; Res : out Matrix10x10) is
X : Float;
begin
for i in 1 .. 10 loop
for k in 1 .. 10 loop
X := 0.0;
for j in 1 .. 10 loop
X := X + Mat1 (i, j) * Mat2 (j, k);
end loop;
Res (i, k) := X;
end loop;
end loop;
end Multiply;
Оператор for аналогичен оператору for Паскаля, за исключением обратного перебора. В Паскале границы менятся местами, в языке Ада — нет:
{ Паскаль }
for i := 1 to 10 do
begin
...
end;
for i := 10 downto 1 do
begin
...
end;
-- Ада
for i in 1 .. 10 loop
...
end loop;
for i in reverse 1 .. 10 loop
...
end loop;
Удобно, что не нужно определять переменные цикла.
Оператор for ожидает диапазон значений. Помимо непосредственного задания диапазона, для перечисления массивов можно использовать атрибут 'Range.
-- Умножение матриц произвольных размеров
type Matrix is array (Integer range <>, Integer range <>) of Float;
function "*" (Mat1, Mat2 : Matrix) return Matrix is
dj : constant Integer := Mat2'First (1) - Mat1'First (2);
X : Float;
begin
if Mat1'Length (2) /= Mat2'Length (1) then
raise Constraint_Error with
"Размеры не совпадают, не могу умножить";
end if;
return Result : Matrix (Mat1'Range (1), Mat2'Range (2)) do
for i in Mat1'Range (1) loop
for k in Mat2'Range (2) loop
X := 0.0;
for j in Mat1'Range (2) loop
X := X + Mat1 (i, j) * Mat2 (j + dj, k);
end loop;
Result (i, k) := X;
end loop;
end loop;
end return;
end "*";
Если нужно работать с матрицами, предпочтительнее воспользоваться пакетом Ada.Numerics.Real_Arrays. Он, как правило, оптимизирован под процессор и работает быстрее.