Помощь - Поиск - Пользователи - Календарь
Полная версия: Двумерный массив
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.