Найти наибольший чётный положительный элемент выше главной диагонали матрицы - Turbo Pascal (33544)
Формулировка задачи:
Здравствуйте. Нужна помощь по теме "двумерные массивы"!
Задача.
Дан двумерный массив. Найти наибольший чётный положительный элемент выше главной диагонали и наименьший отрицательный элемент ниже главной диагонали с указанием их индексов. Создать новый массив, в котором найденные элементы поменяются местами.
Заранее спасибо за помощь!
Требования преподавателя - числа задаются не рандомно , сделать так чтобы можно было вводить размерность массива( количество строк,столбцов)
Решение задачи: «Найти наибольший чётный положительный элемент выше главной диагонали матрицы»
textual
Листинг программы
program mass; const m = 16; var n, i, j, ia, ja, ib, jb, t: integer; a: array [1..m, 1..m] of integer; fa, fb: boolean; begin //ввод размерности массива repeat write('n = '); readln(n); if (n < 2) or (n > m) then writeln('n out of range 2..', m, ', reenter.') until (n >= 2) and (n <= m); //ввод массива writeln('Enter array:'); for j := 1 to n do for i := 1 to n do begin write('a[', i, ', ', j, '] = '); readln(a[i, j]) end; //печать исходного массива, поиск нужных элементов fa := false; fb := false; writeln('Source array:'); for j := 1 to n do begin for i := 1 to n do begin write(a[i, j]:6); if (i > j) and not(odd(a[i, j])) and (a[i, j] >= 0) then if fa then begin if (a[i, j] > a[ia, ja]) then begin ia := i; ja := j end end else begin ia := i; ja := j; fa := true; end; if (i < j) and (a[i, j] < 0) then if fb then begin if (a[i, j] < a[ib, jb]) then begin ib := i; jb := j end end else begin ib := i; jb := j; fb := true end end; writeln end; //вывод найденных элементов write('Max even positive element above principal diagonal: '); if fa then writeln('a[', ia, ', ', ja, '] = ', a[ia, ja]) else writeln('not found.'); write('Min negative element below principal diagonal: '); if fb then writeln('a[', ib, ', ', jb, '] = ', a[ib, jb]) else writeln('not found.'); //обмен элементов и печать массива, если это возможно if fa and fb then begin t := a[ia, ja]; a[ia, ja] := a[ib, jb]; a[ib, jb] := t; writeln('Result:'); for j := 1 to n do begin for i := 1 to n do write(a[i, j]:6); writeln end end else writeln('No change.'); readln //ждём нажатия <Enter> перед закрытием программы end.
Объяснение кода листинга программы
- Переменная
m
инициализируется значением 16. - В цикле
repeat-until
пользователю предлагается ввести размерность массива от 2 до 16. Если введенные данные не соответствуют указанному диапазону, программа выводит сообщение об ошибке и просит пользователя повторить ввод. - В цикле
for
происходит ввод данных для каждого элемента массива. - Переменные
fa
иfb
инициализируются значениемfalse
. Они будут использоваться для отслеживания того, был ли найден наибольший или наименьший элемент соответственно. - В блоке
if
проверяется, является ли текущий элемент массива четным и положительным. Если это так, то он сравнивается с предыдущим наибольшим четным положительным элементом. Если текущий элемент больше, то он становится новым наибольшим элементом, и его индексы сохраняются в переменныхia
иja
. - Если в массиве есть такой элемент, то в блоке
if
проверяется, является ли следующий элемент за ним меньшим отрицательным элементом. Если это так, то индексы этого элемента сохраняются в переменныхib
иjb
. - В блоке
else
проверяется, не были найдены наибольший элемент или наименьший элемент. Если это так, то индексы текущего элемента сохраняются в переменныхia
иjb
. - Если в массиве есть наибольший элемент, то в блоке
if
проверяется, можно ли обменять его с элементом ниже главной диагонали. Если это так, то происходит обмен элементов, и текущий элемент становится новым наибольшим элементом. - В конце программы выводится сообщение с найденными наибольшим и наименьшим элементами.