IPB

> for...to, for...downto (зарезервированные слова)
Чат
Форум
Загрузка...
 

Язык:
Русский
English

Цикл со счётчиком


Оператор 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. Он, как правило, оптимизирован под процессор и работает быстрее.

См. также

Лекция №3.3: Ветвления. Массивы. Циклы

 
 К началу страницы 
Тэги: to downto for
 

Код для вставки: :: :: :: ГОСТ ::
Поделиться: //
 



-
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"