Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Двумерный массив

Автор: goosberry 15.05.2009 23:01

Задача: найти среднее геометрическое положителных элементов каждого столбца матрицы d(n,m). Поместить их в массив m(n, m<12).

Мне удалось написать программу, вычисляющую лишь общее средее геометрическое, остальное, к сожалению, мне не понятно. Помогите пожалуйста, буду очень признательна)))


program zadacha;
uses crt;
type a=array [1..100, 1..100] of integer;
var d:a;
i,j,n,m,k,pol:integer;
sr:real;
begin
writeln('vvedite kolichestvo stroc massiva');
readln(n);
writeln('vvedite kolichestvo stolbcov massiva');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
writeln('vvedite element, d[',i,',',j,']');
readln(d[i,j]);
end;
writeln;
writeln('ischodnaya matrica:');
for i:=1 to n do
begin
for j:=1 to m do
write(d[i,j]:4);
writeln;
end;
k:=0;
pol:=1;
for i:=1 to n do
for j:=1 to m do
begin
if d[i,j]>0 then begin k:=k+1; pol:=pol*d[i,j]; sr:=pol/k; end;
end;
write ('k=', k, ' pol= ', pol, ' sr= ', sr:3:3);
readkey;
end.


Автор: Lapp 16.05.2009 0:55

Цитата(goosberry @ 15.05.2009 20:01) *
Мне удалось написать программу, вычисляющую лишь общее средее геометрическое, остальное, к сожалению, мне не понятно.

Боюсь, что тебе непонятно не только остальное)).
Среднее геометрическое - это

(a1*a2*a3*...*an)1/n

Вот, смотри, я тут делаю массив ga (geometry average, извиняюсь за калькирование, не знаю как это будет по-англ), содержащий средние геометрические столбцов.
for j:=1 to m do begin
ga[j]:=1;
for i:=1 to n do if d[i,j]>0 then begin
k:=k+1;
ga[j]:=ga[j]*d[i,j]
end
end;

И обрати внимание на порядок вложения циклов. Спрашивай, что неясно. Успехов.


Добавлено через 4 мин.
Ой, извини, я забыл извлечь корень (и не только))..
Вот так надо:
for j:=1 to m do begin
g:=1;
k:=0;
for i:=1 to n do if d[i,j]>0 then begin
k:=k+1;
g:=g*d[i,j]
end;
if k>0 then ga[j]:=exp(Ln(g)/k)
end;

Автор: goosberry 16.05.2009 11:05

Спасибо, с этой задачей вроде разобралась))

Автор: goosberry 17.05.2009 12:36

Только иногда у меня тут

if k>0 then ga[j]:=exp(Ln(g)/k)

ввыводит ошибку: Invalid floating point operation
Не подскажите что сделать?

Автор: volvo 17.05.2009 12:40

Убедиться, что G строго больше нуля, при <= 0 функция Ln будет давать сбой.

Автор: Lapp 17.05.2009 13:11

В принципе, g может оказаться равным нулю, и в этом нет большого криминала.. Попробуй заменить эту строчку на такую:

if k>0 then if g>0 then ga[j]:=exp(Ln(g)/k) else ga[i]:=0

Автор: goosberry 17.05.2009 13:44

Только я что-то не пойму как же у меня g будет равно 0, если в столбце обязательно присутствуют положительные элементы?

Автор: Lapp 17.05.2009 13:48

Цитата(goosberry @ 17.05.2009 10:44) *
Только я что-то не пойму как же у меня g будет равно 0, если в столбце обязательно присутствуют положительные элементы?
А, ну да, у тебя же массив-то целый (если вещественный, то умножение двух ненулевых чисел в принципе может дать ноль). Если целый - то.. выкладывай весь текущий вариант. Будем посмотреть)).

Автор: goosberry 17.05.2009 14:03

program zadacha;
uses
crt;
const
n=5;
m=5;
type
a=array [1..n, 1..m] of integer;
b=array [1..m] of real;
var
d:a;
ga:b;
i,j,g,k:integer;
begin
randomize;
writeln('ischodnaya matrica:');
for i:=1 to n do
begin
for j:=1 to m do
begin
d[i,j]:=random(100)-20;
write(d[i,j]:4);
end;
writeln;
end;
for j:=1 to m do
begin
k:=0;
g:=1;
for i:=1 to n do
if d[i,j]>0 then
begin
k:=k+1;
g:=g*d[i,j];
end;
if k>0 then if g>0 then ga[j]:=exp(ln(g)/k) else ga[j]:=0;
end;
writeln;
writeln ('resultat: ');
for j:=1 to m do
write(ga[j]:3 :1,' ');
readkey;
end.


Автор: volvo 17.05.2009 14:07

Вылет - на строке

 g:=g*d[i,j];
. Это банальное переполнение. Типа Integer не хватает для хранения произведения положительных чисел... Попробуй LongInt, если не поможет - Real...

Автор: goosberry 17.05.2009 14:15

О, вроде помогло))
Спасибо большое give_rose.gif