Консультация № 168791
02.06.2009, 18:39
0.00 руб.
0 1 1
Уважаемые эксперты помогите решить такую задачу:
Дан линейный связный список, содержащий целые числа. Создать программу вычисления среднего геометрического элементов списка. Начертить блок схему программы. Привести пример выполнения такой программы.

Обсуждение

Неизвестный
02.06.2009, 19:44
общий
это ответ
Здравствуйте, Боев Константин Геннадиевич.

Среднее геометрическое есть корень n-й степени из произведения элементов списка, где n - число элементов.
Будем считать, что среди элементов списка нет нулевого (заодно это даст признак окончания ввода чисел).
Будем запрашивать у пользователя ввод целых чисел до того момента, пока он не введет 0, и помещать из в список.
Список формируется по принципу стека (помещение очередного элемента производится в голову списка), т.к. это наиболее простая операция, а никаких требований к списку не указано.
После того, как список сформирован, выполняется вычисление произведения. Если не вводить слишком больших чисел или слишком много, то размера LongInt должно хватить. При необходимости тип переменной s можно изменить на Real или даже Double.
Важно установить вначале переменную s в единицу для вычисления произведения.
Выражение s^(1/n) вычисляется как e^(1/n*ln(s)).


Приложение:
Program List;

Type
PList = ^TList;
TList = Record
next : PList;
num : Word;
end;

Var
l : PList;
p : PList;

n : Word;

s : LongInt;
r : Real;

Procedure AddList (var p : PList; n : Word);
var
q : PList;

begin
New (q);
q^.num := n;
q^.next := p;
p := q;
end;

Begin
l := nil;
writeln ('Введите целые числа. Признак окончания ввода - число 0');
Repeat
write ('Число: '); readln (n);
if n <> 0 then AddList (l, n);
Until n = 0;

if l = nil then
writeln ('Список пуст!')
else begin
p := l;
n := 0;
s := 1;
while p <> nil do
begin
s := s * p^.num;
Inc (n);
p := p^.next;
end;

r := exp (1 / n * ln (s));

writeln ('Среднее геометрическое равно ', r:16:8);
end;
End.
Форма ответа