Другие языки программирования и технологии

Помогите пожалуйста с задачей на Паскаль.

Такая задача. Дана матрица. Упорядочить ее строки по убыванию первых элементов строк, если это возможно. Растолкуйте мне пожалуйста, как сделать эту сортировку? Сделал пока только вот что. program lab_5_1; uses crt; const x=100; type matr = array[1..x,1..x] of integer; var i,j,n,m:integer; a:matr; procedure matrix; begin clrscr; Randomize; Write('Ввести n='); Readln(n); Write('Ввести m='); Readln(m); for i:=1 to n do begin for j:=1 to m do begin a[i,j]:=random(10); Write(a[i,j]:4); end; writeln; end; end; procedure sort_matrix; var k,x:integer; begin ??? for i:=1 to n do //âûâîä begin for j:=1 to m do Write(a[i,j]:4); Writeln; end; end; begin matrix; writeln; sort_matrix; readln; end. Как упорядочить? заранее, Большое спасибо за помощь)
Да, сортирует неправильно - у тебя меняются не строки местами, а только их первые элементы.
Программа ужасна! Ты никогда не слышал про аргументы функции? Работать внутри подпрограммы с глобальными переменными - плохой стиль. Даже ужасный. Хорошо, когда все глобальные переменные определяются после объявления последней подпрограммы. Но это так, к слову.
Теперь по существу вопроса.
Несложно сделать сортировку линейного массива. В принципе она у тебя готова. С матрицей относительная сложность возникает только в том лишь смысле, что надо переставить местами не один элемент (как у тебя!) , а целую строку. Но и здесь есть хитрость.
Паскаль позволяет объявлять пользовательские типы данных. А что если объявить тип, СТРОКА - простой линейный массив. Возможно? ДА! А что если объявить тип МАТРИЦА как массив СТРОК. Возможно? ДА! И тогда появляется возможность внутри МАТРИЦЫ переставлять СТРОКИ в одно действие как если бы МАТРИЦА была ЛИНЕЙНЫМ МАССИВОМ.
Ну и, напоследок, пример.

const
SIZE = 50;
type
TRow = array [1 .. SIZE] of integer;
TMatrix = array [1 .. SIZE] of TRow;

function FillMatrix(Lower, Highest: integer; Width, Height: integer): TMatrix;
var
idx, jdx: integer;
m: TMatrix;
begin
for idx := 1 to Height do
for jdx := 1 to Width do
m[idx, jdx] :=Random(Highest - Lower + 1) + Lower;
FillMatrix := m;
end;

procedure Print(const Matrix: TMatrix; Width, Height: integer);
var
Row: TRow;
idx, jdx: integer;
begin
for idx := 1 to Height do
begin
Row := Matrix[idx];
for jdx := 1 to Width do
write(Row[jdx]:4);
writeln;
end;
end;

function Sort(const Matrix: TMatrix; Width, Height: integer): TMatrix;
var
Row1, Row2: TRow;
idx, jdx: integer;
m: TMatrix;
begin
m := Matrix;
for idx := 1 to Height do
begin
Row1 := m[idx];
for jdx := idx + 1 to Height do
begin
Row2 := m[jdx];
if (Row2[1] > Row1[1]) then
begin
m[jdx] := Row1;
m[idx] := Row2;
Row1 := m[idx];
end;
end;
end;
Sort := m;
end;

var
Matrix: TMatrix;
Width, Height, Low, High: integer;
begin
Randomize();
write('width ');
readln(Width);
write('height ');
readln(Height);
write('lower ');
readln(Low);
write('highest ');
readln(High);
Matrix := FillMatrix(Low, High, WIdth, Height);
Print(Matrix, Width, Height);
Matrix := Sort(Matrix, Width, Height);
writeln('sorted');
Print(Matrix, Width, Height);
readln;
end.

Это - ХОРОШИЙ ПРИМЕР оформления программы. И рабочий конечно.
Да, надо отметить что сортировка производится не строго по УБЫВАНИЮ, а по НЕВОЗРАСТАНИЮ (только первого элемента!) , в ряде случаев это может быть важно, ну а с математической точки зрения - это совсем разные вещи.
---
Уважайте время других пользователей Ответов. Не забывайте отмечать лучшие ответы.
Владимир Матвиенко
Владимир Матвиенко
5 083
Лучший ответ
Первые элементы строк это элименты с индексами x=1 и У от 1 до М.
for j:=1 to m do
a[1,j];

А сортируешь этот ряд элементов, ну например Метод пузырька. в гугле забей
ищешь максимальный первый элемент во всех строках, ставишь его на первое место.. и так далее..