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
27.05.2011 4:33
Цитата(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
27.05.2011 10:19
Цитата(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
27.05.2011 11:55
Цитата(Eduard @ 27.05.2011 7:19)
В этом месте вылазит ошибка Stack overflow error.
Увеличь стек или уменьши размер массивов. Какой у тебя компилятор?
Eduard
27.05.2011 11:56
Цитата(Lapp @ 27.05.2011 8:55)
Какой у тебя компилятор?
TP7
Lapp
27.05.2011 12:03
Цитата(Eduard @ 27.05.2011 8:56)
TP7
А ездишь ты на телеге?..
По умолчанию, в TP7 стек был, кажется.. 16 К. Твой массив 100х100х2=20К. Увеличь стек до максимума (64К). Это в опциях.
Скачай FP (freepascal.org) и займись делом, а не бирюльками.
Eduard
27.05.2011 12:08
Спасибо. Я не мог понять что такое стек.
Lapp
27.05.2011 12:25
Цитата(Eduard @ 27.05.2011 9:08)
Спасибо. Я не мог понять что такое стек.
Стек - это область памяти, где размещаются переменные вызываемых процедур. Динамически аллоцируемая память размещается в "куче" (heap). Она в TP может достигать аж ~600 килобайт!! Дикое количество, особенно если учесть, что размер памяти сейчас измеряется даже не мегабайтами, а гигабайтами.. Иначе говоря, ТР тебе позволяет использовать одну-две сотых доли процента установленной памяти.. Зачем пользоваться краденным старьем, если есть бесплатный новый компилятор со всеми современными возможностями?
TarasBer
27.05.2011 13:39
> Иначе говоря, ТР тебе позволяет использовать одну-две сотых доли процента установленной памяти..
Можно перейти в защищённый режим и использовать всю память. Правда, не пи запуске из хрюши.
Lapp
28.05.2011 10:15
Цитата(TarasBer @ 27.05.2011 10:39)
Можно перейти в защищённый режим и использовать всю память.
А сделать один большой массив?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.