Отсортировать положительные элементы ниже побочной диагонали матрицы по возрастанию - Pascal
Формулировка задачи:
Помогите зделать задачку:Дана матрица N*m.Отсортировать положительные элементы ниже побочной диагонали по возрастанию,а отрицательные элементы выше побочной диагонали по возрастаниюНайти наибольший элемент выше побочной диагонали с указанием его индекса
Решение задачи: «Отсортировать положительные элементы ниже побочной диагонали матрицы по возрастанию»
textual
Листинг программы
var
a: Array[Byte, Byte] Of ShortInt;
temp: Array[Byte] Of ShortInt;
i, j, k, n, iMax, jMax, nTemp: Byte;
swap: ShortInt;
begin
{ввод размерности}
repeat
Write('Input n(>1): ');
ReadLn(n);
until (n > 1);
Randomize; WriteLn;
{заполнение и поиск максимума}
iMax := 0; jMax := 0;
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do
begin
a[i, j] := Random(199) - 99;
Write(a[i, j]:4);
if ((j + i + 1 < n) And (a[i, j] > a[iMax, jMax]))
then
begin
iMax := i;
jMax := j;
end;
end;
WriteLn;
end;
WriteLn('Max[', iMax + 1, '][', jMax + 1, ']=', a[iMax, jMax]);
{сортировка ниже побочной диагонали}
nTemp := 0;
for i := 1 to n - 1 do
for j := n - i to n - 1 do
if (a[i, j] > 0)
then
begin
temp[nTemp] := a[i, j];
Inc(nTemp);
end;
if (nTemp > 1)
then
begin
for i := 0 to nTemp - 2 do
for j := 0 to nTemp - i - 2 do
if (temp[j] > temp[j + 1])
then
begin
swap := temp[j];
temp[j] := temp[j + 1];
temp[j + 1] := swap;
end;
k := 0; i := 1;
while ((i < n) And (k < nTemp)) do
begin
j := n - i;
while ((j < n) And (k < nTemp)) do
begin
if (a[i, j] > 0)
then
begin
a[i, j] := temp[k];
Inc(k);
end;
Inc(j);
end;
Inc(i);
end;
end;
{сортировка выше побочной диагонали}
nTemp := 0;
for i := 0 to n - 2 do
for j := 0 to n - i - 2 do
if (a[i, j] < 0)
then
begin
temp[nTemp] := a[i, j];
Inc(nTemp);
end;
if (nTemp > 1)
then
begin
for i := 0 to nTemp - 2 do
for j := 0 to nTemp - i - 2 do
if (temp[j] > temp[j + 1])
then
begin
swap := temp[j];
temp[j] := temp[j + 1];
temp[j + 1] := swap;
end;
k := 0; i := 0;
while ((i < n - 1) And (k < nTemp)) do
begin
j := 0;
while ((j < n - i - 1) And (k < nTemp)) do
begin
if (a[i, j] < 0)
then
begin
a[i, j] := temp[k];
Inc(k);
end;
Inc(j);
end;
Inc(i);
end;
end;
{вывод итоговый}
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do
Write(a[i, j]:4);
WriteLn;
end;
end.
Объяснение кода листинга программы
- Объявление переменных:
a: двумерный массив размерности Byte, хранящий числа типа ShortInttemp: одномерный массив размерности Byte, хранящий числа типа ShortInti, j, k, n, iMax, jMax, nTemp: переменные типа Byteswap: переменная типа ShortInt
- Ввод размерности:
- Пользователю предлагается ввести число
n(количество строк и столбцов матрицы) до тех пор, пока введенное значениеnбольше 1.
- Пользователю предлагается ввести число
- Заполнение матрицы и поиск максимума:
- Генерируется случайное значение для каждого элемента матрицы и выводится на экран.
- Выполняется поиск максимального значения в матрице и его индексов с учетом условия ниже побочной диагонали.
- Сортировка положительных элементов ниже побочной диагонали по возрастанию:
- Положительные элементы ниже побочной диагонали копируются в массив
tempи сортируются по возрастанию. - Отсортированные элементы из
tempзаменяют соответствующие элементы в матрицеa.
- Положительные элементы ниже побочной диагонали копируются в массив
- Сортировка отрицательных элементов выше побочной диагонали по убыванию:
- Отрицательные элементы выше побочной диагонали копируются в массив
tempи сортируются по убыванию. - Отсортированные элементы из
tempзаменяют соответствующие элементы в матрицеa.
- Отрицательные элементы выше побочной диагонали копируются в массив
- Вывод итоговой матрицы:
- Отсортированная матрица выводится на экран.