Показать сообщение отдельно
  #11  
Старый 12.09.2013, 15:06
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Код:
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.
Ответить с цитированием