Помощь - Поиск - Пользователи - Календарь
Полная версия: Массивы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Eduard
uses crt;
const
  Max= 100;

type
  tStroka= array [1..Max] of integer;

var
  a: array [1..100] of tStroka;
  N, M, i, j :integer;
  s:real;
  e: tStroka;

begin
  write('N, M -> ');
  readln(N, M);
  write('Input matrix -> ');
  for i:=1 to N do
    for j:=1 to M do
      begin
        write('A[',i,',',j,'] -> ');
        readln(a[i, j]);
      end;
  for i:=1 to n do
    for j:=i-1 downto 1 do
      begin
        if a[j,1]<a[j+1,1] then
          begin
            e:=a[j];
            a[j]:=a[j+1];
            a[j+1]:=e;
          end;

  writeln (a[i,j]);
  end;
for i:= 1 to n do
  begin
   s:=0;
   for j:= 1 to m do
     s:=s+a[i,1];
  end;
   s:=s/N;
write (s);
end.

Как сделать сортировку в виде процедуры, а вычисление в виде функции? Препод говорил что-то о разных способах задания переменых в процедурах и функциях, и я запутался, когда, какой способ использовать. Помогите, пожалуйста,.
Lapp
Цитата(Eduard @ 26.05.2011 20:21) *
Как сделать сортировку в виде процедуры, а вычисление в виде функции? Препод говорил что-то о разных способах задания переменых в процедурах и функциях, и я запутался, когда, какой способ использовать.
Думаю, твой препод имел в виду параметры-значения и параметры-переменные. Сортировку нужно применять непосредственно к самой матрице, и результат должен отразиться на ней - следовательно, надо применять var-параметр. Вычисление чего-то там (я так и не понял, чего именно; если среднее по столбцам - то оно делается неправильно) дает некий отдельный результат, никак не отражающийся на самой матрице. Следовательно, жеательно применить параметр-значение (хотя var-параметр тоже будет работать, и даже быстрее, нужно только следить за тем, чтоб случайно не испортить матрицу). А все вспомогательные переменнные (параметры цикла, промежуточные суммы..) надо делать локальными, то есть определять их внутри процедуры/функции.
Короче, примерно вот так:
const
  Max= 100;

type
  tStroka= array [1..Max] of integer;
  tMnogoStrok= array [1..100] of tStroka;

var
  a: tMnogoStrok;
  N, M, i, j:integer;
  e: tStroka;


procedure Sort(var a: tMnogoStrok);
var
  i,j: integer;
begin
  for i:=1 to n do
    for j:=i-1 downto 1 do begin
      if a[j,1]<a[j+1,1] then begin
        e:=a[j];
        a[j]:=a[j+1];
        a[j+1]:=e;
      end;
      writeln (a[i,j]);
    end
end;

function Calculation(a: tMnogoStrok): double;
var
  i,j: integer;
  s: double;
begin
  for i:= 1 to n do begin
    s:=0;
    for j:= 1 to m do s:=s+a[i,1];
  end;
  Calculation:= s/N
end;

begin
  write('N, M -> ');
  readln(N, M);
  write('Input matrix -> ');
  for i:=1 to N do
    for j:=1 to M do
      begin
        write('A[',i,',',j,'] -> ');
        {readln(a[i, j]);}
        a[i,j]:= Random(n*m);
      end;
  Sort(a);
  writeln (Calculation(a));
end.
Eduard
Цитата(Lapp @ 27.05.2011 1:33) *



function Calculation(a: tMnogoStrok): double;
var
  i,j: integer;
  s: double;
begin
  for i:= 1 to n do begin
    s:=0;
    for j:= 1 to m do s:=s+a[i,1];
  end;
  Calculation:= s/N
end;



В этом месте вылазит ошибка Stack overflow error.
Lapp
Цитата(Eduard @ 27.05.2011 7:19) *
В этом месте вылазит ошибка Stack overflow error.
Увеличь стек или уменьши размер массивов.
Какой у тебя компилятор?
Eduard
Цитата(Lapp @ 27.05.2011 8:55) *

Какой у тебя компилятор?

TP7
Lapp
Цитата(Eduard @ 27.05.2011 8:56) *
TP7

А ездишь ты на телеге?..

По умолчанию, в TP7 стек был, кажется.. 16 К. Твой массив 100х100х2=20К. Увеличь стек до максимума (64К). Это в опциях.

Скачай FP (freepascal.org) и займись делом, а не бирюльками.
Eduard
Спасибо. Я не мог понять что такое стек.
Lapp
Цитата(Eduard @ 27.05.2011 9:08) *
Спасибо. Я не мог понять что такое стек.
Стек - это область памяти, где размещаются переменные вызываемых процедур. Динамически аллоцируемая память размещается в "куче" (heap). Она в TP может достигать аж ~600 килобайт!! Дикое количество, особенно если учесть, что размер памяти сейчас измеряется даже не мегабайтами, а гигабайтами.. Иначе говоря, ТР тебе позволяет использовать одну-две сотых доли процента установленной памяти..
Зачем пользоваться краденным старьем, если есть бесплатный новый компилятор со всеми современными возможностями?
TarasBer
> Иначе говоря, ТР тебе позволяет использовать одну-две сотых доли процента установленной памяти..

Можно перейти в защищённый режим и использовать всю память. Правда, не пи запуске из хрюши.
Lapp
Цитата(TarasBer @ 27.05.2011 10:39) *
Можно перейти в защищённый режим и использовать всю память.
А сделать один большой массив?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.