nextupprevious

Next:5.4.2 Произведение матриц
Up:5.4 Программы обработки матриц
Previous:5.4 Программы обработки матриц


5.4.1 Поиск максимума в матрице

Задача. Задана матрица вещественных чисел A размером 30 х 30. Найти максимальный среди отрицательных элементов матрицы, расположенных в заштрихованной ее части, включая границу (рис. 5.9).


Рис.5.9. Матрица A с выделенной частью

Решение. При нахождении максимума обычно используют следующее очевидное соотношение:

    max(M U {x}}= max(max(M), x),

где M -- произвольное непустое множество чисел, а x -- произвольное число. Для пустого множества M выражение max(M) не определено. В случае, если множество чисел из условия задачи

окажется пустым, мы будем печатать текст "нет отрицательных элементов". Заштрихованную часть матрицы можно "обходить" с помощью пересчета индексов строки $i$ и столбца 235#121, организуемого следующими двумя заголовками циклов:

for I := 1 to 30 do
    if I < 16 then L := 31-I else L := I end;
        (* {L=max(I, 31-I)} *)
        for J := L to 30 do ...

При просмотре элементов матрицы будем с помощью значений логической переменной НАЙДЕН различать два состояния: найден хотя бы один отрицательный элемент (НАЙДЕН = true) и такого элемента пока не найдено (НАЙДЕН = false; это будет начальное состояние просмотра). В состоянии not НАЙДЕН обнаружение отрицательного элемента будет переключать текущее состояние в НАЙДЕН и задавать начальное значение переменной МАКС. Неотрицательные элементы при просмотре просто пропускаются. В состоянии НАЙДЕН обнаружение отрицательного элемента может приводить к перевычислению переменной МАКС с тем, чтобы в ней по-прежнему хранился максимум отрицательных элементов уже просмотренной части матрицы.

module ПоискМаксимумаМатрицы;
const R = 30;
var A : array R+1, R+1 of real;
    L,I,J : integer;
    МАКС : real;
    НАЙДЕН : boolean;
begin
    for I := 1 to R do for J := 1 to R do Read(A[I,J]) end;
    НАЙДЕН := false;
    for I := 1 to R do
         if I <= R div 2 then L := R-I+1 else L := I end;
          (* {L=max(I, 31-I)} *)
         for J := L to R do
                if A [I,J]< 0 then
                    if НАЙДЕН then
                        if МАКС < A [I,J] then МАКС := A [I,J] end
                        (*

                        *)
                    end
                else НАЙДЕН := true; МАКС := A[I,J]
                end
         end
    end;
    if НАЙДЕН then
        writeLn( 'Максимум равен',МАКС )
    else writeln( 'Нет отрицательных элементов' )
    end
end ПоискМаксимумаМатрицы.

Next:5.4.2 Произведение матриц
Up:5.4 Программы обработки матриц
Previous:5.4 Программы обработки матриц


© В.Н. Касьянов, Е.В.Касьянова. 2004