Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Упорядочивание матрицы

Автор: Crash_Devil 12.12.2007 17:47

Задание: Дана матрица. Упорядочить элементы строк матрицы по неубыванию,
а сами строки по убыванию максимальных элементов строк.
Использовать сортировку простым выбором, реализовав метод в виде подпрограммы.
не пашет рандом(выдает нули), и сортировка...
Вот исходник:

Program z3;
const
n=4;{strok}
m=5{stolbcov};
type
tvector=array[1..m] of real;
tmatrix=array[1..n] of tvector;

procedure smena_strok(var matrica:tmatrix; const i,j:integer);
var T:tvector;
begin
T:=matrica[i];
matrica[i]:=matrica[j];
matrica[j]:=T;
end;
procedure vvod(matrica:tmatrix);
var i,j:integer;
begin
randomize;
for i:=1 to n do
for j:=1 to m do
matrica[i][j]:=random(100)-50;
end;

procedure vivod(matrica:tmatrix);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to m do
write(' ',matrica[i][j]);
writeln;
end;
end;
procedure sort1(matrica:tmatrix);
var k,i,j,maxE:integer;
max:real;
begin
for i:=1 to n do begin
for j:=m downto 2 do
begin
max:=matrica[1][n];maxE:=1;
for k:=1 to j do
if matrica[k][n]<=max then begin max:=matrica[k][n]; maxE:=k;end;
matrica[maxE][n]:=matrica[j][n];matrica[j][n]:=max;
end;
end;

end;

var
matrica:tmatrix;
i,j:integer;
begin
vvod(matrica);
writeln('Ishodnaya');
vivod(matrica);
sort1(matrica);
writeln('Poluchennaya');
vivod(matrica);
end.

Автор: volvo 12.12.2007 17:49

Цитата
не пашет рандом(выдает нули)
Еще бы... Передай матрицу как Var-параметр - заработает...

Автор: Crash_Devil 12.12.2007 17:59

Цитата(volvo @ 12.12.2007 12:49) *

Еще бы... Передай матрицу как Var-параметр - заработает...

У меня ступор...
Где это?
Что туда надо поставить?

Автор: volvo 12.12.2007 18:05

procedure vvod(VAR matrica:tmatrix);

Автор: Crash_Devil 12.12.2007 18:12

А на счет сортировки, Пишет "выход за границы диапазона изменения индекса 1..4"
Помогите пожалуйсто!

Автор: volvo 12.12.2007 18:39

procedure sort1(var matrica:tmatrix);
var
k,i,j: integer;
T: real;
begin
for i:=1 to n do begin

for j := 1 to m do
for k := m downto j + 1 do
if matrica[i][k - 1] > matrica[i][k] then begin
T := matrica[i][k - 1];
matrica[i][k - 1] := matrica[i][k];
matrica[i][k] := T;
end
end;
end;

Хинт: сортировка простым выбором - это не метод последовательного поиска минимумов...

Автор: Crash_Devil 12.12.2007 21:03

Вот процедура перестановки строк местами к условию
"... а сами строки по убыванию максимальных элементов строк":

procedure sort2(var matrica:tmatrix);
var
k,i,j: integer;
T: real;
begin
for i:=1 to n do
for j:=1 to m do
if matrica[i][1]<matrica[i+1][1]then smena_strok(matrica,1,i+1);
end;
Опять пишет "выход за границы диапазона изменения индекса"!
Что не так?

Автор: volvo 12.12.2007 21:09

Потому что у тебя опять не метод "пузырька"... Почитай уже наконец, как он правильно реализуется:
http://forum.pascal.net.ru/index.php?s=&showtopic=3065&view=findpost&p=27328

Вот так sort2 работает:

procedure sort2(var matrica:tmatrix);
var
i,j: integer;
begin
for i:=1 to n do
for j:=n downto i+1 do
if matrica[j][1]<matrica[j-1][1]
then smena_strok(matrica,j,j-1);
end;


Автор: Crash_Devil 12.12.2007 21:13

ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ И ТЕРПЕНИЕ!