Программа для работы с многомерными динамическими массивами

Тема в разделе "Pascal and Delphi", создана пользователем Fighter4Freedom, 19 дек 2010.

  1. Fighter4Freedom

    Fighter4Freedom New Member

    Регистрация:
    19 дек 2010
    Сообщения:
    4
    Симпатии:
    0
    Задача состоит в следующем: необходимо написать программу, которая могла бы создавать n-мерное количество m-мерных массивов. Предусмотреть формирование массива вручную и автоматически, при формировании автоматически заполнение должно производиться с использованием трех и более законов распределения. Предусмотреть вывод в графическом режиме, если заполнение производиться числами. Кроме того нужно выполнить элементарные действия с массивами, но это я думаю и сам смогу реализовать :unsure:

    Вопрос: возникла следующая проблема при попытке вычислить и заполнить StringGrid по формуле экспоненциального распределения. Функции я создаю в отдельном модуле. Во-первых, я не уверен, правильно ли я написал формулу на Делфи: [​IMG]

    Код (Delphi):
    unit Mas_func;

    interface

    Type mas = array of array of single;

    procedure ExponInit(n,m: integer; p: single; var a: mas);

    implementation

    procedure ExponInit(n,m: integer; p: single; var a: mas);
    var i,j: integer;
    begin
    SetLength(a, n, m);
    a[0, 0] := 1;
    for i := 0 to n-1 do
    for j := 0 to m-1 do
    a[i, j] := p * exp((-p) * a[i, j]);
    end;

    end.
    Далее идет модуль с прогой, где я не уверен в правильной передаче содержимого массива в StringGrid, а не уверен, поскольку мне не нравятся значения которые появляются в StringGrid:

    Код (Delphi):
    implementation

    {$R *.dfm}

    var a1: mas; n,m: integer; p: single;

    procedure TForm1.RadioGroup1Click(Sender: TObject);
    var i,j: integer;
    s: string;
    begin
    n := SpinEdit1.Value;
    m := SpinEdit2.Value;
    p := StrToFloat(Edit1.Text);
    StringGrid1.RowCount := n;
    StringGrid1.ColCount := m;

    with StringGrid1 do
    for i := 0 to RowCount - 1 do
    for j := 0 to ColCount - 1 do
    Cells[j, i]:= '';

    if (RadioGroup1.ItemIndex = 0) then begin
    ExponInit(n,m,p,a1);
    for i := 0 to n-1 do
    for j := 0 to m-1 do begin
    str(a1[i, j]:8:3, s);
    StringGrid1.Cells[j, i] := s;
    end;
    end;

    end;

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if (Key in ['.', 'a'..'z', 'A'..'Z']) then
    ShowMessage('Ви ввели недопустимий символ!');
    end;

    end.
    Помогите пожалуйста разобраться, спасибо.
     
  2. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    ошибка в формуле p * exp((-p) * a[i, j]) так как a[i, j] вы еще не определили. вместо него надо писать i или j, или разберитесь с формулой так как чтобы функция была F(x,y).
     
  3. Fighter4Freedom

    Fighter4Freedom New Member

    Регистрация:
    19 дек 2010
    Сообщения:
    4
    Симпатии:
    0
    Хорошо, я понял. Сделал так, посмотрите, вроде бы работает, знать бы правильно ли?

    Код (Delphi):
    unit Mas_func;

    interface

    Type TMyArray = array of array of single;

    procedure ExponInit(n,m: integer; p: single; var a: TMyArray);

    implementation

    uses Math;

    procedure ExponInit(n,m: integer; p: single; var a: TMyArray);
    var i,j: integer;
    begin
    SetLength(a, n, m);
    Randomize;

    for i := 0 to n-1 do
    for j := 0 to m-1 do
    a[i, j] := Random(5)-5;

    for i := 0 to n-1 do
    for j := 0 to m-1 do
    a[i, j] := p * exp(-p * a[i, j]);
    end;

    end.
    Главный модуль:

    Код (Delphi):
    implementation

    {$R *.dfm}

    var a: TMyArray; n,m: integer; p: single;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    SpinEdit1.Value
    end;

    procedure TForm1.RadioGroup1Click(Sender: TObject);
    var i,j: integer;
    s: string;
    begin
    n := SpinEdit1.Value;
    m := SpinEdit2.Value;
    p := StrToFloat(Edit1.Text);
    StringGrid1.RowCount := n;
    StringGrid1.ColCount := m;

    with StringGrid1 do
    for i := 0 to RowCount - 1 do
    for j := 0 to ColCount - 1 do
    Cells[j, i]:= '';

    if (RadioGroup1.ItemIndex = 0) then begin
    ExponInit(n,m,p,a);
    for i := 0 to n-1 do
    for j := 0 to m-1 do begin
    str(a[i, j]:8:3, s);
    StringGrid1.Cells[j, i] := s;
    end;
    end;

    end;

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if (Key in ['.','a'..'z','A'..'Z','+','-','*','/','\','=','_','|']) then
    Key := #0;
    end;

    end.
     
  4. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    Мне все-таки кажется что случайное вычисление x не подходит для создания экспоненциального распределения в массиве. вместо х надо брать j, а случайным образом определять p
    я бы сделал так:
    тогда для каждого вектора получится случайное, но экспоненциальное распределение.
     
  5. Fighter4Freedom

    Fighter4Freedom New Member

    Регистрация:
    19 дек 2010
    Сообщения:
    4
    Симпатии:
    0
    Так мне нужен один график для одной матрицы, зачем мне больше одного p для одной матрицы. p - это параметр масштаба. И почему j, а не i, это по ходу дела не имеет значения, поскольку все массивы должны быть квадратными, так как мне нужно выполнять над ними элементарные операции и соответственно они не могут быть прямоугольными. Я честно говоря, не знаю, как правильно подойти к этой задаче, с какой стороны не подойду, все не правильно.
     
  6. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    если в качестве х выступает j - вы получите все строки одинаковые, i - все столбцы. Применяя j в каждой строке вы получите экспоненту, а изменяя p распределение в каждой строке будет экспонентой но разной.. вот что я хотел сказать. А получая х случайно в строках распределение экспонентой не будет.
     
  7. Fighter4Freedom

    Fighter4Freedom New Member

    Регистрация:
    19 дек 2010
    Сообщения:
    4
    Симпатии:
    0
    Я Вас понимаю, но посмотрите на формулу, там стоит х, кто в таком случае не прав и что делать?
     
Загрузка...

Поделиться этой страницей