История изменений
Исправление 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 обернуть в классы, но тут это явно лишнее.