При работе с массивами в языке программирования Delphi иногда возникают ошибки, связанные с неправильным вычислением среднего значения. В данной статье мы рассмотрим типичную проблему, с которой сталкиваются разработчики при попытке найти среднее арифметическое элементов массива, и предложим правильное решение.
Проблема
Разработчик столкнулся с проблемой, при которой функция для вычисления среднего значения элементов массива возвращает значение около 50, независимо от вводимых данных. В коде функции используется цикл для суммирования элементов массива, после чего сумма делится на количество элементов. Однако, несмотря на корректные входные данные, результат функции остается неизменным и не соответствует ожидаемому среднему значению.
Пример кода
Function Average(x : array of Integer; var y : Integer): Real;
var
e : Integer;
fTotal : Real;
begin
fTotal := 0;
Result := 0;
for e := 1 to y do
fTotal := fTotal + x[e];
Result := fTotal / y;
end;
Ошибка
Основная ошибка заключается в использовании параметра var y : Integer для передачи количества элементов в массив. В языке Delphi для параметров-массивов предусмотрен особый тип параметра - open array, который содержит информацию о длине массива, и параметр y в данном случае не нужен.
Исправление
Чтобы исправить ошибку, необходимо убрать параметр var y и использовать константный параметр x для массива. В теле функции следует использовать функции Low(x) и High(x) для перебора элементов массива, а для получения длины массива - функцию Length(x).
function Average(const X: array of Integer): Double;
begin
if Length(X) = 0 then
raise Exception.Create('Cannot compute average of empty array.');
Result := 0;
for var i := Low(X) to High(X) do
Result := Result + X[i];
Result := Result / Length(X);
end;
Или, используя более современный синтаксис:
function Average(const X: array of Integer): Double;
begin
if Length(X) = 0 then
raise Exception.Create('Cannot compute average of empty array.');
Result := 0;
for a in X do
Result := Result + a;
Result := Result / Length(X);
end;
Альтернативный подход
Для избежания переполнения переменной Result во время вычисления суммы, можно использовать следующий подход:
function Average(const X: array of Integer): Double;
begin
if Length(X) = 0 then
raise Exception.Create('Cannot compute average of empty array.');
Result := 0;
const F := 1 / Length(X);
for a in X do
Result := Result + F * a;
end;
Использование стандартных функций
В Delphi существует стандартная функция SumInt(X) для суммирования элементов массива, которую можно использовать для упрощения вычисления среднего:
function Average(const X: array of Integer): Double;
begin
Result := SumInt(X) / Length(X);
end;
Также можно воспользоваться функцией System.Math.Mean, однако она не поддерживает массивы целых чисел, поэтому может потребоваться преобразование типов.
Заключение
Приведенные выше исправления помогут избежать ошибок в вычислении среднего значения в массивах на языке программирования Delphi. Важно помнить о правильном использовании параметров-массивов и функций для работы с ними.
Исправление ошибки в функции вычисления среднего значения элементов массива в языке программирования Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS