Помощь - Поиск - Пользователи - Календарь
Полная версия: Двумерный массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
goosberry
Задача: найти среднее геометрическое положителных элементов каждого столбца матрицы 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
Цитата(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
Спасибо, с этой задачей вроде разобралась))
goosberry
Только иногда у меня тут
if k>0 then ga[j]:=exp(Ln(g)/k)

ввыводит ошибку: Invalid floating point operation
Не подскажите что сделать?
volvo
Убедиться, что G строго больше нуля, при <= 0 функция Ln будет давать сбой.
Lapp
В принципе, g может оказаться равным нулю, и в этом нет большого криминала.. Попробуй заменить эту строчку на такую:

if k>0 then if g>0 then ga[j]:=exp(Ln(g)/k) else ga[i]:=0
goosberry
Только я что-то не пойму как же у меня g будет равно 0, если в столбце обязательно присутствуют положительные элементы?
Lapp
Цитата(goosberry @ 17.05.2009 10:44) *
Только я что-то не пойму как же у меня g будет равно 0, если в столбце обязательно присутствуют положительные элементы?
А, ну да, у тебя же массив-то целый (если вещественный, то умножение двух ненулевых чисел в принципе может дать ноль). Если целый - то.. выкладывай весь текущий вариант. Будем посмотреть)).
goosberry
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
Вылет - на строке
 g:=g*d[i,j];
. Это банальное переполнение. Типа Integer не хватает для хранения произведения положительных чисел... Попробуй LongInt, если не поможет - Real...
goosberry
О, вроде помогло))
Спасибо большое give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.