Трехмерный динамический массив в Pascal
Массив вроде как описать смог, а дальше не пойму.
Код:
type TMass1=array of real;
TMass2=array of TMass1;
TMass3=array of TMass2;
var i,j:real;
Setlength(FMass,10);
for i:=Low(FMass) to High(FMass) and
begin
Setlength(FMass[i],10);
for j:=Low(FMass[i] to High(FMass[j]
Setlength(FMass[i][j],10);
end;
TMass2=array of TMass1;
TMass3=array of TMass2;
var i,j:real;
Setlength(FMass,10);
for i:=Low(FMass) to High(FMass) and
begin
Setlength(FMass[i],10);
for j:=Low(FMass[i] to High(FMass[j]
Setlength(FMass[i][j],10);
end;
и тип инт (поменяешь)
Код:
TMass = array of integer;
TMass1 = Array of TMass;
var a:array of TMass1;
i,j,k:integer;
begin
pro:=1;
SetLength(a,10);
for i:=Low(a) to High(a) do begin
for j:=Low(a) to High(a) do begin
Setlength(a[i],10);
for k:=Low(a) to High(a) do begin
Setlength(a[i][j],10);
a[i,j,k]:=random(100);
pro := pro * a[i,j,k];
end;
end;
end;
end;
TMass1 = Array of TMass;
var a:array of TMass1;
i,j,k:integer;
begin
pro:=1;
SetLength(a,10);
for i:=Low(a) to High(a) do begin
for j:=Low(a) to High(a) do begin
Setlength(a[i],10);
for k:=Low(a) to High(a) do begin
Setlength(a[i][j],10);
a[i,j,k]:=random(100);
pro := pro * a[i,j,k];
end;
end;
end;
end;
Код:
var
Ar3d: Array of Array of Array of Real;
..........
SetLength(Ar3d,10,10,10);
Ar3d: Array of Array of Array of Real;
..........
SetLength(Ar3d,10,10,10);
как тогда полный код программы будет выглядеть?
Код:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
a: Array of Array of Array of REAL;
I, J, K: BYTE;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
SetLength(a, 10, 10, 10);
Randomize;
for I := 0 to 9 do
for J := 0 to 9 do
for K := 0 to 9 do
begin
a[I, J, K] := Random(100) + Random;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
{$APPTYPE CONSOLE}
uses
SysUtils;
var
a: Array of Array of Array of REAL;
I, J, K: BYTE;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
SetLength(a, 10, 10, 10);
Randomize;
for I := 0 to 9 do
for J := 0 to 9 do
for K := 0 to 9 do
begin
a[I, J, K] := Random(100) + Random;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
-5.0 x 10^324 .. 1.7 x 10^308. Так что есть вероятность переполнить этот диапазон при перемножении 1000 элементов, со случайными значениями 0-100. Кроме того при перемножении чисел <1 можно получить слишком мелкую отрицательную степень числа. Для решения первой проблемы надо произведение хранить в типе Extended (Extended -3.6 x 10^4951 .. 1.1 x 10^4932). С мелкими степенями еще нужно разбираться.
Код:
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
const Dim = 10;
var
Ar3d: Array of Array of Array of Real;
I, J, K: Byte;
Product: Extended;
c: Char;
begin
Randomize;
try
SetLength(Ar3d, Dim, Dim, Dim);
except
Writeln('Error. Can not alloc. memory...'); //ошибка выделения памяти
Read(c); //вместо паузы
Exit;
end;
Product := 1.0;
try
for I := 0 to (Dim - 1) do
for J := 0 to (Dim - 1) do
for K := 0 to (Dim - 1) do
begin
Ar3d[I, J, K] := 100.0*Random();
Product := Product*Ar3d[I,J,K];
end;
Product := Product / (Dim*Dim*Dim); //теперь деленный на к-во элем.
except
Writeln('Error. Probably underflow...'); //возможно underflow
Read(c); //вместо паузы
Exit;
end;
Ar3d := Nil;
Writeln('Result is: ', Product);
Read(c); //вместо паузы
end.
{$APPTYPE CONSOLE}
uses SysUtils;
const Dim = 10;
var
Ar3d: Array of Array of Array of Real;
I, J, K: Byte;
Product: Extended;
c: Char;
begin
Randomize;
try
SetLength(Ar3d, Dim, Dim, Dim);
except
Writeln('Error. Can not alloc. memory...'); //ошибка выделения памяти
Read(c); //вместо паузы
Exit;
end;
Product := 1.0;
try
for I := 0 to (Dim - 1) do
for J := 0 to (Dim - 1) do
for K := 0 to (Dim - 1) do
begin
Ar3d[I, J, K] := 100.0*Random();
Product := Product*Ar3d[I,J,K];
end;
Product := Product / (Dim*Dim*Dim); //теперь деленный на к-во элем.
except
Writeln('Error. Probably underflow...'); //возможно underflow
Read(c); //вместо паузы
Exit;
end;
Ar3d := Nil;
Writeln('Result is: ', Product);
Read(c); //вместо паузы
end.
Ну не назвал бы это подвохом. Программист обязан выбирать тип переменной под свои цели.
Double и Real - действительно гдето давно читал что Real устарел и в место него используется Double
Функция SizeOf для обоих типов возвращает 8, хотя для студии это как будто разные вещи.
Когда наводишь курсор на Real студия пишет что это system.real, ну а Double - system.double.
Возможно у них разные диапазоны значений, но они в памяти занимают одинаковое количество байт.
В справке просто сказано, что теперь real это double :) Насчет подвоха я имел ввиду больше возможность нарваться на машинный эпсилон.
всем спасибо, разобрался)