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

Дана целочисленная прямоугольная матрица переставить строки матрицы по возрастанию сумм положительных элементов

Помогите написать код на Pascal!
program N76886979;
var
a: array of array of smallint;
n, m, i, j, imin: byte;
t: pointer;
begin
randomize;
n := random(9) + 2;
m := random(15) + 1;
setlength(a, n, m + 1);
writeln('Дана матрица ', n, 'x', m, ':');
for i := Low(a) to High(a) do
begin
for j := 1 to m do
begin
a[i, j] := random(199) - 99;
write(a[i, j]:4)
end;
writeln
end;

{Получение сумм положительных элементов в строках}
for i := Low(a) to High(a) do
begin
a[i, 0] := 0;
for j := 1 to m do
if a[i, j] > 0 then
inc(a[i, 0], a[i, j])
end;
{Сортировка строк матрицы методом простого выбора}
for i := Low(a) to High(a) - 1 do
begin
imin := i;
for j := i + 1 to High(a) do
if a[j, 0] < a[imin, 0] then
imin := j;
if i <> imin then
begin
t := a[imin];
a[imin] := a[і];
a[і] := t
end
end;
{Вывод результата}
writeln(#13#10'Преобразованная матрица: ');
for i := Low(a) to High(a) do
begin
for j := 1 to m do
write(a[i, j]:4);
writeln('Summa = ':12, a[i, 0]);
end;
readln;
finalize(a)
end.



Решение задачи "в лоб" приводит к очень нерациональному расходу вычислительных мощностей. Неоднократно придётся считать суммы элементов в одних и тех же строках и менять местами элементы.
Поэтому суммы считаются только один раз и записываются в нулевой столбец, который не используется для элементов матрицы.
Также используется тот факт, что у динамических массивов по первой размерности находится одномерный массив указателей на одномерные массивы строк элементов. И для обмена местами строк не каждый элемент перемещается через "пустое ведро", а указатели на строки.

P.S. Вы не указали требуемый вам диалект Паскаля, а эта программа понравится далеко не каждому компилятору.
Павел Гаврилов
Павел Гаврилов
51 590
Лучший ответ

Похожие вопросы