For..To / Downto..Do
Переменная цикла и начальное и конечное значения должны иметь порядковый тип. Используйте составной оператор (Begin..End), чтобы выполнить в цикле несколько операторов.
To:
Со словом To, значение переменной цикла увеличивается на 1 при каждой итерации цикла.
DownTo:
Со словом DownTo, значение переменной цикла уменьшено на 1 при каждой итерации цикла.
Пример
(* For. To, For. DownTo *) For I:=1 To ParamCount Do WriteLn(ParamStr(I); For I:=1 To 10 Do For J:=1 To 10 Do Begin X:=0; For K:=1 To 10 Do X:=X+Mat1[I, K]*Mat2[K, J]; Mat[I, J]:=X; End;
Downto/ru
Ключевое слово Downto используется для указания того, что значение переменной-счетчика в цикле For уменьшается на 1 на каждом шаге цикла. Значение переменной-счетчика, указанное после слова downto, должно быть меньше, чем начальное значение в инструкции цикла For.
Цикл For downto do
var i : integer; begin for i := 10000 downto 1 do begin // инструкции цикла end; end;
См. также
Retrieved from «http://wiki.freepascal.org/index.php?title=Downto/ru&oldid=131890»
- Russian
- Pascal/ru
- Reserved words/ru
- Control Structures/ru
Оператор цикла for
Кроме того, переменную можно описать непосредственно в заголовке цикла:
for переменная : тип := начальное значение to или downto конечное значение do
оператор
for var переменная := начальное значение to или downto конечное значение do
оператор
В последнем случае используется автоопределение типа переменной по типу начального значения. В двух последних случаях область действия объявленной переменной распространяется до конца тела цикла, которое в данном случае образует неявный блок. Вне тела цикла такая переменная недоступна, поэтому следующий цикл может использовать переменную с тем же именем:
for var i := 1 to 10 do
Print(i);
for var i := 1 to 5 do
Print(i*i);
Текст от слова for до слова do включительно называется заголовком цикла , а оператор после do — телом цикла . Переменная после слова for называется параметром цикла . Для первой формы цикла с ключевым словом to параметр цикла меняется от начального значения до конечного значения, увеличиваясь всякий раз на единицу, а для второй формы ключевым словом downto — уменьшаясь на единицу. Для каждого значения переменной-параметра выполняется тело цикла. Однократное повторение тела цикла называется итерацией цикла . Значение параметра цикла после завершения цикла считается неопределенным.
Переменная-параметр цикла может иметь любой порядковый тип. При этом начальное и конечное значения должны быть совместимы по присваиванию с переменной-параметром цикла.
var en: (red,green,blue,white);
.
for en := red to blue do
write(Ord(en):2);
for var c := ‘a’ to ‘z’ do
write(c);
Если для цикла for . to начальное значение переменной цикла больше конечного значения или для цикла for . downto начальное значение переменной цикла меньше конечного значения, то тело цикла не выполнится ни разу.
Если цикл используется в подпрограмме, то переменная-параметр цикла должна быть описана как локальная. Наилучшим решением в PascalABC.NET является описание переменной в заголовке цикла.
Изменение переменной-параметра цикла внутри цикла является логической ошибкой. Например, следующий фрагмент со вложенным оператором for является ошибочным:
for i := 1 to 10 do
i -= 1;
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 := 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. Он, как правило, оптимизирован под процессор и работает быстрее.
