LINUX.ORG.RU

История изменений

Исправление bormant, (текущая версия) :

К слову, вашему коду ближе вот такой вариант:

{$mode ObjFPC}{$H+}
uses SysUtils;
type
  TDblArr = array of Double;
  NumericArrayFunc = function (const a: TDblArr): Double;
  StringImageNumericArray = function (const a: TDblArr): String;
  EEmptyArray = class(Exception); //Исключение на обработку пустого массива

//Утилита формирования результата
function PrintResults(im: StringImageNumericArray; naf: NumericArrayFunc; m: TDblArr): String;
begin
  Result:='Среднее значение элементов массива ' + im(m) + ' = ';
  try
    Result+=FloatToStr(naf(m));
  except
    on e: EEmptyArray do
      Result+=e.Message;
  end;
end;

//Способ обработки (в данном случае - вычисления среднего значения) элементов массива
function daAverage(const a: TDblArr): Double;
var t: Double;
begin
  Result:=0;
  if Length(a)=0 then
    raise EEmptyArray.Create('Массив пуст!');
  for t in a do Result+=t;
  Result/=Length(a);
end;

//Способ отображения массива
function daImage(const a: TDblArr): String;
var i: Integer;
begin
  Result:='[';
  if Length(a)>0 then Result+=FloatToStr(a[Low(a)]);
  for i:=Low(a)+1 to High(a) do Result+=', '+FloatToStr(a[i]);
  Result+=']';
end;

var values1, values2, empty: TDblArr;
begin
  DecimalSeparator:='.';
  //Тестовые данные
  values1:=TDblArr.Create(1, 2, 3, 4);
  values2:=TDblArr.Create(-11, 4, -562, 3, 400);
  //Вывод результата
  WriteLn(PrintResults(@daImage,@daAverage,values1));
  WriteLn(PrintResults(@daImage,@daAverage,values2));
  WriteLn(PrintResults(@daImage,@daAverage,empty));
end.
Если и сравнивать, то его.

Можно, безусловно, daImage и daAverage обернуть в классы, но тут это явно лишнее.

Исходная версия bormant, :

К слову, вашему коду ближе вот такой вариант:

{$mode ObjFPC}{$H+}
uses SysUtils;
type
  TDblArr = array of Double;
  NumericArrayFunc = function (const a: TDblArr): Double;
  StringImageNumericArray = function (const a: TDblArr): String;
  EEmptyArray = class(Exception);

function PrintResults(im: StringImageNumericArray; naf: NumericArrayFunc; m: TDblArr): String;
begin
  Result:='Среднее значение элементов массива ' + im(m) + ' = ';
  try
    Result+=FloatToStr(naf(m));
  except
    on e: EEmptyArray do
      Result+=e.Message;
  end;
end;

function daAverage(const a: TDblArr): Double;
var t: Double;
begin
  Result:=0;
  if Length(a)=0 then
    raise EEmptyArray.Create('Массив пуст!');
  for t in a do Result+=t;
  Result/=Length(a);
end;

function daImage(const a: TDblArr): String;
var i: Integer;
begin
  Result:='[';
  if Length(a)>0 then Result+=FloatToStr(a[Low(a)]);
  for i:=Low(a)+1 to High(a) do Result+=', '+FloatToStr(a[i]);
  Result+=']';
end;

var values1, values2, empty: TDblArr;
begin
  DecimalSeparator:='.';
  values1:=TDblArr.Create(1, 2, 3, 4, 5);
  values2:=TDblArr.Create(-11, 4, -562, 3, 400);
  WriteLn(PrintResults(@daImage,@daAverage,values1));
  WriteLn(PrintResults(@daImage,@daAverage,values2));
  WriteLn(PrintResults(@daImage,@daAverage,empty));
end.

Если и сравнивать, то его.

Можно, безусловно, daImage и daAverage обернуть в классы, но тут это явно лишнее.