Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Трехмерный динамический массив в Pascal

63K
04 июня 2013 года
4итер
18 / / 17.05.2012
Создать трехмерный динамический массив типа real 10*10*10. Заполнить случайными числами от 0 до 100, в цикле перемножить все элементы и поделить на их количество.
Массив вроде как описать смог, а дальше не пойму.

Код:
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;
60K
04 июня 2013 года
Альберт Шайдуллин
13 / / 21.10.2012
по нубски наверно
и тип инт (поменяешь)

Код:
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;
326
05 июня 2013 года
sadovoya
757 / / 19.11.2005
Вы что, с Си переезжаете :) В Дельфи ведь есть короткий способ задать массив:

 
Код:
var
  Ar3d: Array of Array of Array of Real;

..........

  SetLength(Ar3d,10,10,10);
63K
05 июня 2013 года
4итер
18 / / 17.05.2012
как тогда полный код программы будет выглядеть?
465
07 июня 2013 года
QWERYTY
595 / / 25.03.2012
Конечно это не полный код, но остальное ты сам доделай

Код:
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.
326
08 июня 2013 года
sadovoya
757 / / 19.11.2005
Задача с подвохом. Real соответствует (по крайней мере в Delphi 2006 и вероятно выше) тип Double с диапазоном
-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). С мелкими степенями еще нужно разбираться.
326
08 июня 2013 года
sadovoya
757 / / 19.11.2005
Пока могу предложить такое решение. Возможное underflow оно просто как ошибку обрабатывает.

Код:
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.
465
08 июня 2013 года
QWERYTY
595 / / 25.03.2012
To sadovoya

Ну не назвал бы это подвохом. Программист обязан выбирать тип переменной под свои цели.

Double и Real - действительно гдето давно читал что Real устарел и в место него используется Double
Функция SizeOf для обоих типов возвращает 8, хотя для студии это как будто разные вещи.
Когда наводишь курсор на Real студия пишет что это system.real, ну а Double - system.double.
Возможно у них разные диапазоны значений, но они в памяти занимают одинаковое количество байт.
326
08 июня 2013 года
sadovoya
757 / / 19.11.2005
В справке просто сказано, что теперь real это double :) Насчет подвоха я имел ввиду больше возможность нарваться на машинный эпсилон.
63K
09 июня 2013 года
4итер
18 / / 17.05.2012
всем спасибо, разобрался)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог