• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Fighter4Freedom
  • Дата начала
F

Fighter4Freedom

Задача состоит в следующем: необходимо написать программу, которая могла бы создавать 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.
Помогите пожалуйста разобраться, спасибо.
 
F

Fighter4Freedom

Хорошо, я понял. Сделал так, посмотрите, вроде бы работает, знать бы правильно ли?

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

nayke

a[i, j] := Random(5)-5;

a[i, j] := p * exp(-p * a[i, j]);
Мне все-таки кажется что случайное вычисление x не подходит для создания экспоненциального распределения в массиве. вместо х надо брать j, а случайным образом определять p
я бы сделал так:
p := Random(сколько необходимо)+1;

a[i, j] := p * exp(-p * j);

тогда для каждого вектора получится случайное, но экспоненциальное распределение.
 
F

Fighter4Freedom

Так мне нужен один график для одной матрицы, зачем мне больше одного p для одной матрицы. p - это параметр масштаба. И почему j, а не i, это по ходу дела не имеет значения, поскольку все массивы должны быть квадратными, так как мне нужно выполнять над ними элементарные операции и соответственно они не могут быть прямоугольными. Я честно говоря, не знаю, как правильно подойти к этой задаче, с какой стороны не подойду, все не правильно.
 
N

nayke

Так мне нужен один график для одной матрицы, зачем мне больше одного p для одной матрицы. p - это параметр масштаба. И почему j, а не i, это по ходу дела не имеет значения, поскольку все массивы должны быть квадратными, так как мне нужно выполнять над ними элементарные операции и соответственно они не могут быть прямоугольными. Я честно говоря, не знаю, как правильно подойти к этой задаче, с какой стороны не подойду, все не правильно.

если в качестве х выступает j - вы получите все строки одинаковые, i - все столбцы. Применяя j в каждой строке вы получите экспоненту, а изменяя p распределение в каждой строке будет экспонентой но разной.. вот что я хотел сказать. А получая х случайно в строках распределение экспонентой не будет.
 
F

Fighter4Freedom

Я Вас понимаю, но посмотрите на формулу, там стоит х, кто в таком случае не прав и что делать?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!