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