unit uMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
T2DIntegerDynArray = array of array of integer; //Объявляем свой тип дынных, 2 мерный динамический массив из целых (у вас real, зачем?)
TForm1 = class(TForm)
edtM: TEdit; //Сюда пишем строки
edtN: TEdit; //Сюда столбцы
Label1: TLabel;
Label2: TLabel;
memLog: TMemo;//Сюда выводим логи
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure calculation(const m,n:integer);
function getNextCount(const a:T2DIntegerDynArray; const col:integer):integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
m,n:integer;
begin
m:= StrToInt(edtM.Text);
n:=StrToInt(edtN.Text);
calculation(m,n);
end;
procedure TForm1.calculation(const m, n: integer);
var
a: T2DIntegerDynArray; //Объявляем наш массив
row,col, count:integer; //счетчики циклов
s:string; //вспомогательная строка
begin
//m - строки, n - столбцы
{выделяем память под массив и заполняем рандомами 0-39}
Randomize; //Необходимо, чтоб функция random давала всегда разные результаты
setlength(a, m, n); //выделили память
for row:=0 to high(a) do //пробегаем по строкам
begin
s:='';
for col:=0 to high(a[0]) do //пробегаем по столбцам
begin
a[row,col]:=random(40); //заполняем рандомами
s:=s+' '+ IntToStr(a[row,col]); //заполняем строку, чтоб потом вывести её в лог (необязательно, просто для удобства, чтоб мы сразу видели наш массив), у вас так StringGrid заполняется, зачем-то в отдельном цикле (у вас по сути 2 одинаковых цикла подряд, не надо так)
end;
memLog.Lines.Add(Format('Строка №%d (%s)',[row, s])); //Выводим строку row в лог
end;
for col:=0 to high(a[0])-1 do //пробегаем от 0 до n-2 столбцам
begin
count:=getNextCount(a, col); //вычисляем количество превышающих элементов
memLog.Lines.Add(Format('Столбец %d, результат = %d',[col+1, count])); //выводим результат по каждому столбцу
end;
end;
function TForm1.getNextCount(const a: T2DIntegerDynArray; const col: integer): integer; //скармливаем массив a, столбец col, получаем количество превышающих элементов в столбце col+1
var
sum, row:integer;
mean :double;
begin
sum:=0;
result:=0;
for row:=0 to high(a) do sum:=sum+a[row,col]; //сумма всех элементов в столбце col
mean:=sum / length(a); //cреднее арифметическое (length(a) - это фактически количество строк в массиве)
memLog.Lines.Add(Format('Среднее арифметическое для столбца №%d = %n',[col,mean]));//вывели в лог
for row:=0 to high(a) do if a[row, col+1] > mean then inc(result); //посчитали количество элементов в столбце col+1, которое превышает среднее арифметическое столбца col
end;
end.