1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Вопросы новичков и не только", создана пользователем Fighter4Freedom, 19 дек 2010.

  1. Fighter4Freedom

    Fighter4Freedom New Member

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

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

    Код:
    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:

    Код:
    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

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

    Fighter4Freedom New Member

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

    Код:
    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.
    Главный модуль:

    Код:
    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

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

    Fighter4Freedom New Member

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

    nayke Well-Known Member

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

    Fighter4Freedom New Member

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

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