Всем добрый вечер. Не компилируеться програмка, зависает на процедуре сумирования элементов столбцов:
uses
crt;
const
m=5; n=7;
type
realm = array[1..n] of real;
var
mA: array[1..m] of realm;
mS: array[1..n] of real;
tr: boolean;
e, v: integer; rr, tt: integer;
procedure fill_matrix(var mF: array of realm;ll, mm: integer);
var
l, m: integer;
begin
randomize;
for l:=1 to ll do begin
for m:=1 to mm do
begin
mF[l, m]:=random(300)-150;
end; end;
end;
function suma_el_st(mT: array of realm;i, j: integer): real;
var
k: integer;
suma: real;
begin
suma:=0;
for k:=1 to i do
suma:=suma+mT[k, j];
suma_el_st:=suma;
end;
procedure perestanovka_st(mP: array of realm; x, y: integer);
var
f: integer;
begin
for f:=1 to m do
begin
mP[x, f]:=mP[x, f]+mP[y, f];
mP[y, f]:=mP[x, f]-mP[y, f];
mP[x, f]:=mP[x, f]-mP[y, f];
end;
end;
begin
fill_matrix(mA, m, n);
{sort}
repeat
tr:=true;
for e:=1 to n-1 do begin
if suma_el_st(mA, e, n) < suma_el_st(mA, e, n+1) then begin
perestanovka_st(mA, n, n+1);
tr:=false;
end;
end;
until tr;
for rr:=1 to n do begin
for tt:=1 to m do
begin
write(mA[rr, tt]);
end;
writeln;
end;
end.
mP[x, f]:=mP[x, f]+mP[y, f];Это ты так пытаешься менять элементы местами? Смысл?
mP[y, f]:=mP[x, f]-mP[y, f];
mP[x, f]:=mP[x, f]-mP[y, f];
mP[x, f]:=mP[x, f]+mP[y, f];Это ты так пытаешься менять элементы местами? Смысл?
mP[y, f]:=mP[x, f]-mP[y, f];
mP[x, f]:=mP[x, f]-mP[y, f];
А каким образом у тебя возникает переполнение? Где именно? При таких маленьких размерах массивов его быть просто не должно, кроме того, Var - это передача "по ссылке", что не приближает Stack Overflow, а наоборот, отдаляет его...
TS*, ты выбрал не самый правильный способ представления данных... У тебя в процедуру перестановки передается массив строк, а работать тебе нужно с массивом столбцов...
Но поскольку телепатией я не владею, и что у тебя N - число строк или столбцов - не знаю( а гадать не буду) - то жду твоего ответа...
напиши в конце как получилась гтовая прога плз
uses
crt;
const
m=5;{stroki}
n=7;{stolbcu}
type
realm = array[1..n] of real;
var
mA: array[1..m] of realm;
mS: array[1..n] of real;
tr: boolean;
e, v: integer; rr, tt: integer;
procedure fill_matrix(var mF: array of realm;ll, mm: integer);
var
l, m: integer;
begin
randomize;
for l:=0 to ll-1 do begin
for m:=0 to mm-1 do
begin
mF[l, m]:=random(300)-150;
end; end;
end;
function suma_el_st(mT: array of realm;i, j: integer): real;
var
k: integer;
suma: real;
begin
suma:=0;
for k:=0 to i-1 do
suma:=suma+mT[k, j];
suma_el_st:=suma;
end;
procedure perestanovka_st(var mP: array of realm; x, y: integer);
var
f: integer;
ss: real;
begin
for f:=0 to m-1 do
begin
ss:=mP[x, f];
mP[x, f]:=mP[y, f];
mP[y, f]:=ss;
end;
end;
begin
fill_matrix(mA, m, n);
{sort}
repeat
tr:=true;
for e:=1 to n-1 do begin
if suma_el_st(mA, e, n) < suma_el_st(mA, e, n+1) then begin
perestanovka_st(mA, n, n+1);
tr:=false;
end;
end;
until tr;
writeln;writeln;writeln;
for rr:=1 to n do begin
for tt:=1 to m do
begin
write(mA[rr, tt]);
end;
writeln;
end;
end.
TS* Не то... Смотри, что она у меня выводит:
(особенное внимание - на нижнюю строку)
А теперь сравни с этим:
uses
crt;
const
m=5;
n=7; { columns count }
type
realm = array[1..m] of real;
var
mA: array[1..n] of realm;
tr: boolean;
curr_col, curr_line: integer;
e, v: integer;
procedure fill_matrix(var mF: array of realm;
const num_lines, num_columns: integer);
var
lines, cols: integer;
begin
randomize;
for cols := 0 to num_columns - 1 do
for lines := 1 to num_lines do begin
mF[cols][lines] := random(300)-150;
end;
end;
function suma_el_st(const mT: array of realm;
const col_to_sum, num_lines: integer): real;
var
k: integer;
suma: real;
begin
suma:=0;
for k := 1 to num_lines do
suma:=suma+mT[col_to_sum - 1][k];
suma_el_st:=suma;
end;
procedure perestanovka_st(var mP: array of realm;
const change_from, change_to: integer);
var
f: integer;
T: realm;
begin
T := mP[change_from - 1];
mP[change_from - 1] := mP[change_to - 1];
mP[change_to - 1] := T;
end;
begin
fill_matrix(mA, m, n);
writeln;
writeln;
for curr_line := 1 to m do begin
for curr_col := 1 to n do
write(mA[curr_col][curr_line]:8:3);
writeln;
end;
{sort}
repeat
tr:=true;
for e:=1 to n-1 do begin
if suma_el_st(mA, e, m) < suma_el_st(mA, e+1, m) then begin
perestanovka_st(mA, e, e+1);
tr:=false;
end;
end;
until tr;
writeln;
writeln;
for curr_line := 1 to m do begin
for curr_col := 1 to n do
write(mA[curr_col][curr_line]:8:3);
writeln;
end;
readln;
end.