Динамические массивы

При создание динамических массивов нижний (первый) индекс 0? Вот пример: Program massiv; Begin var m:=ReadLnInteger(‘M=’); var n:=ReadLnInteger(‘N=’); var mt:= new integer[m,n]; for var K:=1 to M do for var j:=1 to n do mt[k,j]:=k*j; Println(mt); // или mt.Println end.

При этом после запуска программы даёт ошибку. А вот при этом не даёт: Program massiv; Begin var m:=ReadLnInteger(‘M=’); var n:=ReadLnInteger(‘N=’); var mt:= new integer[m+1,n+1]; for var K:=1 to M do for var j:=1 to n do mt[k,j]:=k*j; Println(mt); // или mt.Println end.

Только, во втором случае появляются лишний столбец и лишняя строка с нолями! Если вы хотите обращаться к элементам динамического массива, то необходимо помнить, то индексация происходит от 0 до Length–1. Об этом написано в справке: „Справочник по языку“ — „Типы данных“ — „Динамические массивы“

begin
  var m := ReadLnInteger('M=');var n := ReadLnInteger('N=');
  var mt := new integer[m, n];
  for var K := 1 to M do 
    for var j := 1 to n do mt[k - 1, j - 1] := k * j;
  Println(mt);
  // или
  mt.Println
end.

Хотя, я бы вашу программу написал вот так:

begin
  var mt := New integer[ReadInteger('m ='), ReadInteger('n =')];
  for var Row := 0 to mt.GetLength(0)-1 do
    for var Col := 0 to mt.GetLength(1)-1 do
      mt[Row,Col] := Succ(Row)*Succ(Col);
  mt.Println
end.

А почему не так:

begin
  var mt := MatrGen(ReadInteger('m ='),ReadInteger('n ='),(i,j)->(i+1)*(j+1));
  mt.Println
end.

Если ТС не увидел разницы между результатами своей первой и второй программ…

Благодарю за содействие RAlex и JuriiMW. В общем то, что первый индекс 0.

ну зачем же так, если делать коротко то уже в 1 строчку :slight_smile:

MatrGen(ReadInteger('m ='),ReadInteger('n ='),(i,j)->(i+1)*(j+1)).Println;
1 лайк