Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > [Pascal] Двумерные массивы


Автор: Dwane 8.2.2009, 19:49
Доброго времени суток. Помогите пожалуста с заданием.
В прямоуголной матрице вычеслить МАКСИМАЛЬНОЕ СРЕДНЕЕ среди всех вычесленных покаждой строке средних значений кроме заданной строки.

Вот.Тоесть,нужно найди среднее для каждой строки.И потом найти среднее из всех средних значений строк кроме заданной кроме заданной.
Все времмя что нибудь не работает.Помогите пожалуста.
Заранее благодарен.

Автор: ФедосеевПавел 8.2.2009, 23:07
Ну, покажи, что не получается, где ошибка...

Хотя бы описание констант, типов, ввод данных, вывод хоть неправильных, но результатов...

Автор: Dwane 9.2.2009, 16:14
Да,ничего не получается.Я не знаю даже как среднее арифметическое найти.Тоесть я то знаю,но паскаль упорно не дает так сделать.
Код

Uses Crt;
Const
m=3;{Допустим для теста массив 3х2}
n=2;
Var
tda: array [1..m,1..n] of integer;{Собсветнно массив}
sred: array [1..m] of integer;{А это такой массив одномерный в котором бы хранились средние арифметические каждой строки.Это обязательно нужно использовать}
i,j:sredtdainteger;
begin
for i:= 1 to m do
for j:= 1 to n do read(tda[i,j]);
readkey;

end.


Вот.Дальше нужно среднее арефметическое найти и записать их в масив одномерный {sred}.И потом найти среднее арефметическое всех элементов одномерного массива кроме указанного.
Это я думал сделать так:
1.Запрашиваем указать строчку которую не учитывать.
2.Обнулить этот элемент одномерного массива
3.И посчитать общую среднею армефметическую по форумуле scredtda:= scredtda div(m-1);
sredtda - это общая средняя всего масива.Ну как она там находиится scredtda:=scredtda+sred[i,j] так наврено.А m-1 потому что один из элементов массива раен 0 и его считать не нужно.
Но код у меня не получается никак. 

Автор: Metalex 9.2.2009, 16:38
Уточни, тебе нужно найти среднее значение каждой строки, а дальше максимальное из средних?

Автор: Dwane 9.2.2009, 16:41
Нет.Мне нужно найти среднее значение каждой строки,а потом среднее знакчение средних .Кроме указанной.
Допустим 3 строки всего у первой среднее 2 у второй 4 у третей 6.Потом нужно исключить одну строку и найти среднее оставишся.Мы говорим что вторую мы исключаем и находим среднее первой и третей. 2+6\2.

Автор: ФедосеевПавел 9.2.2009, 20:57
Dwane, я не уверен, но кажется ты чуть-чуть запутался:

Цитата(Dwane @  8.2.2009,  19:49 Найти цитируемый пост)
В прямоуголной матрице вычеслить МАКСИМАЛЬНОЕ СРЕДНЕЕ среди всех вычесленных покаждой строке средних значений кроме заданной строки.



Цитата(Dwane @  9.2.2009,  16:41 Найти цитируемый пост)
Нет.Мне нужно найти среднее значение каждой строки,а потом среднее знакчение средних .Кроме указанной.


Мне кажеться, что всё-таки нужно найти МАКСИМАЛЬНОЕ среднее.
Тогда, код будет примерно таким.
1. По каждой строке матнрицы вычисляем среднее 
Код

  for i:=1 to m do begin
    sred[i]:=0;
    for j:=1 to n do sred[i]:=sred[i]+tda[i, j];
    sred[i]:=sred[i] / n;
  end;

2. Теперь в массиве sred находим максимальный элемент, пропустив только одно значение.
Или можно обойтись без массива sred
Код

  {k   - пропускаемая строка (integer)}
  {sTek   - значение среднего арифметического текущей строки (real)}
  {sMax - максимальное значение средних арифметических строк (real)}
  {найдем среднее арифметическое первой строки и будем временно считать его максимальным}
  i:=1;
  if i=k then i:=i+1; {если первую строку нужно пропустить - тогда рассмотрим вторую}
  sMax:=0;
  for j:=1 to n do sMax:=sMax+tda[i, j];
  sMax:=sMax / n;
  {теперь просматриваем все строки кроме k-ой, вычисляем среднее и сравниваем с максимальным}
  {если текущее максимальное меньше текущего среднего, то sMax:=sTek}
  for i:=1 to m do begin
    if i=k then Continue;
    sTek:=0;
    for j:=1 to n do sTek:=sTek+tda[i, j];
    sTek:=sTek / n;
    if sMax<sTek then sMax:=sTek;
  end;
..........................
sMax - это и есть искомый результат - максимальное из средних арифметических строк матрицы tda, за исключением строки k
..........................


Автор: Dwane 9.2.2009, 22:21
Да,вы парвы.Это я не правильнопереписал.В моем первом посте все правильно написано.Да все правильно.Спасибо большое.
Вот только я не понял.
А если нужно пропустить не 1 строчку а скажем 3 помоему тогда не подойдет 
Код
 
 i:=1;
 if i=k then i:=i+1;


Как ни странно работает,но не совсем так как нужно.
Матрица:
             2  2 (Среднее 2) 
             3  3 (Среднее 3)
             4  4 (Среднее 4)
Если пропускаю 3 строку и прошу вывести sMax он выдает средующее
sMax=2 
и если не очишая экрана начать выполнять програму заного видно что на самом деле он выдал
sMax=2 sMax=3 
Подрят...не могу понять в чем дело.

Автор: ФедосеевПавел 9.2.2009, 23:42
Только что CopyPaste фрагменты программ и запустил с твоим примером. Результат верный (отличающийся от приведенного).
Код

{.$DEFINE Debug}
{$UNDEF Debug}
USES
  CRT;
Const
  m=3;{Допустим для теста массив 3х2}
  n=2;
TYPE
  TMassiv = array [1..m,1..n] of Real;
{$IFDEF Debug}
CONST
  tda   : TMassiv = ( (2, 2),
                      (3, 3),
                      (4, 4)
                    );
{$ENDIF}
Var
{$IFNDEF Debug}
  tda   : TMassiv; {Собственно массив}
{$ENDIF}
  i, j  : Integer; {переменные для работы с массивом}
  k     : Integer; {номер строки массива,
                    которая не рассматривается при вычислениях}
  sTek  : Real;    {значение среднего арифметического текущей строки}
  sMax  : Real;    {максимальное значение средних арифметических строк}
BEGIN
{$IFNDEF Debug}
  WriteLn('Введите массив ',m,'x',n);
  for i:= 1 to m do
    for j:= 1 to n do read(tda[i,j]);
{$ENDIF}
  WriteLn;
  WriteLn('Введён массив ',m,'x',n);
  for i:= 1 to m do begin
    for j:= 1 to n do Write(tda[i,j]:10:3);
    WriteLn;
  end;
  Write('Введите номер исключаемой строки (1..',m,') ');
  ReadLn(k);
  {найдем среднее арифметическое первой строки и будем временно считать его максимальным}
  i:=1;
  if i=k then i:=i+1; {если первую строку нужно пропустить - тогда рассмотрим вторую}
  sMax:=0;
  for j:=1 to n do sMax:=sMax+tda[i, j];
  sMax:=sMax / n;
  {теперь просматриваем все строки кроме k-ой, вычисляем среднее и сравниваем с максимальным}
  {если текущее максимальное меньше текущего среднего, то sMax:=sTek}
  for i:=1 to m do begin
    if i=k then Continue;
    sTek:=0;
    for j:=1 to n do sTek:=sTek+tda[i, j];
    sTek:=sTek / n;
    if sMax<sTek then sMax:=sTek;
  end;
  WriteLn('Max=',sMax);
END.


Автор: Dwane 11.2.2009, 01:06
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)